// set the refresh rate for new messages
// 1000 = 1 second
// set it higher to reduce server load
// set it lower to for a more responsive chat
// should not be set to less than 1000
var updateInterval = 5000;
// Show debug messages, keep this set to false
// unless you are having problems.
var debugMode = false;

// no need to change any of these
var chatURL = "liveChat.php";
var httpRequest = getRequestObj();
var cache = new Array();
var lastMessageID = -1;
var timerId = 0;
var running = 0;
var show_status = 0;


function getRequestObj()
{
  var xmlHttp;
  try
  {
    xmlHttp = new XMLHttpRequest();
  }
  catch(e)
  {
    var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP");
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
    {
      try
      {
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
      }
      catch (e) {}
    }
  }

  if (!xmlHttp)
  {
    alert("Error starting Live Chat.");
  }
  else
  {
    return xmlHttp;
  }
}


function startChat()
{
  if (show_status == 1)
  {
    document.getElementById("status").innerHTML = 'Initializing...';
  }
  var oMessageBox = document.getElementById("messageBox");
  oMessageBox.setAttribute("autocomplete", "off");
  running = 1;
  getMessages();
}

function stopChat()
{
  if (running == 0)
  {
    running = 1;
    timerId = setTimeout("getMessages();", updateInterval);
    document.getElementById('switch').src = 'modules/Live_Chat/images/stop.png';
    document.getElementById('switch').title= 'Stop Chat';
    if (show_status == 1)
    {
      document.getElementById("status").innerHTML = 'Restarting...';
    }
  }
  else
  {
    running = 0;
    takeOffline();
    clearTimeout(timerId);
    document.getElementById('switch').src = 'modules/Live_Chat/images/go.png';
    document.getElementById('switch').title = 'Start Chat';
    document.getElementById('online').innerHTML = '';
    if (show_status == 1)
    {
      document.getElementById("status").innerHTML = 'Stopped';
    }
  }
}

function handleReceivingMessages()
{
  if (httpRequest.readyState == 4)
  {
    if (httpRequest.status == 200)
    {
      try
      {
        readMessages(httpRequest);
      }
      catch(e)
      {
        displayError(e.toString());
      }
    }
    else
    {
      displayError(httpRequest.statusText);
    }
  }
}

function sendMessage()
{
  var oCurrentMessage = document.getElementById("messageBox");
  var currentTextColor = document.getElementById("textColor").value;
  var currentTextSize  = document.getElementById("textSize").value;
  var currentTextBold = document.getElementById("textBold").value;
  var currentTextItalic = document.getElementById("textItalic").value;
  var currentTextUnderline = document.getElementById("textUnderline").value;
  
  if (oCurrentMessage.value.replace(/(^\s+)|(\s+$)/g, "") != "")
  {
    params =  "mode=postMessage" + "&id=" + encodeURIComponent(lastMessageID) + "&color=" + encodeURIComponent(currentTextColor) + "&size=" + encodeURIComponent(currentTextSize) + "&message=" + encodeURIComponent(oCurrentMessage.value);
    if (currentTextBold == 1) { params += "&b=1"; }
    if (currentTextItalic == 1) { params += "&i=1"; }
    if (currentTextUnderline == 1) { params += "&u=1"; }
    cache.push(params);
    oCurrentMessage.value = "";
  }
}

function getMessages()
{
  var currentTextColor = document.getElementById("textColor").value;
  var currentTextSize = document.getElementById("textSize").value;
  var currentTextBold = document.getElementById("textBold").value;
  var currentTextItalic = document.getElementById("textItalic").value;
  var currentTextUnderline = document.getElementById("textUnderline").value;
  var checkOnline = '';
  
  if(httpRequest)
  {
    try
    {
      if (httpRequest.readyState == 4 || httpRequest.readyState == 0)
      {
        var params = "";
        if (cache.length>0)
        {
          params = cache.shift();
        }
        else
        {
          params = "mode=getNew" + "&id=" +lastMessageID;
        }

        httpRequest.open("POST", chatURL, true);
        httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        httpRequest.onreadystatechange = handleReceivingMessages;
        httpRequest.send(params);
      }
      else
      {
        timerId = setTimeout("getMessages();", updateInterval);
      }
    }
    catch(e)
    {
      displayError(e.toString());
    }
  }
  if (show_status == 1)
  {
    document.getElementById("status").innerHTML = "Updating...";
  }
}


function readMessages(httpRequest)
{
  if (show_status == 1)
  {
    document.getElementById("status").innerHTML = 'Idle';
  }
  var response = httpRequest.responseText;
  if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0)
    throw(response.length == 0 ? "Void server response." : response);

  response = httpRequest.responseXML.documentElement;

  denyPost = response.getElementsByTagName("denied").item(0).firstChild.data;
  if (denyPost == "true")
  {
    outputMessage("<div style='color: red; font-weight: bold;'>You Must Login To Post<\/div><br \/>");
  }
  
  var online = response.getElementsByTagName("online").item(0).firstChild.data;
  if (online != 'false')
  {
    var userList = '';
    userArray = response.getElementsByTagName("user");
    for(var i=0; i<userArray.length; i++)
    {
      var user = userArray.item(i).firstChild.data.toString();
      userList += "<div style='width: 138px; margin-bottom: 6px;'><img src='modules/Live_Chat/images/user-icon.png' alt='' /> <a target='blank' href='modules.php?name=Your_Account&amp;op=userinfo&amp;username=" + user + "'><strong>" + user + "</strong></a></div>";
    }
    document.getElementById("online").innerHTML = userList;
  }
  
  idArray = response.getElementsByTagName("id");
  colorArray = response.getElementsByTagName("color");
  sizeArray = response.getElementsByTagName("size");
  styleArray = response.getElementsByTagName("style");
  nameArray = response.getElementsByTagName("name");
  timeArray = response.getElementsByTagName("time");
  messageArray = response.getElementsByTagName("message");
  displayMessages(idArray, colorArray, sizeArray, styleArray, nameArray, timeArray, messageArray);
  if(idArray.length>0)
    lastMessageID = idArray.item(idArray.length - 1).firstChild.data;

  timerId = setTimeout("getMessages();", updateInterval);
}


function displayMessages(idArray, colorArray, sizeArray, styleArray, nameArray, timeArray, messageArray)
{

  for(var i=0; i<idArray.length; i++)
  {
    var color = colorArray.item(i).firstChild.data.toString();
    var size = sizeArray.item(i).firstChild.data.toString();
    var style = styleArray.item(i).firstChild.data.toString();
    var time = timeArray.item(i).firstChild.data.toString();
    var name = nameArray.item(i).firstChild.data.toString();
    var message = messageArray.item(i).firstChild.data.toString();
    var htmlMessage = "";
    colorStr = (color == '') ? '' : ' color: '+color+';';
    sizeStr = (size == '') ? '' : ' font-size: '+size+';';
    format = style.split("|");
    boldStr = (format[0] == 0) ? '' : ' font-weight: bold;';
    italicStr = (format[1] == 0) ? '' : ' font-style: italic;';
    underlineStr = (format[2] == 0) ? '' : ' text-decoration: underline;';
    
    htmlMessage += "<div style='margin-bottom: 6px;'>";
    htmlMessage += "<a target='blank' href='modules.php?name=Your_Account&amp;op=userinfo&amp;username=" + name + "'><strong>" + name + "</strong></a>:&nbsp; <span style='"+colorStr+sizeStr+boldStr+italicStr+underlineStr+"'>";
    htmlMessage += message.toString();
    htmlMessage += "</span><br />" + time + "";
    htmlMessage += "</div>";
    outputMessage(htmlMessage);
  }
}


function outputMessage(message)
{
  var oScroll = document.getElementById("scroll");
  var scrollDown = (oScroll.scrollHeight - oScroll.scrollTop <= oScroll.offsetHeight);
  oScroll.innerHTML += message;
  oScroll.scrollTop = scrollDown ? oScroll.scrollHeight : oScroll.scrollTop;
}


function displayError(message)
{
  outputMessage("Error accessing the server! "+ (debugMode ? "<br/>" + message : ""));
}

function handleKey(e)
{
  e = (!e) ? window.event : e;
  code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
  if (e.type == "keydown")
  {
    if(code == 13)
    {
      sendMessage();
    }
  }
}



function toggleStyle(styleId, formId)
{
  styleobj = document.getElementById(styleId);
  formobj  = document.getElementById(formId);
  
  if (formobj.value == 1)
  {
    formobj.value = '';
    //styleobj.style.border = '1px solid black';
    styleobj.style.background = 'transparent';
    
  }
  else
  {
    formobj.value = 1;
    //styleobj.style.border = '1px solid '+bgcolor2;
    styleobj.style.background = bgcolor2;
  }
}


function overlayElement(id, elem)
{
  x=document.getElementById(id);
  y=document.getElementById(elem);
  
  y.xx=getposOffset(y, "left")
  y.yy=getposOffset(y, "top")
  x.style.left=y.xx-clearbrowseredge(y, "rightedge")+"px"
  x.style.top=y.yy-clearbrowseredge(y, "bottomedge")+x.offsetHeight+"px"
  
  if (x.style.display == "none")
  {
    x.style.display = "";
  }
  else
  {
    x.style.display = "none";
  }
}

function getposOffset(what, offsettype)
{
  var totaloffset = (offsettype == "left") ? what.offsetLeft : what.offsetTop;
  var parentEl = what.offsetParent;
  while (parentEl != null)
  {
    totaloffset = (offsettype == "left") ? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
    parentEl = parentEl.offsetParent;
  }
  return totaloffset;
}


var vertical_offset   = "16px";
var horizontal_offset = "16px";
var ie4 = document.all;
var ns6 = document.getElementById && !document.all;
function clearbrowseredge(obj, whichedge)
{
  var edgeoffset = (whichedge == "rightedge") ? parseInt(horizontal_offset) * -1 : parseInt(vertical_offset) * -1;
  var iecompat = (document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
  if (whichedge == "rightedge")
  {
    var windowedge = (ie4 && !window.opera) ? iecompat.scrollLeft + iecompat.clientWidth - 15 : window.pageXOffset + window.innerWidth - 15;
    y.contentmeasure = y.offsetWidth;
    if (windowedge - y.xx < y.contentmeasure)
      edgeoffset = y.contentmeasure - obj.offsetWidth;
  }
  else
  {
    var windowedge = (ie4 && !window.opera) ? iecompat.scrollTop + iecompat.clientHeight - 15 : window.pageYOffset + window.innerHeight - 18;
    y.contentmeasure = y.offsetHeight;
    if (windowedge - y.yy < y.contentmeasure)
    edgeoffset = dropmenuobj.contentmeasure + obj.offsetHeight
  }
  return edgeoffset
}


function chatWindow(mypage,myname,w,h)
{
  var win = null;
  LeftPosition = (screen.width) ? (screen.width-w)/2 : 100;
  TopPosition = (screen.height) ? (screen.height-h)/2 : 100;
  httpRequest = '';
  clearTimeout(timerId);
  document.getElementById("messageBox").disabled = 'disabled';
  document.getElementById("sendMessage").disabled = 'disabled';
  document.getElementById("scroll").innerHTML = "";
  document.getElementById("online").innerHTML = "";
  settings = 'width='+ w +',height='+ h +',top='+ TopPosition +',left='+ LeftPosition +',scrollbars=no,location=no,directories=no,status=yes,menubar=no,toolbar=no,resizable=yes';
  win = window.open(mypage, myname, settings);
}


function takeOffline()
{
  if(httpRequest)
  {
    try
    {
      if (httpRequest.readyState == 4 || httpRequest.readyState == 0)
      {
        httpRequest.open("POST", chatURL, true);
        httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        httpRequest.onreadystatechange = function () { return false; }
        httpRequest.send("&logout=1");
      }
    }
    catch(e)
    {
      displayError(e.toString());
    }
  }
}

window.onload   = function() { startChat(); }
window.onunload = function() { takeOffline(); }
window.onclose  = function() { takeOffline(); }
