//define global variables
var $debug		= false;
var $pageLoaded		= false;
var $injectActive	= false;
var $injectQueue	= [];
var $controlQueue	= [];
var $loadEvents		= [];
var $debugMessages	= [];

// inject external scripts
inject('/scripts/php.js');
inject('/scripts/chi.js');
inject('/scripts/form.js');
inject('/scripts/ajax.js');


/*
window.onload = function () {
	debugMsg('PAGE LOADED!');
	//$pageLoaded = true;
	//chi.create();
};
*/

window.onDomReady = function(fn) {
	//W3C-compliant browser
	if(document.addEventListener) {
		document.addEventListener("DOMContentLoaded", fn, false);
	}
	//IE
	else {
		document.onreadystatechange = function() {
			if ((/loaded|complete/).test(document.readyState)) {
				fn();
			}
		}
	}
};

function domReady() {
	debugMsg('DOM READY!');
	$pageLoaded = true;
	chi.create();
};
      

//execute as soon as DOM is loaded
window.onDomReady(domReady);

document.getElementsByAttribute = function($attrValue, $attrName) {
	var $attrName	= $attrName || 'class';
	var $elements	= this.getElementsByTagName('*');
	var $result		= [];
	for (var $i = 0; $i < $elements.length; $i++) {
		var $element = $elements[$i];
		if ($element.getAttribute($attrName) == $attrValue) {
			$result.push($element);
		}
	}
	return $result;
};

function $() {
	var $result = [];
	for (var $i = 0; $i < arguments.length; $i++) {
		var $arg = arguments[$i];
		$element = (typeof $arg == 'string')
			? document.getElementById($arg)
			: $arg;

		$result.push($element);
	}
	
	$result = ($result.length == 1)
		? $result[0]
		: $result;

	return $result;
};

function debugMsg($msg, $type) {
	$debugMessages.push(debugMsg.arguments);
	if (typeof window.date == 'function' && $debug) {
		while ($debugMessages.length > 0) {
			var $args	= $debugMessages.shift();
			var $msg	= $args[0];
			var $type	= $args[1] || 'hint';
			var $target	= $('debug' + ucfirst($type) + 's') || null;
			if ($target != null) {
				$target.innerHTML += '<b>['+date('H:m:s', microtime(true))+'] js:</b> ' + $msg + '<br>';
				if ($msg == 'clear') {
					$target.innerHTML = '';
				}
			}
		}
	}
};

function addLoadEvent($loadEvent) {
	//debugMsg('queueing: ' + $loadEvent);
	$loadEvents.push($loadEvent);
	//debugMsg('-'+$loadEvents.join("<br>"));
};

function executeLoadEvents() {
	while ($loadEvents.length > 0) {
		var $loadEvent = $loadEvents.shift();
		
		if (typeof $loadEvent == 'function') {
			//debugMsg('executing: XXX');
			$loadEvent();
		}
		else {
			//debugMsg('executing: ' + $loadEvent);
			eval($loadEvent);
		}
	}
};

// Inject JS & CSS directly as DOM elements
function inject($file, $instances) {
	var $instances	= inject.arguments[1] || false;
	var $chrPos		= { '.': $file.lastIndexOf('.'), '/': $file.lastIndexOf('/') };
	var $fileName	= $file.substring($chrPos['/'] + 1, $chrPos['.']);
	var $fileExt	= $file.substring($chrPos['.'] + 1);
	var $injectId	= $fileName+'.'+$fileExt;
	
	$injectActive = ($injectQueue.length > 0)
		? $injectActive
		: false;
	
	if ($injectActive == true && $fileExt == 'js') {
		//debugMsg('injectQueue: ' + $file);
		$injectQueue.push($file);
	}
	else {
		if ($($injectId) == null) {
			//debugMsg('injecting: ' + $injectId);
			
			var $elementTag	  = ($fileExt == 'js') ? 'script' : 'link';
			var $injectObject = document.createElement($elementTag);
			$injectObject.id  = $injectId;
			
			switch ($fileExt) {
				case 'js':
					$injectActive		= true;
					$injectObject.type	= 'text/javascript';
					$injectObject.src 	= $file;
					
					if (document.addEventListener) {
						$injectObject.onload = function() {
							initControl($injectId, $fileName, $instances);
						}
					}
					else {
						$injectObject.onreadystatechange = function(){
							if ((/loaded|complete/).test($injectObject.readyState)) {
								initControl($injectId, $fileName, $instances);
							}
						}
					}
					break;
				case 'css':
					$injectObject.rel  = 'stylesheet';
					$injectObject.type = 'text/css';
					$injectObject.href = $file;
					break;
			}
			
			document.getElementsByTagName('head')[0].appendChild($injectObject);
		}
	}
};

function initControl($injectId, $fileName, $instances) {
	debugMsg('initializing: ' + $injectId);
	if (window.chi && chi[$fileName]) {
		$fileName = 'chi.'+$fileName;
	}
	
	eval('var $class = window.'+$fileName+' || null;')
	
	if ($class && typeof $class.init == 'function') {
		if ($instances) {
			for (var $i in $instances) {
				var $instance = $instances[$i];
				$class[$instance] = $class;
				window.addLoadEvent($fileName+'.'+$instance+'.init("'+$instance+'")');	
			}
		}
		else {
			window.addLoadEvent($fileName+'.init()');	
		}
		//debugMsg('initializing: ' + $injectId);
	}

	if ($injectQueue.length > 0) {
		var $injectFile = $injectQueue.shift();
		window.inject($injectFile);
	}

	if ($pageLoaded) {
		debugMsg('fireLoadEvents');
		executeLoadEvents();
	}
	
	$injectActive = false;
}

// create xmlRequest-Object
function xmlRequest() {
	var $result = false;
	if (window.XMLHttpRequest) {
		$result = new XMLHttpRequest();
	}
	else if (window.ActiveXObject) {
		try {
			$result = new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch (e) {
			try {
				$result = new ActiveXObject('Microsoft.XMLHTTP');
			}
			catch (e) {}
		}
	}
	return $result;
};

function executeRequest($reqUrl, $reqVars, $aSync) {
	var $result = false;
	var $aSync  = $aSync || false;

	if ($result = xmlRequest()) {
		var $reqType = ($reqVars == null) ? 'get' : 'post';
		$result.open($reqType, $reqUrl, $aSync);
		$result.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		$result.send($reqVars);
	}

	return $result;
};