/* <
 * File   : common.php
 * Purpose: PHP-generated JavaScript file.
 *          Sends XML request to Chategory.
 *          Prepends new messages if someone has sent one within the past "x" seconds.
 *          Interval ("x") defined by admin (or mod[s], if admin allows it).
*/

var $_config = {
  paginate    : 15,
  dateDisplay : true,
  refreshRate : 2*1000
};

var $_env = {
       opera      : window.opera?true:false,
       winLoad    : false,
       loc        : location.href,
       getElemId  : null,
       iHtml      : null,
       xmlhttpreq : false,
       activex    : false,
       entries    : new Array(),
       entryTimer : null,
       userTimer  : null,
       iconVisible: false,
       iconTimer  : null,
       debug      : true
};

var $_ajax = {
  xmlObj       : null,
  sendXml      : null,
  init         : function (){
   if($_env.loc.indexOf("?s") == -1 || $_env.loc.indexOf("?s=0") != -1){
    if($_env.loc.indexOf("index.php") != -1 || $_env.loc.indexOf(".php") == -1){
     $_env.entryTimer = setInterval("$_ajax.read()", $_config.refreshRate);
     var startStop = document.getElementById ('startStop');
         startStop.style.display = 'inline';
         startStop.onclick = function(){ $_ajax.stop(); }
         startStop.firstChild.data = 'Stop';
    }
   }
  },
  stop         : function (){
   if($_env.entryTimer){
      clearInterval($_env.entryTimer);
      $_env.entryTimer = null;
   }
   var startStop = document.getElementById ('startStop');
       startStop.onclick = function (){ $_ajax.init(); }
       startStop.firstChild.data = 'Start';
  },
  arySearch    : function (obj, ary){
   var len = ary.length;
    for(var i=0; i<len; i++){
     if(ary[i]){
      if(ary[i].getElementsByTagName("date")[0].firstChild.data == obj.getElementsByTagName("date")[0].firstChild.data
      && ary[i].getElementsByTagName("message")[0].firstChild.data == obj.getElementsByTagName("message")[0].firstChild.data){
         return true;
      }
     }
    }
   return false;
  },
  read         : function (url){
   if(!url) url = 'update.php';
   if($_env.opera || !$_env.getElemId || !$_env.iHtml){
      $_ajax.stop();
      return;
   }
      $_ajax.showIcon();
   if($_env.xmlhttpreq){
      $_ajax.xmlObj = new XMLHttpRequest();
      $_ajax.xmlObj.onreadystatechange = $_ajax.parseUpdates;
      $_ajax.xmlObj.open ("GET", url, true);
      $_ajax.xmlObj.send (null);
    return true;
   } else if($_env.activex){
      $_ajax.xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
      $_ajax.xmlObj.onreadystatechange = $_ajax.parseUpdates;
      $_ajax.xmlObj.open ("GET", url, true);
      $_ajax.xmlObj.send();
    return true;
   }
   if($_env.debug){
      alert ('Error! There was an error in the initialization process for reading '+url);
   }
   return false;
  },
  parseUpdates : function(){
   if(!$_ajax.xmlObj){
       return false;
   }
   if($_ajax.xmlObj.readyState == 4 && $_ajax.xmlObj.responseXML){
    var response = $_ajax.xmlObj.responseXML.documentElement;
     if(!response.getElementsByTagName("entry")){
      if($_env.debug){
         alert('Error! The "entry" element of the XML file was not found.');
      }
        return false;
     }
    var
       entry = response.getElementsByTagName("entry"),
       iLen = entry.length,
       eLen = $_env.entries.length;

     for(var m=0; m<iLen; m++){
       if(!$_ajax.arySearch(entry[m], $_env.entries) && ($_config.paginate-1) <= eLen){
           $_ajax.updateEntries
            (
             entry[m].getElementsByTagName("name")   [0].firstChild.data,
             entry[m].getElementsByTagName("class")  [0].firstChild.data,
             entry[m].getElementsByTagName("message")[0].firstChild.data,
             entry[m].getElementsByTagName("date")   [0].firstChild.data
            );
       }
       if($_config.paginate <= eLen){
          $_env.entries.shift();
       }
          $_env.entries[$_env.entries.length] = entry[m];
       var pElem = document.getElementsByTagName("P");
       if (typeof(pElem[($_config.paginate+1)]) != "undefined" && pElem[($_config.paginate+1)].className != ""){
           temp = document.getElementById("chatBox");
           temp.removeChild(temp.getElementsByTagName("P")[temp.getElementsByTagName("P").length-2]);
       }
     }
   }
  },
  sendReq      : function (obj,url){
   if(!$_env.entryTimer){ $_ajax.init(); } // un-pause
   var data = obj.value;
   if($_env.opera){
      return true;
   }
       obj.value = '';
       obj.focus();
       $_ajax.showIcon();
       url = !url?"post.php":url;
   if ($_env.xmlhttpreq) {
       $_ajax.sendXml = new XMLHttpRequest();
       $_ajax.sendXml.open("POST", url, false);
       $_ajax.sendXml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
       $_ajax.sendXml.send(obj.name+"="+data);
       $_ajax.read();
   } else if ($_env.activex) {
       $_ajax.sendXml = new ActiveXObject("Microsoft.XMLHTTP");
       $_ajax.sendXml.open("POST", url, false);
       $_ajax.sendXml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
       $_ajax.sendXml.send(obj.name+"="+data);
       $_ajax.read();
   }
   return false;
  },
  showIcon     : function (){
   if($_env.winLoad){
    document.getElementById('cInput').firstChild.style.background = 'url(indicator.gif) 100% 50% no-repeat';
    $_env.iconVisible = true;
    $_env.iconTimer = setTimeout('$_ajax.hideIcon()', $_config.refreshRate/2);
   }
  },
  hideIcon     : function (){
   if($_env.winLoad){
      document.getElementById('cInput').firstChild.style.backgroundImage = '';
      $_env.iconVisible = false;
      $_env.iconTimer = null;
   }
  },
  updateEntries: function (user, sClass, msg, date){
   if($_config.dateDisplay){
    var newData = "<p class=\""+sClass+"\">At "+date+" <span class=\"name\">"+user+"</span> said: "+msg+"</p>";
   } else {
    var newData = "<p class=\""+sClass+"\"><span class=\"name\">"+user+"</span> says: "+msg+"</p>";
   }
   var temp = document.getElementById("chatBox");
       temp.innerHTML = newData+temp.innerHTML;
       $_ajax.hideIcon();
  }
}

var $_online = {
 xmlObj   : null,
 init     : function (){
  $_env.userTimer = setInterval("$_online.read()", $_config.refreshRate);
 },
 stop     : function (){
  if($_env.userTimer){
     clearInterval($_env.userTimer);
     $_env.userTimer = null;
  }
 },
 read     : function (){
  var url = "online.php?xml";
  if($_env.loc.indexOf("online") != -1)
   { url += "=0"; }
  else 
   { url += "=1"; }
  if(!$_env.getElemId || !$_env.iHtml || !document.getElementById("uOnline") || $_env.opera){
     $_online.stop();
     return;
   }
  if ($_env.xmlhttpreq) {
      $_online.xmlObj = new XMLHttpRequest();
      $_online.xmlObj.onreadystatechange = $_online.update;
      $_online.xmlObj.open("GET", url, true);
      $_online.xmlObj.send(null);
  } else if ($_env.activex) {
      $_online.xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
      $_online.xmlObj.onreadystatechange = $_online.update;
      $_online.xmlObj.open("GET", url, true);
      $_online.xmlObj.send();
  }
 },
 update   : function (){
  if($_online.xmlObj.readyState == 4 && $_online.xmlObj.responseXML){
   var response = $_online.xmlObj.responseXML.documentElement;
    if($_env.loc.indexOf("online") == -1){
       document.getElementById("uOnlineSpan").innerHTML = response.firstChild.data;
    } else {
       var len = response.firstChild.childNodes.length, temp = '';
        for(var j=0; j<len; j++){
            temp += "<li>"+response.firstChild.childNodes[j].firstChild.data+"</li>";
        }
       document.getElementById("uOnline").innerHTML = "<ul>"+temp+"</ul>";
   }
  }
 }
};

function load(){
 $_env = {
       opera      : window.opera?true:false,
       winLoad    : true,
       loc        : location.href,
       getElemId  : document.getElementById?true:false,
       iHtml      : document.getElementsByTagName("BODY")[0].innerHTML?true:false,
       xmlhttpreq : window.XMLHttpRequest?true:false,
       activex    : window.ActiveXObject?true:false,
       entries    : new Array(),
       entryTimer : null,
       userTimer  : null,
       iconVisible: false,
       debug      : true
     };
     $_ajax.init();
     $_online.init();
}

if(window.attachEvent){
   window.attachEvent('onload', load);
} else if(window.addEventListener && !$_env.opera){
   window.addEventListener('load', load, false);
}

if(!Array.prototype.shift){
 Array.prototype.shift = function (){
  var temp = this[this.length-1];
  delete this[this.length-1];
  return temp;
 }
}