/**			 
 * SHAJ Sync Html And Javascript
 * thanks to www.gizax.it, Daniele Florio
 * Based on ahah.js code this improve try to give it "multi request" per time
 * by creating a stack of call to XMLHTTP object
 *
 * @author		Tesei Valerio, www.mojodo.it
 * @version		0.2
 * @license		GNU/GPL
 */
function SHAJ()
{
	this.LoadingImage = null;
	this.LoadingText = null;
	this.ExecJavascript = true;
	this.SHAJStack = new Array();
	this.XHObj = null;
	// insert a request into the array
	this.EXEC_RUNNING = false; // is the array processed?
	this.LAST_CALL_ENDED = true;// last shaj call is finished?
	/**
	 * inserisce un link nello stack Ajax
	 * @param {String} PageLink
	 * @param {String} QueryString
	 * @param {String} ResultDIV
	 * @param {String} UserAction
	 * @param {String} Method
	 */
	
	this.callLink = function (PageLink, QueryString, ResultDIV, UserAction,Method)
	{
		if(!PageLink)
			return;
		obj = new SHAJObject();
		obj.link = PageLink;
		obj.querystring = QueryString;
		obj.result = ResultDIV;
		obj.useraction = UserAction;
		if(Method.toUpperCase()  == 'POST')
			obj.method = 'POST';
		else
			obj.method = 'GET';
		obj.XHReq = this.XMLHTTP();
		this.SHAJStack.push(obj);
		// if function that execute url calls is stopped
		this.LAST_CALL_ENDED=false;
		if(!this.EXEC_RUNNING)
			this.exec();
	}
	this.exec = function()
	{
		//document.body.style.cursor = 'wait';
		this.EXEC_RUNNING = true;
		while(this.SHAJStack.length>0)
		{
			var element = this.SHAJStack.pop();
			this.execRequest(element);
		}
		this.EXEC_RUNNING = false;
		this.LAST_CALL_ENDED=true;
	}
	this.execRequest = function(SHAJObj)
	{
		this.setLoading(SHAJObj.result);
		var XH = SHAJObj.XHReq;
		if(XH)
		{
			method = SHAJObj.method;
			if(SHAJObj.querystring != "" && SHAJObj.method.toUpperCase()=="GET")
				link = SHAJObj.link +"?"+ SHAJObj.querystring;
			else
				link = SHAJObj.link
			XH.onreadystatechange = function()
			{
				SHAJUtils.Done(SHAJObj.link, SHAJObj.result,SHAJObj.XHReq,SHAJObj.useraction);
			} 
			XH.open(method, link, true);
			if(SHAJObj.method.toUpperCase()=="POST")
			{
				XH.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				XH.send(SHAJObj.querystring);	
			} else {
				XH.send("");
			}
		}
	}
	this.setLoading = function(div)
	{
		div = document.getElementById(div);
		if(this.LoadingText!=null || this.LoadingImage != null)
		{
			var text;
			text = '<div style="text-align:center;">'
			if(this.LoadingImage != null)
				text += '<img src="'+this.LoadingImage+'" border="0" /><br />';
			if(this.LoadingText != null)
				text += this.LoadingText
			text += '</div>';
			div.innerHTML = text;
		}
	}
	this.XMLHTTP = function()
	{
		if (window.XMLHttpRequest)
			return new XMLHttpRequest();
		if (window.ActiveXObject)
			return new ActiveXObject("Microsoft.XMLHTTP");
	}
}
var SHAJUtils = 
{
	Done: function (url,result,XHReq, execJS, callbackFunction)
	{
		if(XHReq.readyState==4 && XHReq.status == 200)
		{
			div = document.getElementById(result);
			div.innerHTML = XHReq.responseText;
			//if(execJS)
			this.executeJS(XHReq.responseText);
			if(callbackFunction!="" && callbackFunction!=null)
				eval(callbackFunction);
		}		
		else if(XHReq.readyState==4)
			div.innerHTML = "Unable to process request for url: "+url;
	},
	executeJS: function (element)
	{
		//dichiaro un elemento div
		var jElement = document.createElement("div");
		//ci carico all'interno il risultato della chiamata asincorna
		jElement.innerHTML = "_"+element+"_";
		//ottengo la lista dei tag <script>
		var jsList = jElement.getElementsByTagName('SCRIPT');
		var toEval = "";
		//per orgni <script> trovato
		for(i=0;i<jsList.length;i++)
		{
			// ie >6 && ff >2 && safari
			if(jsList[i].innerHTML)
				toEval=jsList[i].innerHTML;
			//ie < 4 && ff <2
			else if(jsList[i].innerText)
				toEval=jsList[i].innerText;
			// opera > 2 && safari
			else if(jsList[i].text)
				toEval=jsList[i].text;
			// safari
			else if(jsList[i].textContent)
				toEval=jsList[i].textContent;
			if(toEval!="") {
				try { 
					// eseguo le chiamate js contenute in to eval
					eval(toEval);
				}
				catch(ex) {
					// niente
					//alert(ex);
				}
				toEval = "";
			}
		}
	}
}
function SHAJObject()
{
	var link; // link to load
	var querystring; //querystring to pass it
	var result; //where you what to see html page?
	var useraction;//user action
	var method="GET";//GET or POST
	var XHReq = null;
}
function SHAJSubmit(formname,action,resultDiv){
	// 2do: aggiungere tutti i campi del dom in maniera sistematica.
	var form = document.getElementById(formname);
	var querystring = '';
	var method = form.method;
	for (var idx = 0; idx < form.length; idx++) {
		var FElement = form.elements[idx];
		var type = FElement.type;
		//DEBUG: alert(FElement.name+'='+FElement.type);
		switch(type.toLowerCase()) {
			case 'radio': // radio e checkbox must be passed only if set
			case 'checkbox':
				if(FElement.checked) {
					querystring += FElement.name + '=' + FElement.value+'&';
				}
				break;
			case 'select-multiple':
				var selected  =new Array();
				var array_string = '';
				for (var i = 0; i < FElement.options.length; i++) {
					if (FElement.options[i].selected) 
						querystring += FElement.name + '=' + FElement.options[i].value +'&';
				}
			case 'submit':
				break;
			default: // all others fields type got .value :D
				querystring += FElement.name + '=' + FElement.value+'&';
				break;
		} 
	}
	querystring += 'SHAJSUBMIT'; // identify a SHAJSUBMIT
	//DEBUG: alert(querystring);
	if(method.toLowerCase() == 'GET') {
		shajObj.callLink(action+'?'+querystring,'',resultDiv,'','GET')
	} else {
		shajObj.callLink(action,querystring,resultDiv,'','POST');
	}
}
var shajObj = new SHAJ();
