/** @fileoverview
 * Utility for registering events to fire when the content is loaded or after DOM update events.
 * @author Russ Tennant <russ@i2rd.com> 
 * @requires i2rd-util.js, logger.js
 */
if(typeof cmscl == 'undefined') {
cmscl = true;
if(typeof cms == 'undefined'){cms = {};}

cms.windowObservers = [];
cms.contentObservers = [];
cms._WE = cms._CE = null;
cms._onWLC = cms._onCLC = false;
cms.fireWindowLoadEvent = function(observer) {
	try { observer.call(null, cms._WE); } catch(e) {
		log4js.logger.error("Unable to call observer in cms.fireWindowLoadEvent", e);
	}
};
cms.fireContentLoadEvent = function(observer) {
	try { observer.call(null, cms._CE); } catch(e) {
		log4js.logger.error("Unable to call observer in cms.fireContentLoadEvent", e);
	}
};
// http://dean.edwards.name/weblog/2005/09/busted/
/** Execute the specified function on DOM load or after.
 * @param observer the observer to register.
 */
cms.executeOnContentLoadOrAfter = function(observer) {
	if(!observer){return;}
	if(cms._onCLC){cms.fireContentLoadEvent(observer);}
	else{cms.contentObservers.push(observer);}
};
cms._onContentLoad =  function(evt) {
	if(cms._onCLC){return;}
	cms._CE = evt || window.event;
	cms._onCLC = true;
	var o;
	//log4js.logger.info("Firing " + cms.contentObservers.length + " listeners. windowLoaded? " + cms._onWLC);
	while( (o = cms.contentObservers.pop()) ) {cms.fireContentLoadEvent(o);}
};
/**
 * Execute the specified function on window load or after.
 */
cms.executeOnWindowLoadOrAfter = function(observer) {
	if(!observer){return;}
	if(cms._onWLC) { cms.fireWindowLoadEvent(observer); }
	else { cms.windowObservers.push(observer); }
};
i2rd.addEvent(window, 'load', function(evt) {
	
	cms._WE = evt || window.event;
	// onContentLoad has not been called. Call it now.
	if(!cms._onCLC) {
		log4js.logger.debug("Firing onContentLoad late.");
		cms._onContentLoad(cms._WE);
	}
	cms._onWLC = true;
	var o;
	while( (o = cms.windowObservers.pop()) ) {
		cms.fireWindowLoadEvent(o);
	}
});


//OnContentLoad listener setup.
try {
	var ua = navigator.userAgent;
	if (document.addEventListener  && 
		(ua.match(/Firefox/) || ua.match(/SeaMonkey/)) ) {
		document.addEventListener("DOMContentLoaded", cms._onContentLoad, null);
	} else if(document.attachEvent &&  !window.opera) {
     document.write("<script id=__cmsOnContentLoad defer " + "src='//:'><\/script>");
     document.getElementById("__cmsOnContentLoad").onreadystatechange = function() {
         if (this.readyState == "complete") {
             this.onreadystatechange = null;
             cms._onContentLoad();
         }
     };
 } else {
		cms._timer = setInterval(function() {
         var drs = document.readyState;
			if ((drs && /complete|loaded/.test(drs))
			    || cms._onWLC) {
				clearInterval(cms._timer);
				delete cms._timer;
				cms._onContentLoad();
			}
		}, 10);
	}
} catch(e) {
	log4js.logger.error("Unable to setup oncontentload check.", e);
}

} // End conditional eval.