/*
 * Cservenák János [Chery]
 *
 * Javascript kezelés: OK
 * Szinkron, Aszinkron kérés: OK
 * Szekvenciálsi, párhuzamos több lekérdezés: IE 5.5 és IE 6.0 alatt csak szekvenciális (a práhuzamos esetné mindet az utolsó div-be tölti)
 *                                            IE 7.0, IE 8.0 FireFox 2.0/3.0, NETSCAPE 9.0, Safary 3.1.2, Opera 9.61: OK
 */
var selfo = null;
var loadthread = 0;
var showalert = false;
var isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
var isIE55 = /msie|MSIE 5.5/.test(navigator.userAgent);
var oldie = (isIE6 || isIE55); 

function delay(millis) {
 var date = new Date();
 var curDate = null;
 do { curDate = new Date(); } while(curDate-date < millis);
}
 
function _getElement(aID){ return (document.getElementById(aID) || document.all[aID]); }

function RecalRandomTime(command) {
 var rt = Math.floor(Math.random()*1000);
 setTimeout(command, rt);
}

function runJS(divname) {
 var head = document.getElementsByTagName('head')[0];
 var szkripttagok = _getElement(divname).getElementsByTagName('script');
 for(var no=0;no<szkripttagok.length; no++) {
  var e = document.createElement('script');
  e.type = 'text/javascript';
  if (szkripttagok[no].src != '') e.setAttribute("src", szkripttagok[no].src);
  if("text" in e)e.text=szkripttagok[no].innerHTML;
  else if("textContent" in e)e.textContent=szkripttagok[no].innerHTML;
  else if("innerHTML" in e)e.innerHTML=szkripttagok[no].innerHTML;
  else e.appendChild(document.createTextNode(szkripttagok[no].innerHTML));
  head.appendChild(e);
 }
}

function evaluateCss(divname) {
 var cssTags = _getElement(divname).getElementsByTagName('style');
 var head = document.getElementsByTagName('head')[0];
 for(var no=0;no<cssTags.length;no++){ head.appendChild(cssTags[no]); }
}


function onechannel() { }
onechannel.prototype = {
 xmlobj: '',
 obj: ''
};

function channel2div() { } // lekérdező és HttpClient objektum társító az egy időben történő ajax lekérések elkülönítéséhez
channel2div.prototype = {
 requests : new Array(),
 add: function (xmlobj, obj) {
  var item = new onechannel();
  item.xmlobj = xmlobj;
  item.obj = obj;
  this.requests.push(item);
 },
 get: function (xmlobj) {
  for(var i=0;i<this.requests.length;i++) {
   if (this.requests[i].xmlobj == xmlobj) return this.requests[i].obj;
  }
  return null;
 },
 remove: function (obj) {
  var newr = Array();
  for (var i=0;i<this.requests.length;i++) {
   if (this.requests[i].obj != obj) newr.push(this.requests[i]);
  }
  this.requests = newr;
 }
};

var Channels = new channel2div();

function HttpClient() { }
HttpClient.prototype = {
 requestType:'GET',   // get / post
 isAsync:true,        // true / false
 callback:false,      // sikeres visszahívó
 callbackparam:false, // visszahívó 2. paramétere (1. a válasz-üzenet)
 xmlhttp:false,       // lekérdező objektum

 onSend:  function() { loadthread++; try { _getElement('HttpClientstatus').style.display = ''; } catch (e) {} },
 onLoad:  function() { loadthread--; try { if (loadthread==0 ) _getElement('HttpClientstatus').style.display = 'none'; } catch (e) {} },
 onError: function(error) { if (showalert) alert(error); },
 init:    function() {
  try { // Mozilla / Safari / IE7
   this.xmlhttp = new XMLHttpRequest();
  } catch (e) {
   var XMLHTTP_IDS = new Array('MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP');
   var succes = false;
   for (var i=0;i<XMLHTTP_IDS.length && !succes; i++) {
    try { this.xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]); succes = true; } catch (e) { }
   }
   if (!succes) { this.onError('Unable create XMLHttpRequest.\n Your browser not supporting AJAX.'); }
  }
 },
 makeRequest: function(url, payload) {
  if (!this.xmlhttp) { this.init(); }
  this.xmlhttp.open(this.requestType, url, this.isAsync);
  if (this.requestType == "POST") {
   this.xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=windows-1250");
   this.xmlhttp.setRequestHeader("Content-length", payload.length);
  }
  selfo = this;
  try {
   this.xmlhttp.ajaxobject = this; // firefox alatt nem elérhető onreadystatechange-ből
  } catch (e) { oldie = true; }
  if (this.isAsync) {
   this.xmlhttp.onreadystatechange = function () {
    if (navigator.userAgent.indexOf("Firefox")!=-1) return;
    if (navigator.userAgent.indexOf("Safari")!=-1) return;
    //if (navigator.userAgent.indexOf("Opera")!=-1) return;
    if (this.ajaxobject) selfo = this.ajaxobject; else if (!oldie) { return; }
    switch (selfo.xmlhttp.readyState) {
     case 4:
      selfo.onLoad();
      if (selfo.xmlhttp.status == 200) {
       selfo.callback(selfo.xmlhttp.responseText, selfo.callbackparam);
      } else { selfo.onError('HTTP Error Making Request: ['+selfo.xmlhttp.status+'] '+selfo.xmlhttp.statusText+'\n'+url); }
      Channels.remove(selfo);
      break;
    }
    return;
   };
   try{
   this.xmlhttp.onload = function () { // firefox, netscape, chrome, safary
    var newself = this.ajaxobject;
    if (!newself) newself = Channels.get(this);
    if (newself) { selfo = newself; } else {
     //alert('marad a globális selfo az ajax.js::xmlhttp.onload-ban (párhuzamos hozzáférés tiltott ebben a böngészőben)');
     //ha a böngésző nem támogatná sehogy a práhuzamos lekérdezést akkor az utoljára lekért helyre teszzük az adatot
    }
    self = null; if (self) return; // opera-ban (self nem lesz null) onreadystatechange résznél kezelve az eseményt, itt kilépés
    selfo.onLoad();
    try{ 
     if (selfo.xmlhttp.status == 200) {
      selfo.callback(selfo.xmlhttp.responseText, selfo.callbackparam);
     } else { selfo.onError('HTTP Error Making Request: ['+selfo.xmlhttp.status+'] '+selfo.xmlhttp.statusText+'\n'+url); }
    } catch (e) {
     self = oldself; // szándékos hiba a böngésző típus kikerülés miatt
     if (self.xmlhttp.status == 200) {
      self.callback(self.xmlhttp.responseText, self.callbackparam);
     } else { selfo.onError('HTTP Error Making Request: ['+selfo.xmlhttp.status+'] '+selfo.xmlhttp.statusText+'\n'+url); }
    }
    Channels.remove(selfo);
   };
   } catch (e) {;}
   Channels.add(this.xmlhttp, this);
  }
  this.xmlhttp.send(payload);
  if (!this.isAsync) { return this.xmlhttp.responseText; } else { this.onSend(); }
  return 1;
 }
}

// FillDiv példa: <a href="javascript:FillDiv('targetDivName','ajaxrespond.php?id=423&name=user')">Link</a>
function FillDiv(divname, requesturl, loadingstring) {
 if ((oldie) && (loadthread>0)) { RecalRandomTime("FillDiv('"+divname+"',\""+requesturl+"\");"); return; }
 if (_getElement(divname) == null) { if (showalert) alert("Invalid target :"+divname); return; }
 var client = new HttpClient();
 client.isAsync = true;
 client.callbackparam = divname;
 _getElement(divname).innerHTML = "";
 if (loadingstring) _getElement(divname).innerHTML = loadingstring;
 client.callback = function(result, divname) {
  var obj = _getElement(divname)
  if (obj) { obj.innerHTML = result; } else { if (showalert) alert("Invalid target : "+divname); return; }
  runJS(divname);
  //evaluateCss(divname);
 }
 client.makeRequest(requesturl, null);
}

// FillDiv példa: <a href="javascript:FillDiv('targetDivName','ajaxrespond.php', 'id=423&name=user')">Link</a>
function FillDivPost(divname, requesturl, postmsg, loadingstring) {
 if ((oldie) && (loadthread>0)) { RecalRandomTime("FillDivPost('"+divname+"',\""+requesturl+"\",\""+postmsg+"\");"); return; }
 if (_getElement(divname) == null) { if (showalert) alert("Invalid target :"+divname); return; }
 var client = new HttpClient();
 client.isAsync = true;
 client.requestType = "POST";
 client.callbackparam = divname;
 _getElement(divname).innerHTML = "";
 if (loadingstring) _getElement(divname).innerHTML = loadingstring;
 client.callback = function(result, divname) {
  var obj = _getElement(divname)
  if (obj) { obj.innerHTML = result; } else { if (showalert) alert("Invalid target : "+divname); return; }
  runJS(divname);
  //evaluateCss(divname);
 }
 client.makeRequest(requesturl, postmsg);
}

function converturl(url) {
 var re = /&/g;
 return url.replace(re, "&amp;");
}

// FillDiv példa: <a href="javascript:FillDiv('targetDivName','ajaxrespond.php', 'reqistration_form')">Link</a>
function FillDivForm(divname, requesturl, formname, loadingstring) {
 if ((oldie) && (loadthread>0)) { RecalRandomTime("FillDivForm('"+divname+"',\""+requesturl+"\",'"+formname+"');"); return; }
 var postmsg = "";
 var x=_getElement(formname);
 if (x == null) { if (showalert) alert("Invalid form :"+formname); return; }
 for (var i=0;i<x.length;i++) {
  if (x.elements[i].name=="") continue;
  if (( (x.elements[i].type != "checkbox") && (x.elements[i].type != "radio")) || (x.elements[i].checked)) {
   if (postmsg != "") postmsg += "&";
   postmsg += x.elements[i].name + "=" + converturl(x.elements[i].value);
  }
 }
 FillDivPost(divname, requesturl, postmsg, loadingstring);
}

//
// Háttérben/dinamikusan betöltött *.js fájlok tartalmára várakozás
// Használat: WaitForObject(szuksegesobjektumneve, callback_fuggveny, ellenorzesiciklusido);
var WaitObjects = Array();
var runningwait = false;

function removeWaiter(obj) {
 var neww = Array();
 for (var i=0;i<WaitObjects.length;i++) if (WaitObjects[i] != obj) neww.push(WaitObjects[i]);
 WaitObjects = neww;
}

function CheckWaiters() {
 if (WaitObjects.length == 0) { runningwait = false; return; }
 var minct = 1000000;
 for(var i=0;i<WaitObjects.length;i++) {
  var t = true;
  eval("if (typeof "+WaitObjects[i].o+" == 'undefined') t = false;");
  if (t) { WaitObjects[i].cb(); removeWaiter(WaitObjects[i]); minct=50; break; }
  else if (WaitObjects[i].ct<minct) minct = WaitObjects[i].ct;
 }
 if (minct == 1000000) minct = 500;
 var t = setTimeout("CheckWaiters()", minct);
}

function WaitForObject(objname, callback, checktime) {
 var t = false;
 eval("if (typeof "+objname+" != 'undefined') t = true;");
 if (t) { callback(); return; }
 if (checktime<1) checktime = 1000;
 var e = new Object(); e.o  = objname; e.cb = callback; e.ct = checktime;
 WaitObjects.push(e);
 if (runningwait == false) { runningwait = true; var t = setTimeout("CheckWaiters()", checktime); } 
}

