var req=null;
var ajaxResponseContent=null;
var ajaxShowLoader=null;
var ajaxPutIntoDiv=null;
var ajaxDivOrFunction=null
var ajaxDebug = false;
var ajaxForm = null;
var ajaxIsForm = true;
var fileToExecute = null;
var setPosition=window;
var ajaxLoaderImage='images/barLoading.gif';
var ajaxStartFunction=null;
var ajaxEndFunction=null;
var ajaxEnableErrorHandling=false;
var ajaxMouse_x=0;
var ajaxMouse_y=0;
var ajaxEndExposition=true;
var ajaxPipeRequest=new Array();
var ajaxPipeRequestStartFunc=new Array();
var ajaxPipeRequestEndFunc=new Array();

var READY_STATE_UNINITIALIZED=0;
var READY_STATE_LOADING=1;
var READY_STATE_LOADED=2;
var READY_STATE_INTERACTIVE=3;
var READY_STATE_COMPLETE=4;

function createAjaxFrmDeferredExecute (fileToExecute, params, form, ajaxShowLoader, ajaxPutIntoDiv, ajaxDivOrFunction, ajaxDebug){
    
    if(ajaxDebug){
        alert('Start iframeDeferredExecute');
    }
    
    window.ajaxShowLoader = ajaxShowLoader;
    window.ajaxPutIntoDiv = ajaxPutIntoDiv;
    window.ajaxDivOrFunction = ajaxDivOrFunction;
    window.ajaxDebug = ajaxDebug;
    window.ajaxForm = params;
    window.ajaxIsForm = form;
    window.ajaxFileToExecute = fileToExecute;
    window.fileToExecute = fileToExecute;
    
    document.write("<iframe onload=\"loadAjaxIFrameRequest();\" name='oHiddenIFrame' width='5' height='5'></iframe>");
    //onload=\"loadAjaxIFrameRequest();\" 
    /*window.oIFrame = document.createElement("iframe");
    window.oIFrame.width=100;
    window.oIFrame.height=100;
    window.oIFrame.id='oHiddenIFrame';
    window.oIFrame.name='oHiddenIFrame';
    document.appendChild(window.oIFrame);*/
    
    iFrame=frames['oHiddenIFrame'];
    //window.iFrame.location="test.php";
    
    //params.target = 'oHiddenIFrame';        
    //params.action = fileToExecute;
    
}

function sendAjaxWRIFrameRequest(fileToExecute, params, form, ajaxShowLoader, ajaxPutIntoDiv, ajaxDivOrFunction, ajaxDebug){
    
    window.ajaxShowLoader = ajaxShowLoader;
    window.ajaxPutIntoDiv = ajaxPutIntoDiv;
    window.ajaxDivOrFunction = ajaxDivOrFunction;
    window.ajaxDebug = ajaxDebug;
    window.ajaxForm = params;
    window.ajaxIsForm = form;
    window.ajaxFileToExecute = fileToExecute;
    window.fileToExecute = fileToExecute;
    
    sendAjaxIFrameRequest()
}

function sendAjaxIFrameRequest(){
   
    if(window.ajaxShowLoader){            
        writeDivLoader();
    }
    
    oldTarget=window.ajaxForm.target;
    oldAction=window.ajaxForm.action;
    
    if(window.ajaxIsForm){
        window.ajaxForm.action = window.ajaxFileToExecute;
        window.ajaxForm.target = 'oHiddenIFrame';        
        window.ajaxForm.submit();        
        disableAll();
    }else{
        alert("This Function is jet developed only for upload file by form submission");
    }    
    
    //window.ajaxForm.target = '_self';
    //window.ajaxForm.action = "javascript:sendAjaxIFrameRequest();";
    
    window.ajaxForm.target = oldTarget;
    window.ajaxForm.action = oldAction;
    
    
    
}

function loadAjaxIFrameRequest(){    
    
    iFrame=frames['oHiddenIFrame'];
    if(iFrame.document.body.innerHTML){
        window.ajaxResponseContent=iFrame.document.body.innerHTML;
        putIntoOutput();
    }
    
}


function startAjaxPipeRequest(){
    
    for(i=0; i<=window.ajaxPipeRequest.length; i++){
        if(window.ajaxPipeRequest[i]!=null){            
            eval(window.ajaxPipeRequest[i]);
            window.ajaxPipeRequest[i]=null;            
            return;
        }
    }
    
}

function deferredExecute (fileToExecute, params, form, ajaxShowLoader, ajaxPutIntoDiv, ajaxDivOrFunction, ajaxDebug){
    
    
    if(window.ajaxEndExposition){
        window.ajaxEndExposition=false;
    }else{
        window.ajaxPipeRequest[window.ajaxPipeRequest.length] = "deferredExecute ('"+fileToExecute+"', '"+params+"', "+form+", "+ajaxShowLoader+", "+ajaxPutIntoDiv+", '"+ajaxDivOrFunction+"', "+ajaxDebug+")";        
        //window.ajaxPipeRequestStartFunc[window.ajaxPipeRequest.length] =  
        //window.ajaxPipeRequestStartFunc[window.ajaxPipeRequest.length] =
        return;
    }
    
    window.ajaxShowLoader = ajaxShowLoader;
    window.ajaxPutIntoDiv = ajaxPutIntoDiv;
    window.ajaxDivOrFunction = ajaxDivOrFunction;
    window.ajaxDebug = ajaxDebug;
    window.ajaxForm = params;
    window.ajaxIsForm = form;
    
    if(window.ajaxShowLoader)
        writeDivLoader();
    
    if(form){
        
        disableAll();
        theParam="";
        for(i=0; i<params.length; i++){
            if(params.elements[i].length != undefined && params.elements[i].type!='select-one'){
                for(g=0; g<params.elements[i].length; g++){
                    if(window.ajaxDebug)
                        alert(params.elements[i].name+"="+escape(encodeURIComponent(params.elements[i].value)));
                    theParam+=params.elements[i].name+"["+g+"]"+"="+escape(params.elements[i][g].value)+"&";
                }
            }else if (params.elements[i].length != undefined && params.elements[i].type=='select-one'){
                if(window.ajaxDebug)
                    alert(params.elements[i].name+"="+escape(params.elements[i].value));
                theParam+=params.elements[i].name+"="+escape(params.elements[i].value)+"&";
            }else{
                
                if(params.elements[i].type=='checkbox'){
                    if(params.elements[i].checked){
                        if(window.ajaxDebug)
                            alert(params.elements[i].name+"="+escape(params.elements[i].value));
                        theParam+=params.elements[i].name+"="+escape(params.elements[i].value)+"&";
                    }
                }else{
                    if(window.ajaxDebug)
                            alert(params.elements[i].name+"="+escape(params.elements[i].value));
                    theParam+=params.elements[i].name+"="+escape(params.elements[i].value)+"&";
                }
            }
        }
        theParam=theParam.substring(0,theParam.length-1);
        
        if(window.ajaxDebug)
            alert("Param passed by form - "+theParam);        
        
        sendRequest(fileToExecute, theParam);        
    }else{       
        if(window.ajaxDebug)
            alert("Param passed by function - "+params);
        
        sendRequest(fileToExecute, params);        
    } 
       
}

                                            
function sendRequest(url,params,HttpMethod){
    if (!HttpMethod)
        HttpMethod="POST";    
    
    //application/x-www-form-urlencoded
    //multipart/form-data
    
    if(ajaxStartFunction!=null){
        eval(ajaxStartFunction);
        clearAjaxStartFunction();
    }
    
    req=initXMLHTTPRequest();
    if (req){        
        req.onreadystatechange=onReadyState;
        req.open(HttpMethod, url, true);
        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        req.setRequestHeader("connection", "close");
        req.send(params);         
        //req.abort();       //to force stop ajax connection
    }
}


function initXMLHTTPRequest(){
var xRequest=null;
    if (window.XMLHttpRequest){
        xRequest=new XMLHttpRequest();
    } else if (window.ActiveXObject){
        xRequest=new ActiveXObject
        ("Microsoft.XMLHTTP");
    }
    return xRequest;
}
        
function onReadyState(){
    var ready = req.readyState;
    var regexp = /\\'/g;
    var data=null;
    
    if (ready==READY_STATE_COMPLETE){
        if(window.ajaxShowLoader)
            window.setPosition.document.getElementById('divAjaxStringLoader').innerHTML="Trasmissione Dati Ultimata";
        if(window.ajaxDebug){            
            alert("Data Trasmission Complete");
        }
        data=req.responseText;
        data=data.replace(regexp,"'");        
        window.ajaxResponseContent=data;
        putIntoOutput();
    }else if (ready==READY_STATE_UNINITIALIZED){
        if(window.ajaxShowLoader)
            window.setPosition.document.getElementById('divAjaxStringLoader').innerHTML="Errore Inizializzaziione Dati";
        if(window.ajaxDebug){            
            alert("Wong Data Inizialization");
        }
    }else if (ready==READY_STATE_LOADING){
        if(window.ajaxShowLoader)
            window.setPosition.document.getElementById('divAjaxStringLoader').innerHTML="Caricamento Dati...";
        if(window.ajaxDebug){            
            alert("I'm Loading Data");
        }
    }else if (ready==READY_STATE_LOADED){
        if(window.ajaxShowLoader)
            window.setPosition.document.getElementById('divAjaxStringLoader').innerHTML="Caricamento Dati Ultimato";
        if(window.ajaxDebug){
            alert("Data is Loaded");
        }        
    }else if (ready==READY_STATE_INTERACTIVE){
        if(window.ajaxShowLoader)
            window.setPosition.document.getElementById('divAjaxStringLoader').innerHTML="Ricezione Dati...";        
    }

}

function testSuccess() {
    var regex=/^(ERR\|)/;
    if(window.ajaxResponseContent.search(regex)==-1) {        
        return true;
    }else{
        window.ajaxResponseContent=window.ajaxResponseContent.replace(regex,"");
        return false;
    }
}

function putIntoOutput(){
    
    functionToExecute=null;
    
    if(window.ajaxResponseContent==''){
        window.ajaxResponseContent='ISOK|';
    }
    
    if(window.ajaxDebug){
        alert(window.ajaxResponseContent);
    }
   
    if(testSuccess()){        
        
        enableAll();
        if(window.ajaxShowLoader){            
            closeDivLoader();    
        }
                
        if(window.ajaxPutIntoDiv && window.ajaxDivOrFunction!=false){
            
            if(window.ajaxDebug){
                alert("verso una div");
            } 
            
            if(window.ajaxResponseContent=="ISOK|"){
                window.ajaxResponseContent="";
            }
               
            window.setPosition.document.getElementById(window.ajaxDivOrFunction).innerHTML=window.ajaxResponseContent;                        
            //window.setPosition.document.getElementById(window.ajaxDivOrFunction).innerHTML='xxx';
               
        } else if (window.ajaxPutIntoDiv==false && window.ajaxDivOrFunction!=false){
            
            var isFunction= /[)]$/;
            if(window.ajaxDivOrFunction.search(isFunction)!='-1'){

                window.ajaxDivOrFunction=window.ajaxDivOrFunction.substr(0, window.ajaxDivOrFunction.length-2);

            }
            
            if(window.ajaxDebug){             
                alert("verso una funzione di utenza - "+window.ajaxDivOrFunction);
            }            
                         
            if(window.ajaxDebug){             
                alert("Chiama Funzione come - "+window.ajaxDivOrFunction+"("+window.ajaxResponseContent+")");
            }
            
            eval(window.ajaxDivOrFunction+"("+window.ajaxResponseContent+")");            
            
        }else{
            window.ajaxResponseContent="";
            if(window.ajaxDebug){
                alert("E' in background");
            }            
        }
        
        if(window.ajaxDebug){
            alert("End function "+window.ajaxEndFunction);
        }
        
        window.ajaxEndExposition=true;
        
        if(window.ajaxEndFunction!=null){
            functionToExecute=window.ajaxEndFunction;
            clearAjaxEndFunction();
            if(functionToExecute!=null){
                eval(functionToExecute);
            }
        }
        
        startAjaxPipeRequest();
        
    }else{        
         
         if(!window.ajaxShowLoader && !window.ajaxEnableErrorHandling){
            writeDivLoader();
         }
                
         if(window.ajaxEnableErrorHandling){
            showErrorBox();
         }else{
            document.getElementById('divAjaxStringLoader').innerHTML="ERRORE DRASTICO";
            document.getElementById('divAjaxBarLoader').innerHTML="<b style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #FF0000;'>"+window.ajaxResponseContent+"</b>";
         }
                
         window.ajaxEndExposition=true,
         clearAjaxEndFunction();
         startAjaxPipeRequest();
         
    }
    
}

function setAjaxWinPosition(position){
    window.setPosition=position;    
}

function setAjaxLoaderImage(image){
    window.ajaxLoaderImage=image;    
}

function getAjaxResponse(){
    
    $i=0;

    while($i<100000){
        $i++;
    }

    return window.ajaxResponseContent;
}

function writeDivLoader(){
    
    /*window.ajaxTolloDiv = window.setPosition.document.createElement("div");    
    window.setPosition.document.body.appendChild(window.ajaxTolloDiv);
    window.ajaxTolloDiv.style.backgroundColor="#CCCCCC";
    window.ajaxTolloDiv.style.position="absolute";
    window.ajaxTolloDiv.style.zIndex=3;
    window.ajaxTolloDiv.style.filter="alpha(opacity=70)";
    window.ajaxTolloDiv.style.left=0;
    window.ajaxTolloDiv.style.top=0;
    window.ajaxTolloDiv.style.width="100%";
    window.ajaxTolloDiv.style.height="100%";
    window.ajaxTolloDiv.name="divAjaxLoader";
    window.ajaxTolloDiv.id="divAjaxLoader";
    
    table="<table border='0' cellpadding='0' cellspacing='0' align='center' valign='middle' width='100%' height='100%'>";
    table+="    <tr>";
    table+="        <td align='center' valign='middle'>";
    table+="        <table style='font-size: 5px; border: 1px solid #FF6000;' bgcolor='#FFFFFF' border='0' cellpadding='0' cellspacing='0' align='center' valign='middle' width='260' height='60'>";
    table+="            <tr><td align='center' valign='middle'>";
    table+="                <b style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #FF6000;'>";
    table+="                    <div id='divAjaxStringLoader' name='divAjaxStringLoader'>Caricamento dati, attendere ...</div>";
    table+="                </b><br><div onclick='javascript:enableAll();closeDivLoader();' style='cursor: pointer;' name='divAjaxBarLoader' id='divAjaxBarLoader'><img onclick='javascript:enableAll();closeDivLoader();' src='"+window.ajaxLoaderImage+"'></div></td></tr>";
    table+="        </table>";
    table+="        </td>";
    table+="    </tr>";
    table+="</table>";
    
    window.ajaxTolloDiv.innerHTML=table
    
    */
    
    window.ajaxTolloDiv = window.setPosition.document.createElement("div");    
    window.setPosition.document.body.appendChild(window.ajaxTolloDiv);
    window.ajaxTolloDiv.style.position="absolute";
    window.ajaxTolloDiv.style.zIndex=3;
    
    if(document.all){
        window.ajaxTolloDiv.style.backgroundColor="#CCCCCC";
        window.ajaxTolloDiv.style.filter="alpha(opacity=80)";
    }else{
        window.ajaxTolloDiv.style.backgroundImage="url(images/bgDivLoader.png)";
    }
    
    window.ajaxTolloDiv.style.left=0;
    window.ajaxTolloDiv.style.top=0;
    if(document.width){
        window.ajaxTolloDiv.style.width=document.width;
        window.ajaxTolloDiv.style.height=document.height;
    }else{
        window.ajaxTolloDiv.style.width=document.body.clientWidth;
        window.ajaxTolloDiv.style.height=document.body.clientHeight;        
    }    
    window.ajaxTolloDiv.name="divAjaxLoader";
    window.ajaxTolloDiv.id="divAjaxLoader";
    
    table="<table border='0' cellpadding='0' cellspacing='0' align='center' valign='middle' width='100%' height='100%'>";
    table+="    <tr>";
    table+="        <td align='center' valign='middle'>";
    table+="        <table style='font-size: 5px; border: 1px solid #FF6000;' bgcolor='#FFFFFF' border='0' cellpadding='0' cellspacing='0' align='center' valign='middle' width='260' height='60'>";
    table+="            <tr><td align='center' valign='middle'>";
    table+="                <b style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #FF6000;'>";
    table+="                    <div id='divAjaxStringLoader' name='divAjaxStringLoader'>Caricamento dati, attendere ...</div>";
    table+="                </b><br><div onclick='javascript:enableAll();closeDivLoader();' style='cursor: pointer;' name='divAjaxBarLoader' id='divAjaxBarLoader'><img onclick='javascript:enableAll();closeDivLoader();' src='"+window.ajaxLoaderImage+"'></div></td></tr>";
    table+="        </table>";
    table+="        </td>";
    table+="    </tr>";
    table+="</table>";
    
    window.ajaxTolloDiv.innerHTML=table;
    
}
    
function closeDivLoader(){    
    window.setPosition.document.body.removeChild(window.ajaxTolloDiv);
    
}

function disableAll(){
    if(window.ajaxIsForm===true){            
        for (i=0; i<window.ajaxForm.elements.length; i++){
            window.ajaxForm.elements[i].disabled=true;
        }
    }
}

function enableAll(){
   if(window.ajaxIsForm===true){            
        for (i=0; i<window.ajaxForm.elements.length; i++){
            window.ajaxForm.elements[i].disabled=false;
        }
    }
}

function setAjaxStartFunction(func){
    window.ajaxStartFunction = func;
}

function setAjaxEndFunction(func){
     window.ajaxEndFunction = func;
}

function clearAjaxStartFunction(){    
    window.ajaxStartFunction = null;
}

function clearAjaxEndFunction(){
    if(window.ajaxEndExposition){
        window.ajaxEndFunction = null;
    }
}

function setErrorActiveBox(){
    window.ajaxEnableErrorHandling=true;    
    window.ajaxMouse_x=event.x; 
    window.ajaxMouse_y=event.y;    
}

function showErrorBox(){    
    
    window.oErrDiv = window.setPosition.document.createElement("div");    
    window.setPosition.document.body.appendChild(window.oErrDiv);
    window.oErrDiv.style.backgroundColor="#CCCCCC";
    window.oErrDiv.style.position="absolute";
    window.oErrDiv.style.zIndex=3;
    window.oErrDiv.style.filter="alpha(opacity=90)";
    window.oErrDiv.style.left=window.ajaxMouse_x;
    window.oErrDiv.style.top=window.ajaxMouse_y;
    window.oErrDiv.style.width="250px";
    window.oErrDiv.style.height="60px";
    window.oErrDiv.name="divAjaxErrorBox";
    window.oErrDiv.id="divAjaxErrorBox";
    
    table="<table border='0' cellpadding='0' cellspacing='0' align='center' valign='middle' width='250' height='60'>";
    table+="    <tr>";
    table+="        <td align='center' valign='middle'>";
    table+="        <table style='font-size: 5px; border: 1px solid #FF6000;' bgcolor='#FFFFFF' border='0' cellpadding='0' cellspacing='0' align='center' valign='middle' width='250' height='60'>";
    table+="            <tr><td align='center' valign='middle'>";
    table+="                <b style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #FF6000;'>";
    table+="                    <div id='divAjaxStringLoader' name='divAjaxStringLoader'>Errore Incorso...</div>";
    table+="                </b><br><div onclick='javascript:window.setPosition.document.body.removeChild(window.oErrDiv);' style='cursor: pointer;' name='divAjaxBarLoader' id='divAjaxBarLoader'><img onclick='javascript:window.setPosition.document.body.removeChild(window.oErrDiv);' src='"+window.ajaxLoaderImage+"'></div></td></tr>";
    table+="        </table>";
    table+="        </td>";
    table+="    </tr>";
    table+="</table>";
    
        
    window.oErrDiv.innerHTML=table;
    window.ajaxEnableErrorHandling=false;

    
}