/*
Laadt jsType projecten in een browser
*/
(function(){
	//onerror=function(Description,URL,Line,Column,File){alert(Description)};
	var
		d=document,
		scripts=d.getElementsByTagName('script'),
		thisScript=scripts[scripts.length-1],
		gpjsRoot,
		incScript=function(n){d.write('<script src="'+n+'"></script>')},
		at=function(n){return thisScript.getAttribute('data-'+n)},
		run=at('run'),
		w=window,
		ie=d.createEventObject?w.JSON?8:w.XMLHttpRequest?7:6:0,//6=minimum ondersteund, 7=ook IE8 compatibility mode, 8=8 en hoger
		op=w.opera?opera.version():0,
		//TODO: class maken tbv runtime toevoegen van custom typeloaders aan jsType
		//bedoeld voor fixes maar ook voor laden van subprojecten, externe libraries en RPC's
		//een typeloader kan bepalen tot welke namespaces een subproject toegang heeft
		browserFixes=function(n){
			switch(n){
				case 'gpjs.browser._Event':
				case 'gpjs.browser._DOM':
					if (ie) return n+'_IE';
				/*
				break;
				case 'Canvas':return ie?n:false;//IECanvas
				case 'Console':return w.console?false:n;
				case 'JSON':return w.JSON?false:n;
				//Stylesheets, Flash, Google, jQuery, Gears...
				//HTML5 audio en video tags (en API) emuleren via Flash?
				*/
			}
			return n;
		},
		customLoaders=function(n){
			var path=n.split('.');
			var top=path.shift();
			switch(top){
				case 'import': return path.join('.');
				case 'google':
					var module=path.shift();
					if (module=='libs'||module=='analytics') return;
					//todo: https protocol
					if (!customLoaders.google) incScript((customLoaders.google='http://maps.google.com/')+'jsapi'+(jsType.googleAPIkey?'?key='+jsType.googleAPIkey:''));//checken voor eenmalig?
					jsType(n,function(){return eval(n)});
					//todo: globale settings voor language, sensor en css inladen
					//todo: https afvangen
					//standaard wordt laatste versie geladen die op moment van schrijven beschikbaar is, hogere versies later ondersteunen via extra namespace
					return customLoaders.google+(module=='maps'?'maps/api/js?sensor=true':'jsapi?file='+module+'&v=1');
			}
		}
	;
	if (!run) throw new Error('no "data-run" attribute specified');
	if (w.console){
		jsType_trace=function(v){console.log(v)};//als console niet beschikbaar is wordt er ook niet getraced
		if (console.clear) console.clear();//moet ergens anders staan maar staat tot nu toe effe hier zodat IE niet vol loopt.
	}
	if (thisScript.src.slice(thisScript.src.length-3)=='.js'){
		gpjsRoot=thisScript.src.slice(0,thisScript.src.lastIndexOf('/')+1);
		jsType_ie=ie;
		jsType_op=op;
		jsType_load=function(n){
			incScript(customLoaders(n)||gpjsRoot+'types/'+browserFixes(n).replace(/\./g,'/')+'.js');
		};
		incScript(gpjsRoot+'jsType.js');
		jsType_load(run);
	}
	else{
		var browserInfo='&browser=bla';//TODO: browserFixes resultaat in querystring zetten zodat dit serverside kan worden gebruikt
		incScript(thisScript.src+'?run='+run+browserInfo);
	}
	//document.write('<script src="jsType.js"></script><script src="types/'+thisScript.getAttribute('data-run')+'.js"></script>');
	//alternatief voor onload: aantal requirements tellen en steeds na laden -1. zodra 0: run
	//maar dan moet er eerst wel iets worden uitgewerkt voor werken met externe dependencies (google)
	onload=function(){jsType.run(run)};
})()