// Even Faster Web Sites - Steve Souders
var scriptLoader = {};
scriptLoader.Script = {
	loadScript: function(url, onload) {
		scriptLoader.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 ( scriptLoader.Script.differentDomain(aUrls[i]) ) {
				bDifferent = true;
				break;
			}
		}

		// pick the best loading function
		var loadFunc = scriptLoader.Script.loadScriptXhrInjection;
		if ( bDifferent ) {
			if ( -1 != navigator.userAgent.indexOf('Firefox') || -1 != navigator.userAgent.indexOf('Opera') ) {
				loadFunc = scriptLoader.Script.loadScriptDomElement;
			}
			else {
				loadFunc = scriptLoader.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() { 
				if ( !domscript.onloadDone ) {
					domscript.onloadDone = true; 
					onload(); 
				}
			};
			domscript.onreadystatechange = function() {
				if ( ( "loaded" === domscript.readyState || "complete" === 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
			_UTIL_addEvent(window, "load", onload);
		}
	},

	queuedScripts: new Array(),

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

		var s = new AjaxService();
		s.setURL(url);
		s.setDelegate(function (r){
			if ( bOrder ) {
				scriptLoader.Script.queuedScripts[iQueue].response = r;
				scriptLoader.Script.injectScripts();
			}
			else {
				var se = document.createElement('script');
				document.getElementsByTagName('head')[0].appendChild(se);
				se.text = r;
				if ( onload ) {
					onload();
				}
			}
		});
		s._method = "GET";
		s.callService();
	},

	injectScripts: function() {
		var len = scriptLoader.Script.queuedScripts.length;
		for ( var i = 0; i < len; i++ ) {
			var qScript = scriptLoader.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;
				}
			}
		}
	}
};
