//Author and copyright: Thomas Papenmeier, 2008var servlet = "http://www.erbrecht-papenmeier.de/erbrecht/erbrecht";var getQueryInterval;var sentTime = 0;var updateTime = 0;var waitingForAnswer = false;var chat = new Array();var wideChat = false;var chatClosed = true;var isRechtsanwalt = false;var isAdmin = false;var internetExplorer = false;var channel = "Lobby";var doWelcome = false;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(chatxml,channel){ this.channel = channel; 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("privat=");  if (indexChat != -1)  {   var semicolon = a.indexOf(";",indexChat);   if(semicolon == -1)   {    semicolon = a.length;   }   document.getElementById("privat").checked = (a.substring(indexChat+7,semicolon) == "true");  } } if (!chatClosed) {  document.getElementById("rechts").style.display = "block";  document.getElementById("rechtsohne").style.display = "none";  if (chatxml == "0") //kein userobject  {   queryChat();  }  else  {   receiveFromServlet(chatxml);//force scroll down   var objDiv = document.getElementById("chattext");   objDiv.scrollTop = objDiv.scrollHeight;  }  getQueryInterval = window.setInterval("queryChat();",3000); //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("action=querychat"); return true;}function sendChat(){ if (document.getElementById("chatinput").value != '')  {  var privat = document.getElementById("privat").checked;  var chatLine = document.getElementById("chatinput").value;    chatLine = toValidString(chatLine);    if (privat)  {   chatLine = "#" + chatLine;  }  var success = sendToServlet("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("Der Server ist für einen Moment beschäftigt. Dies kann auch sein, weil gerade automatisch Nachrichten abgefragt werden. Bitte senden Sie die Nachricht nochmal.");  }  return false; } 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; }  if (xml.indexOf("*rechtsanwalt*") != -1) {  isRechtsanwalt = true; } if (xml.indexOf("*admin*") != -1) {  isAdmin = true; }//Willkommensnachricht  if (xml.indexOf("*welcome*") != -1) {  doWelcome = true; } var index = xml.indexOf("*chat*"); while (index != -1) {  chat.push(getChatMessage(xml.substring(xml.indexOf("*chat*",index)+6,xml.indexOf("*/chat*",index))));  index += 1;  index = xml.indexOf("*chat*",index); } updateChat();  if (xml.indexOf("*name*") != -1) {  document.getElementById("chatname").value = getStringFromXML(xml,"name"); } document.getElementById("usersonline").innerHTML = getStringFromXML(xml,"usersonline")   + " Besucher 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];  } }  var thirdPerson = false; if (xml.indexOf("*thirdperson*") != -1) {  thirdPerson = true; }  var hasAvatar = false; if (!thirdPerson && (xml.indexOf("*avatar*") != -1)) {  hasAvatar = true; } var avatarURL = ""; if (hasAvatar) {  avatarURL = getStringFromXML(xml,"avatar"); } //                                           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 privat = document.getElementById("privat").checked; var chatContent = ""; if (doWelcome == true) {  chatContent += "<font color=\"#666666\">Sie wurden automatisch in den Chatraum eingeloggt. In dem Textfeld oben können Sie Ihren Chatnamen ändern. Mit dem Textfeld unten können Sie Nachrichten schicken. Probieren Sie es doch mit einem einfachen \"Hallo\"!</font><br>"; } chat.sort(chatComparator); for (var i=0;i<chat.length;i++) {  if ((chat[i][1] == "chat") &&    (    (!privat && (chat[i][2] == channel))  //privat nicht angeklickt, nur Lobby	|| (chat[i][2] == "privat") //privat angeklickt, nur privat//	|| (isRechtsanwalt && !privat) //auch Privates in der Lobby   ))  {   if (chat[i][2] == "privat")   {    chatContent += "<font color=#AA0000>[";   }   else   {    chatContent += "<font color=#000000>[";   }   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][7]) //hasAvatar   {    chatContent += "<img src=\"" + chat[i][8] + "\" title=\"" + chat[i][4] + "\">";   }   else //no avatar   {    if (chat[i][6]) //thirdPerson    {     chatContent +="*";    }    else    {     chatContent +="&lt;";    }    chatContent += chat[i][4];    if (!chat[i][6]) //not thirdPerson    {     chatContent += "&gt;"    }   } //Stein: end of no avatar   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) //user scrolled up {  scrollDown = false; } document.getElementById('chattext').innerHTML = getChatContent(); //Stein: scroll down  //alert(objDiv.scrollTop + " " + objDiv.clientHeight + " scroll " + objDiv.scrollHeight); 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 = 'privat=' + document.getElementById("privat").checked + '; expires='+a.toGMTString()+';';  updateChat();}//-----------------------------------------------------function changeWideChat(){ if (chatClosed) {  openChat();  return;   } if (wideChat) {  document.getElementById("mitte").style.display = "block";  document.getElementById("rechts").style.width = "22%";  document.getElementById("widechatbutton").firstChild.nodeValue = "<";  wideChat = false; } else {  document.getElementById("mitte").style.display = "none";  document.getElementById("rechts").style.width = "80%";  document.getElementById("widechatbutton").firstChild.nodeValue = ">";  wideChat = true; }}function closeChat(){ if (wideChat) {  changeWideChat();  return; } clearInterval(getQueryInterval); document.getElementById("rechts").style.display = "none"; document.getElementById("rechtsohne").style.display = "block"; 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("rechts").style.display = "block"; document.getElementById("rechtsohne").style.display = "none"; getQueryInterval = window.setInterval("queryChat();",3000); //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;}function changeName(){ var name = toValidString(document.getElementById("chatname").value); sendToServlet("action=newname&name=" + name);} //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;}