/* -------------------------------------------------------------------------------------------- */
/* UoContext																					*/
/* -------------------------------------------------------------------------------------------- */

var UoContext = new Class({
	Implements: [Options],
	
	options: {},
	
	scriptArray: [],
	scriptIndex: -1,
	
	controller: null,
	bootstrapDone: false,
	domReady: false,
	
	initialize: function(options) {
		
		this.setOptions(options);
		// base Scripts
		this.addScripts(['base/UoBaseController.js','base/UoBaseModule.js']);
		
		
	},
	
	
	bootstrap: function() {
		// check for modules with extended funtionality
		var extendedModules = $$('div.uoExt').map(function(item) {
			return item.get('id');
		});
		//console.log(extendedModules);
		this.registerModules(extendedModules, true);
		
		// load all scripts
		this.loadNextScript();
		
		
		this.bootstrapDone = true;
	},
	
	
	onDomReady: function() {
		
		this.domReady = true;
		
		var controllerOptions = this.options['controllerOptions'];
		// console.log('new {controllerClass}(this, controllerOptions);'.substitute(this.options));
		this.controller = eval('new {controllerClass}(this, controllerOptions);'.substitute(this.options));
	},
	
	
	addScript: function(scriptUrl) {
		this.addScripts([scriptUrl]);
	},
	
	
	addScripts: function(scriptUrlArray) {
		// add script to scriptpool
		this.scriptArray.extend([scriptUrlArray]);
		// if already bootstrapped, load the scripts immediatly
		this.bootstrapDone && this.loadNextScript();
	},
	
	
	registerModule: function(moduleName, basedModules) {
		// add the Module
		this.registerModules([moduleName], $chk(basedModules));
	},
	
	
	registerModules: function(moduleNameArray, basedModules) {
		var baseModuleScripts = moduleNameArray.map(function(item, index) {
			return 'base/modules/{moduleName}BaseModule.js'.substitute({moduleName: item});
		})
		
		var moduleScripts = moduleNameArray.map(function(item, index) {
			return 'modules/{moduleName}Module.js'.substitute({moduleName: item});
		})
		
		$chk(basedModules) && this.addScripts(baseModuleScripts);
		this.addScripts(moduleScripts);
	},
	
	
	loadNextScript: function() {
		// check if there are actually scripts left to load
		if (this.scriptArray.length - 1 <= this.scriptIndex) return;
		
		// increase the index, load all scripts in that bundle
		this.scriptIndex++;
		this.scriptArray[this.scriptIndex];
		var thisScriptIndex = this.scriptIndex;
		
		this.scriptArray[this.scriptIndex].each(function(item, index) {
			var substr = {
				src: item,
				item: item,
				index: index,
				scriptIndex: thisScriptIndex
			}
			
			// is it a relative scriptUrl?
			if (!/^https?/.test(item)) {
				substr.src = this.options['javascriptBaseUrl'] + substr.src;			
			}
			
			//console.log('load[{scriptIndex}]: {item}'.substitute(substr));
			
			// if the document isnt fully loaded(domReady), we can inject with document.write
			if(!context.domReady) {
				document.write('<script src="'+substr.src+'" type="text/javascript"></script>');
				//console.log('Loading ({scriptIndex}): {item}'.substitute(substr));
			} else {
				$(document.body).adopt(new Element('script', {
					'type': 'text/javascript',
					'src' : substr.src
				}));
			}
			
			
			
		});
		
		// load the next bulk
		this.loadNextScript();
	}
	
	
});

window.addEvent('domready', function() {
	window['context'].onDomReady();
});
