/** @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) {
		cms._onContentLoad(cms._WE);
		try{ if(typeof console != 'undefined') console.log("Fired onContentLoad late."); }catch(e){}
	}
	cms._onWLC = true;
	var o;
	while( (o = cms.windowObservers.pop()) ) {
		cms.fireWindowLoadEvent(o);
	}
});


//OnContentLoad listener setup.
try {
	var ua = navigator.userAgent;
	if (document.addEventListener) document.addEventListener("DOMContentLoaded", cms._onContentLoad, false);
	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();
			}
		};
	}
} catch(e) {log4js.logger.error("Unable to setup oncontentload check.", e);}

} // End conditional eval.
