﻿// <!CDATA[
function AjaxClass(serverFileName,divId,ConstantParams)
{
    this.serverFN=serverFileName;
    if(divId !== "undefined" && divId!='')
        this.divE=document.getElementById(divId);
    if(ConstantParams === "undefined")
        this.ConstantParams='';
    else
        this.ConstantParams=ConstantParams;
    this.GetXmlHttpObject=function(){
        var xmlHttp=null;
        try{xmlHttp=new XMLHttpRequest();}
        catch (e){
          try{xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");}
          catch (e){xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");}
         }
        return xmlHttp;
    }
   // this._xmlHttp=this.GetXmlHttpObject();    //used for nowReturn(...)
   //	if (this._xmlHttp==null){alert("Sorry...Your browser does not support AJAX!");return null;}

    this.xmlHttp=new Array();
    this.busyFlag=new Array();
    
    this.doReturn=function(queryString,parameters,beNew,doSuccess_ret,doNotSuccess,time,doTimeOut,id)
    {
        if(id==null)
            id=this.xmlHttp.push(this.GetXmlHttpObject())-1;
        if(id<0 || id>=this.xmlHttp.length)
            return;    
        var xh=this.xmlHttp[id]; 
        this.abort(id);
        this.busyFlag[id]=1;
        var sto;
        var me=this;
        if(time!=null && time!=0)
            sto=setTimeout(
                function(){
                  me.abort(id);
                  log.add('Ajax('+id+') Fail         @@@',JSON.stringify({'ErrorMessage':'Timeout Finished','MaxTime':time}))
                  eval(doTimeOut);
                },time);
        if(this.divE)
            this.divE.style.display = "inline";
        xh.open("post",this.serverFN,true);
        xh.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        var mode='simply';
        var allparams='';
        if(queryString.match(/^[a-zA-Z\d_]*\([\s\S]*\)$/))
        {
            mode='functional';
            var openpar=queryString.indexOf("(");
            var func=queryString.substring(0,openpar);
            var ep=this.exeParam(parameters)
            // if(window.dev && window.dev==2)
            //  document.title=(ccc++)+"_"+ret
            log.add('Ajax('+id+') Send    -->',func+"("+ep.substr(1,ep.length-2)+")")
            ep=ep.length+"_"+ep
            allparams=this.ConstantParams+(this.ConstantParams!=''?'&':'')+"F="+func+"&P="+encodeURIComponent(ep);
        }
        else
            allparams=this.ConstantParams+(this.ConstantParams!=''?'&':'')+queryString
       // if(beNew)
       //     allparams+=(allparams==""?"":"&")+"sid="+Math.random();
        var ret;
    	xh.onreadystatechange=
             function(){
                 if(me.busyFlag[id]==0)
                    {clearTimeout(sto);return;}
                 if (xh.readyState==4 )
                    {
                        clearTimeout(sto);
                        if( xh.status == 200)
                        {
                          var responseText=xh.responseText;
                          if(responseText=='Error 139')
                            alert('Error 139: '+'امكان ارتباط با سايت شگردها فعلا وجود ندارد چون در اين لحظه صفحه ديگري از اين سايت باز كرده ايد');
                          if(responseText=='Error 124'){
                            alert('Error 124: '+'شما فعلا از امكانات شگردها محروم هستيد');
                            me.doReturn=function (){};
                          }

                          responseText=responseText.replace(/\u0000/g,"0");
                          responseText=responseText.replace(/\u0001/g,"1");
                      //  responseText=responseText.replace(/\u2028/g,"");
                     //   responseText=responseText.replace(/\u2029/g,"");

                            try{
                              if(mode=='simply')
                                  ret=responseText;
                              else if(mode=='functional')
                                  ret=me.FetchArray(responseText,id);
                            }
                            catch(err){
                           //   if(window.dev && window.dev=='try')     .description
                              log.add('Ajax('+id+') Fail         !!!',JSON.stringify({'ErrorMessage':err,'AjaxResponse':responseText}))
                              eval(doNotSuccess);
                              me.abort(id);
                              return;
                            }
                            eval(doSuccess_ret);
  						   //	ale(typeof ret+"("+ret+")_"+responseText)
                        }
                        else{
                            log.add('Ajax('+id+') Fail         ***',JSON.stringify({'ErrorMessage':'Status!=200','Status':xh.status}))
                            eval(doNotSuccess);
                        }
                        me.abort(id);
                    }
               };
       // document.title=allparams
        xh.send(allparams);
        return id;
    }
    this.abort=function(id)
    {
        if(id==null || id<0 || id>=this.xmlHttp.length)
            return;
        this.busyFlag[id]=0;
        this.xmlHttp[id].abort();
        this.hideDiv();
    }
    this.hideDiv=function()
    {
        for(var i=0;i<this.busyFlag.length;i++)
            if(this.busyFlag[i]==1)
                return;
        if(this.divE)
            this.divE.style.display = "none";
    }
    this.isBusy=function(id)
    {
        if(this.busyFlag[id]==1)
            return true;
        return false;
    }
   // this.refresh=function(id){}
   // this.close=function(){}

    this.exeParam=function(params)
    {
		//params=params.replace(/\r\n/g,"\\r\\n");
        var str=JSON.stringify(params)
		str=str.replace(/ی/g,"ي");
		str=str.replace(/ى/g,"ي");
	  	str=str.replace(/ک/g,"ك");
        return str
    }
    this.FetchArray=function(matn,id)
    {
        if(matn=="")
            throw 'Ajax output is empty'
        var endmeta=matn.indexOf("_");
        var size=matn.substr(0,endmeta);
        var data=matn.substr(endmeta+1);
        if(data.length!=size)
            throw 'Ajax output size is not matched'
   //   eval('var ret='+data)
        log.add('Ajax('+id+') Receive <--',data)
        var ret=JSON.parse(data)
        return ret
    }
}
var log={
  data:'',
  add:function(type,event){
    var d = new Date();
    var t=d.getHours()+':'+d.getMinutes()+':'+d.getSeconds();
    log.data=log.data.concat(type,' ['+t+'] ',event,'\n\n')
    log.data=log.data.slice(-50000)
  },
  show:function(){
    alert(log.data)
  }
}

function errorHandler(message, url, line)
{

   var err="line='" + line + "' url='" + url + "' msg='" + message +  "'";
   log.add('JS Error     ???',err)
   return;   //  on demand
     $.ajax({
   type: "POST",
   url: "./include/jsLog.php",
   data: "F="+encodeURIComponent(err),
   success: function(ret){}
 });
    return true;
}
window.onerror = errorHandler;

function withinString(str)
{
   //	str=str.replace(/\\/g,"\\\\");
   //	str=str.replace(/'/g,"\\'");
   //	str=str.replace(/"/g,'\\"');
	return str;
}
function simple(str)
{
  str=str.replace(/\\/g,"\\\\");
  str=str.replace(/'/g,"`");
  str=str.replace(/"/g,'`');
  return str;
}
//var myAjax=new AjaxClass("ajax.php","loading");
// ]]>

