
////////////
// STATUS //
////////////

function Status(statusdiv, state, message){
	if (statusdiv.childNodes[0].id != "loading")
	{
		tmp  = "<div id='loading'><span class='ic'></span>";
		tmp += "<span class='tx'>Loading...</span></div>";
		statusdiv.innerHTML = tmp;
	}

	LoadingIcon = statusdiv.childNodes[0].childNodes[0];
	LoadingText = statusdiv.childNodes[0].childNodes[1];

	if (state == "loading")
	{
		LoadingIcon.style.backgroundImage = "url('img/_loading.gif')";
	} else if (state == "waiting")
	{
		LoadingIcon.style.backgroundImage = "url('img/_waiting.png')";
	} else if (state == "ok")
	{
		LoadingIcon.style.backgroundImage = "url('img/_ok.png')";
	} else if (state == "error")
	{
		LoadingIcon.style.backgroundImage = "url('img/_error.png')";
	}
	statusdiv.childNodes[0].childNodes[1].innerHTML = message;

}

///////////////////
// AJAX WRAPPERS //
///////////////////

var Ajax = new Object();
Ajax.channel_open=true;

Ajax.Request = function(fnc, xurl, meth, statusdiv)
{
	if (Ajax.channel_open)
	{
		Status(statusdiv, "loading", "[XHR] Sending request (Ajax.Request)");
		Ajax.channel_open=false;
		if (meth == "FetchBooks")
		{
			Ajax.Proper(fnc, xurl, Page.ParseBooks, statusdiv);
		} else if (meth == "FetchProjectsCloud")
		{
			Ajax.Proper(fnc, xurl, Page.ParseProjectsCloud, statusdiv);
		} else if (meth == "FetchProjectsSlide")
		{
			Ajax.Proper(fnc, xurl, Page.ParseProjectsSlide, statusdiv);
		}
	} else {
		var timedfnc="Ajax.Request(\""+fnc+"\",\""+xurl+"\",\""+meth+"\",\""+statusdiv+"\")";
		setTimeout(timedfnc, 5000);
		Status(statusdiv, "waiting", "[XHR] Channel closed. I'll retry in 5 seconds");
	}
}

Ajax.Proper = function(fnc, xurl, callbackMethod, statusdiv)
{
		Status(statusdiv, "loading", "[XHR] Sending request (Ajax.Proper)");
		var url="";
		if (fnc=="get")
		{
			url = 'common/responder.php?' + xurl; 
		} else if (fnc=="put")
		{
			//url = 'common/proxy.php?' + xurl;
		}
		Ajax.request = Ajax.createRequestObject();
		Ajax.request.onreadystatechange = callbackMethod;
		Ajax.request.open("POST", url, true);
		Ajax.request.setRequestHeader('Content-type', "text/html");
		Ajax.request.send(url);
		Status(statusdiv, "loading", "[XHR] Request sent (Ajax.Proper)");
}

Ajax.createRequestObject = function()
{
	var obj;
	if(window.XMLHttpRequest)
	{
		obj = new XMLHttpRequest();
	} else if(window.ActiveXObject)	{
		//obj = new ActiveXObject("MSXML2.XMLHTTP");
		obj = new ActiveXObject("Microsoft.XMLHTTP");
	}
	return obj;
}

Ajax.CheckReadyState = function(obj, statusdiv)
{
	if(obj.readyState == 0) {
		Status(statusdiv, "loading", "[XHR] Request sent [State "+obj.readyState+"] (Ajax.CheckReadyState)");
		}
	if(obj.readyState == 1 || obj.readyState == 2 || obj.readyState == 3) {
		Status(statusdiv, "loading", "[XHR] Fetching data [State "+obj.readyState+"] (Ajax.CheckReadyState)");
		}
	if(obj.readyState == 4)
	{
		if(obj.status == 200)
		{
			Status(statusdiv, "ok", "[XHR] Response received (Ajax.CheckReadyState)");
			return true;
		}
		else
		{
			Status(statusdiv, "error", "[XHR] "+obj.status+" (Ajax.CheckReadyState)");
		}
	}
}


/////////////////
// JSON PARSER //
/////////////////

// json2.js
// source: https://github.com/douglascrockford/JSON-js/blob/master/json2.js
// date: October 20, 2011

var JSON;if(!JSON){JSON={}}(function(){function str(a,b){var c,d,e,f,g=gap,h,i=b[a];if(i&&typeof i==="object"&&typeof i.toJSON==="function"){i=i.toJSON(a)}if(typeof rep==="function"){i=rep.call(b,a,i)}switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i){return"null"}gap+=indent;h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c<f;c+=1){h[c]=str(c,i)||"null"}e=h.length===0?"[]":gap?"[\n"+gap+h.join(",\n"+gap)+"\n"+g+"]":"["+h.join(",")+"]";gap=g;return e}if(rep&&typeof rep==="object"){f=rep.length;for(c=0;c<f;c+=1){if(typeof rep[c]==="string"){d=rep[c];e=str(d,i);if(e){h.push(quote(d)+(gap?": ":":")+e)}}}}else{for(d in i){if(Object.prototype.hasOwnProperty.call(i,d)){e=str(d,i);if(e){h.push(quote(d)+(gap?": ":":")+e)}}}}e=h.length===0?"{}":gap?"{\n"+gap+h.join(",\n"+gap)+"\n"+g+"}":"{"+h.join(",")+"}";gap=g;return e}}function quote(a){escapable.lastIndex=0;return escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b==="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function f(a){return a<10?"0"+a:a}"use strict";if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(a){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(a){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;if(typeof JSON.stringify!=="function"){JSON.stringify=function(a,b,c){var d;gap="";indent="";if(typeof c==="number"){for(d=0;d<c;d+=1){indent+=" "}}else if(typeof c==="string"){indent=c}rep=b;if(b&&typeof b!=="function"&&(typeof b!=="object"||typeof b.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":a})}}if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&typeof e==="object"){for(c in e){if(Object.prototype.hasOwnProperty.call(e,c)){d=walk(e,c);if(d!==undefined){e[c]=d}else{delete e[c]}}}}return reviver.call(a,b,e)}var j;text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}})()


