/**
 * @namespace window.loader
 * @author patrickc   
 * @sdoc loader.sdoc
 * @version 4.1
 */

/** @id Loader */
function Loader(){
	// methods
	this.init				= Init;
	this.ie_oncontentready	= IE_oncontentready;
	this.run				= Run; 
	this.runOnLoad			= RunOnLoad; 
	this.runOnDOMLoad		= RunOnDOMLoad;
	this.logger				= new Logger;
	this.onload				= OnLoad;
	this.onDomReady = this.oncontentready 	= OnContentReady; 
	this.timer				= null;
	
	// parameters
	this.loaded 			= false;
	this.onDOMLoadMethods 	= new Array;
	this.onLoadMethods		= new Array;
	this.version			= 4.1;
	

	/** @id Loader.OnContentReady */
	function OnContentReady(mthd){
		if (document.addEventListener && !navigator.userAgent.toString().toLowerCase().match('khtml')) {
			document.addEventListener("DOMContentLoaded", mthd, false);
		} else {
	   		loader.onDOMLoadMethods[loader.onDOMLoadMethods.length] = mthd;
		}		
	}

	/** @id Loader.OnLoad */
	function OnLoad(mthd){
   		if (window.addEventListener) {
	       window.addEventListener("load", mthd, false);
 		} else if (window.attachEvent) {
			window.attachEvent('onload', mthd);				
		} else {
			loader.onLoadMethods[loader.onLoadMethods.length] = mthd;
		}
	}
	/** @id Loader.Init */
	function Init(){
   		if (window.attachEvent) {
			/*@cc_on @*/
			/*@if (@_win32)
				document.write('<scr'+'ipt defer src="javascript:void(0)" onreadystatechange="loader.ie_oncontentready(this)"></scr'+'ipt>');
			/*@end @*/
			window.attachEvent('onload', loader.runOnLoad );
		} else if (navigator.userAgent.toString().toLowerCase().match('khtml')){
			if (/WebKit/i.test(navigator.userAgent)) { 
				window.loader.timer = setInterval(function() {
					if (/loaded|complete/.test(document.readyState)) {
						clearInterval(window.loader.timer);
						window.loader.timer = null;
						loader.runOnDOMLoad();
					}
				}, 10);
			}	
		} else {
			window.onload = loader.runOnLoad;
		}
		this.loaded = true;
	}

	/** @id Loader.Run */
	function Run(methods,caller){
		if (!methods || !methods.length){return;}
		if (window.logger) logger.log('window.'+caller+' fired');
		methods.reverse();
		for (var i=methods.length-1;i>=0;i--){
			methods.pop()();
		}
	}

	/** @id Loader.RunOnLoad */
	function RunOnLoad(){
		if (window.logger) logger.log('window.onload fired');
		if (loader.onDOMLoadMethods && loader.onDOMLoadMethods.length>0){
			if (window.logger) logger.log('window.oncontentready failed so running now');
			loader.run(loader.onDOMLoadMethods,'onContentReady');
		}
		if (loader.onLoadMethods && loader.onLoadMethods.length>0){
			loader.run(loader.onLoadMethods,'onLoad');
		}
	}

	/** @id Loader.RunOnDOMLoad */
	function RunOnDOMLoad(){
		if (!loader.onDOMLoadMethods || !loader.onDOMLoadMethods.length){return;}
		loader.run(loader.onDOMLoadMethods,'onContentReady');
	}

	/** @id Loader.IE_oncontentready */
	function IE_oncontentready(obj){
		if (obj.readyState == 'complete' && document.getElementsByTagName('BODY') && document.getElementsByTagName('BODY')[0] && document.getElementsByTagName('BODY')[0].readyState == 'complete'){
			loader.runOnDOMLoad();
		} else if (obj.readyState == 'complete'){/* 
			somthing wrong with the HTML, possible active javascript alert, or javascript rebuilding page? 
			setInterval() timer here if you want to recheck, 
			methods will get run onLoad	*/
			if (window.logger) logger.log('window.onDOMload failed, falling back to onload');
		};		
	}


	/** @id Loader.Logger */		
	function Logger(){
		// methods
		this.log 			= Log;
		this.review 		= Review;
		this.reset 			= Reset;
		this.error			= _Error;
		// params
		this.functionList 	= new Array;
		this.debug			= true;
		
		function Log(f)
		{
			if (window.logger) logger.log(f);
			this.functionList.push(f);
		}
		function Review()
		{
			alert(this.functionList.join("\n"))
		}
		function Reset()
		{
			this.functionList = null;
			this.functionList = new Array;
		}
		function _Error(err,msg)
		{
			if (window.logger) logger.error(err,msg);
		}
	}	
}
window.loader = new Loader; 
window.loader.init();

