

var chatBoxes = new Array();
var countBoxes = 0;
var chat_userA = new Array();

var requestAllRooms = 0;
var inChat = 1;
var askUser = 0;

function chatStart() {
  var dt = new Date();
  //dtyear = dt.getYear();
  //if (dtyear < 1900) dtyear += 1900;
  clientZeit = Math.floor(Date.parse(dt) / 1000);

  var a = makeChatBox("all",idf("chats"),1);
  a.thema = "public box";
  showProtokoll(a.id);
  //var b = makeChatBox("test1",idf("chats"),1);
  //b.thema = "public box (test 1)";
  //showProtokoll(b.id);
  
  var e = makeNewOwnBox(chatUserName);
  showProtokoll(e.id);
  
  //makeNewBox();
  startLoop();
}

function chatStart_ownBox() {
  var testChat = idf("chats");
  if (testChat != undefined) {
  	inChat = 0;
    var dt = new Date();
    clientZeit = Math.floor(Date.parse(dt) / 1000);
  
    var a1 = makeChatBox("all",idf("chats"),1);
    a1.thema = "public box";
  	chatBox_collapse(a1.id);
    //showProtokoll(a1.id);
    
    if (chatUserTo != chatUserID) {
      var a2 = makeNewBox("Theme", chatUserTo + "_own", 0);
  	  chatBox_collapse(a2.id);
    }
  
    var e = makeNewOwnBox(chatUserName);
  	chatBox_collapse(e.id);
    //showProtokoll(e.id);
    startLoop();
  }	
}

var timeOutC = 0;
var nextUploadTime = 0;

function startLoop() {
 if (0 != timeOutC)
 {
   window.clearTimeout(timeOutC);
   timeOutC = 0;
 }
 var dt = new Date();
 var dtn = Date.parse(dt);
 //alert ((dtn - nextUploadTime));
 if (nextUploadTime < dtn)
 {
   var message = "room=" + getAllRooms();
   if (requestAllRooms == 0) {
     requestAllRooms = 1;
     message = message.concat("&name=", myEncode(chatUserName), "&age=", chatUserAge, "&sex=", chatUserSex , "&inChat=" , inChat);
   }
   if (0 < askUser) {
     message = message.concat("&askUser=", askUser);
     askUser = 0;   	 
   }
   nextUploadTime = dtn + 20000;
   ajaxChatSend("./chatNback.php", message, chatResponse, 1);
 }
 timeOutC = window.setTimeout("startLoop()",2000);
}

function getAllRooms() {
 var allRooms = "";
 for (var i=0; i < chatBoxes.length; i++)
 {
   if (chatBoxes[i].active == 1) {
     if (1 < allRooms.length) allRooms = allRooms.concat(',');
     allRooms = allRooms.concat(chatBoxes[i].id);
   } 
 }
 //alert (allRooms); 
 return allRooms;
}

function setServerTime(time) {
  
  var dt = new Date();
  clientZeit = Math.floor(Date.parse(dt) / 1000);
  serverZeit = time;
}

function addNextUpload(time) {
  
  var dt = new Date();
  var nextUploadTime1 = Date.parse(dt) + 1000 * time;
  if (nextUploadTime < nextUploadTime1) 
    nextUploadTime = nextUploadTime1;
}

function immidiateRefresh() {
  var dt = new Date();
  nextUploadTime = Date.parse(dt) - 10;
}

function getRoom(room) {
  var index = -1;
  for (var i=0; i < chatBoxes.length; i++) {
    if (chatBoxes[i].id == room) index = i;
  }
  return index; 
}

function enterRoom(roomID, status) {
  countBoxes = 0;
  for (var i=0; i < chatBoxes.length; i++) {
    if (chatBoxes[i].active == 1) countBoxes++; 
  }
  var index = getRoom(roomID);
  if (-1 < index) {
    if (status == 1) {
      if (countBoxes < 6) {
        makeChatBox(roomID,idf("chats"),1);
        showProtokoll(roomID);
      } else {
        alert ("Du kannst nicht mehr als 6 Räume öffnen");
      }
    }
    else {
      chatBoxes[index].active = 0;
      chatBoxes[index].outline.style.display = "none";
    }
    printRooms();
  }
}

function closeRoom(roomID, status) {
  var index = getRoom(roomID);
  if (-1 < index) {
    if (status == 1) {
      chatBoxes[index].status = 1;
      //makeChatBox(roomID,idf("chats"),1);
      //showProtokoll(roomID);
    }
    else {
      chatBoxes[index].status = 0;
      //chatBoxes[index].active = 0;
      //chatBoxes[index].outline.style.display = "none";
    }
    sendMessage = "newRoom=" + roomID + "&status=" + status + "&inChat=" + inChat;
    ajaxChatSend("./chatNback.php", sendMessage, chatResponse, 1);
    printRooms();
  }
}

function setProtokoll(raum, protokoll) {
  var i = getRoom(raum);
  if (0 <= i) {
  	chatBoxes[i].update = (chatBoxes[i].protokoll == protokoll)?1:0;
    //jscmdWrite("setProtokoll: " + raum, 0, 0);	
    if (0 == chatBoxes[i].update) {
      chatBoxes[i].protokoll = protokoll;
      showProtokoll(raum);
    }
  }  
}

function showProtokoll(raum) {
  //jscmdWrite("showProtokoll:" + raum, 0, 0);	
  var img_chat_open = domImg("./pict/chat_open.gif");
  img_chat_open.style.border = "0pt solid black";
  var img_chat_close = domImg("./pict/chat_closed.gif");
  img_chat_close.style.border = "0pt solid black";
  //jscmdWrite("showProtokoll: " + raum, 1, 0);	
  var i= getRoom(raum);
  if (0 <= i) {
    var header = chatBoxes[i].header;
    removeAllChildren(header);
      
  	if (inChat == 0) {
        var collapse = domFDiv(header,"fr");
        //var imgA = ( chatBoxes[i].collapse==0 )?domImg("./pict/chat_open.gif"):domImg("./pict/chat_closed.gif");
        var imgA = ( chatBoxes[i].collapse==0 )?img_chat_open:img_chat_close;
        imgA.style.border = "0pt solid black";
        var ref = domRef(imgA , "JavaScript:chatBox_collapse(\"" + chatBoxes[i].id + "\");" , collapse);
        var news = domFDiv(header,"fr");
        news.style.fontSize = "8pt";
        news.style.padding = "2pt";
        domText(chat_mDate(chatBoxes[i].posted,0),news);
  	}
    var mottoD = domFDiv(header);
    domText(chatBoxes[i].thema,mottoD);
    mottoD.style.background = "#cc8";
    mottoD.style.padding = "2pt";
    mottoD.style.textAlign = "center";
    mottoD.style.fontSize = "11pt";
      
    if (chatBoxes[i].update == 0)
    {       
      //jscmdWrite("protokoll (update): " + raum, 0, 1);	
      //alert (raum);
      //chatBoxes[i].protokoll = protokoll;
      //domBreak(document.body);
      //domText(chatBoxes[i].protokoll,document.body);
      //domBreak(document.body);
      var ar = protokollDigest(chatBoxes[i].protokoll);
      //domText("Raum " + raum + " " + i + " ar=" + ar.length + ";",document.body);
      //domBreak(document.body);
      
      var start = (50 < ar.length)?ar.length - 50:0;
      //domText("Raum " + raum + " " + i + " ar=" + ar.length + " => " + start + ";",document.body);
      var target = chatBoxes[i].output;
      removeAllChildren(target);
      
      for (var j=start; j<ar.length; j++) {
        var m = domFDiv(target);
        m.style.clear = "both";
        var name = domFDiv(m,"fl");
        
        /* für Mail */
        if (ar[j].id != chatUserID) {
          if (chatBoxes[i].expMode == 1) {
          	var miniMail = domImg("./hilfe/minimail1.gif");
          	miniMail.style.border = "0px";
            var mailRef = domRef(miniMail,"JavaScript:openUserMailBox(" + ar[j].id + ", '" 
              + ar[j].name + "','" + raum + "', " + ar[j].time + ")",name);
            mailRef.style.color = "#000";
            mailRef.style.textDecoration = "none";
            domText(" ",name);
          }
        }
        
        var nameRef = domRef(domText(ar[j].name),"JavaScript:openUserChatBox(" + ar[j].id + ", '" + ar[j].name + "')",name);
        nameRef.id = "nameRef%" + raum + "%" + ar[j].id + "%" + ar[j].time + "%0";
        addEvent(nameRef,"mouseover",chat_showProfil);
        addEvent(nameRef,"mouseout",chat_hideProfil);
        nameRef.style.color = "#000";
        nameRef.style.textDecoration = "none";
        nameRef.style.fontWeight = "bold";
        domText(":",name);
        //domText(ar[j].time,name);
        name.style.paddingRight = "5pt";
        //m.style.border = "1pt solid black";
        var html = ar[j].html;
        m.appendChild(html); 
      }
      // Platz nach unten
      var m = domFDiv(target);
      domText(" ",m);
      m.style.clear = "both";
      m.style.height = "2pt";
      m.style.lineHeight = "2pt";
      
      chatBoxes[i].update = 1;
    }
  }  
  scrollProt();
}

function scrollProt()
{
 var newTimeOut = 0;
 for (var i=0; i < chatBoxes.length; i++)
 {
    var prot = chatBoxes[i].output ;
    var scrollTarget = prot.scrollHeight - prot.offsetHeight;
    if (prot.scrollTop < scrollTarget)
    {
      newTimeOut = 1;
      prot.scrollTop = scrollTarget + 50;
      /*
      if (500 < scrollTarget - prot.scrollTop) prot.scrollTop += 500;
      else
      {
        if (100 < scrollTarget - prot.scrollTop) prot.scrollTop += 100;
        else
        {
          if (20 < scrollTarget - prot.scrollTop) prot.scrollTop += 20;
          else prot.scrollTop += 2;
        }
      }
      */
    }
  }
  //if (0 < newTimeOut) window.setTimeout('scrollProt()',1000);
  //alert ("scrollTop: " + prot.scrollTop + " scrollHeight: " + prot.scrollHeight + "\rclientTop: " + prot.clientTop + " clientHeight: " + prot.clientHeight + "\roffsetTop: " + prot.offsetTop + " offsetHeight: " + prot.offsetHeight);
}

function refreshDelay(e) {
  addNextUpload(20);
}

/*
 * showFlyerUserID wird gesetzt, wenn das Element noch nicht für diesen User existiert
 */
var showFlyerUserID = 0;
var showFlyerUserIDTarget = null;
var showFlyerUserMode = 0;
var showFlyer = null;
function chat_showProfil (e) {	
  var node = getEventTarget(e);
  // a enthält Raum % UserID % Zeit % Mode
  var a = chat_explode(node.id,'%');
  var index = -1;
  var tuserID = parseInt(a[2]);
  var tmode = parseInt(a[4]);
  var index = chat_getUserIndex(tuserID);
  showFlyerUserID = tuserID;
  showFlyerUserIDTarget = node;  
  showFlyerUserMode = tmode;
  if (chat_userA[index].display != null) {
  	chat_showUserFlyer();  	
  }
  else {
   var message = "askUser=" + tuserID;
   ajaxChatSend("./chatNback.php", message, chatResponse, 1);
  }
}

function chat_hideProfil (e) {
  showFlyerUserID = 0;	
  showFlyerUserIDTarget = null;	
  var node = getEventTarget(e);
  if (showFlyer != null && showFlyer != undefined) {
  	showFlyer.style.left = "-2000pt";
  	showFlyer = null;
  }
}

function chat_showUserFlyer() {
  if (0 < showFlyerUserID && showFlyerUserIDTarget != null) {	
    var tuserID = parseInt(showFlyerUserID);
    var index = chat_getUserIndex(tuserID);
  	var flyer = chat_userA[index].display;
  	if (flyer != undefined && flyer != null) {
  	  var tNode = showFlyerUserIDTarget;
      var xPos = 0;
      var yPos = 0;
      while (tNode.nodeName != "BODY")
      {
        xPos += tNode.offsetLeft;
        yPos += tNode.offsetTop;
        yPos -= tNode.scrollTop;
        //domText ("attributes=" + tNode.attributes + " " , document.body);
        //domText ("tNode.offsetTop=" + tNode.offsetTop + ", tNode.scrollTop=" + tNode.scrollTop + ", tNode.clientTop=" + tNode.clientTop, document.body);
        //domBreak (document.body);
        tNode = tNode.offsetParent;
      }
      
      flyer.style.display = "";
      flyer.style.position = "absolute";
      flyer.style.left = (xPos+10) + "px";
      fyPos = yPos+showFlyerUserIDTarget.clientHeight + 6; 
      if (showFlyerUserMode == 0) fyPos += 10;	     
      flyer.style.top = fyPos + "px";
      showFlyer = flyer;
      showFlyerUserID = 0;
      showFlyerUserIDTarget = null;
  	}
  }	
}

function chatBox_collapse(id, mode) {
  if (mode == undefined) mode = 0;
  var index = getRoom(id);
  if (0 <= index) {
  	room = chatBoxes[index];
  	if (room.collapse == 0) {
  	  room.foutline.style.height = "0px";
  	  room.foutline.style.overflow = "hidden";
  	  room.foutline.style.display = "none";
  	  room.collapse = 1;
  	} else {
  	  room.foutline.style.height = "";
  	  room.foutline.style.overflow = "hidden";
  	  room.foutline.style.display = "";
  	  room.collapse = 0;  		
  	}
  	showProtokoll(id);
  }
	
}

function makeChatBox(room,parent,active) {
  if (active == undefined) active = 0;
  var index = getRoom(room);
  if (index < 0) {
    index = chatBoxes.length;
    var chat = new Object();
    chat.id = room;
    chat.dbid = 0;
    chat.lastInput = 0;
    chat.owner = 0;
    chat.ownerName = "";
    chat.thema = "";
    chat.protokoll = "";
    chat.update = 0;
    chat.status = 0;
    chat.collapse = 0;
    chat.posted = 0;
    chat.active = active;
    chat.ownStatus = 0;
    chat.user = new Array();
    chat.expMode = 0;
    makeChatBoxVisible(room, chat, parent);
    if (active == 0) {
      chat.outline.style.display = "none";
    }
    chatBoxes.push(chat);
  }
  else {
    if (chatBoxes[index].outline != undefined) {
      if (active == 1) {
        chatBoxes[index].outline.style.display = "";
        chatBoxes[index].active = 1;
        immidiateRefresh();
      }
    }
    else {
      alert ("try to open a Box, which has not been defined");
    }
  }
  return chatBoxes[index];
}

/*
* HTML-Ausgabe der Chatbox
*/
function makeChatBoxVisible(room, box, parent) {
  
    var fbox = domFDiv(parent,"fl");
    fbox.style.border = "1pt solid black";
    fbox.style.width = "235px";
    //fbox.style.height = "360px";
    var header = domFDiv(fbox);
    header.style.border = "2pt solid #8a8";
    header.style.heigth = "32px";
    var innerfbox=domFDiv(fbox);
    var fboxchat = domFDiv(innerfbox);
    fboxchat.style.border = "0pt solid #a00";
    fboxchat.style.padding = "4pt";
    fboxchat.style.height = "250px";
    fboxchat.style.overflow= "hidden";
    fboxchat.style.overflow= "auto";
    fboxchat.style.fontSize= "8pt";
    fboxchat.style.lineHeight= "10pt";
    var fboxta = domFDiv(innerfbox);
    fboxta.style.textAlign = "center";
    var ta = domTextarea("",fboxta);
    ta.style.width = "220px";
    ta.style.overflow= "auto";
    ta.style.height = "30pt";
    addEvent(ta,"keyup",refreshDelay);
    var sendchat = domFDiv(innerfbox);
    sendchat.style.padding = "2pt";
    sendchat.style.fontSize = "8pt";
    var ref = domRef(domText("send") , "JavaScript:roomSend(\"" + room + "\");" , sendchat);
    domText(" ", sendchat);
    var ref = domRef(domText("Chatmails") , "JavaScript:roomExpand(\"" + room + "\");" , sendchat);
    
    var expfbox = domFDiv(innerfbox);

    box.input = ta;
    box.inputexp = null;
    box.output = fboxchat;
    box.header = header;
    box.expField = expfbox;
    box.outline = fbox;
    box.foutline = innerfbox;
}

function roomExpand(raum) {
  var i = getRoom(raum);
  if (0 <= i) {
    var box = chatBoxes[i];
    box.expMode = (box.expMode + 1) % 2;
  	box.update = 0;
    showProtokoll(raum);
  }
}

var chat_sendMailTo = 0;
var chat_sendMailContent = "";
var chat_sendMailTime = 0;
function openUserMailBox(userID, userName, raum, zeit) {
  var i = getRoom(raum);
  if (0 <= i) {
    var box = chatBoxes[i];
    var expfbox = box.expField;
    removeAllChildren(expfbox);
    
    var ar = protokollDigest(box.protokoll);
    
    var targetName = "???";
    var targetID = 0;
    var targetText = "?";
    
    for (var j=0; j < ar.length; j++) {
      if (ar[j].id == userID && ar[j].time == zeit) {
      	chat_sendMailTo = userID;
      	chat_sendMailContent = ar[j].message; 
        chat_sendMailTime = zeit;
        var frbox = domFDiv(expfbox);
        frbox.style.margin = "5pt";
        frbox.style.border = "0px solid red";
      	var aheader = domDiv(domText("Mail an " + userName), frbox);
      	aheader.style.padding = "5pt";
      	aheader.style.paddingBottom = "0pt";
      	aheader.style.fontSize = "10pt";
      	aheader.style.fontWeight = "bold";
      	var ahtml = ar[j].html;
      	frbox.appendChild(ahtml);
      	ahtml.style.padding = "10pt";
      	ahtml.style.paddingTop = "3pt";
      	ahtml.style.fontSize = "10pt";
      	//domText(ar[j].message,expfbox);
      	//domBreak(expfbox);
      }
    }
       
    var fboxma = domFDiv(expfbox);
    fboxma.style.textAlign = "center";
    var ma = domTextarea("",fboxma);
    ma.style.width = "220px";
    ma.style.overflow= "auto";
    ma.style.height = "120pt";
    addEvent(ma,"keyup",refreshDelay);
    var msendchat = domFDiv(expfbox);
    msendchat.style.padding = "2pt";
    msendchat.style.fontSize = "8pt";
    var ref = domRef(domText("send mail") , "JavaScript:chat_mailSend(\"" + raum + "\");" , msendchat);
    box.inputexp = ma;	
  }
}

function chat_mailSend (raum) {  	
  var i = getRoom(raum);
  if (0 <= i) {
    var box = chatBoxes[i];
    
    var message = box.inputexp.value;
    if (1 < message.length) {
      box.inputexp.value = "";
      var sendMessage =
          "&userTo=" + chat_sendMailTo  
        + "&mailTime=" + chat_sendMailTime 
        + "&mail1=" + myEncode(chat_sendMailContent) 
        + "&mail2=" + myEncode(message);
      ajaxChatSend("./chatNback.php", sendMessage, chatResponse, 1);
    }
      
    var expfbox = box.expField;
    removeAllChildren(expfbox);
    box.inputexp = null;
    chat_sendMailTo = 0;
    chat_sendMailContent = "";
    chat_sendMailTime = 0;
  }
}

/*
*
*/
function makeNewBox(thema, newRoomName, defOwn) {
  if (defOwn == undefined) defOwn = 0;
  if (newRoomName == undefined) newRoomName = chatUserID + "_" + chatBoxes.length;
  var erg = makeChatBox(newRoomName,idf("chats"),1);
  if (thema != undefined) erg.thema = thema;
  if (defOwn == 0)
  {
    erg.owner = chatUserID;
    erg.ownerName = chatUserID;
  }
  var sendMessage = "newRoom=" + newRoomName + "&motto=" + myEncode(thema) + "&inChat=" + inChat;
  ajaxChatSend("./chatNback.php", sendMessage, chatResponse, 1);
  return erg;
}

function makeNewOwnBox(thema) {
  return makeNewBox(thema, chatUserID + "_own", 0);
}

function openUserChatBox(toID, name) {
  if (0 < toID && toID != chatUserID) {	
  var addBox = true;
  for (var i=0; i < chatBoxes.length; i++) {
  	if (chatBoxes[i].owner == toID) {
  		addBox = false;
  		if (chatBoxes[i].thema == "Theme") {
  		  if (name != undefined) chatBoxes[i].thema = name;
          for (var j=0; j < chat_userA.length; j++) {
            if (chat_userA[j].id == toID) {
  		      chatBoxes[i].thema = chat_userA[j].name;
  	        }
          }
  		}
  		enterRoom(chatBoxes[i].id, 1);
  	}
  }
  
  countBoxes = 0;
  for (var i=0; i < chatBoxes.length; i++) {
    if (chatBoxes[i].active == 1) countBoxes++; 
  }
  
  if (addBox && countBoxes < 6) {
  	var thema = "Theme";
    if (name != undefined) thema = name;
    for (var i=0; i < chat_userA.length; i++) {
      if (chat_userA[i].id == toID) {
  		thema = chat_userA[i].name;
  	  }
    }
  	
  	var boxName = toID + "_own";
    var a = makeNewBox(thema, boxName, 0);
    a.owner = toID;
    showProtokoll(boxName);
  	//chatBox_collapse(a2.id);
  	//askUser= chatUserTo;
  }
  }
}

/*
* Auswertung des AJAX-Calls für einen Raum
* argument = dbID~owner~status~posted~thema~ownStatus~(userID in Room)~(userID invite)~(userID banned)
*/
function setRoom(roomName, argument) {
 //alert (roomName + ": " + argument);
 var aRoom = makeChatBox(roomName,idf("chats"),0);
 var args = chat_explode(argument,"~");
 aRoom.dbid = parseInt(args[0]);
 aRoom.owner = parseInt(args[1]);
 aRoom.status = parseInt(args[2]);
 aRoom.posted = parseInt(args[3]);
 aRoom.ownStatus = 0;
 //aRoom.ownStatus = parseInt(args[5]);
 if (1 < args[4].length)
   aRoom.thema = args[4];
 // User im Raum
 if (0 < args[6].length) {
   aRoom.user = chat_explode(args[6],',');
 }
 if (0 < args[7].length) {
   invitedUser = chat_explode(args[7],',');
   for (var i = 0; i < invitedUser.length; i++) {
     if (invitedUser[i] == chatUserID) {
       aRoom.ownStatus = 1;
     }
   }
 }
}

/*
* Online-Übersicht über alle Räume
*/
function printRooms() {
  var infoRooms = idf("rooms");
  if (infoRooms != undefined) {
    removeAllChildren(infoRooms);
    for (var i=0; i<chatBoxes.length; i++)
    {
      var room = chatBoxes[i];
      if (1 < room.thema.length ) {
        var di =  clientZeit - room.posted;
        var userName = "?";
        if (di < 600 || room.owner == 0) {
          var ch = domFDiv(infoRooms);
          ch.style.padding = "2pt";
          ch.style.marginBottom = "3pt";
    
          //domText(room.ownStatus + " " , ch);
          if (room.owner == chatUserID) {
            if (room.status == 0)
              domRef(domText("close"), "JavaScript:closeRoom('" + room.id + "',1);", ch);
            else
              domRef(domText("open"), "JavaScript:closeRoom('" + room.id + "',0);", ch); 
      
            domText(" ", ch);       
          }
          else {
            if (0 < room.owner) {
              if (room.active == 0) {
                if (room.status == 0 || room.ownStatus == 1) {
                  var enterText = ( room.ownStatus==1 )? "invite":"enter";
            
                  domRef(domText(enterText), "JavaScript:enterRoom('" + room.id + "',1);", ch);
                  domText(" ", ch);
                }
                else {
                  domText("closed ", ch);
                  ch.style.color = "#888";
                }
              }
              else
                domRef(domText("leave "), "JavaScript:enterRoom('" + room.id + "',0);", ch);
            }      
          }
          domText(room.thema, ch);
        
          //domText(" " + chat_mDate(room.posted,0) + " ",ch);
    
          //domText(" " + room.status, ch);
          //ch.style.padding = "2pt";
          if (room.active == 0) {
            ch.style.backgroundColor = "#ccc";
          }
          if (room.active == 1) {
            ch.style.backgroundColor = "#eba";
          }
          // User ausgeben
          if (room.active == 1 || room.status == 0) {
            for (var j = 0; j < room.user.length; j++) {
              for (var jj = 0; jj < chat_userA.length; jj++) {
                var di =  clientZeit - chat_userA[jj].time;
                if (di < 60) {
                  if (chat_userA[jj].id == room.user[j]) {
                    var userB = domFDiv(infoRooms);
                    userB.style.paddingLeft="5pt";
                    domText(chat_userA[jj].age,userB);
                    if (chat_userA[jj].sex == 2)
                      domImg("./sexm.gif",userB);
                    if (chat_userA[jj].sex == 1)
                      domImg("./sexw.gif",userB);
      
                    domText(chat_userA[jj].name, userB);
                    if (room.user[j] == room.owner) userB.style.fontWeight = "bold";
                  }
                }
              }
            }
          }
        }
      } 
    }
  }
}

function roomSend(room) {
  var index = getRoom(room);
  if (0 <= index) {
    var cB = chatBoxes[index];
    var message = cB.input.value;
    if (1 < message.length) {
      cB.input.value = "";
      var eUserName = chatUserName.replace(/[\[\]~\n\r]/gi," ");
      cB.update = 0;
      cB.protokoll = cB.protokoll.concat("[" + chatUserID + "~" + eUserName + "~" + 0 + "]" + myEncode(message));
      //domText(cB.protokoll,document.body);
      showProtokoll(cB.id);
      //alert (message + " ### " + encodeURIComponent(message));
      //alert (message + " ### " + escape(message));
      addNextUpload(30);
      //var sendMessage = "userID=" + chatUserID + "&userName=" + encodeURIComponent(eUserName) + "&send=" + encodeURIComponent(cB.id) + "&text=" + encodeURIComponent(message) + "&room=" + getAllRooms();
      if (default_memberMode != 9) {
        var sendMessage = "userID=" + chatUserID + "&userName=" + myEncode(eUserName) + "&send=" + encodeURIComponent(cB.id) + "&roomID=" + cB.dbid + "&text=" + encodeURIComponent(message) + "&room=" + getAllRooms();
        ajaxChatSend("./chatNback.php", sendMessage, chatResponse, 1);
      }
    }
  }
}

function protokollDigest(message) { 
	
  //jscmdWrite("protokollDigest start", 0, 1);
  
  while (0 <= message.indexOf("\n")) message = message.replace("\n"," ");
  while (0 <= message.indexOf("\r")) message = message.replace("\r"," ");
  while (0 <= message.indexOf("%")) message = message.replace("%"," ");
  
  var erg = new Array();
  var re=/^\[([^\]]+)\](.+?)(\[.*)/mgi;
  var re1=/^\[([^\]]+)\](.+)$/mgi;
  var b = 1; 
  
  while (b) { 
    var header = "";
    var argument = "";
    b = 0;
    re.lastIndex=0;
    var gto = re.exec(message);

    if (gto != null) {
      header = gto[1];
      argument = gto[2];
      //alert("Befehl: " +   + "\nWert: " + gto[2] + "\nRest: " + gto[3]); 
      message = gto[3]; 
      //domText(header + " " + argument + " " + message,document.body);
      //domText(message,document.body);
      //domBreak(document.body);
      b = 1;
    }
    else
    {
      re1.lastIndex=0;
      var gto1 = re1.exec(message);
      if (gto1 != null) {
        header = gto1[1];
        //domText(header,document.body);
        //domBreak(document.body);
        argument = gto1[2];
        message = ""; 
      }    
    }
    if (0 < header.length) {
      var n = document.createElement("div");
      n.style.display = "inline";
      n.innerHTML = chat_text2HTML(decodeURIComponent(argument), 80, 0);
      
      var br = chat_explode(header, '~');
      var u = new Object();
      u.id = parseInt(br[0]);
      u.name = br[1];
      u.time = parseInt(br[2]);
      u.message = argument;
      u.html = n;
      erg.push(u);
    }
  }  	
  //jscmdWrite("protokollDigest ende", 0, 1);
  return erg; 
}

/***********************
  User 
***********************/

function chat_setUser(argument) {
  // UserID-UserName-Posted-Gender-Age
  var br = chat_explode(argument, '~');
  var i = chat_getUserIndex(br[0]);
  chat_userA[i].name = br[1];
  chat_userA[i].age = br[4];
  chat_userA[i].sex = br[3];
  chat_userA[i].time = br[2];
}

function chat_setUserDisplayInfo(tuserID, arg) {
  var i = chat_getUserIndex(tuserID);
  var t = domFDiv(document.body);
  t.innerHTML = arg;
  chat_userA[i].display = t	;
  chat_showUserFlyer();
}

function chat_getUserIndex(id) {
  var erg = -1;
  for (var i=0; i < chat_userA.length; i++)
  {
    if (chat_userA[i].id == id) erg = i;
  }
  
  if (erg < 0) {
      erg = chat_userA.length;
      var u = new Object();
      u.id = id;
      u.name = "";
      u.time = 0;
      u.age = 0;
      u.sex = 0;
      u.status = 0;
      u.display = null;
      chat_userA.push(u);
  }
  return erg;
}

function printUser() {
  var infoUser = idf("user");
  if (infoUser != undefined)
  {
    removeAllChildren(infoUser);
    for (var i=0; i<chat_userA.length; i++)
    {
      var di =  clientZeit - chat_userA[i].time;
      // User nach 1 Minute nicht mehr anzeigen
      if (di < 60) {
        var ch = domFDiv(infoUser);
        domText(chat_userA[i].age,ch);
        if (chat_userA[i].sex == 2)
          domImg("./sexm.gif",ch);
        if (chat_userA[i].sex == 1)
          domImg("./sexw.gif",ch);
        //domText(" " + chat_userA[i].name + " " + chat_mDate(userA[i].time,0),ch);
        domText(" " + chat_userA[i].name + " ",ch);
        //domText(chat_mDate(chat_userA[i].time,0) + " ",ch);
      
        if (chat_userA[i].id != chatUserID && chat_userA[i].status == 0) {
          domRef(domText("invite"), "JavaScript:chat_setUserStatus(" + chat_userA[i].id + ",1);", ch);
        }
      }
    }
  }
}

function chat_setUserStatus(userid, status) {
  var uIndex = chat_getUserIndex(userid);
  chat_userA[uIndex].status = status;
  sendMessage = "userTo=" + userid + "," + status;
  ajaxChatSend("./chatNback.php", sendMessage, chatResponse, 1);
  printUser();
}

function ajaxChatSend(file, sendMessage, chatResponse, mode) {
  var serverJetztZeit = 0;
  if (clientZeit != undefined) {
    var dt = new Date();
    var clientJetztZeit = Math.floor(Date.parse(dt) / 1000);
    var serverJetztZeit = clientJetztZeit - clientZeit + serverZeit;
     
     file = file.concat("?time=",serverJetztZeit);
  }      
  ajaxSend(file, sendMessage, chatResponse, 1);	
}

var tFlyer = null;
function attachElement(elem,flyer)
{
  if (flyer == undefined)
  {
    if (tFlyer != null) tFlyer.style.top = "-2000px";
    tFlyer = null;
  }
  else
  {
    var tNode = elem;
    var xPos = 0;
    var yPos = 0;

    while (tNode.nodeName != "BODY")
    {
      xPos += tNode.offsetLeft;
      yPos += tNode.offsetTop;
      tNode = tNode.offsetParent;
    }

    var elemHeight = (0 < elem.clientHeight)?elem.clientHeight:elem.scrollHeight;
    var elemWidth = (0 < elem.clientWidth)?elem.clientWidth:elem.scrollWidth;

    flyer.style.left = (xPos + 0) + "px";
    flyer.style.top = (yPos + elemHeight + 2) + "px";
    tFlyer = flyer;
  }
}

/***********************
 AJAX Basic
***********************/

function chatResponse() {
  var message = ajaxResponse();
  if (message != false) chatMessageDigest(message);
}

function chatMessageDigest(message)
{
  //alert (message);
  re=/^\s*\[{2}([^\]]+)\]{2}=([^\n]+?)\n((.|\n)*)/gi;
  var b = 1; 
  re1=/^\s*\[\[+([^\]]+)\]\]=([^\n]+)$/gi;
  while (b) { 
    b = 0;
    //alert (message);
    var a1 = message.indexOf("]]");
    var befehl = message.slice(2,a1);
    message = message.slice(a1+3,message.length);
    var a2 = message.indexOf("[[");
    var argument = message;
    if (0 <= a2)
    {
      argument = message.slice(0,a2);
      message = message.slice(a2,message.length);
      b = 1;
    }
    else
    {
      message = "";
    }
    if (0 < befehl.length) {
      //alert (befehl + " " + argument);
      var befA = chat_explode(befehl, '~');
      if (befA[0] == 'fileSize') {
        alert(argument);
      }
      if (befA[0] == 'Lines') {
        alert("Lines: " + argument);
      }
      if (befA[0] == 'serverZeit') {
        setServerTime(parseInt(argument));
      }
      if (befA[0] == 'room') {
        setProtokoll(befA[1],argument);
      }
      if (befA[0] == 'user') {
        chat_setUser(argument);
      }
      if (befA[0] == 'info') {
        setRoom(befA[1],argument);
      }
      if (befA[0] == 'uinfo') {
        chat_setUserDisplayInfo(befA[1],argument);
      }
    }
  }  
  printUser();
  printRooms();
  
  for (var i=0; i < chatBoxes.length; i++) {
  	showProtokoll(chatBoxes[i].id);
  }
}

function chat_explode(text, delim)
{
 var reht = new RegExp("(.*?)"+delim+"(.*)","gi");
 RegExp.multiline=true;
 var erg = new Array();
 var rtext = text;
 var b = 1;
 while (b)
 {
   var ln = rtext.length;
   b = 0;
   reht.lastIndex=0;
   var gt = reht.exec(rtext);
   if (gt != undefined)
   {
        erg.push(gt[1]);
        //alert (gt[1] + " " + gt[2]);
        b = 1;
        rtext = gt[2];
   }
   else erg.push(rtext)
 }
 return erg;
}

/**
* implode (array('a','b','c'),'/','arg') =>
* arg1=a/arg2=a/arg3=a
*/
function chat_implode(ar, delim, fhelp)
{
 var erg = "";
 for (var i=0; i < ar.length; i++)  {
   if (0 < i) erg = erg.concat(delim);
   erg = erg.concat(fhelp, i+1, "=", escape(ar[i]));
 }
 return erg;
}

/*******************
*******************/

function chat_bb2tag(text, btag, tagv, tagn)
{
  // wandelt eine Kombination der Art
  // [btag]...[/btag] um in
  // <tagv>...<tagn>
  var stz = new RegExp("\\\["+btag+"\\\]([\\\s\\\S\]*?)\\\[\\\/"+btag+"\\\]","gi");
  //alert (stz.toString());
  var reht=stz;
  reht.lastIndex=0;
  RegExp.multiline=true;
  var erg;
  var b = 1;
  while (b)
  {
    var gt = reht.exec(text);
    b = 0;
    if (gt)
    {
       b = 1;
       erg = tagv + gt[1] + tagn;
       text = text.replace(gt[0],erg);
    }
  }
  return text;
}

var chat_smilieCounter = 0;
function chat_replaceSmilie(text,smilie,icon,smonV)
{
  if (smonV == undefined) smonV = 0;
  if (chat_smilieCounter == undefined) chat_smilieCounter = 0;
  var rest = 10000;
  if (0 < smonV)
  {
    rest = (chat_smilieCounter < 3)?(3-chat_smilieCounter):0;
  }
  text = chat_replaceAll(text,smilie,"<img src=\"" + getServerFromLoc() + "/Smilie/" + icon + ".gif\" border=\"0\" alt=\""+ icon +"\">",rest,1);
  return text;
}

function chat_replaceAll(r,ra,rn,max, smilieCounterOn)
{
  if (max == undefined) max = 10000;
  if (smilieCounterOn == undefined) smilieCounterOn = 0;
  var counter = 0;
  while (0 <= r.indexOf(ra) && counter < max)
  {
    counter++;
    if (smilieCounterOn == 1) chat_smilieCounter++;
    r = r.replace(ra,rn);
  }
  // restlichen Smilies ersetzen
  if (smilieCounterOn == 1)
  {
    while (0 <= r.indexOf(ra))
    {
      if (smilieCounterOn == 1) chat_smilieCounter++;
      r = r.replace(ra,"");
    }
  }
  return r;
}

function chat_text2HTML(r, maxImage, mode)
{
  //bench("text2HTML start",4);
  if (mode == undefined) mode = 0;
      var re = r;
      // Sonderzeichen ersetzen...
      re = chat_replaceAll(re,"\r","");
      //re = replaceAll(re,"&","&amp;");

      re = chat_replaceAll(re,"\"","&quot;");
      re = chat_replaceAll(re,"<","&lt;");
      re = chat_replaceAll(re,">","&gt;");
      re = chat_bb2tag(re,"b","<b>","</b>");
      re = chat_bb2tag(re,"i","<i>","</i>");
      re = chat_bb2tag(re,"u","<u>","</u>");
      re = chat_bb2tag(re,"r","<font face=\"serif\">","</font>");
      re = chat_bb2tag(re,"a","<font face=\"arial\">","</font>");
      re = chat_bb2tag(re,"z","<font style=\"font-size:14pt\">","</font>");
      re = chat_bb2tag(re,"zz","<font style=\"font-size:8pt\">","</font>");
      re = chat_bb2tag(re,"w","<b style=\"color:#ff0000\">","</b>");
      //re = bb2tag(re,"add","<div style=\"display: inline; background-Color: #dd7; text-decoration: underline;\">","</div>");
      //re = bb2tag(re,"sub","<div style=\"display: inline; background-Color: #dd7; text-decoration: line-through;\">","</div>");
      re = chat_replaceAll(re,"\n---\n","<hr style=\"clear: both;\">");
      re = chat_replaceAll(re,"%\n","");
      re = chat_replaceAll(re,"\n","<br>");
      //re = replaceImg(re);

      // Images
      if (maxImage == undefined) maxImage = 400;
      var reht=/\[img(r|l|i|c)?([0-9]*)\](.*?)(\s*:text:\s*(.|\s)*?\s*)?\[\/img\]/gi;
      var comt=/\s*:text:\s*((.|\s)*)?/gi;
      reht.lastIndex=0;
      RegExp.multiline=true;
      var erg;
      var untertext;
      var hasuntertext;
      var b = 1;
      while (b)
      {
        var gt = reht.exec(re);
        b = 0;
        if (gt)
        {
           gImg++;
           b = 1;
           //alert (gt);
           hasuntertext = false;
           untertext = "";
           if (gt[4] != null && 0 < gt[4].length)
           {
             //alert(gt);
             comt.lastIndex=0;
             var cm = comt.exec(gt[4]);
             untertext = cm[1];
             hasuntertext = true;
             //alert(gt);
           }
           erg = "";
           //alert (gt);
           var style = "";
           var resizeMode = 2;
           var resizeStyle = 0;
           var blankImg = true;
           if (gt[1] == null) style = " style=\"display:block;\"";
           if (gt[1] == "i") style = " style=\"display:inline;\"";
           if (gt[1] == "l")
           {
             style = " style=\"float:left;padding-right:5pt;\"";
             resizeMode = 0;
           }
           if (gt[1] == "r")
           {
             style = " style=\"float:right;padding-left:5pt;\"";
             resizeMode = 1;
           }
           if (gt[1] == "c")
           {
             style = "text-Align: center;";
             blankImg = false;
             resizeMode = 2;
             resizeStyle = 2;
           }

           if (hasuntertext) erg = erg + "<div " + style + "><table border=\"0\" cellspacing=\"0\"><tr><td style=\"text-align:center;\">";
           if (blankImg)
           {
             erg = erg + "<img id='gImg-" + gImg + "' src=\"" + gt[3] + "\" ";
           //erg += " onLoad=\"resize(event," + wp + "," + resizeMode + ");\"";
           //docWindowWrite("Graphik gefunden " + "gImg-" + gImg, "#eea", "Size: " + wp, 0)
             if  (!hasuntertext) erg = erg + style;
             erg = erg + ">";
           }
           else
           {
             erg = erg + "<div style=\"" + style + "\"><img id='gImg-" + gImg + "' src=\"" + gt[3] + "\" ";
             erg = erg + "></div>";
           }

           wp = maxImage;
           if (0 < gt[2].length)
           {
             var wp = parseInt(gt[2]);
             //erg = erg + "width=\"" + wp + "\"";
           }
           if (wp < 20) wp = 20;
           if (maxImage < wp) wp = maxImage;
           resizeElemID("gImg-" + gImg, wp, resizeMode, resizeStyle);

           if (hasuntertext) erg = erg + "</td></tr><tr><td class=\"pic-unter\">" + untertext + "</td></tr></table></div>";
           //alert(erg);
           re = re.replace(gt[0],erg);

        }
      }
      //bench("img",5);

       // Smilies
      var smon = 0;
      chat_smilieCounter = 0;
      if (0 < (mode&4)) smon = 1;
      re = chat_replaceSmilie(re,":-)))","happy",smon);
      re = chat_replaceSmilie(re,":-))","harlol",smon);
      re = chat_replaceSmilie(re,":-)","icon_lol",smon);
      re = chat_replaceSmilie(re,":-P","icon_razz",smon);
      re = chat_replaceSmilie(re,";-))","glueck",smon);
      re = chat_replaceSmilie(re,";-)","zwinker2",smon);
      re = chat_replaceSmilie(re,":-D","icon_biggrin",smon);
      re = chat_replaceSmilie(re,":kopfpatsch:","kopfpatsch",smon);
      re = chat_replaceSmilie(re,":--:","schlecht",smon);
      re = chat_replaceSmilie(re,":++:","daumen",smon);
      re = chat_replaceSmilie(re,":angel:","ANGEL",smon);
      re = chat_replaceSmilie(re,":-b","BOUNCE2",smon);
      re = chat_replaceSmilie(re,":-k","kiffer77",smon);
      re = chat_replaceSmilie(re,";-!","smokin",smon);
      re = chat_replaceSmilie(re,":hug:","hug",smon);
      re = chat_replaceSmilie(re,":kiss:","kiss2",smon);
      re = chat_replaceSmilie(re,":lieb:","troest",smon);
      re = chat_replaceSmilie(re,":wink:","wave",smon);
      re = chat_replaceSmilie(re,":-u","lew",smon);

      re = chat_replaceSmilie(re,":-(((","frust2",smon);
      re = chat_replaceSmilie(re,":-((","heul",smon);
      re = chat_replaceSmilie(re,":-(","icon_frown",smon);
      re = chat_replaceSmilie(re,":-??","icon_confused",smon);
      re = chat_replaceSmilie(re,":-?","help",smon);
      re = chat_replaceSmilie(re,";-?","shrug",smon);
      re = chat_replaceSmilie(re,":-o","icon_eek",smon);
      re = chat_replaceSmilie(re,":-/","grummel",smon);
      re = chat_replaceSmilie(re,":-V","icon_evil",smon);
      re = chat_replaceSmilie(re,":-v","icon_mad",smon);
      re = chat_replaceSmilie(re,":-m","butt",smon);
      re = chat_replaceSmilie(re,":-f","fu0ck",smon);
      re = chat_replaceSmilie(re,":-g","gaehn",smon);
      re = chat_replaceSmilie(re,":-!","messy",smon);
      re = chat_replaceSmilie(re,":gr:","madpunchy",smon);
      re = chat_replaceSmilie(re,":grr:","wurf",smon);
      re = chat_replaceSmilie(re,":grrr:","tomate",smon);
      re = chat_replaceSmilie(re,":thread+:","good_thread",smon);
      re = chat_replaceSmilie(re,":agb:","siehenubs",smon);
      re = chat_replaceSmilie(re,":-r","outahere",smon);
      re = chat_replaceSmilie(re,":-l","lehrer",smon);
      re = chat_replaceSmilie(re,":-x","oops",smon);
      re = chat_replaceSmilie(re,":-K","party",smon);
      re = chat_replaceSmilie(re,":-a","puke",smon);
      re = chat_replaceSmilie(re,":-q","rotwerd",smon);

      re = chat_replaceAll(re,"~[~","[");
      re = chat_replaceAll(re,"^^T","&nbsp;&nbsp;");
      //bench("smilies",5);

  //bench("text2HTML ende",4);
 return re;
}


function chat_mDate(dt, mode)
{
 /*
 var monatsNamen = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
 var monatsNamenKurz = new Array("jan", "feb", "mär", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "dez");
 var dn = new Date();
 var dm = parseInt(dt) * 1000;
 var d = new Date(dm);
 var dyear = d.getYear();
 if (dyear < 1900) dyear += 1900;
 var dmonth = d.getMonth()+1;
 var ddate = d.getDate();
 var dhour = d.getHours();
 var dminutes = d.getMinutes();
 var dseconds = d.getSeconds();
 */
 var erg = "";
 if (mode == 0)
 {
   // für Chat-Mode
   di =  Math.floor(clientZeit - dt);
   if (0 <= di)
   {
     if (di < 60) erg += di + "sek";
     else
     {
       di /= 60;
       if (di < 60) erg += Math.floor(di) + "min";
       // Was soll man angeben, wenn der Kontakt älter ist als 60min ?
       else erg += "";
     }
   }
 }
 return erg;
}


