
self.loadjsPacks = {
	'darf': { test: function(){
		return self.darf && typeof self.darf.getKeks == 'function';
	} },
	'gapi': { test: function(){
		return typeof gAPIclientClass == 'function';
	} },
	'favos': { dep: [ 'darf', 'gapi' ],
		file: "favos--r15008.js"
	}
};


self.loadjs = (function(){
	var baseUrl = (function(){
		var scripts = document.getElementsByTagName('script');
		for (var i=scripts.length-1; i>=0; i--) {
			if (scripts[i].src) {
				var match = scripts[i].src.match(/^(.*)js\/load(|--r[0-9]+)\.js/);
				if (match && match[1]) {
					return match[1];
				}
			}
		}
	})() || '/';
	
	var loaded = [];
	function loadScriptSrc (scriptUrl, asyncWait, callback) {
		var scriptNode = document.createElement("script");
		scriptNode.setAttribute("type", "text/javascript");
		scriptNode.setAttribute("language", "JavaScript");
		scriptNode.setAttribute("src", scriptUrl);
		if (callback) {
			scriptNode.onload = scriptNode.onreadystatechange = function() {
				if ((!scriptNode.readyState) || scriptNode.readyState == "loaded" || scriptNode.readyState == "complete" || scriptNode.readyState == 4 && scriptNode.status == 200) {
					if (asyncWait > 0) {
						setTimeout(callback, asyncWait);
					}
					else {
						callback();
					}
				}
			}
		}
		var headNode = document.getElementsByTagName("head")[0];
		headNode.appendChild(scriptNode);
	}
		
	var loadjs = function (jsname, callback){
		if (loaded.indexOf(jsname) >= 0) {
			callback();
			return;
		}
		console.info('loadjs(',arguments,')');
		var pack = self.loadjsPacks[jsname] || null;
		if (!pack) throw 'loadjs: pack "'+jsname+'" is unknown!';
		
		// first check for dependencies
		if (typeof pack.dep != 'undefined') {
			for (var i=0; i<pack.dep.length; i++) {
				if (loaded.indexOf(pack.dep[i]) < 0) {
					loadjs(pack.dep[i], function(){
						loadjs(jsname, callback);
					});
					return;
				}
			}
		}
		
		// are there any tests?
		if (typeof pack.test != 'undefined') {
			var tests = pack.test instanceof Array ? pack.test : [pack.test];
			var testsPassed = 0;
			for (var i=0; i<tests.length; i++) {
				var t = tests[i];
				var test = function() { return t };
				if (typeof t == 'string' ) {
					test = function() {
						return !(eval( 'typeof '+ t ) == 'undefined' && document.getElementById(t) == null);
					}
				}
				else if (typeof t == 'function' ) {
					test = t;
				}
				var testresult = test();
				if ( !(testresult === false || typeof testresult == "undefined" || testresult == null) ) {
					testsPassed++;
				}
			}
			// all tests passed! so just execute the callback
			if (testsPassed == tests.length) {
				loaded.push(jsname);
				callback();
				return;
			}
		}
		
		// just
		pack.url = pack.url || (baseUrl + 'js/' + (pack.file || jsname+'.js') );
		console.info('pack.url = ', pack.url);
		loadScriptSrc(pack.url, 0, function(){
			loaded.push(jsname);
			callback();
		});
	}
	
	// initialy load these...
	if (self.loadjs_ && self.loadjs_.length) {
		console.info('loadjs: initialy load: ', self.loadjs_);
		for (var i=0; i<loadjs_.length; i++) {
			loadjs.apply(this,loadjs_[i]);
		}
	}
	
	var queue = [];
	var inQueue = false;
	var queuedLoadJs = function(){
		if (inQueue || queue.length == 0) return;
		inQueue = true;
		var args = queue.shift(),
			jsname = args[0],
			callback = args[1];
		loadjs(jsname, function(){
			inQueue = false;
			setTimeout(function() { callback(); }, 0);
			queuedLoadJs();
		});
	}
	return function(jsname, callback){
		queue.push(arguments);
		queuedLoadJs();
	};
})();



