//Author and copyright: Thomas Papenmeier (Stein), 2008var servlet = "http://testserver.shadowmere.de/Shadowmere2/FWS";var getQueryInterval;var sentTime = 0;var updateTime = 0;var lastIncomingUpdateTime = 0;var waitingForAnswer = false;var chat = new Array();var wideChat = false;var chatClosed = false;var internetExplorer = false;var showChat = true;var showAllianceChat = true;function chatComparator(a,b) //Stein: a and b arrays{ var time1 = a[0]; var time2 = b[0]; var result = time1*1 - time2*1; return (result>0)?1:(result<0)?-1:0;}function initChat() { if (navigator.appName == "Microsoft Internet Explorer") {  internetExplorer = true; } if (document.cookie) {  a = document.cookie;  var index = a.indexOf("chatclosed=");  if (index != -1)  {   var semicolon = a.indexOf(";",index);   if(semicolon == -1)   {    semicolon = a.length;   }   chatClosed = (a.substring(index+11,semicolon) == "true");  }  var indexChat = a.indexOf("chaton=");  if (indexChat != -1)  {   var semicolon = a.indexOf(";",indexChat);   if(semicolon == -1)   {    semicolon = a.length;   }   if (a.substring(indexChat+7,semicolon) == "false")   {    showChat = false;   }  }  var indexAllianceChat = a.indexOf("alliancechaton=");  if (indexAllianceChat != -1)  {   var semicolon = a.indexOf(";",indexAllianceChat);   if(semicolon == -1)   {    semicolon = a.length;   }   if (a.substring(indexAllianceChat+15,semicolon) == "false")   {    showAllianceChat = false;   }  } } if (showChat && showAllianceChat) {  document.getElementById("alltab").className = "activechattab";  document.getElementById("chattab").className = "chattab";  document.getElementById("alliancechattab").className = "chattab"; } else if (showChat && !showAllianceChat) {  document.getElementById("alltab").className = "chattab";  document.getElementById("chattab").className = "activechattab";  document.getElementById("alliancechattab").className = "chattab"; } else //alliance chat {  document.getElementById("alltab").className = "chattab";  document.getElementById("chattab").className = "chattab";  document.getElementById("alliancechattab").className = "activechattab";  document.getElementById("chatinput").className = "alliancechat"; } if (!chatClosed) {  receiveFromServlet(chatxml);//force scroll down  var objDiv = document.getElementById("chattext");  objDiv.scrollTop = objDiv.scrollHeight;  getQueryInterval = window.setInterval("queryChat();",4000); //see also openchat } else {  document.getElementById("chathead").style.display = "none";  document.getElementById("chat").style.display = "none";  document.getElementById("usersonline").firstChild.nodeValue = " "; }}function queryChat(){ //Stein: no auto query, if other query last 2 seconds curTime = new Date(); if (sentTime + 4000 >= curTime.getTime()) {  return true; } sendToServlet("actionType=ajax&action=querychat"); return true;}function sendChat(){ if (document.getElementById("chatinput").value != '')  {  var chatLine = document.getElementById("chatinput").value;    chatLine = toValidString(chatLine);    if (!showChat && showAllianceChat)  {   chatLine = "#" + chatLine;  }    var success = sendToServlet("actionType=ajax&action=sendchat&message=" + chatLine);  if (success)  {   document.getElementById("chatinput").value = "";  } }}function sendToServlet(text) //Stein: also puts the response into the chat area{ if (waitingForAnswer) {  if (sentTime + 3000 < curTime.getTime()) //Stein: It is 3 seconds since last query  {   waitingForAnswer = false;  }  else  {   setTimeout("sendToSevlet('" + text +"')",1000);//   alert("The server is currently answering one of your queries. Please wait a few seconds!");  } } waitingForAnswer = true; text += "&time=" + updateTime; //for chat and news var xmlHttp = null; // Mozilla, Opera, Safari sowie Internet Explorer 7 if (typeof XMLHttpRequest != 'undefined') {  xmlHttp = new XMLHttpRequest(); } if (!xmlHttp) {  // Internet Explorer 6 und älter  try  {   xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");  }  catch(e)  {   try   {    xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");   }   catch(e)   {    xmlHttp  = null;    alert("Your browser does not support AJAX!");   }  } } if (xmlHttp) {  xmlHttp.open('POST', servlet, true);  xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  xmlHttp.onreadystatechange = function ()  {   if (xmlHttp.readyState == 4) //Stein: answer from server arrived. This is an object handler that is kind of threaded   {    waitingForAnswer = false;    receiveFromServlet(xmlHttp.responseText);   }  };  curTime = new Date();  sentTime = curTime.getTime();  xmlHttp.send(text); } return true;} //Stein: This also parses newsfunction receiveFromServlet(xml){ //alert(xml); //Servlet requests login if (xml.indexOf("<nosession>") != -1) //Stein: not logged in {  alert("login error, tell Stein");  return; }  var index = xml.indexOf("<chat>"); while (index != -1) {  var chatMessageString = xml.substring(xml.indexOf("<chat>",index)+6,xml.indexOf("</chat>",index));  var time = getUnformattedNumberFromXML(chatMessageString,"time");  if (time > lastIncomingUpdateTime) //Stein: used to stop double posts with slow connections  {   chat.push(getChatMessage(chatMessageString));  }  index += 1;  index = xml.indexOf("<chat>",index); } lastIncomingUpdateTime = updateTime; //Stein: used to stop double posts updateChat();  document.getElementById("usersonline").firstChild.nodeValue = getStringFromXML(xml,"usersonline")   + " users online"; }//----------------function getChatMessage(xml){ var time = getUnformattedNumberFromXML(xml,"time"); var type = "chat"; if (time > updateTime) {  updateTime = time; } var channel = getStringFromXML(xml,"channel"); var message = getStringFromXML(xml,"message"); var username = getStringFromXML(xml,"username"); var color = getStringFromXML(xml,"color");  //convert links var messageParts = message.split("http://") ; message = ""; for (var i=0;i<messageParts.length;i++) {  if (i > 0) //all but first are new links  {   var linkEnd = messageParts[i].indexOf(" ");   var messageEnd = messageParts[i].length;   if (linkEnd == -1)   {    linkEnd = messageEnd;   }   var link = messageParts[i].substring(0,linkEnd);   var rest = messageParts[i].substring(linkEnd,messageEnd);   message += "<a href=\"http://" + link + "\" target=\"_blank\">http://" + link + "</a>";   message += rest;  }  else  {   message += messageParts[i];  } } //insert emoticons/smileys message = message.replace(/:@/g,"<img src=\"images/angry.jpg\">"); message = message.replace(/:\(/g,"<img src=\"images/frown.jpg\">"); message = message.replace(/\/bash/g,"<img src=\"images/blush.jpg\">"); message = message.replace(/:'\(/g,"<img src=\"images/cry.jpg\">"); message = message.replace(/\*\?/g,"<img src=\"images/dark.jpg\">"); message = message.replace(/8\|/g,"<img src=\"images/disbelief.jpg\">"); message = message.replace(/:\)/g,"<img src=\"images/th_smile.jpg\">"); message = message.replace(/\/heart/g,"<img src=\"images/heart.jpg\">"); message = message.replace(/:x/g,"<img src=\"images/kiss.jpg\">"); message = message.replace(/:X/g,"<img src=\"images/kiss.jpg\">"); message = message.replace(/:-\*/g,"<img src=\"images/kiss.jpg\">"); message = message.replace(/\/roflmao/g,"<img src=\"images/roflmao.jpg\">"); message = message.replace(/\/busypoo/g,"<img src=\"images/busypooping.jpg\">"); message = message.replace(/:s/g,"<img src=\"images/disbelief.jpg\">"); message = message.replace(/:S/g,"<img src=\"images/disbelief.jpg\">"); message = message.replace(/:o/g,"<img src=\"images/ohdear.jpg\">"); message = message.replace(/:O/g,"<img src=\"images/ohdear.jpg\">"); message = message.replace(/\/poo/g,"<img src=\"images/Got_poo.jpg\">"); message = message.replace(/:P/g,"<img src=\"images/tongue.jpg\">"); message = message.replace(/:p/g,"<img src=\"images/tongue.jpg\">"); message = message.replace(/:D/g,"<img src=\"images/grin.jpg\">"); message = message.replace(/;\)/g,"<img src=\"images/wink.jpg\">"); message = message.replace(/\/santa/g,"<img src=\"images/santa.jpg\">"); message = message.replace(/\/vamp/g,"<img src=\"images/vamp.jpg\">"); message = message.replace(/\/orc/g,"<img src=\"images/orc.jpg\">"); message = message.replace(/\/moogly/g,"<img src=\"images/gomo.jpg\">"); message = message.replace(/\/moo/g,"<img src=\"images/moo.jpg\">"); message = message.replace(/\/lep/g,"<img src=\"images/lep.jpg\">"); message = message.replace(/O_o/g,"<img src=\"images/bugeyed.jpg\">");       var thirdPerson = false; if (xml.indexOf("<thirdperson>") != -1) {  thirdPerson = true; }  var hasAvatar = false; if (xml.indexOf("<avatar>") != -1) {  hasAvatar = true; } var avatarURL = ""; if (hasAvatar) {  avatarURL = getStringFromXML(xml,"avatar"); } //Stein:                                             0         1           2                    3                 4                 5                 6                                     7                               8 message = new Array(time,type,channel,message,username,color,thirdPerson,hasAvatar,avatarURL); return message;}//--------------------------------------------------------------------function getChatContent(){ var chatContent = ""; chat.sort(chatComparator); for (var i=0;i<chat.length;i++) {  if ((chat[i][1] == "chat") &&    ((showChat && (chat[i][2] == "Lobby")) || (showAllianceChat && (chat[i][2] == "alliance"))))  {   if (chat[i][2] == "alliance")   {    chatContent += "<font color=#00FF00>[";   }   else   {    chatContent += "<font color=#FFFFCC>[";   }   date = new Date(chat[i][0]);   chatContent += date.getHours() + ":";   var mins = date.getMinutes();   if (mins <= 9)   {    chatContent += "0";   }   chatContent += mins;   chatContent += "] ";   chatContent += "</font><font color=";   chatContent += chat[i][5];   chatContent += ">";   if (chat[i][6]) //thirdPerson   {    chatContent +="*";	chatContent += chat[i][4]; //userName   }   else   {    if (chat[i][7]) //hasAvatar    {     chatContent += "<img src=\"" + chat[i][8] + "\" title=\"" + chat[i][4] + "\">";    }    else //no avatar    {     chatContent +="&lt;";     chatContent += chat[i][4]; //userName     chatContent += "&gt;"    } //Stein: end of no avatar   } //Stein: end of thirdperson   chatContent += " ";   chatContent += chat[i][3];   chatContent += "</font>";   //Stein: insert line breaks   if (i < chat.length-1)   {    chatContent += "<br>"   }  } } return chatContent;} //-----------------------------------------------function updateChat(){ var objDiv = document.getElementById("chattext"); var scrollDown = true; if (objDiv.scrollTop + objDiv.clientHeight < objDiv.scrollHeight - 100) //Stein: user scrolled up; the -100 is because firefox stopped scrolling from time to time {  scrollDown = false; } document.getElementById('chattext').innerHTML = getChatContent(); //Stein: scroll down  if (scrollDown) {  objDiv.scrollTop = objDiv.scrollHeight; }}//--------------------------------------------------------function updateChatCookie(){ var a = new Date(); a = new Date(a.getTime() + 1000*60*60*24*365); // 1 year document.cookie = 'chaton=' + showChat + '; expires='+a.toGMTString()+';'; document.cookie = 'alliancechaton=' + showAllianceChat + '; expires='+a.toGMTString()+';';  updateChat();}//------------------------------------------------------------------function allChatTab(){ showChat = true; showAllianceChat = true; document.getElementById("alltab").className = "activechattab"; document.getElementById("chattab").className = "chattab"; document.getElementById("alliancechattab").className = "chattab"; document.getElementById("chatinput").className = "chatinput"; updateChatCookie();}function chatTab(){ showChat = true; showAllianceChat = false; document.getElementById("alltab").className = "chattab"; document.getElementById("chattab").className = "activechattab"; document.getElementById("alliancechattab").className = "chattab"; document.getElementById("chatinput").className = "chatinput"; updateChatCookie();}function allianceChatTab(){ showChat = false; showAllianceChat = true; document.getElementById("alltab").className = "chattab"; document.getElementById("chattab").className = "chattab"; document.getElementById("alliancechattab").className = "activechattab"; document.getElementById("chatinput").className = "alliancechat"; updateChatCookie();}//-----------------------------------------------------function changeWideChat(){ if (chatClosed) {  openChat();  return;   } if (wideChat) {  document.getElementById("mitte").style.display = "block";  document.getElementById("right").style.width = "22%";  document.getElementById("widechatbutton").firstChild.nodeValue = "<";  wideChat = false;  //Stein: enforce scrolling, because the thin chat is farer down  var objDiv = document.getElementById("chattext");  objDiv.scrollTop = objDiv.scrollHeight; } else {  document.getElementById("mitte").style.display = "none";  document.getElementById("right").style.width = "80%";  document.getElementById("widechatbutton").firstChild.nodeValue = ">";  wideChat = true; }}function closeChat(){ if (wideChat) {  changeWideChat();  return; } clearInterval(getQueryInterval); document.getElementById("chat").style.display = "none"; document.getElementById("chathead").style.display = "none"; document.getElementById("usersonline").firstChild.nodeValue = " "; var a = new Date(); a = new Date(a.getTime() + 1000*60*60*24*365); // 1 year document.cookie = 'chatclosed=true; expires='+a.toGMTString()+';';  chatClosed = true;}function openChat(){ document.getElementById("chat").style.display = "block"; document.getElementById("chathead").style.display = "block"; getQueryInterval = window.setInterval("queryChat();",4000); //see also initChat var a = new Date(); a = new Date(a.getTime() + 1000*60*60*24*365); // 1 year document.cookie = 'chatclosed=false; expires='+a.toGMTString()+';';  chatClosed = false;} //XML functions###########################################################################################function getStringFromXML(xml,tag){ var index1 = xml.indexOf("<" + tag + ">")+tag.length+2; var index2 = xml.indexOf("</" + tag + ">"); if ((index1 == -1) || (index2 == -1) || (index1 == index2)) {  return ""; } return xml.substring(index1,index2);} function getUnformattedNumberFromXML(xml,tag){  var text = getStringFromXML(xml,tag);  return text*1;}  function getNumberFromXML(xml,tag){  var text = getStringFromXML(xml,tag);  return formatNumber(text);}function formatNumber(text){ var number = ""; while (text.length > 3) {  number =  "," + text.substring(text.length-3,text.length) + number;  text = text.substring(0,text.length-3); } number = text + number; return number;}  //Stein: Shows a double as percentfunction getDoublePercentFromXML(xml,tag){  var text = getStringFromXML(xml,tag);  return formatNumber("" + Math.round(text*100)) + "%";}function getBooleanFromXML(xml,tag){ var result = getStringFromXML(xml,tag); return (result == "true");}//-------------------------------------------------------------function toValidString(text){ text = text.replace(/%/g,"%25"); text = text.replace(/\+/g,"%2B"); text = text.replace(/&/g,"%26"); if (internetExplorer) {  text = text.replace(/Ä/g,"%C4");  text = text.replace(/Ö/g,"%D6");  text = text.replace(/Ü/g,"%DC");  text = text.replace(/ä/g,"%E4");  text = text.replace(/ö/g,"%F6");  text = text.replace(/ü/g,"%FC"); } return text;}
