var zlapServerFile='';
var ser = zlapCreateXMLHttp()

function zlapCreateXMLHttp() {
var sa;
if(window.XMLHttpRequest) {
    try {
      sa = new XMLHttpRequest();
    } catch(e) {
      sa = false;
    }
  } else if(window.ActiveXObject) {
    try {
      sa = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {
      sa = false;
    }
  }
  return sa;
}

function zlapSend(req) {
//IE Cache work around
var d = new Date();
var time = d.getTime();

  if(req.indexOf('?')>=0) {
   ser.open('get', req+'&'+time+'='+time);
  } else {
   ser.open('get', req+'?'+time+'='+time);
  }
  ser.onreadystatechange = zlapResponse;
  ser.send(null);
}

function zlapSendA(ids,args,file) {
var sfile='';
if(!file) {
 if(!zlapServerFile) {
  if(!window.zlapError) { alert('Zlap Error: Server File not defined.'); } else { zlapError('Server File not defined.'); }
  return;
 } else { sfile=zlapServerFile; }
} else { sfile=file; }

//IE Cache work around
var d = new Date();
var time = d.getTime();

 var req='?';
 for(i=0;i<ids.length;i++){
  req+=ids[i]+'='+encodeURIComponent(args[i])+'&';
 }

  if(req.indexOf('?')>=0) {
   ser.open('get', sfile+req+'&'+time+'='+time);
  } else {
   ser.open('get', sfile+req+'?'+time+'='+time);
  }

  ser.onreadystatechange = zlapResponse;
  ser.send(null);
}

function zlapSendForm(frm,file) {
var sfile='',req='?';
if(!file) {
 if(!zlapServerFile) {
  if(!window.zlapError) { alert('Zlap Error: Server File not defined.'); } else { zlapError('Server File not defined.'); }
  return;
 } else { sfile=zlapServerFile; }
} else { sfile=file; }

//IE Cache work around
var d = new Date();
var time = d.getTime();

 frmEle=document.forms[frm].getElementsByTagName("input");

 for(i=0;i<frmEle.length;i++) {
  d=frmEle[i];
  if(d.name) {
   req+=d.name+'='+encodeURIComponent(d.value)+'&';
  }
 }

  if(req.indexOf('?')>=0) {
   ser.open('get', sfile+req+'&'+time+'='+time);
  } else {
   ser.open('get', sfile+req+'?'+time+'='+time);
  }
  ser.onreadystatechange = zlapResponse;
  ser.send(null);

}

function zlapCheckError(data) {
//PHP Errors
 if(data.indexOf("<b>Parse error</b>:")>=0) { return 'PHP Parse Error ('+data+')'; }
 if(data.indexOf("<b>Fatal error</b>:")>=0) { return 'PHP Fatal Error ('+data+')'; }
//General Expected errors violating syntax
// if(data.indexOf("\n")>=0) { return 'New Line found, please use <zlap-newline> and replace with new-line on your end.'; }
 if(!data) { return 'No Data Sent.'; }
}

function zlapResponse() {
  if(ser.readyState == 4){
   var res = ser.responseText;
   var msg=res.split('<zlap-split>');
   for (i=0; i<msg.length; i++) {
    errmsg=zlapCheckError(msg[i]);
    if(errmsg) {
     if(!window.zlapError) { alert('Zlap Error: '+errmsg); } else { zlapError(errmsg); }
    } else {
     if(msg[i].substr(0,1)=='0') { //ERROR
      if(!window.zlapUserError) { alert('User Defined Error: '+msg[i].substr(1)); } else { zlapUserError(msg[i].substr(1)); }
     } else if(msg[i].substr(0,1)=='1') { //OK execute function, error handling
      if(res.indexOf('(')>=0) {
       if(eval('window.'+msg[i].substr(1,msg[i].indexOf('(')-1))) {
        eval(msg[i].substr(1));
       } else {
        if(!window.zlapError) { alert('Zlap Error: return function not found'); } else { zlapError(msg[i].substr(1)); }
       }
      } else {
       if(!window.zlapError) { alert('Zlap Error: return function not found'); } else { zlapError(msg[i].substr(1)); }
      }
     } else if(msg[i].substr(0,1)=='2') { //OK execute string, no error handling: use at own risk
      eval(msg[i].substr(1));
     } else { //ERROR
      if(!window.zlapError) { alert('Zlap Error: an unknown error occurred ('+msg[i]+')'); } else { zlapError(msg[i].substr(1)); }
     }
    }
   }
  }
}

function zlapReplaceString(sString, sReplaceThis, sWithThis) {
 if (sReplaceThis != "" && sReplaceThis != sWithThis) {
  var counter = 0;
  var start = 0;
  var before = "";
  var after = "";
   while (counter<sString.length) {
    start = sString.indexOf(sReplaceThis, counter);
    if (start == -1){
     break;
    } else {
     before = sString.substr(0, start);
     after = sString.substr(start + sReplaceThis.length, sString.length);
     sString = before + sWithThis + after;
     counter = before.length + sWithThis.length;
    }
   }
  }
 return sString;
}

