function ask (page,answer_target,noEval,mode) {
	var self=this;
	var request=Object();
	var data=Array();
	var copt=Array();
	data= {
		p : page,
		t : answer_target,
		noEval : noEval,
		smode : !mode
	}
	self.sEval='<script type="text/javascript">';
	self.eEval='</script>';
	if (document.all) var ie=true;
	else var ie=false;

	self.wait_callback=function(s) {
		return true;
	}
	self.error_callback=function(p,d) {
		return true;
	}
	self.before_load_callback=function() {
		return true;
	}
	self.after_load_callback=function() {
		return true;
	}
	self.receive_callback=self.substitute_action;
	self.evalCode=function (text) {
		try {
			var trt=false;
			start=text.search(self.sEval);
			end=text.search(self.eEval);
			if (start!=-1 && end!=-1) trt=text.slice(start+self.sEval.length,end);
			if (trt) eval (trt);
			return trt;
		}
		catch (e) {}
	}
	self.set_header=function(name,value) {
		request.setRequestHeader(name, value);
	}
	self.set_send_mode=function(cmethod,cmode) {
		switch (cmethod) {
			case 'post':
				data['method']='POST';
			break;
			case 'get':
			case null:
			case false:
			default:
				data['method']='GET';
			break;
		}
		switch (cmode) {
			case 'async':
			case null:
			case false:
				data['smode']=true;
			break;
			case 'sync':
			default:
				data['smode']=false;
			break;
		}
	}
	self.set_receive_mode=function(m,evalStatus) {
		switch (m) {
			case 'append':
			case 'append_after':
				self.receive_callback=self.append_action;
			break;
			case 'append_before':
				self.receive_callback=self.append_before_action;
			break;
			case 'none':
				self.receive_callback=function() {return true};
			break;
			case 'default':
			case null:
			case false:
			default:
				self.receive_callback=self.substitute_action;
			break;
		}
		switch (evalStatus) {
			case 'eval':
			case 'y':
			case '1':
			case null:
			case false:
				data['noEval']=false;
			break;
			case 'noeval':
			case 'n':
			case '0':
			default:
				data['noEval']=true;
			break;
		}
	}
	self.substitute_action=function(atarget) {
		var tg=$(atarget);
		var txt=request.responseText;
		if (tg.innerHTML!=txt) tg.innerHTML=txt;
		return txt;
	}
	self.append_action=function(atarget) {
		var tg=$(atarget);
		var txt=request.responseText;
		tg.innerHTML=tg.innerHTML+txt;
		return txt;
	}
	self.append_before_action=function(atarget) {
		var tg=$(atarget);
		var txt=request.responseText;
		tg.innerHTML=txt+tg.innerHTML;
		return txt;
	}
	self.create=function () {
		var obj;
		var creato = false;
		try {
			obj = new XMLHttpRequest();
			creato = true;
		} catch (e) {
			var IEXMLHttpRequestNames = new Array("Microsoft.XmlHttp", "MSXML4.XmlHttp", "MSXML3.XmlHttp","MSXML2.XmlHttp", "MSXML.XmlHttp");
			for (var i = 0; i < IEXMLHttpRequestNames.length; i++) {
				try {
					obj = new ActiveXObject(IEXMLHttpRequestNames[i]);
					creato = true;
				} catch (e) {}
			}
		}
		if (creato) {
			request=obj;
			return obj;
		}
		else alert('errore irreversibile di visualizzazione. Sostituire il browser');
		return false;
	}
	self.send=function  (cpage,postdata) {
		if (cpage) data['p']=cpage;
		if (!postdata) postdata=null;
		request.open(data['method'],data['p'],data['smode']);
//		alert(cpage+" "+method+" "+mode);
		request.setRequestHeader('Askit-Type', data.toString());
		if (data['method']=='POST')	request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		request.send(postdata);
		self.wait_callback(request,data);
	}
	self.receive_handler=function() {
		if(request.readyState == 4) {
			if (request.status==200) {
				var trt=request.responseText;
				self.before_load_callback(request,data);
				if ( $(data['t']) != null ) {
					var trt=self.receive_callback(data['t']);
					if (!noEval) self.evalCode(trt);
				}
				else {
					self.wait_callback(false);
					self.error_callback(request,data);
				}
				self.after_load_callback(request,data);
				self.stop();
			}
			else self.error_callback(request,data);
		}
		self.wait_callback(request,data);
	}
	self.receive=function(c_atarget) {
		if (c_atarget) data['t']=c_atarget;
		self.receive_handler();
		request.onreadystatechange=self.receive_handler;
	}
	self.stop=function() {
		request.abort();
	}
	self.autoask=function() {
		self.send();
		self.receive();
	}
	
	//default
	self.set_send_mode('get','async');
	self.set_receive_mode('default','eval');
	
	//automation
	self.create();
}


function askit_shell (copt) {
	var self=this;
	var opt={
		title : ''
	}
	for (key in copt) opt[key]=copt[key];
	self.get=function  (page,targetDiv,noEval) {
		var xhr=new ask(page,targetDiv,noEval);
		if (opt.get_wait_callback) xhr.wait_callback=opt.get_wait_callback;
		if (opt.error_callback) xhr.error_callback=opt.error_callback;
		if (opt.after_load_callback) xhr.after_load_callback=opt.after_load_callback;
		xhr.autoask();
		return false;
	}
	self.load=function (page,targetDiv,titleDiv) {
		self.get(page,targetDiv);
		if (!putted) {
			history_handler.put(page,targetDiv,opt['title']+titleDiv);
			var putted=true;
		}
		return false;
	}
	self.getOnly=function(page,targetDiv,noEval) {
		var xhr=new ask();
		xhr.set_send_mode("get","sync");
		xhr.send(page);
		xhr.receive(targetDiv);
		
		return false;
	}
	self.pull=function(page,targetDiv,noEval) {
		var xhr=new ask(page,targetDiv,noEval);
		xhr.autoask();
		return false;
	}
	self.append=function(page,atarget,noEval) {
		var xhr=new ask(page,atarget,noEval);
		xhr.set_receive_mode('append_after');
		xhr.send();
		xhr.receive(atarget);
	}
	self.append_before=function(page,atarget,noEval) {
		var xhr=new ask(page);
		xhr.set_receive_mode('append_before');
		xhr.send();
		xhr.receive(atarget);
	}
}
function history_handler (cvarname) {
	var self=this;
	var pages=Array();
	var divs=Array();
	var varname=cvarname;
	var index=-1;
	var ifrm=false;
	self.refresh=function() {
		return self.get();
	}
	self.get_data=function(indexnum) {
		if (indexnum!=null && indexnum) {
			index=indexnum;
		}
		var trt=Array();
		trt['p']=pages[index];
		trt['t']=divs[index];
		if (!document.all) window.location.href="#"+index+"|"+divs[index];
		return trt;
	}
	self.put=function(page,destination,t) {
		index=pages.length;
		pages[index]=page;
		divs[index]=destination;
		if (document.all) ifrm.src='history_handler.php?target='+index+"|"+destination;
		else window.location.href="#"+index+"|"+destination;
		if (t!=null) window.document.title=t;
		
	}
	self.get=function(indexnum) {
		var data=self.get_data(indexnum);
		self.history_call(data);
	}
	self.reset_to=function(num) {
		pages.splice(num,pages.length-num);
		pages.splice(num,pages.length-num);
	}
	self.previous=function() {
		self.get(index-1);
	}
	self.init=function() {
		ifrm=document.createElement('iframe');
		ifrm.id='askit_history_iframe';
		ifrm=document.body.appendChild(ifrm);
		ifrm.style.display='none';
		return ifrm;
	}
	self.check=function(y) {
		var trt=false;
		if (document.all) {
			var esodata=$('askit_history_iframe').contentWindow.ht;
			if (!y) return;
		}
		else var esodata=window.location.hash.substr(1);
		if (esodata == null) return;
		var page_data=esodata.split("|");
		var endo_index=index;
		var eso_index=page_data[0];
		if (endo_index!=eso_index) {
			trt=self.get(eso_index);
		}
		return trt;
	}
	self.start_listen=function() {
		self.init();
		window.setInterval(varname+".check()",200);
	}
}

var $_GET=Array();
var $_POST=Array();
function page_vars_catcher() {
	var self=this;
	self.get=function(p) {
		if (!p) p=window.location.href;
		var raw=p.split("?");
		if (raw.length>1) {
			var exraw=raw[1].split("&");
			for (var i=0; i<exraw.length; i++) {
				var currarr=exraw[i].split("=");
				$_GET[currarr[0]]=currarr[1];
			}
		}
		alert(window.location.href);
		return $_GET;
	}
	self.post=function (formDiv) {
		 function GetElemValue(name, value) {
			  qstr += (qstr.length > 0 ? "&" : "")
					+ escape(name).replace(/\+/g, "%2B") + "="
					+ value.replace(/&/g,escape('&'));
		 }
		var qstr = "";
		 var formObj = $(formDiv);
		var elemArray = formObj.getElementsByTagName('input');
		var selectArray = formObj.getElementsByTagName('select');
		var textareaArray = formObj.getElementsByTagName('textarea');
		for (i=0;i<selectArray.length;i++) {
			sele=selectArray[i];
			GetElemValue(sele.name,sele.value);
		}
		for (i=0;i<textareaArray.length;i++) {
			var tx=textareaArray[i];
			GetElemValue(tx.name,tx.value);
		}
		 for (var i = 0; i < elemArray.length; i++) {
				var element = elemArray[i];
				var elemType = element.type.toUpperCase();
				var elemName = element.name;
				if (elemName) {
					if (elemType == "TEXT"
					|| elemType == "PASSWORD"
					|| elemType == "BUTTON"
					|| elemType == "RESET"
					|| elemType == "SUBMIT"
					|| elemType == "FILE"
					|| elemType == "IMAGE"
					|| elemType == "HIDDEN")
					GetElemValue(elemName, element.value);
					else if (elemType == "CHECKBOX") {
						if (!element.checked) {
							element.value=false;
							GetElemValue(elemName,element.value);
						}
						else {
							GetElemValue(elemName,element.value);
						}
					}
					else if (elemType == "RADIO" && element.checked)
					GetElemValue(elemName, element.value);
					else if (elemType == "SELECT")
					for (var j = 0; j < element.options.length; j++) {
						var option = element.options[j];
						if (option.selected)
						GetElemValue(elemName,
						option.value);
					}
				}
		 }
		 return qstr;
	}
}

