// --------------------------------------------------------------------
// Author  : mashimonator
// Create  : 2009/07/22
// Update  : 2009/07/22
// Description : クロスブラウザでDOMContentLoadedのイベントリスナーを提供する
// --------------------------------------------------------------------

var clListener = {

	isAlreadyDetect : false,
	isAlreadyExec : false,
	funcList : [],

	//-----------------------------------------
	// DOMContentLoadedイベントで実行する関数を登録する
	//-----------------------------------------
	add : function( func ) {
		if ( clListener.isAlreadyExec ) {
			func.call();
		} else {
			clListener.funcList.push( function(){ return func.call(); } );
		}
	},

	//-----------------------------------------
	// DOMContentLoadedイベントを検知する
	//-----------------------------------------
	detectEvent : function() {
		// check
		if ( clListener.isAlreadyDetect ) {
			return;
		} else {
			clListener.isAlreadyDetect = true;
		}
		// detect
		if ( document.addEventListener ) {
			// for Mozilla, Opera and webkit
			document.addEventListener('DOMContentLoaded', function(){
				document.removeEventListener('DOMContentLoaded', arguments.callee, false);
				clListener.exec();
			}, false);
		} else if ( document.attachEvent ) {
			// for IE(iframe)
			document.attachEvent('onreadystatechange', function(){
				if ( document.readyState === 'complete' ) {
					document.detachEvent('onreadystatechange', arguments.callee);
					clListener.exec();
				}
			});
			// for IE
			if ( document.documentElement.doScroll && window == window.top ) (function(){
				if ( clListener.isAlreadyExec ) return;
				try {
					document.documentElement.doScroll('left');
				} catch( error ) {
					setTimeout(arguments.callee, 0);
					return;
				}
				clListener.exec();
			})();
		}
	},

	//-----------------------------------------
	// 登録された関数を実行する
	//-----------------------------------------
	exec : function() {
		if ( !clListener.isAlreadyExec ) {
			clListener.isAlreadyExec = true;
			if ( clListener.funcList ) {
				var len = clListener.funcList.length;
				for (var i = 0; i < len; i++) {
					clListener.funcList[i].apply();
				}
				clListener.funcList = null;
			}
		}
	}

}
clListener.detectEvent();
