var jsLayout = {base:"js/"};

jsLayout.execInterval = null;
jsLayout.depends = new Array();
jsLayout.depends.add = function(dep) {
	for (var i = 0; i < this.length; i++)
		if (this[i] == dep)
			return;
	this.push(dep);
}
jsLayout.includes = new Array();
jsLayout.includes.containsAll = function(arry) {
	for (var i = 0; i < arry.length; i++)
		if (!this.contains(arry[i]))
			return false;
	return true;
}
jsLayout.includes.contains = function(str) {
	for (var i = 0; i < this.length; i++)
		if (this[i] == str)
			return true;
	return false;
}
jsLayout.execQueue = new Array();

jsLayout.includes.contains = function (needle) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == needle)
			return true;
	}
	return false;
}

/**
 * Navigator methods
 */
jsLayout.navigatorIsMSIE = function() {
	return (navigator.appName == "Microsoft Internet Explorer") || (navigator.userAgent.indexOf('MSIE') != -1);
}
jsLayout.navigatorIsFirefox = function() {
	return (navigator.userAgent.indexOf('Firefox') != -1);
}
jsLayout.navigatorIsUnknown = function() {
	if (jsLayout.navigatorIsMSIE())
		return false;
	if (jsLayout.navigatorIsFirefox())
		return false;
	// add other tests here as additional browsers are tested
	return true;
}
jsLayout.getNavigatorVersion = function() {
	if (this.navigatorIsMSIE()) {
		return parseFloat(navigator.userAgent.substring(navigator.userAgent.indexOf('MSIE') + 4));
	}
	
	if (this.navigatorIsFirefox()) {
		return parseFloat(navigator.userAgent.substring(navigator.userAgent.indexOf('Firefox') + 7 + 1));
	}
	return 0;
}

jsLayout.getInnerWidth = function() {
	if (jsLayout.navigatorIsMSIE()) {
		if ((document.documentElement) && (document.documentElement.clientWidth > 0)) {
			return document.documentElement.clientWidth;
		}
		return document.body.clientWidth;
	} else if (jsLayout.navigatorIsFirefox()) {
		return window.innerWidth;
	} else {
		// default behaviour should conform to standards
		return window.innerWidth;
	}
}

jsLayout.getInnerHeight = function() {
	if (jsLayout.navigatorIsMSIE()) {
		if ((document.documentElement) && (document.documentElement.clientHeight > 0)) {
			return document.documentElement.clientHeight;
		}
		return document.body.clientHeight;
	} else if (jsLayout.navigatorIsFirefox()) {
		return window.innerHeight;
	} else {
		// default behaviour should conform to standards
		return window.innerHeight;
	}
}

jsLayout.randomizeURL = function (url) {
	var rand = Math.round(Math.random() * 1000000000);
	if (url.indexOf('?') == -1)
		url += "?.rand=" + rand;
	else
		url += "&.rand=" + rand;
	return url;
}


jsLayout.getXMLHTTPRequest = function () {
	var XMLHttp=null
	if (window.XMLHttpRequest) {
		XMLHttp=new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		XMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
	}
	return XMLHttp;
}



jsLayout.require = function(url) {
	this.depends.add(url);
	var randurl = this.randomizeURL(this.base + url);	
	var xmlhttp = this.getXMLHTTPRequest();
	xmlhttp.onreadystatechange = function() {
		if ((xmlhttp.readyState == 4) || (xmlhttp.readyState == "complete")) {
			eval(xmlhttp.responseText);
			jsLayout.includes.push(url);
		}
	}
	xmlhttp.open("GET",randurl,true);
	xmlhttp.send(null);
    return false;
}

jsLayout.requireOnce = function(url) {
	if (!this.includes.contains(url)) {
		this.require(url);
	}
	return false;
}

jsLayout.execute = function() {}

jsLayout.commit = function() {
	if (jsLayout.includes.containsAll(jsLayout.depends)) {
			eval("jsLayout.execute()");
	} else {
		setTimeout(jsLayout.commit,1000);
		}
}