/*

12/2007.
The Portal Manager for 2112Portals will keep track and persist settings, the
Portal Admin is applying to Windows (such as width, height, X, Y) or Menus.
It bases on a pluggable architecture that allows all kind of persistency.
Simply implement the required methods (kind of Interface Implementation)
 in a file called portalPersister.js
*/


/*
2/2008
From now on all global singleton Objects will be held here.
masterControl -> the SnapIn administration.


10/2008 Updated V 1.4


*/

/*Dependencies:
   
NS2112   is loaded.

*/

function includeCSS(theCSSURI)
{
var fileref=""
fileref=document.createElement("link")
fileref.setAttribute("rel", "stylesheet");
fileref.setAttribute("type", "text/css");
fileref.setAttribute("href", theCSSURI);
//document.getElementsByTagName('head').item(0).appendChild(script);

}

function include(file) {
  var script  = document.createElement('script');
  script.src  = file;
  script.type = 'text/javascript';
  document.getElementsByTagName('head').item(0).appendChild(script);
}







//Namespace 2112
window.NS2112 = window.NS2112 || {};


function testPM()
{
   alert("NS2112.portalMan") ;
}

NS2112.sandboxMode = false ;






//This is the core portal file that will boot all other modules neccessary to
//get the portal going.
//So that only one file has to be included in an html file.
//NS2112.include("/2112PowerWindows/widgetBase/myFirstWidget/myFirstWidget.js") ;


//The instance of our global masterController - this is a singleton.

NS2112.namespace('NS2112.portalMan.masterControl') ;


NS2112.m_masterControl ;
NS2112.m_windowManager;
//Event handling 
NS2112.onConsoleOut = new NS2112.CustomEvent("onConsoleOut");  //Output to console12


NS2112.portalMan = function()
{
  
   var m_windowManager ;
  /*    
   var m_masterControl ;
   this.getMasterControl = function()
   {
      alert('obsolete!') ;
      debugger;
      if( null == m_masterControl )
      {
         m_masterControl = new NS2112.masterControl() ; 
      }
      return m_masterControl ;
   }

*/
   this.getWindowManager = function()
   {
	  //NS2112.portalMan.break('PORTALMAN', 3) ; //would debug - see portalSettings.js
	  
      if( null == m_windowManager )
      {
         m_windowManager = new NS2112.windowManager(50, 50, 10, 30) ; 
      }

     
     try { //Fixing the abominable IE(6) image reload
              document.execCommand("BackgroundImageCache", false, true);
     } catch(err) {}

      return m_windowManager ;
   }
   
}


NS2112.portalMan.Versionstring = "1.5.0 [MARCH.2010]" ;

NS2112.portalMan.SysInfo = function()
{
   vInfo = YAHOO.env.getVersion("yahoo") ;
   strMsg = "2112PowerWindows Version [" + NS2112.portalMan.Versionstring +"]\nYUI Version [" + vInfo.version + "]\n" +
      "Visit http://2112Portals.com for more details." ;
   alert(strMsg) ;
}

 NS2112.portalMan.getWindowManager = function()
{
   if( null == NS2112.m_windowManager )
   {
      NS2112.m_windowManager = new NS2112.windowManager(50, 50, 10, 30) ; 
   }
   return NS2112.m_windowManager ;
}


NS2112.portalMan.getMasterControl = function()
{
   if( null == NS2112.m_masterControl )
   {
      NS2112.m_masterControl = new NS2112.masterControl() ; 
   }
   return NS2112.m_masterControl ;
}


NS2112.portalMan.bootHandlerSuccess = function(oData) { 
	    //code to execute when all requested scripts have been 
	    //loaded; this code can make use of the contents of those 
	    //scripts, whether it's functional code or JSON data. 
       if( oData )
         oData.purge();

     NS2112.portalMan.getMasterControl().loadSnapIns() ;
	} 

NS2112.portalMan.bootHandlerFail = function(oData) { 
   alert("The boot sequence failed.") ;
}

NS2112.portalMan.loadCore = function ()
{
   var silo = new NS2112.snapInLoader() ;
   var r_Scripts = new Array() ;
      try {      
      
         r_Scripts.push( NS2112.portalPath + 'tool-man/core.js') ;
         r_Scripts.push(NS2112.portalPath  + 'tool-man/events.js') ;
         r_Scripts.push(NS2112.portalPath  + 'tool-man/css.js') ;
         r_Scripts.push(NS2112.portalPath  + 'tool-man/coordinates.js') ;
         r_Scripts.push(NS2112.portalPath  + 'tool-man/drag.js') ;
         /*
         r_Scripts.push(NS2112.portalPath  + 'config/portalSettings.js') ;
         
         
         */
   //The second wave         
         r_Scripts.push(NS2112.portalPath  + 'runtime12/nlsProvider.js') ;
         r_Scripts.push(NS2112.portalPath  + 'runtime12/windowMan.js') ;
        // r_Scripts.push(NS2112.portalPath  + 'runtime12/coreSnapIn.js') ;
         NS2112.syncArray = r_Scripts.slice() ; //snap shot for sync

         NS2112.snapInLoaderGlobals.embedScript(r_Scripts, null, NS2112.portalMan.bootHandlerSuccess,
                NS2112.portalMan.bootHandlerFail, NS2112.syncArray ) ;
           

    //  loader.loadModules(r_Modules) ;
      } catch(ex) {
         alert(ex) ;
      }      
}

//A setting may consist of a top level and a sub level
NS2112.portalMan.getSetting = function(strTopic, strSub)
{
   var value ;
   try
   {
      if( strSub == null )
         value = NS2112.aPortalSettings[strTopic] ;
      else
         value = NS2112.aPortalSettings[strTopic][strSub] ;
      if( typeof value == 'undefined') value = null ;
   }
   catch(ex)
   {
      value = null ;
   }
   return value ;
}

//to make life easier - messy numbers (in strings) would ruin your portal.
NS2112.portalMan.getNumericSetting = function(strTopic, strSub, nDefault)
{
   var value = NS2112.portalMan.getSetting(strTopic, strSub) ;
   if( !value ) 
      value = nDefault ;      
   return parseInt(value) ;
}



//A setting may consist of a top level
NS2112.portalMan.setSetting = function(strTopic, strSub, strValue)
{
   
   try
   {
      if( strSub == null )
         NS2112.aPortalSettings[strTopic] = strValue ;
      else
         NS2112.aPortalSettings[strTopic][strSub] = strValue;
      
   }
   catch(ex)
   {
      
   }
   
}

NS2112.portalMan.getBasePath = function(){
   return NS2112.portalMan.getSetting('BASE') ;
}


NS2112.portalMan.getLoaderURL = function(){
   return NS2112.portalMan.getSetting('SNAP_LOADER') ;
}

NS2112.portalMan.getBootConfigURL = function(){
   return NS2112.portalMan.getSetting('BOOT_LOADER_URL') ;
}

NS2112.portalMan.getLoadMethod = function(){  //GET/POST
    return NS2112.portalMan.getSetting('LOAD_METHOD') ;
}

NS2112.portalMan.getYUIPath = function(){
   return NS2112.portalMan.getSetting('YUI_PATH') ;
}

NS2112.portalMan.getHeaderHeight = function(){
   return parseInt(NS2112.portalMan.getSetting('WINDOWS', 'HEADER_HEIGHT')) ;
}

NS2112.portalMan.getFooterHeight = function(){
   return parseInt(NS2112.portalMan.getSetting('WINDOWS', 'FOOTER_HEIGHT')) ;
}

NS2112.portalMan.getContentWndExtX = function(){
    return parseInt(NS2112.portalMan.getSetting('WINDOWS', 'EXTX')) ;
}

NS2112.portalMan.getContentWndExtY = function(){
    return parseInt(NS2112.portalMan.getSetting('WINDOWS', 'EXTY')) ;
}

NS2112.portalMan.getDragShimName = function(){
    return NS2112.portalMan.getSetting('WINDOWS', 'DRAGSHIM') ;
}

//Get CSS for Header/Footer
NS2112.portalMan.getCustomCSS_URL = function(){
    return NS2112.portalMan.getSetting('CUSTOMCONTENT', 'STYLE') ;
}

NS2112.portalMan.getCustomHeaderURL = function(){
    return NS2112.portalMan.getSetting('CUSTOMCONTENT', 'HEADER') ;
}

NS2112.portalMan.getCustomFooterURL = function(){
    return NS2112.portalMan.getSetting('WINDOWS', 'FOOTER') ;
}

NS2112.portalMan.getLayoutTop = function(){
    var top = NS2112.portalMan.getSetting('LAYOUT', 'TOP') ;
    if( top ) return parseInt(top) ;
    return top ;
}

NS2112.portalMan.getLayoutLeft = function(){
    var left = NS2112.portalMan.getSetting('LAYOUT', 'LEFT') ;
    if( left ) return parseInt(left) ;
    return left ;
}

NS2112.portalMan.getLayoutRight = function(){
    var right = NS2112.portalMan.getSetting('LAYOUT', 'RIGHT') ;
    if( right ) 
      return parseInt(right) ;
    return right ;
}
NS2112.portalMan.getLayoutCenter = function(){
    return null ;  //current versions calculate center themselves from totalWidth - left - right...
}

//conditional debugging by querying the config
NS2112.portalMan.debug = function(strWho, iLevel){

	if( NS2112.portalMan.getNumericSetting('BREAKPOINTS', 'BREAK_LEVEL', 0) < iLevel) return ;
	if( NS2112.portalMan.getNumericSetting('BREAKPOINTS', strWho, 0) != 0 )
			debugger;
			
}








//to be removed - there should no instance of portalMan at all.
var portalMan = new NS2112.portalMan() ;
/*1.5 make sure portalSettings.js is loaded!*/
NS2112.portalPath  = NS2112.portalMan.getBasePath(); 
if( -1 == NS2112.portalPath.search(/\/$/) )
   NS2112.portalPath += '/' ;  //need the trailing slash



if ( null == NS2112.portalPath ) 
	NS2112.portalPath = '/2112PowerWindows/' ;






getFromDom = function ( domDoc, iItemNum, strKey, strDefault )
{
    
	if( null != domDoc  &&
	    null != domDoc.getElementsByTagName(strKey) &&
   	 null != domDoc.getElementsByTagName(strKey).item(iItemNum) &&
   	 null != domDoc.getElementsByTagName(strKey).item(iItemNum).firstChild
      )
   {
   	return new String(domDoc.getElementsByTagName(strKey).item(iItemNum).firstChild.data) ;
   }
   else
     return strDefault ;
}

/*funktion zum abschicken eines Formulars mit Enter-Taste*/


function evalKeyForSubmit(event, frm) 
{
    var myEvent = (event) ? event : ((window.event) ? window.event : "");
    //alert(myEvent.keyCode);

   if (event && myEvent.keyCode == 13) // IE: ...event.keyCode...
   {
      // ENTER gedrückt, also Formular abschicken      
      return true;
   }
   else
      return false;

}





/***************************************************************************************************/

//encapsulation of the YUI loader - get rid of this and replace it by an own class (someday).

//1.4 Array to hold loaded modules as lookup before inserting with the loader.
//    This is due to the YUI! Loader(2.*) not dealing with concurrent calls for same libs.


//Portal Man Loader Constants
NS2112.LoadControl.Limbo         = -1 ;
NS2112.LoadControl.LoadPending   =  0 ;
NS2112.LoadControl.LoadComplete  =  1 ;
NS2112.LoadControl.LoadInsert    =  2 ;
NS2112.LoadControl.LoadInit      =  3 ;

NS2112.loadHistory = new Object ;
NS2112.loadQueue = null ;  //here identical modules will be queue for later notification of loadSuccess
NS2112.Loader = function() {
   NS2112.loadQueue = NS2112.loadQueue || new Array() ; //singleton - current load in progress queue   
   this.ModName = '#' ;
   this.data = new Object;
   this.onSuccess = null;

   var m_Loader = new YAHOO.util.YUILoader({
      base: NS2112.aPortalSettings['YUI_PATH'] + '/',
      //filter: "RAW", 	//use debug versions (or apply some
      //some other filter?
      loadOptional: true, //load all optional dependencies?
      // should a failure occur, the onFailure function will be executed
      onFailure: function(o) {
		if( NS2112.portalMan.getNumericSetting('BREAKPOINTS', 'BREAK_LEVEL', 0) > 0 )
			debugger;
         alert("error: " + YAHOO.lang.dump(o));
      }
      
   });

   m_Loader.data = this.data;
   m_Loader.data['m_rWaitForMultipleObjects'] = new Array() ;
   
   this.require = function(strLib) {
      NS2112.onConsoleOut.fire('loader.require [' + strLib + ']' + NS2112.loadHistory[strLib] + ' this.data.theSnap.Name.');
      //check array first.
      if ( NS2112.loadHistory[strLib] == NS2112.LoadControl.LoadPending  ) 
      { //already loading
         this.ModName = strLib ;
         m_Loader.data['m_rWaitForMultipleObjects'].push(strLib) ;
         NS2112.onConsoleOut.fire('m_rWaitForMultipleObjects' + strLib);
         //due to race conditions the module might be loaded already while processing this.         
         NS2112.onConsoleOut.fire('loader.require [' + strLib + '] is already loading.');
         return NS2112.LoadControl.LoadPending ; //already queued - nothing to do then
      }
      
      m_Loader.require(strLib);
      
      return NS2112.LoadControl.LoadInsert  ;
   }

   this.insert = function(iInsertState) {
      
      m_Loader.onSuccess = this.onSuccess;  //onSuccess will be set by the caller therefore is null above.      
      m_Loader.insert();
         
   }
}

/*The object manager - a central resource manager.*/
    NS2112.namespace('NS2112.objectMan') ;  //1.5+


    NS2112.objectMan.storage = NS2112.objectMan.storage || {} ;


    NS2112.objectMan.createObject = function(strObjID){        
		NS2112.objectMan.storage[strObjID] = NS2112.objectMan.storage[strObjID] || {} ;
		return NS2112.objectMan.storage[strObjID] ;
	}
	
	NS2112.objectMan.createArray = function(strObjID){
		NS2112.objectMan.storage[strObjID] = NS2112.objectMan.storage[strObjID] || new Array() ;
		return NS2112.objectMan.storage[strObjID] ;
	}
	
	NS2112.objectMan.getObject = function(strObjID){
		return NS2112.objectMan.storage[strObjID] ;
	}
	/*we decided to be non-hierachical (no trees) so store IDs like grid.Services2 instead*/
	NS2112.objectMan.insertObject = function(strObjID,  oValue){
	    NS2112.objectMan.storage[strObjID] =  NS2112.objectMan.createObject(strObjID) ;
		NS2112.objectMan.storage[strObjID] = oValue ;
	}
	
	NS2112.objectMan.emptyObject = function(strObjID){	    
		NS2112.objectMan.storage[strObjID] = null ;
	}
	







