var WEBKIT = Browser.Engine.webkit;
var GECKO = Browser.Engine.gecko;
var OPERA = Browser.Engine.presto;
var IE = Browser.Engine.trident;
var IE6 = (navigator.userAgent.toLowerCase().indexOf('msie 6') != -1) && (navigator.userAgent.toLowerCase().indexOf('msie 7') == -1);

var header = "#header";
var content = ".content";
var footer = ".footer";
var loader = ".loader";
var error = "#error";
var loadingQueue = new Array();
var hash=new hashManager();
var hashTimer=null;
var loadTimer=null;

window.addEvent("domready", function(){
    if (IE6) {
        /*
         * if IE6 stop loading the website and show error
         */
        loadHTML("ie6.html", error, "loadError");
    }
    else {
        /*
         * load site structures
         * put standard structures into queue
         * callback is for calling document.ready JS after ajax load for each particular content
         */
        var target = {};
        target.page = "header.html";
        target.element = header;
		target.callback = "initHeader";
		target.hash = "";
        loadingQueue.push(target);
		
        target = {};
		if (hash.get() == null) {
			target.page = "home.html";
			target.element = content;
			target.callback = "initContent";
			target.hash = "home";
		}
		else
		{
			target.page = hash.get()+".html";
			target.element = content;
			target.callback = "initContent";
			target.hash = hash.get();
		}
        loadingQueue.push(target);
		
        target = {};
        target.page = "footer.html";
        target.element = footer;
		target.callback = "";
		target.hash = "";
        loadingQueue.push(target);
		
        phaseLoad();
		
		hashTimer=setInterval("hash.sync()",500);
		loadTimer=setInterval("phaseLoad()",500);	
    }
});

/*
 * load a specific page
 */
function loadPage(page)
{
	loadHTML(page+".html",content,"initContent",page);
};

/*
 * load the targeted page.html into specified DOM element, and call callback function if mentioned
 */
function loadHTML(page, target, callback, newHash){
	if (newHash!="")
	{
		hash.set(newHash);
	}
	loadShow();
    var targetElement = $$(target);
    var request = new Request.HTML({
        url: "" + page,
        onSuccess: function(html){
			targetElement.set('html','');
            $$(target).adopt(html);
			if (typeof window[callback] === "function") {
				window[callback]();
			}
			loadHide();
        },
        onFailure: function(){
			loadHide();
        }
    }).send();
}

/*
 * ajax loading phase
 * get all queued requests and load them 
 */
function phaseLoad(){
    if (loadingQueue.length > 0) {
        var target = loadingQueue.pop();
        loadHTML(target.page, target.element, target.callback, target.hash);
        if (loadingQueue.length > 0) {
            phaseLoad();
        }
    }   
}

function loadShow()
{
	$$("#loader").fade("in");
}
function loadHide()
{
	$$("#loader").fade("out");
}
function loadError()
{
	$$("#errorWrapper").setStyle(
		"display","block");
}

function hashManager(){
	this.currentHash=null;
	if ((window.location.hash != "")&&(window.location.hash != "#null")) {
		this.currentHash=window.location.hash;
		this.currentHash=removeHashMark(this.currentHash);
	}
	
	this.get=function get(){
		if ((this.currentHash=="")||(this.currentHash==null)||(this.currentHash=="#null"))
		{
			return null;
		}
		return this.currentHash;
	}
	this.set=function set(newHash){
		if (newHash != "") {
			this.currentHash = newHash;
			this.currentHash=removeHashMark(this.currentHash);
		}
		if ((this.currentHash!=null)&&(this.currentHash != window.location.hash)) {
			window.location.hash = "#" + this.currentHash;
		}
	};
	
	this.sync=function(){
		if ((window.location.hash != "")&&(window.location.hash != "#null")) {
			if ("#" + this.currentHash != window.location.hash) {
				this.currentHash = window.location.hash;
				this.currentHash=removeHashMark(this.currentHash);
				
				var target = {};
		        target.page = this.currentHash + ".html";
		        target.element = content;
				target.callback = "initContent";
				target.hash = this.currentHash;
		        loadingQueue.push(target);
			}
		}
	};
	function removeHashMark(field)
	{
		if (field[0] == "#") {
			return field.substring(1, field.length);
		}
		return field;
	}
}