// 
//  loader.js
//  speed
//  
//  Created by A.S.Dietzel on 2009-06-17.
//  Copyright 2009 Dubizzle. All rights reserved.
// 
if ( "undefined" == typeof(L) || !L ) {
	var L = {};
}
L.addHandler = function(elem, type, func) { 
    if ( elem.addEventListener ) { 
        elem.addEventListener(type, func, false); 
    } 
    else if ( elem.attachEvent ) { 
        elem.attachEvent("on" + type, func); 
    } 
}; 

L.Script = {
	loadScript: function(url, onload) {
		L.Script.loadScriptDomElement(url, onload);
	},

	loadScripts: function(aUrls, onload) {
		// first pass: see if any of the scripts are on a different domain
		var nUrls = aUrls.length;
		var bDifferent = false;
		for ( var i = 0; i < nUrls; i++ ) {
			if ( L.Script.differentDomain(aUrls[i]) ) {
				bDifferent = true;
				break;
			}
		}

		// pick the best loading function
		var loadFunc = L.Script.loadScriptXhrInjection;
		if ( bDifferent ) {
			if ( -1 != navigator.userAgent.indexOf('Firefox') || 
				 -1 != navigator.userAgent.indexOf('Opera') ) {
				loadFunc = L.Script.loadScriptDomElement;
			}
			else {
				loadFunc = L.Script.loadScriptDocWrite;
			}
		}

		// second pass: load the scripts
		for ( var i = 0; i < nUrls; i++ ) {
			loadFunc(aUrls[i], ( i+1 == nUrls ? onload : null ), true);
		}
	},

	differentDomain: function(url) {
		if ( 0 === url.indexOf('http://') || 0 === url.indexOf('https://') ) {
			var mainDomain = document.location.protocol + 
				"://" + document.location.host + "/";
			return ( 0 !== url.indexOf(mainDomain) );
		}

		return false;
	},

	loadScriptDomElement: function(url, onload) {
		var domscript = document.createElement('script');
		domscript.src = url;
		if ( onload ) {
			domscript.onloadDone = false;
			domscript.onload = function() { 
				domscript.onloadDone = true; 
				onload(); 
			};
			domscript.onreadystatechange = function() {
				if ( "loaded" === domscript.readyState && !domscript.onloadDone ) {
					domscript.onloadDone = true;
					domscript.onload();
				}
			};
		}
		document.getElementsByTagName('head')[0].appendChild(domscript);
	},

	loadScriptDocWrite: function(url, onload) {
		document.write('<scr' + 'ipt src="' + url + 
					   '" type="text/javascript"></scr' + 'ipt>');
		if ( onload ) {
			// we can't tie it to the script's onload, so use window
			// thus, it doesn't fire as early as it might have
			L.addHandler(window, "load", onload);
		}
	},

	queuedScripts: new Array(),

	loadScriptXhrInjection: function(url, onload, bOrder) {
		var iQueue = L.Script.queuedScripts.length;
		if ( bOrder ) {
			var qScript = { response: null, onload: onload, done: false };
			L.Script.queuedScripts[iQueue] = qScript;
		}

		var xhrObj = L.Script.getXHRObject();
		xhrObj.onreadystatechange = function() { 
			if ( xhrObj.readyState == 4 ) {
				if ( bOrder ) {
					L.Script.queuedScripts[iQueue].response = xhrObj.responseText;
					L.Script.injectScripts();
				}
				else {
					var se = document.createElement('script');
					document.getElementsByTagName('head')[0].appendChild(se);
					se.text = xhrObj.responseText;
					if ( onload ) {
						onload();
					}
				}
			}
		};
		xhrObj.open('GET', url, true);
		xhrObj.send('');
	},

	injectScripts: function() {
		var len = L.Script.queuedScripts.length;
		for ( var i = 0; i < len; i++ ) {
			var qScript = L.Script.queuedScripts[i];
			if ( ! qScript.done ) {
				if ( ! qScript.response ) {
					// STOP! need to wait for this response
					break;
				}
				else {
					var se = document.createElement('script');
					document.getElementsByTagName('head')[0].appendChild(se);
					se.text = qScript.response;
					if ( qScript.onload ) {
						qScript.onload();
					}
					qScript.done = true;
				}
			}
		}
	},

	getXHRObject: function() {
		var xhrObj = false;
		try {
			xhrObj = new XMLHttpRequest();
		}
		catch(e){
			var aTypes = ["Msxml2.XMLHTTP.6.0", 
						  "Msxml2.XMLHTTP.3.0", 
						  "Msxml2.XMLHTTP", 
						  "Microsoft.XMLHTTP"];
			var len = aTypes.length;
			for ( var i=0; i < len; i++ ) {
				try {
					xhrObj = new ActiveXObject(aTypes[i]);
				}
				catch(e) {
					continue;
				}
				break;
			}
		}
		finally {
			return xhrObj;
		}
	}
};

