/////////////////////////////////////////////////////////////// JS
// js_ajax.js - Simple AJAX - Filippo Grassilli
/////////////////////////////////////////////////////////////// JS

function simpleAjax() {
    // Properties
    var xmlReq=null;
    var saDiv=null;
    var saDivId="simpleAjaxDiv";
    var customHandler=null;
    var customXMLHandler=null;
    var customJSONHandler=null;
    var isJSON=false;

    // Methods
    this.sendReq=sendReq;
    this.postForm=postForm;
    this.abortReq=abortReq;
    this.setTarget=setTarget;
    this.setHandler=setHandler;
    this.setXMLHandler=setXMLHandler;
    this.setJSONHandler=setJSONHandler;
    this.setJSON=setJSON;

    // Public
    function sendReq(url) {
	if(xmlReq) return;
	if(!saDiv) saDiv=document.getElementById(saDivId);
	createXMLReq();
	xmlReq.open("GET",url,true);
	xmlReq.send(null);
    }
    function postForm(frm) {
	var params;
	if(xmlReq) return;
	if(!saDiv) saDiv=document.getElementById(saDivId);
	createXMLReq();
	params=form2QS(frm);
	xmlReq.open("POST",frm.action,true);
	xmlReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	xmlReq.setRequestHeader("Content-Length",params.length);
	xmlReq.setRequestHeader("Connection","close");
	xmlReq.send(params);
    }
    function abortReq(url) {
	if(!xmlReq) return;
	xmlReq.abort();
    }
    function setTarget(tid) {
	if(typeof(tid)=='object') {
	    saDivId='';
	    saDiv=tid;
	} else {
	    saDivId=tid;
	    saDiv=null;
	}
    }
    function setHandler(fn) {
	customHandler=fn;
    }
    function setXMLHandler(fn) {
	customXMLHandler=fn;
    }
    function setJSONHandler(fn) {
	customJSONHandler=fn;
    }
    function setJSON(mode) {
	isJSON=mode?true:false;
    }
    // Private
    function createXMLReq() {
	var xmlhttp=null;
	try {
	    xmlhttp=new XMLHttpRequest();
	} catch(e) {
	    try {
		xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
	    } catch(e) {
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	    }
	}
	xmlhttp.onreadystatechange=stdHandler;
	xmlReq=xmlhttp;
	return(xmlhttp);
    }
    function stdHandler() {
	if(xmlReq.readyState==4) {
	    if(isJSON) {
		var respText=xmlReq.responseText
		var respJSON=eval("("+respText+")");
		if(respJSON.script) var ajScript=new Function(respJSON.script);
		respText=respJSON.html;
	    } else {
		var respText=xmlReq.responseText
		// Isola script e lo rende funzionale (ajScript)
		var sb=respText.search(/<script>/m);
		if(sb>=0) {
		    var se=respText.search(/<\/script>/m);
		    if(se>sb) {
		        ajScript=respText.substr(sb+8,se-sb-8);
		        ajScript=new Function(ajScript);
			// Elimina script dall'HTML della pagina
			respText=respText.substr(0,sb)+respText.substr(se+9);
		    }
		}
	    }
	    if(saDiv) saDiv.innerHTML=respText;
	    if(typeof(customXMLHandler)=='function') var respXML=xmlReq.responseXML;
	    xmlReq=null;
	    // Esegue script della pagina (ajScript)
	    if(typeof(ajScript)=='function') ajScript();
	    if(typeof(customHandler)=='function') customHandler(respText);
	    if(typeof(customXMLHandler)=='function') customXMLHandler(respXML);
	    // if(typeof(ajScript)=='function') ajScript();
	    if(typeof(customJSONHandler)=='function') customJSONHandler(respJSON);
	}
    }
    function form2QS(frm) {
	var qstr="";
	var frmEl;
	function addElement(name,val) {
	    qstr+=(qstr.length>0?'&':'')+encodeURIComponent(name)+'='+encodeURIComponent(val?val:'');
	}
	for(var f=0; f<frm.elements.length; f++) {
	    frmEl=frm.elements[f];
	    switch(frmEl.type) {
		case 'text':
		case 'search':
		case 'select-one':
		case 'hidden':
		case 'password':
		case 'textarea':
		    addElement(frmEl.name,frmEl.value);
		    break;
		case 'checkbox':
		case 'radio':
		    if(frmEl.checked==true)
			addElement(frmEl.name,frmEl.value);
		    break;
		default:
		    break;
	    }
	}
	return(qstr);
    }
}

