/**
 * @namespace
 */
NURUN.namespace ("CA");

/**
* Contain all global variable
* @class
* @static
*/
CA.global = {
    
    /**
    * Canoe script path. Path must be absolute.
    * @property baseScriptPath
    * @type string
    */
    baseScriptPath: null,
    
    /**
     * Canoe script path for customization.
     * @property customizationPath
     * @type string 
     */
    customizationPath: null,
    
    /**
     * Canoe script path for omniture.
     * @property omniturePath
     * @type string 
     */
    omniturePath: null,
    
    /**
     * Canoe css path .
     * @property cssPath
     * @type string 
     */
    cssPath: null,
    
    /**
    * Canoe website version.
    * @property siteVersion
    * @type string
    */
    siteVersion: null,
    
    /**
    * Page loader filter type (raw, debug or empty string).
    * @property loadFilter
    * @type string
    */
    loadFilter: null,
    
    /**
    * Canoe website current locale.
    * @property locale
    * @type string
    */
    locale: null,
    
    /**
     * Direct Web Remoting generated interface script path.
     * @property locale
     * @type string
     */
     dwrScriptPath: null,
     
     googleKey: null
};


/**
* Asynchrone load for all module required in a page.
* @function
* @params {string} pageClass Name of javascript class for the current page.
* @params {string[]} modules <Optionnal> extra modules to include in the page from YahooUi or NurunUi library.
* @returns void
*/
CA.pageLoader = function(pageClass){
    var pageClassModuleName,
    	loader = new NURUN.util.Loader(),
    	hasDwr = false;

    loader.cfg.addParam("baseNurunUiPath", CA.global.baseScriptPath + "nui/0.8/");
    loader.cfg.addParam("baseYUIPath", CA.global.baseScriptPath + "yui/2.6.0/");
    loader.cfg.addParam("googleAPIKey", CA.global.googleKey);
    
    if(CA.global.loadFilter != null){
        loader.cfg.addParam("filter", CA.global.loadFilter);
    }
    
    pageClassModuleName = _pageClassRequired();
    
    loader.load(pageClassModuleName,  function(){
    	if(CA.pageClass !== null){
    		new CA.pageClass();
        }
    });
    
    function _pageClassRequired () {
    	var moduleDefinition, moduleName, module, i,
    	pageClassRequired = [];
    	
    	for(i = 0; i < CA.modulesToInclude.length; i++){
    		moduleDefinition = CA.modulesToInclude[i];
    		
    		if(YAHOO.lang.isString(moduleDefinition)){
    			moduleName = moduleDefinition;
    		}
			else {
				if(moduleDefinition.dwr){
					hasDwr = true;
					moduleName = "dwr" + moduleDefinition.dwr;
					module = {name:moduleName, type: "js", fullpath:CA.global.dwrScriptPath + "interface/" + moduleDefinition.dwr + ".js"}; 
				} else if (moduleDefinition.css) {				    
				    	moduleName = "css" + moduleDefinition.css;
				    	module = {name:moduleName, type: "css", fullpath:CA.global.cssPath + moduleDefinition.css + ".css"};
				} else if (moduleDefinition.omniture) {
				    moduleName = "js" + moduleDefinition.omniture;
				    module = {name:moduleName, type: "js", fullpath:CA.global.omniturePath + moduleDefinition.omniture + ".js"};
				} else if (moduleDefinition.customization) {				    
				    	moduleName = "js" + moduleDefinition.customization;
				    	module = {name:moduleName, type: "js", fullpath:CA.global.customizationPath + moduleDefinition.customization + ".js"};
				}else {
					moduleName = moduleDefinition.name;
					module = {name:moduleName, type: "js", fullpath:CA.global.baseScriptPath + moduleDefinition.filename}
				}
				
				loader.addModule(module);
			}
			
    		if(YAHOO.lang.isString(moduleName)){
				pageClassRequired.push(moduleName);
    		}
    		else {
    			throw new Error("Module name is required. You cannot include a module without a name");
    		}
    	}
        
        pageClassRequired.push("pagebase");
        //pageClassRequired.push("globalresource");
        
        if(hasDwr){
        	pageClassRequired.push("dwrengine");
        }
        
        _loaderAddModules(pageClassRequired);
        
        return "pageclass";
    }
        
    function _loaderAddModules (pageClassRequired) {
        loader.addModule({name:"pagebase", type: "js", fullpath:CA.global.baseScriptPath + "pages/pagebase.js", requires:["page"]});    
        loader.addModule({name:"pageclass", type: "js", fullpath:CA.global.baseScriptPath + "pages/" + pageClass + ".js", requires:pageClassRequired});        //

        if(hasDwr){
            loader.addModule({name:"dwrengine", type: "js", fullpath:CA.global.dwrScriptPath + "engine.js"});
        }
        
        
    }
}

CA.modulesToInclude = [];


