/*
setInterfaceFont()
  (c) 2006 TUFaT.com. All Rights Reserved

*/
config["ajaxVersion"] = "1.1.4";

/* how much we'll wait for reponse arrival from the request */
var waitForProcessing = 200;
var loginMsg = 'login';
var continueWith = null;
var langDecode = false;
var user = new User ();
var userList = new Array ();
config["maxMessageSize"] = 500;
var rooms = new Array ();
var loutMessageTag = false;
var sendQueue = new Array ();

var processingInProgress = false;
var timeOutId = null;

var comm = null;
var xmlDOMObj = null;

var chatMessages = null;

var inactivityIntervalId = null;

function chatReInit () {

  clearTimeout (timeOutId);

  var AC_main = document.getElementById ("AC_main");

  flushNode (AC_main);
  AC_main.innerHTML='<img src="" name="backgroundimage" id="backgroundimage" width="100%" height="100%" "scrollbars" = "yes">';

  continueWith = null;

  user = new User ();
  userList = new Array ();

  rooms = new Array ();

  sendQueue = new Array ();

  processingInProgress = false;
  timeOutId = null;

  comm = null;
  xmlDOMObj = null;

  chatMessages = null;

  clearInterval(inactivityIntervalId);

  checkBrowserAndInit ();
}

function doLogout (param) {

  chatReInit ();

  if (config["logout"]["close"])
	window.close();
  if(config["logout"]["redirect"])
  	window.open (config["logout"]["url"], config["logout"]["window"], "menubar = yes, location = yes, resizable = no, status = yes, scrollbars = yes, toolbar = yes");
}

function doLogoutWin(){
	if(!comm)
		return;

	var connid = comm["commId"];
	if(connid==0) return;

	if(config["enableSocketServer"]!=true) {
		img = new Image();
		img.src = "../dologout.php?id=" + connid;
	}
}


function waitForSettingsAndContinue () {//
  if (! settingsArrived)
    setTimeout ("waitForSettingsAndContinue ()", waitForProcessing);
  else
  {
  	//alert('*-*-*-*/-*/-');

    if (continueWith != null)
	{
      if(!loutMessageTag)
	  	chatLoop ();
	  setTimeout ("continueWith ()", 1500);
	 }
	}



}

function checkBrowserAndInit () {

  var checkError = false;

  config["enableSocketServer"]=false;

  var httpReq = newHTTPReq ();

  if (! httpReq) {
    alert ("Your browser seems NOT to support HTTP Request Object!\n" +
      "The chat system WILL NOT WORK!");
    checkError = true;
  }

  var testDOMParser = new crossBrowserXMLDoc ();
  if (! testDOMParser) {
    alert ("Your browser seems NOT to support any kind of DOM Parser interface!\n" +
      "The chat system WILL NOT WORK!");
    checkError = true;
  }
  var testDOMDoc = testDOMParser.parseXMLString ("<test></test>");
  if (! testDOMDoc) {
    alert ("Your browser seems NOT to support any kind of DOM Parser interface!\n" +
      "The chat system WILL NOT WORK!");
    checkError = true;
  }

  var AC_main = document.getElementById ("AC_main");
  if (! AC_main) {
    alert ("The 'applet' definition is not present in the document!\n" +
      "The chat system WILL NOT WORK!");
    checkError = true;
  }

  if (checkError)
    return false;

  initUI (logoutHandler);

  getSettings();
  /* wait to get the settings */
  continueWith = createLoginAndContinue;

  waitForSettingsAndContinue ();

 // setTimeout ("chatLoop ();", 100);
}
function createLoginAndContinue () {

  initSocket();

  if(!document.getElementById ("AC_mainTitleRow") || loutMessageTag)
  {
		var loginWin = createLoginUI ();
  		setInterfaceFont();

		if( loginWin!=undefined && loginWin!=null )
  		loginWin.setFormHandler (processLoginInfo);
	}


	var themeStyleLink = document.getElementById ("AC_style_theme");
	config["themeSL"] = themeStyleLink;
	setElementSaP (themeStyleLink, null, {"href": config["theme"]["href"]});


    if(getBrowser ()!=4 || getBrowser ()==3)
        themeStyleLink.onload = DDD(loginWin);
    else
    {
        themeStyleLink.onload = function()
        {
			if(loginWin!=null && loginWin.node!=null)
			{
				toChangeChatColors("colorBtn_button");
            	loginWin.node.userForm.elems["username"].focus();
            }
        }
    }


}
function DDD(myWin)
{
	if(  myWin!=undefined && myWin!=null  )
	{
		toChangeChatColors("colorBtn_button");
  		myWin.node.userForm.elems["username"].focus();
	}
}
function logoutHandler () {
  var data = formatLogoutMessage (user);

  clearTimeout (timeOutId);
  enqueueMessage (data, sendQueue);
  timeOutId = setTimeout ("chatLoop ()", 1);
}

function processLoginInfo () {

  var result = true;

  var formElems = this.elems;

  var username = formElems["username"].value;
  var password = formElems["password"].value;


  if ((username == "") && (config["login"]["username"]["req"] == "true"))
    result = false;

  if ((password == "") && (config["login"]["password"]["req"] == "true"))
    result = false;

  if (! result)
    return;

  if (username == "")
    username = "user_" + getUnixTimestamp ();

  this.window.object.closeWindow ();

  user["login"] = username;
  user["password"] = password;


  if(formElems["language"]){
	var language = formElems["language"].value;
	user["lang"] = language;
  }else
    user["lang"] = config["currentLanguage"];

  eraseCookie("user_lang_ajaxchat");
  createCookie("user_lang_ajaxchat",user["lang"],30);

  chatLoop ();
}

function chatLoop () {
if(comm==null)
{
	flushQueue (sendQueue);

  comm = new AJAXCommunication ();
  comm.setResultHandler (xmlDecoder);

  xmlDOMObj = new crossBrowserXMLDoc ();
}
  if (processingInProgress == true) {
    timeOutId = setTimeout ("chatLoop ()", waitForProcessing);
    return;
  }

  if (user["uid"] == 0 && langDecode) {
	var data = formatLoginData (user);
	//var data = formatSendTimeZone();
    enqueueMessage (data, sendQueue);
  }
 if( !langDecode )
 {
	var data = formatSendTimeZone();
    enqueueMessage (data, sendQueue);
	langDecode = true;
 }


  if (sendQueue.length > 0) {
    processingInProgress = true;
    dataToSend = dequeueMessage (sendQueue);
    comm.getAsyncPOSTURL (config["getXMLURL"], formatSendData (dataToSend, comm));
	if (config["enableSocketServer"]!=true)
    	timeOutId = setTimeout ("chatLoop ()", waitForProcessing);
    else{
	    while (sendQueue.length > 0){
		    dataToSend = dequeueMessage (sendQueue);
    		comm.getAsyncPOSTURL (config["getXMLURL"], formatSendData (dataToSend, comm));
	    }
    }
    return;
  } /* end queue send */
  else {
    /* we have no more queue to process, get the message list */
    var data = formatGetMsgList (user);
    processingInProgress = true;
    comm.getAsyncPOSTURL (config["getXMLURL"], formatSendData (data, comm));
	if (config["enableSocketServer"]!=true)
	    if(user["state"]!=3) // is not away
	    	timeOutId = setTimeout ("chatLoop ()", config["msgRequestInterval"] * 1000);
	    else
    		timeOutId = setTimeout ("chatLoop ()", config["msgRequestIntervalAway"] * 1000);
  }
} /* end function chatLoop () */

function appendMessage (message, color) {
  var retVal = false;

  var chatMessages = document.getElementById ("chatMessages");

  if (chatMessages == null)
    return;

  if (chatMessages.messagesNo >= config["maxMessageCount"]) {
    chatMessages.removeChild (chatMessages.firstChild);
    chatMessages.removeChild (chatMessages.firstChild);
    chatMessages.removeChild (chatMessages.firstChild);
    chatMessages.messagesNo--;
  }

  var sHeightBefore = chatMessages.scrollHeight;
  var sTopBefore = chatMessages.scrollTop;
  var cHeightBefore = chatMessages.clientHeight;

  if (color == null)
    msgColor = "#" + user["color"];
  else
    msgColor = "#" + color;

  msgColor=msgColor.replace("##","#");

  var newSPANElement = document.createElement ("span");
  var newBRElement = document.createElement ("br");
  var newLineText  = document.createTextNode ("\n");

  var newSPANElement2 = document.createElement ("span");
  newSPANElement2.className = "textcolorval";

  //message.replace//&#8249;
  //alert(message);

  newSPANElement2.innerHTML = message;
  if (config["itc"]["mytextcolor"])
  	newSPANElement2.style["color"] = "#" + user["color"];

  newSPANElement.appendChild (newSPANElement2);

  newSPANElement.style["color"] = msgColor;

  chatMessages.appendChild (newSPANElement);
  chatMessages.appendChild (newBRElement);
  chatMessages.appendChild (newLineText);
  chatMessages.messagesNo++;

/*
  TODO: will use this later?

  alert ("scrollTop: " + sTopBefore + ", clientHeight: " + cHeightBefore + ", scrollHeight: " + sHeightBefore + "\n" + "scrollTop: " + chatMessages.scrollTop + ", clientHeight: " + chatMessages.clientHeight + ", scrollHeight: " + chatMessages.scrollHeight);
*/
  //if (sHeightBefore < chatMessages.scrollHeight)
    if ((sTopBefore + cHeightBefore + 5 >= sHeightBefore) || ((sTopBefore + cHeightBefore + 1 == sHeightBefore) && (sTopBefore == 0)) /* this last with && and sTopBefore == 0 is for Konqueror and/or KHTML/Safari */)
      retVal = true;



  return retVal;
}

function pW_closeHandler ()
{
	var user = this.userData["user"];
	user["privateWin"] = null;
	privateArrayWin[user.uid] = null;
	this.closeWindow ();
	playSound ("PopupWindowCloseMin");
}

function pW_minimizeHandler () {
  var mUser = this.userData["user"];

  var roomObj = rooms[mUser["room"]]["object"];
  roomObj.setUserMinimize (mUser, true);

  playSound ("PopupWindowCloseMin");
}

function pW_processInput () {
  // this processes the input from the user
  var formElems = this.elems;

  var toUID = this.window.object.userData["user"]["uid"];

  var textInput = formElems["textInput"];
  var message = textInput.value;

  if (message == "")
    return;

  textInput.value = "";
  message = message.trim ();

  var data = formatPMTextMessageSend (user, message, toUID);

  clearTimeout (timeOutId);
  enqueueMessage (data, sendQueue);
  timeOutId = setTimeout ("chatLoop ()", 1);

  clearInterval(inactivityIntervalId);
  inactivityIntervalId = setInterval("logoutHandler();",config["inactivityInterval"] * 1000);
}

function appendPrivateMessage (toUser, message, color) {

  if (userList[toUser]==null)
	return;


  if (userList[toUser]["privateWin"] == null) {
    var newWindow = createPrivateWindow (userList[toUser]);
    var layoutDiv = document.getElementById ("layoutDiv");
	layoutDiv.style["white-space"] = "nowrap";
    newWindow.appendToParent (layoutDiv);
    newWindow.setCloseHandler (pW_closeHandler);
    newWindow.setMinimizeHandler (pW_minimizeHandler);
    newWindow.setFormHandler (pW_processInput);


    userList[toUser]["privateWin"] = newWindow;

    playSound ("PopupWindowOpen");
    //resizePrivateWindow(userList[toUser]["uid"]);
    applyColorChanges();


	if(newWindow.node.userForm.elems["textInput"])
	{
		newWindow.node.userForm.elems["textInput"].focus ();
    	newWindow.node.userForm.elems["textInput"].maxLength = config["maxMessageSize"];
	}

  }

  var winObj = userList[toUser]["privateWin"];
  if (message == null) {

    if (winObj)
	{
   		document.getElementById("idWinPrivate"+toUser).style["display"] = "block";//ImgRestorecontextMenu
		document.getElementById("ImgRestore"+toUser).style["display"] = "none";
	}

    return;
  }

  var messagesDiv = winObj.userData["messagesDiv"];

  if (messagesDiv == null)
    return;

  if (messagesDiv.messagesNo >= config["maxMessageCount"]) {
    messagesDiv.removeChild (messagesDiv.firstChild);
    messagesDiv.removeChild (messagesDiv.firstChild);
    messagesDiv.removeChild (messagesDiv.firstChild);
    messagesDiv.messagesNo--;
  }

  if (color == null)
    msgColor = "#" + user["color"];
  else
    msgColor = "#" + color;

  var newSPANElement = document.createElement ("span");
  var newBRElement = document.createElement ("br");
  var newLineText  = document.createTextNode ("\n");

  var newSPANElement2 = document.createElement ("span");
  newSPANElement2.className = "textcolorval";
  newSPANElement2.innerHTML = message;
  if (config["itc"]["mytextcolor"])
  	newSPANElement2.style["color"] = "#" + user["color"];
  newSPANElement.appendChild (newSPANElement2);

  newSPANElement.style["color"] = msgColor;

  messagesDiv.appendChild (newSPANElement);
  messagesDiv.appendChild (newBRElement);
  messagesDiv.appendChild (newLineText);
  messagesDiv.messagesNo++;

  messagesDiv.scrollTop = messagesDiv.scrollHeight;

  playSound ("SubmitMessage");
}

function sendMoveMessage (toRoom, pass) {
  if (getRoomIsFull(toRoom))
  	return;

  var data = formatMoveMessage (user, toRoom, pass);

  clearTimeout (timeOutId);
  enqueueMessage (data, sendQueue);
  timeOutId = setTimeout ("chatLoop ()", 1);
}

function getRoomIsFull(toRoom){
	if(!rooms[toRoom])
		return false;

	var usersCount = rooms[toRoom]["object"].users.length;
	if (usersCount >= config["maxUsersPerRoom"]){
		var layoutDiv = document.getElementById ("layoutDiv");
		var newWin = createInformWindow ("roomisfull", {"room": rooms[toRoom]["object"]["roomName"]});
		newWin.setCloseHandler (simple_closeHandler);
		newWin.setFormHandler (inform_windowOKHandler);
		newWin.appendToParent (layoutDiv);
		setInterfaceFont();
		return true;
    }
	return false;
}

function changeRoom (roomId) {
  if (user["uid"] == 0)
    return false;


  playSound ("ComboListOpenClose");

  if (roomId == null) {
    var roomCombo = document.getElementById ("roomSelect");
    var toRoom = roomCombo.value;

    setSelectOptionByValue (roomCombo, user["room"]);
  }
  else
    var toRoom = roomId;

  if (getRoomIsFull(toRoom))
  	return;

  if (toRoom == user["room"])
    return true;

  if (! rooms[toRoom]["hasPassword"]) {
    sendMoveMessage (toRoom, false);
    return true;
  }

  var layoutDiv = document.getElementById ("layoutDiv");
  if (! layoutDiv)
    return;

  var askPassWin = createRoomPassWindow ({"room": toRoom});
  askPassWin.setCloseHandler (simple_closeHandler);
  askPassWin.setFormHandler (general_windowOKHandler);
  askPassWin.appendToParent (layoutDiv);
setInterfaceFont();
  askPassWin.node.userForm.elems["roomPass"].focus ();
}

var oldvaluecheckTAENTER="";
function checkTAENTER (e) {

  var obj=document.getElementById("userTextInput");
  oldvalue=oldvaluecheckTAENTER;
  oldvaluecheckTAENTER=obj.value;
  var ev;

  if (! e)
    ev = window.event;
  else
    ev = e;

  var keyCode;

  if (ev.keyCode)
    keyCode = ev.keyCode;
  else if (ev.which)
    keyCode = ev.which;
  else
    return;

  playSound ("PressButton");

  var isModifier = ev.ctrlKey || ev.shiftKey || ev.altKey;
  if (isSpecialLanguage())
  	isModifier = ev.shiftKey || ev.altKey;
  if (keyCode != 13)
    return;
  else if (isModifier)
    return;

  obj.value=oldvalue;
  oldvaluecheckTAENTER="";

  sendChatMessage ();

  clearInterval(inactivityIntervalId);
  inactivityIntervalId = setInterval("logoutHandler();",config["inactivityInterval"] * 1000);
  return;
}

function sendChatMessage () {
  if (user["uid"] == 0)
    return false;

  if (config["gag"]==true)
  	return;

  var textArea = document.getElementById ("userTextInput");

  var textToSend = textArea.value;

  textArea.value = "";

  textToSend = textToSend.trim ();

  if (textToSend.length == 0)
    return;

  if (textToSend.charAt (0) == '/') {
    processIRCCommand (textToSend);
    return;
  }

  textArea.focus ();

  playSound ("SubmitMessage");

  var textInput = document.getElementById ("userTextInput");
  textInput.textStyle["bolded"] = false;
  textInput.textStyle["italic"] = false;

  var data = formatTextMessageSend (user, textToSend, false, false);

  clearTimeout (timeOutId);
  enqueueMessage (data, sendQueue);
  timeOutId = setTimeout ("chatLoop ()", 1);

  if(config["floodInterval"]>0){
  	config["gag"]=true;
	config["gag-timeout-id"] = setTimeout("config[\"gag\"]=false;",1000 * config["floodInterval"]);
  }
}

function processIRCCommand (inputText) {
  var ircCommandArray = inputText.match (/^\/([a-z?]+)\s*(.*)/);
  if (!ircCommandArray)
  	return;

  var ircCommand = ircCommandArray[1];

  if (user["role"]==3)
  	var disabledArray=config["mods"].split(",");
  else if (user["role"]!=2)
  	var disabledArray=config["disabledIRC"].split(",");
  for (var i in disabledArray)
  	if (disabledArray[i].trim()==ircCommand.trim()){
		data = formatTextMessageSend (user, inputText, false, false);
  		clearTimeout (timeOutId);
    	enqueueMessage (data, sendQueue);
    	timeOutId = setTimeout ("chatLoop ()", 1);
  		return;
	}

  var quotedString = ircCommandArray[2].match (/"(.*)"/);

  if (quotedString == null)
    var ic_more = ircCommandArray[2].match (/(\S*)\s*(.*)/);
  else
    var ic_more = ircCommandArray[2].match (/"(.*)"\s*(.*)/);

  var data = null;

  var layoutDiv = document.getElementById ("layoutDiv");
  switch (ircCommand) {

    case "here":
      data = formatSetStatusMessage (user, 1);
      break;

    case "busy":
      data = formatSetStatusMessage (user, 2);
      break;

    case "away":
      data = formatSetStatusMessage (user, 3);
      break;

    case "brb":
      data = formatSetStatusMessage (user, 4);
      break;

    case "clear":
      var chatMessages = document.getElementById ("chatMessages");
      flushNode (chatMessages);
      chatMessages.messagesNo=0;
	  break;

    case "part":
    case "quit":
    case "logout":
    		data = formatLogoutMessage(user["uid"]);
    	break;

    case "back":
    case "backtime":
      var noMsgs = parseInt (ircCommandArray[2]);
      if (noMsgs == NaN)
        break;

      var isBt = ircCommand == "backtime" ? true : false;
      data = formatBackMessage (user, noMsgs, isBt);

      break;

    case "me":

      var message = ircCommandArray[2];

      data = formatTextMessageSend (user, message, true, false);

      break;

    case "join":
    case "j":

      var roomId = findStrInArrayByKey (ircCommandArray[2], rooms, "name");

      if (roomId != null) {
        changeRoom (roomId);
        break;
      }

      var newWin = createInformWindow ("roomNotFound", {"room": ircCommandArray[2]});
      newWin.setCloseHandler (simple_closeHandler);
      newWin.setFormHandler (inform_windowOKHandler);
      newWin.appendToParent (layoutDiv);
setInterfaceFont();
      break;

    case "ignore":

      var userId = findStrInArrayByKey (ircCommandArray[2], userList, "login");

      if (userId != null) {
        if (user["uid"] == userId)
          break;

        data = formatIgnoreMessage (user, userId, ircCommandArray[2], true);
        break;
      }

      var newWin = createInformWindow ("userNotFound", {"user": ircCommandArray[2]});
      newWin.setCloseHandler (simple_closeHandler);
      newWin.setFormHandler (inform_windowOKHandler);
      newWin.appendToParent (layoutDiv);
setInterfaceFont();
      break;

    case "invite":

      var userId = findStrInArrayByKey (ircCommandArray[2], userList, "login");

      if (userId != null) {
        if (user["uid"] == userId)
          break;

        data = formatInviteMessage (user, userId, user["room"], "");
        break;
      }

      var newWin = createInformWindow ("userNotFound", {"user": ircCommandArray[2]});
      newWin.setCloseHandler (simple_closeHandler);
      newWin.setFormHandler (inform_windowOKHandler);
      newWin.appendToParent (layoutDiv);
setInterfaceFont();
      break;

    case "version":
      var newWin = createInformWindow ("version", null);
      newWin.setCloseHandler (simple_closeHandler);
      newWin.setFormHandler (inform_windowOKHandler);
      newWin.appendToParent (layoutDiv);
setInterfaceFont();
      break;

    /* TODO: Delete this lang command. It's a testing extenstion */
    case "lang":
      data = formatGetLangMessage (user, ircCommandArray[2]);
      break;
    /* TODO: END */

    case "kick":
    case "boot":

      if (config["layouts"][user["role"]]["allowBan"] != "1") {
        data = formatTextMessageSend (user, inputText, false, false);
        break;
      }

      var userId = findStrInArrayByKey (ircCommandArray[2], userList, "login");

      if (userId != null) {
        if (user["uid"] == userId)
          break;

        data = formatBanMessage (user, userId, user["room"], 1, "");
        break;
      }

      var newWin = createInformWindow ("userNotFound", {"user": ircCommandArray[2]});
      newWin.setCloseHandler (simple_closeHandler);
      newWin.setFormHandler (inform_windowOKHandler);
      newWin.appendToParent (layoutDiv);

      break;

    case "broadcast":
      if ((user["role"] != "2") && (user["role"] != "3")) {
        data = formatTextMessageSend (user, inputText, false, false);
        break;
      }

      var message = ircCommandArray[2];

      data = formatTextMessageSend (user, message, false, true);

      break;

    case "alert":
      if ((user["role"] != "2") && (user["role"] != "3")) {
        data = formatTextMessageSend (user, inputText, false, false);
        break;
      }

      var userId = findStrInArrayByKey (ic_more[1], userList, "login");

      if (userId != null) {
        if (user["uid"] == userId)
          break;

        data = formatAlertMessage (user, 1, userId, ic_more[2]);
        break;
      }

      var newWin = createInformWindow ("userNotFound", {"user": ircCommandArray[2]});
      newWin.setCloseHandler (simple_closeHandler);
      newWin.setFormHandler (inform_windowOKHandler);
      newWin.appendToParent (layoutDiv);
setInterfaceFont();
      break;

    case "roomalert":
    case "chatalert":
      if ((user["role"] != "2") && (user["role"] != "3")) {
        data = formatTextMessageSend (user, inputText, false, false);
        break;
      }

      if (ircCommand == "roomalert") {
        data = formatAlertMessage (user, 2, user["room"], ircCommandArray[2]);
        break;
      }

      data = formatAlertMessage (user, 3, null, ircCommandArray[2]);

      break;
    case "ban":
	case "banip":
      if (config["layouts"][user["role"]]["allowBan"] != "1") {
      	data = formatTextMessageSend (user, inputText, false, false);
        break;
      }

      var userId = findStrInArrayByKey (ircCommandArray[2], userList, "login");

      if (userId != null) {
        if (user["uid"] == userId)
          break;
		if (ircCommand=="banip")
			data = formatBanMessage (user, userId, null, 3, "");
		else
        	data = formatBanMessage (user, userId, null, 2, "");
        break;
      }

      var newWin = createInformWindow ("userNotFound", {"user": ircCommandArray[2]});
      newWin.setCloseHandler (simple_closeHandler);
      newWin.setFormHandler (inform_windowOKHandler);
      newWin.appendToParent (layoutDiv);
        setInterfaceFont();
      break;
    case "addbot":
    	if ((user["role"] != "2") && (user["role"] != "3")) {
          data = formatTextMessageSend (user, inputText, false, false);
          break;
        }
        if (quotedString)
    	  ircCommandArray[2]=ircCommandArray[2].replace(/\"/g,"&quot;");
    	data = formatAddBotMessage (ircCommandArray[2], ircCommandArray[2]);
      break;
    case "startbot":
    	if ((user["role"] != "2") && (user["role"] != "3")) {
          data = formatTextMessageSend (user, inputText, false, false);
          break;
        }
    	data = formatStartBotMessage(ircCommandArray[2],user["room"]);
      break;
    case "killbot":
    	if ((user["role"] != "2") && (user["role"] != "3")) {
          data = formatTextMessageSend (user, inputText, false, false);
          break;
        }
    	data = formatKillBotMessage(ircCommandArray[2]);
      break;
    case "showbots":
    	if ((user["role"] != "2") && (user["role"] != "3")) {
          data = formatTextMessageSend (user, inputText, false, false);
          break;
        }
    	data = formatShowBotsMessage();
      break;
    case "teach":
        if ((user["role"] != "2") && (user["role"] != "3")) {
          data = formatTextMessageSend (user, inputText, false, false);
          break;
        }
        str=ircCommandArray[2];
        pos=str.indexOf("\" ")+1;
        if (pos<=0)
        	pos=str.length;
        if (str[0]=="\"" && str[pos-1]=="\"")
        	username=str.substr(1,pos-2);
        else
        	username=str.substr(0,pos);
        args=str.substr(pos+1);
        data = formatTeachBotMessage(username,args);
      break;
     case "unteach":
        if ((user["role"] != "2") && (user["role"] != "3")) {
          data = formatTextMessageSend (user, inputText, false, false);
          break;
        }
        str=ircCommandArray[2];
        pos=str.indexOf("\" ")+1;
        if (pos<=0)
        	pos=str.length;
        if (str[0]=="\"" && str[pos-1]=="\"")
        	username=str.substr(1,pos-2);
        else
        	username=str.substr(0,pos);
        args=str.substr(pos+1);
        data = formatUnTeachBotMessage(username,args);
      break;

    case "unban":
    case "reban":
    case "who":
    case "whois":
    case "kickout":
    	var arg=ircCommandArray[2].trim();
    	if (arg[0]=="\"" && arg[arg.length-1]=="\"")
        	arg="&quot;"+arg.substr(1,arg.length-2)+"&quot;";
      	/*if (quotedString)
    	  ircCommandArray[2]=ircCommandArray[2].replace(/\"/g,"&quot;");*/
    	data = formatTextMessageSend (user, "/" + ircCommand + " " +  arg, false, false);
      break;
    case "gag":
		if ((user["role"] != "2") && (user["role"] != "3")) {
          data = formatTextMessageSend (user, inputText, false, false);
          break;
        }
    	pos=ircCommandArray[2].indexOf(" ");
    	minutes=ircCommandArray[2].substr(0,pos);
    	var username=ircCommandArray[2].substr(pos+1,ircCommandArray[2].length).trim();
    	if (username[0]=="\"" && username[username.length-1]=="\"")
        	username=username.substr(1,username.length-2);
        var userId = findStrInArrayByKey (username, userList, "login");
		if (userId != null) {
	      if (user["uid"] == userId)
	        break;
	      data = formatGagMessage(userId, minutes);
	      break;
	    }
	    var newWin = createInformWindow ("userNotFound", {"user": username});
	    newWin.setCloseHandler (simple_closeHandler);
	    newWin.setFormHandler (inform_windowOKHandler);
	    newWin.appendToParent (layoutDiv);
	    setInterfaceFont();
	  break;
	case "ungag":
		if ((user["role"] != "2") && (user["role"] != "3")) {
          data = formatTextMessageSend (user, inputText, false, false);
          break;
        }
        var username=ircCommandArray[2].trim();
    	if (username[0]=="\"" && username[username.length-1]=="\"")
        	username=username.substr(1,username.length-2);
        var userId = findStrInArrayByKey (username, userList, "login");
		if (userId != null) {
	      if (user["uid"] == userId)
	        break;
	      data = formatUnGagMessage(userId);
	      break;
	    }
	    var newWin = createInformWindow ("userNotFound", {"user": username});
	    newWin.setCloseHandler (simple_closeHandler);
	    newWin.setFormHandler (inform_windowOKHandler);
	    newWin.appendToParent (layoutDiv);
	    setInterfaceFont();
	  break;
    default:
        data = formatTextMessageSend (user, inputText, false, false);
      break;
  }

  if (data != null) {
    clearTimeout (timeOutId);
    enqueueMessage (data, sendQueue);
    timeOutId = setTimeout ("chatLoop ()", 1);
  }
}

function changeLanguageHandler () {
  sendChangeLanguageMessage (this.value);
}

function sendChangeLanguageMessage (newLang) {
  var data = formatGetLangMessage (user, newLang);

  clearTimeout (timeOutId);
  enqueueMessage (data, sendQueue);
  timeOutId = setTimeout ("chatLoop ()", 1);
}

function createRoom () {
  var layoutDiv = document.getElementById ("layoutDiv");
  if (! layoutDiv)
    return;

  var arWin = createAddRoomWindow ();

  arWin.setCloseHandler (simple_closeHandler);
  arWin.setFormHandler (general_windowOKHandler);
  arWin.appendToParent (layoutDiv);
if(arWin.node.userForm.elems["roomName"])
  arWin.node.userForm.elems["roomName"].focus ();
  document.getElementById("radioPublicRoom").checked=true;
  document.getElementById("radioPublicRoom").onclick = function () { document.getElementById("radioPublicRoom").checked=true;document.getElementById("radioPrivateRoom").checked=false; }
  document.getElementById("radioPrivateRoom").onclick = function () {document.getElementById("radioPublicRoom").checked=false; document.getElementById("radioPrivateRoom").checked=true; }
  setInterfaceFont();
}

function changeStatus () {
  var statusSelect = document.getElementById ("statusSelect");
  var newStatus = statusSelect.value;

  var data = formatSetStatusMessage (user, newStatus);

  clearTimeout (timeOutId);
  enqueueMessage (data, sendQueue);
  timeOutId = setTimeout ("chatLoop ()", 1);

}

function showOptionsWindow () {
	resize = 'no';
  closeAllButtonWindows();

  var layoutDiv = document.getElementById ("layoutDiv");
  if (! layoutDiv)
    return;

  var oWin = createOptionsWindow ({"changeLang": changeLanguageHandler, "customPhoto": openCustomPhotoWindow, "customBackground": openCustomBackgroundWindow});

  if (oWin == null)
    return;

  oWin.setCloseHandler (simple_closeHandler);
  oWin.setFormHandler (inform_windowOKHandler);
  oWin.appendToParent (layoutDiv);

  oWin.showWindow();
  setInterfaceFont();

  configureOptionsWindow();
  applyColorChanges();
  setTempColorOptions();
}
function changeMyColor(ev)
{


	if (! ev)
    	ev = window.event;
  	else
    	ev = ev;

	var keyCode;
	var view = document.getElementById ("colorView");
	var code = document.getElementById ("colorcod");

  	if (ev.keyCode)
    	keyCode = ev.keyCode;




	var cod = code.value;
	if(cod.substring(0,1)=="#")
		cod = cod.substring(1,cod.length);

	if(cod.length<6)
		for( var i = cod.length ; i < 6;i++ )
			cod = cod + "0";

	if( ishex(cod) )
	{
		view.style["backgroundColor"] =  "#"+cod.toUpperCase();
	}

	if (keyCode == 13)
  	{
  		var colorMy = view.style["backgroundColor"];
		colorMy = colorMy.substring(1,colorMy.length);
  		var cpDiv = document.getElementById ("colorPicker");
  		var isFor = cpDiv.isFor;

  		isFor.style["backgroundColor"] = "#"+cod.toUpperCase();
 		if (isFor.changeHandler != null)
    		isFor.changeHandler (cod.toUpperCase());

  		cpDiv.style["visibility"] = "hidden";

  		toChangeChatColors(isFor.id);
	}

}
function ishex(value)
{
	var hD = "0123456789ABCDEFabcdef";
	for( var i=0 ; i < value.length ; i++ )
	{
		if(hD.indexOf(value.charAt(i))==-1)
			return false;


	}
	return true;
}
function registerHandlers () {
  var roomCombo = document.getElementById ("roomSelect");
  if (roomCombo != null)
    roomCombo.onchange = function () { changeRoom (null); };

	var colorcod = document.getElementById ("colorcod");
  if (colorcod != null)
    colorcod.onkeyup = function (ev) { changeMyColor(ev); };

  var sendButton = document.getElementById ("sendButton");
  if (sendButton != null)
    sendButton.onclick = function () { sendChatMessage (); };

  var textArea = document.getElementById ("userTextInput");
  if (textArea != null)
    textArea.onkeyup = function (ev) { checkTAENTER (ev); ismaxlength(this); };

  var addRoom = document.getElementById ("addRoom");
  if (addRoom != null)
    addRoom.onclick = function () { createRoom () };

  var statusSelect = document.getElementById ("statusSelect");
  if (statusSelect != null)
    statusSelect.onchange = function () { changeStatus (); };

  ///var skinButton = document.getElementById ("skinBtn");
  //if (skinButton != null)
  //  skinButton.onclick = function () { showOptionsWindow (); }

  var smilesButton = document.getElementById ("smilesBtn");
  if (smilesButton != null)
    smilesButton.onclick = function () { showSmilesWindow (smilesButton, textArea); }

  var colorButton = document.getElementById ("colorBtn");
  if (colorButton != null) {
    colorButton.onclick = function () { showCPWindow (colorButton); };
    colorButton.changeHandler = function (newColor) { changeColor (newColor); };
  }

  var colorButton = document.getElementById ("colorBtn");
  if (colorButton != null) {
    colorButton.onclick = function () { showCPWindow (colorButton); };
    colorButton.changeHandler = function (newColor) { changeColor (newColor); };
  }

  var saveButton = document.getElementById ("saveBtn");
  if (saveButton != null) {
    saveButton.onclick = function () { openSaveWindow (); };
  }

  var helpButton = document.getElementById ("helpBtn");
  if (helpButton != null) {
    helpButton.onclick = function () { openHelpWindow (); };
  }
}

function openSaveWindow () {
  var sessid;
  if (config["enableSocketServer"]!=true)
  	sessid = comm["commId"];
  else
  	sessid = commresponseId;

  if (config["itc"]["mainChat"] != null) {
    var saveFont = config["itc"]["mainChat"]["fontFamily"];
    var saveFSize = config["itc"]["mainChat"]["fontSize"];
  }
  else {
    var saveFont = "Arial";
    var saveFSize = "13";
  }

  var newURL = "../save.php?id=" + sessid + "&font=" + saveFont + "&size=" + saveFSize;
  openBrowserWindow (newURL);
}

function openHelpWindow () {
  if (config["helpUrl"] != null);
    openBrowserWindow (config["helpUrl"]);
}

function openCustomPhotoWindow () {
  var sessid = comm["commId"];
  var newURL = "../load_photo.php?userid=" + user["uid"] + "&lang=" + config["currentLanguage"] + "&connid=" + sessid;

  openUploadWindow (newURL);
}

function openCustomBackgroundWindow () {
  var sessid;
  if (config["enableSocketServer"]!=true)
  	sessid = comm["commId"];
  else
  	sessid = commresponseId;
  var newURL = "../load_avatar_bg.php?userid=" + user["uid"] + "&lang=" + config["currentLanguage"] + "&connid=" + sessid;

  openUploadWindow (newURL);
}

function changeColor (newColor) {

  /* the newColor is in hex */
  var data = formatSetColorMessage (user, newColor);

  clearTimeout (timeOutId);
  enqueueMessage (data, sendQueue);
  timeOutId = setTimeout ("chatLoop ()", 1);
}

function simple_closeHandler () {
  resetAvatar();
  this.closeWindow ();
  closeAllButtonWindows();

  ifRollbackTheme();
  ifShowBackground();
  applyColorChanges();
}

function cmEntryClick () {
  var entryClicked = this.entry;

  var layoutDiv = document.getElementById ("layoutDiv");
  if (! layoutDiv)
    return;

  switch (entryClicked) {
    case "privatemessage":
      appendPrivateMessage (this.parent.user["uid"], null, null);
	  document.getElementById("contextMenu").style["display"] = "none";
      break;

    case "fileshare":
      openSFNewWindow (user["uid"], this.parent.user["uid"], user["lang"], comm.commId);
      break;

    case "invite":
      var inviteWin = createInviteWindow (this.parent.user);
      if (inviteWin == null)
        break;

      inviteWin.setCloseHandler (simple_closeHandler);
      inviteWin.setFormHandler (general_windowOKHandler);
      inviteWin.appendToParent (layoutDiv);
      setInterfaceFont();
	  applyColorChanges();
	  document.getElementById("contextMenu").style["display"] = "none";
	  document.getElementById("pW_messagesFields").focus();//
      break;

    case "ignore":
      var ignoreWin = createIgnoreWindow (this.parent.user, true);
      if (ignoreWin == null)
        break;

      ignoreWin.setCloseHandler (simple_closeHandler);
      ignoreWin.setFormHandler (general_windowOKHandler);
      ignoreWin.appendToParent (layoutDiv);
      setInterfaceFont();
	  applyColorChanges();
	  document.getElementById("contextMenu").style["display"] = "none";
	  if(document.getElementById("textInputField"))
	  	document.getElementById("textInputField").focus();
      break;

    case "unignore":

      var ignoreWin = createIgnoreWindow (this.parent.user, false);
      if (ignoreWin == null)
        break;

      ignoreWin.setCloseHandler (simple_closeHandler);
      ignoreWin.setFormHandler (general_windowOKHandler);
      ignoreWin.appendToParent (layoutDiv);
      setInterfaceFont();
	  applyColorChanges();
	  document.getElementById("contextMenu").style["display"] = "none";
	  if(document.getElementById("textInputField"))
	  document.getElementById("textInputField").focus();
      break;

    case "ban":

      var banWin = createBanWindow (this.parent.user);
      if (banWin == null)
        break;

      banWin.setCloseHandler (simple_closeHandler);
      banWin.setFormHandler (general_windowOKHandler);
      banWin.appendToParent (layoutDiv);
      setInterfaceFont();
	  applyColorChanges();
	  document.getElementById("contextMenu").style["display"] = "none";
      break;

    default:
      /* TODO: DEBUG, delete in the future */
      alert (this.entry + " for user " + this.parent.user["login"]);
      break;
  }
}

function userClickHandler (e) {
  var obj = this;

  if (! e)
    var ev = window.event;
  else
    var ev = e;

  cancelEventPropagation (ev);

  var contextAt = new Object ();
  contextAt["left"] = ev.clientX - POSADJX;
  contextAt["top"]  = ev.clientY - POSADJY;

  var layoutDiv = document.getElementById ("layoutDiv");

  var cmDiv = document.getElementById ("contextMenu");

  if (cmDiv != null) {
    cmDiv.parentNode.removeChild (cmDiv);
    cmDiv = null;
  }

  if (obj.user != user)
    cmDiv = createContextMenu (user["role"], obj.user, cmEntryClick);
  else
  	if (config["hideSelfPopup"])
    	return;
    else
    	cmDiv = createContextMenu (user["role"], obj.user, cmEntryClick);

  layoutDiv.appendChild (cmDiv);

  var divWidth = cmDiv.clientWidth + 10;
  var divHeight = cmDiv.clientHeight + 10;

  if (contextAt["left"] + divWidth > (appletWidth - 4))
    contextAt["left"] = appletWidth - divWidth - 4;

  if (contextAt["top"] + divHeight > (appletHeight - 4))
    contextAt["top"] = appletHeight - divHeight - 4;

  setElementSaP (cmDiv, {"left": contextAt["left"] + "px", "top": contextAt["top"] + "px", "width": divWidth + "px"}, null);
  setElementSaP (cmDiv, {"visibility": "visible"}, null);
}

function general_windowOKHandler () {
  var winObj = this.window.object;
  var winType = winObj.userData["winType"];
  var toUser = winObj.userData["user"];

  winObj.closeWindow ();

  var data = null;

  switch (winType) {
    case "invite":

      var textMessage = this.elems["inviteMessage"].value;
      var toRoom = this.elems["roomSelect"].value;

      data = formatInviteMessage (user, toUser["uid"], toRoom, textMessage);

      break;

    case "ignore":

      var textMessage = this.elems["ignoreText"].value;

      data = formatIgnoreMessage (user, toUser["uid"], textMessage, true);

      toUser["ignored"] = true;

      break;

    case "unignore":

      var textMessage = this.elems["unignoreText"].value;

      data = formatIgnoreMessage (user, toUser["uid"], textMessage, false);

      toUser["ignored"] = false;

      break;

    case "inviteCfrm":

      var toRoom = winObj.userData["room"]

      var textMessage = this.elems["inviteResponse"].value;

      var accepted = this.canceled ? false : true;

      data = formatInvitationConfirm (user, toUser["uid"], toRoom["id"], textMessage, accepted);

      if (accepted) {
        enqueueMessage (data, sendQueue);
        data = null;
        changeRoom (toRoom["id"]);
      }

      break;

    case "fsCfrm":

      var toUser = winObj.userData["user"];
      var fileUrl = winObj.userData["fileUrl"];

      if (this.canceled)
        var cfrm = "flsh_d";
      else {
        var cfrm = "flsh_a";
        openSFDownload ("../" + fileUrl);
      }
	  if(config["showConfirmation"])
      	data = formatFSConfirm (user, toUser["uid"], cfrm);

      break;

    case "addRoom":
      var roomName = this.elems["roomName"].value.trim ();
      var public = this.elems["publicRadio"].checked;
      var password = this.elems["roomPass"].value.trim ();

      if (roomName.length == 0)
        break;

      data = formatAddRoom (user, roomName, public, password);

      break;

    case "ban":
      var banText = this.elems["banMessage"].value.trim ();



//alert(BanValue);
	  if(getBrowser ()!=4)
	  {
	  	      var radioVal1 = this.elems["roomRadio"].checked;
		      var radioVal2 = this.elems["chatRadio"].checked;

	   if (radioVal1 == true)
        var banBy = 1; /* by Room */
      else if (radioVal2 == true)
        var banBy = 2; /* by Chat */
      else
        var banBy = 3; /* by IP */
	  }
	  else
	  	var banBy = BanValue+1;
	  //alert(radioVal1);
	   //alert(radioVal2);



      var roomSelect = this.elems["roomSelect"];
      if (roomSelect != null)
        var roomId = roomSelect.value;
      else
        var roomId = 1;

      var forUser = winObj.userData["user"];

      data = formatBanMessage (user, forUser["uid"], roomId, banBy, banText);

      break;

    case "askRoomPass":

      var password = this.elems["roomPass"].value;
      var forRoom = winObj.userData["forRoom"];

      sendMoveMessage (forRoom, password);

      break;

    default:
      break;
  }

  if (data != null) {
    clearTimeout (timeOutId);
    enqueueMessage (data, sendQueue);
    timeOutId = setTimeout ("chatLoop ()", 1);
  }
}

function inform_windowOKHandler () {
  var winObj = this.window.object;

  setOptionsWindow();

  closeAllButtonWindows();
  winObj.closeWindow ();

}

/* this decodes the response from the chat server */
function xmlDecoder (xmlObj, xmlStr) {

  if (xmlObj == null)
    return;

if(config)
{
	if(config["debug"] && newWindow)
	{

		if( !newWindow.closed )
		{
			newWindow.getAll(xmlStr);
		}
	}
}
  /* gets root node */
  var rootNode = xmlObj.documentElement;

  /* check to see if we have response element */
  if (rootNode.tagName != "response")
    return;

  commresponseId=-1;

  try{
	if (config != null)
	  if (config["enableSocketServer"]==true)
		commresponseId=rootNode.getAttribute ("id");
  }catch(e){
  }

  if(commresponseId==-1){
	  if (comm["commId"] == 0) {
	    var responseId = rootNode.getAttribute ("id");
	    comm["commId"] = responseId;
	  }
	  idcomm = comm["commId"];
  }

  /* iterate through all childrens */
  var childNodes = new Object ();

  if (rootNode.hasChildNodes ())
    childNodes = rootNode.childNodes;
  else
    childNodes.length = 0;

  var hasLoginMessage = false;
  var hasLanguageMessage = false;

  var newUsers       = new Array ();
  var newUsersColors = new Array ();
  var newUsersStates = new Array ();
  var newRooms       = new Array ();
  var newRoomsLocks  = new Array ();
  var removeRooms    = new Array ();
  var removeUsers    = new Array ();
  var movedUsers     = new Array ();
  var newMessages    = new Array ();
  var newInvitations = new Array ();
  var newInvConfirm  = new Array ();
  var newFSRq        = new Array ();
  var newFSCfrm      = new Array ();
  var newGagCfrm     = new Array ();
  var newIgnCfrm     = new Array ();
  var newBackMsg     = new Array ();
  var newMesgB       = new Array ();
  var newAlrts       = new Array ();
  var newErrors      = new Array ();
  var newLogout      = new Array ();
  var newPictures 	 = new Array ();
  var newMcAvatars 	 = new Array ();
  var newRlAvatars 	 = new Array ();
  var newGags 		 = new Array ();
  var newUnGags 	 = new Array ();
  var newAlertCfrm	 = new Array ();

  /*if (childNodes.length>1)
  	alert(xmlStr);*/

  /*str_alert="";
  for (var i = 0; i < childNodes.length; i++) {
    var child = childNodes.item (i);
    if (child.nodeType != Node.ELEMENT_NODE)
      continue;

    str_alert+="|"+child.tagName+"| ... ";
 }
 alert(str_alert);*/

  var hasToScroll = false;
  for (var i = 0; i < childNodes.length; i++) {
    var child = childNodes.item (i);

    if (child.nodeType != Node.ELEMENT_NODE)
      continue;


	//alert(child);

    var msgId = child.getAttribute ("id");
    if (config["enableSocketServer"]!=true){
	    if (msgId < comm.msgId)
	      continue;
    }else{
	   if (msgId < commmsgId)
	   	  continue;
    }

	var messageTime = child.getAttribute ("t");
	//writeDebug("|" + child.tagName + "|"+ child.firstChild.nodeValue + "|\n<br>")
	//alert(child.tagName);
	switch (child.tagName) {
	  case "gag":
	  		var gag = new Object ();
        	gag["duration"] = child.firstChild.nodeValue;
        	gag["fromuid"] = child.getAttribute ("u");
        	newGags.push(gag);
	      break;
	  case "ngag":
	  		var ungag = new Object ();
	  		var uid = child.getAttribute ("u");
	  		ungag["uid"] = uid;
	  		newUnGags.push(ungag);
	      break;
	  case "spht":
	  		var pictureimg=child.firstChild.nodeValue;
	  		var uid = child.getAttribute ("u");
	  		var picture = new Object ();
        	picture["uid"] = uid;
        	picture["picture"] = pictureimg;
        	newPictures.push (picture);
	  	 break;

	  case "load_photo":
	  		config["effects"]["mypicture-temp"] = child.firstChild.nodeValue;
			//alert(document.getElementById("myPicture"));
	  		if (document.getElementById("myPicture"))
	  			document.getElementById("myPicture").innerHTML="<img src=\"." + config["effects"]["mypicture-temp"] + "?" + Math.random() + "\" width=\"120px\">";
	  	 break;

	  case "ravt":
	  		newRlAvatars
	  		var rl_avatar=child.firstChild.nodeValue;
	  		var uid = child.getAttribute ("u");

	  		var rlAvatar = new Object ();
        	rlAvatar["uid"] = uid;
        	rlAvatar["rl_avatar"] = rl_avatar;
        	newRlAvatars.push (rlAvatar);
	     break;
	   case "rang":
	   //config["sound"]["ev"]["ringbell"]["muted"] =  0;
	   //config["sound"]["ev"]["ringbell"]["file"] = "sounds/ringbell.mp3";
	  		var str = lang['bellrang'];//getLanguageString ("messages", "bellrang:bellrang", config["currentLanguage"], null);
			var textMessage = languageStringFormat (str, {"user": user["login"]});
			appendMessage (textMessage,new RGBColor(skinOptsValues["enterRoomNotify"]).toHex());
			playSound ("ringbell",true);
	     break;
	  case "mavt":

	  		var mc_avatar=child.firstChild.nodeValue;
	  		var uid = child.getAttribute ("u");

	  		var mcAvatar = new Object ();
        	mcAvatar["uid"] = uid;
        	mcAvatar["mc_avatar"] = mc_avatar;
        	newMcAvatars.push (mcAvatar);
	     break;

      case "lin":
        user["uid"]      = child.getAttribute ("u");
        user["room"]     = child.getAttribute ("r");
        user["role"]     = child.getAttribute ("rs");
        user["gender"]   = child.getAttribute ("gn");
        user["photo"]    = child.getAttribute ("pt");
        user["language"] = child.firstChild.nodeValue;

        /*
        if(user["role"]=="2"){
	        config["effects"]["avatarsmainchat-avatar"]=":admin:";
			config["effects"]["avatarsroomlist-avatar"]=":admin:";
			config["effects"]["avatarsroomlist"]=1;
			var data = formatSetRoomAvatar (null, config["effects"]["avatarsroomlist-avatar"]);
		    clearTimeout (timeOutId);
		    enqueueMessage (data, sendQueue);
		    timeOutId = setTimeout ("chatLoop ()", 1);
  		}
  		if(user["role"]=="3"){
	        config["effects"]["avatarsmainchat-avatar"]=":mod:";
			config["effects"]["avatarsroomlist-avatar"]=":mod:";
			config["effects"]["avatarsroomlist"]=1;
			var data = formatSetRoomAvatar (null, config["effects"]["avatarsroomlist-avatar"]);
		    clearTimeout (timeOutId);
		    enqueueMessage (data, sendQueue);
		    timeOutId = setTimeout ("chatLoop ()", 1);
  		}*/
  		//alert(user["role"]);

  		var av = getAvatar();

  		//alert(config["smiles"][":admin:"]);
  		if (av!=null){
	  		config["effects"]["avatarsmainchat-avatar"] = "";
	  		for (var key in config["smiles"])
	  			if(config["smiles"][key] == av.mainchat.default_value){
	  				config["effects"]["avatarsmainchat-avatar"] = key;
	  				var data = formatSetMainChatAvatar(null, config["effects"]["avatarsmainchat-avatar"]);
				    clearTimeout (timeOutId);
				    enqueueMessage (data, sendQueue);
				    timeOutId = setTimeout ("chatLoop ()", 1);
  				}
	  		config["effects"]["avatarsmainchat"] = av.mainchat.default_state;
	  		config["effects"]["avatarsmainchat_allow_override"] = av.mainchat.allow_override;

	  		config["effects"]["avatarsroomlist-avatar"] = "";
	  		for (var key in config["smiles"])
	  			if(config["smiles"][key] == av.room.default_value){
	  				config["effects"]["avatarsroomlist-avatar"] = key;
	  				var data = formatSetRoomAvatar (null, config["effects"]["avatarsroomlist-avatar"]);
				    clearTimeout (timeOutId);
				    enqueueMessage (data, sendQueue);
				    timeOutId = setTimeout ("chatLoop ()", 1);
  				}
			config["effects"]["avatarsroomlist"] = av.room.default_state;
			config["effects"]["avatarsroomlist_allow_override"] = av.room.allow_override;
  		}else{
	  		config["effects"]["avatarsmainchat_allow_override"]=1;
			config["effects"]["avatarsmainchat"]=0;
			config["effects"]["avatarsmainchat-avatar"]=":)";
			config["effects"]["avatarsroomlist"]=0;
			config["effects"]["avatarsroomlist_allow_override"]=1;
			config["effects"]["avatarsroomlist-avatar"]=":)";
  		}
  		//alert(av.mainchat.default_value);
        hasLoginMessage = true;
        break;

      case "lng":
      case "glng":
	  	langDecode = true;

        lngXMLString = child.firstChild.nodeValue;
		setLanguageFromXML (xmlDOMObj, lngXMLString);
		hasLanguageMessage = true;

        //printElement(lang);
        break;

      case "adr":
        var roomId      = child.getAttribute ("r");
        var roomName    = child.firstChild.nodeValue;

		 var bool = true;
		//alert(roomId);
		for( key in newRooms )
		{

			//alert(newRooms[key]);
			if(newRooms[key]["id"]==roomId)
			{
				bool = false;
				break;
			}
		}
		if(bool==false)
			break;

        var room = new Object ();
        room["id"] = roomId;
        room["name"] = roomName;
		newRooms.push (room);
		break;

      case "srl":
        var roomId      = child.getAttribute ("r");

        var room = new Object ();
        room["id"] = roomId;
        room["locked"] = true;

        newRoomsLocks.push (room);

        break;

      case "adu":
	  	//user["login"] = child.firstChild.nodeValue;
		//alert('adu' + child.firstChild.nodeValue);
      case "adu2":
      	//alert('  child.firstChild.nodeValue  ' + child.firstChild.nodeValue);
		//alert('adu2' + child.firstChild.nodeValue)
      	var newUser = new User ();
		newUser["uid"]      = child.getAttribute ("u");
        newUser["room"]     = child.getAttribute ("r");
        newUser["role"]     = Number(child.getAttribute ("rs"));
        newUser["gender"]   = child.getAttribute ("gn");
        newUser["photo"]    = child.getAttribute ("pt");
        newUser["login"]    = child.firstChild.nodeValue;
        var userId = findStrInArrayByKey (newUser["login"], newUsers, "login");
        if (userId != null)
	      break;
		newUsers.push (newUser);

		//alert("add " + child.tagName+ " = "+ newUser["uid"] +" id + " + newUser["login"]);
		//if (userList[newUser["uid"]] != null);
       	//	removeUsers.push(newUser["uid"]);

		/*var stree=child.tagName;
		for (var ii in newUser)
			stree+=" " + newUser[ii];
        alert(stree);*/
        /*if(child.tagName=="adu2")
        	newUser["login"]="";*/

        if (config["effects"]["avatarsroomlist"]==1){
	        var data = formatSetRoomAvatar (newUser["uid"], config["effects"]["avatarsroomlist-avatar"]);
	  		clearTimeout (timeOutId);
	  		enqueueMessage (data, sendQueue);
	  		timeOutId = setTimeout ("chatLoop ()", 1);
        }

        if (config["effects"]["avatarsmainchat"]==1){
	        var data = formatSetMainChatAvatar (newUser["uid"], config["effects"]["avatarsmainchat-avatar"]);
	  		clearTimeout (timeOutId);
	  		enqueueMessage (data, sendQueue);
	  		timeOutId = setTimeout ("chatLoop ()", 1);
        }

        if(config["effects"]["mypicture"]){
        	var data = formatSetPicture (newUser["uid"], config["effects"]["mypicture"]);
  			clearTimeout (timeOutId);
  			enqueueMessage (data, sendQueue);
  			timeOutId = setTimeout ("chatLoop ()", 1);
		}
        break;

      case "uclc":
        var uid = child.getAttribute ("u");
        var color = dec2hex (child.firstChild.nodeValue);

        newUsersColors.push ({"uid": uid, "color": fixHexColorValue (color)});

        break;

      case "ustc":

	  if(config["liveSupportMode"] && roleUser!=2)
	  	break;

        var uid = child.getAttribute ("u");
        var state = child.firstChild.nodeValue;

		newUsersStates.push ({"uid": uid, "state": state});

        for (key in newUsers)
        	if(newUsers[key]["uid"]==uid)
        		newUsers[key]["state"]=state;

        for (key in userList)
        	if(userList[uid]){
	        	userList[uid]["state"]=state;
	        	var crRoom=rooms[userList[uid]["room"]]["object"];

	        	//crRoom.removeUser (uid);
	        	//crRoom.addUser (userList[uid], userList);
    		}
        break;

      case "rmu":

        var userId = child.getAttribute ("u");

        removeUsers.push (userId);

        break;

      case "rmr":
        var roomId = child.getAttribute ("r");

        removeRooms.push (roomId);

        break;

      case "msg":
      case "msgu":
        var newMessage = new Object ();
        newMessage["user"] = child.getAttribute ("u");
        newMessage["room"] = child.getAttribute ("r");
        newMessage["time"] = child.getAttribute ("t");
        newMessage["priv"] = child.getAttribute ("a");

        newMessage["urgent"] = child.tagName == "msgu" ? true : false;

		newMessage["text"] = unescapeHTML (child.firstChild.nodeValue);

		if (newMessage["room"])
		{
			if(newMessage["room"]==user["room"])
				newMessages.push (newMessage);
		}
		else
        	newMessages.push (newMessage);

        if (isFocusWindowOnNewMessages())
        	window.focus();

        break;

      case "mvu":

		if(roleUser==2)
		{
			var userUid     = child.getAttribute ("u");
        	var movedToRoom = child.getAttribute ("r");

        	movedUsers.push ({"uid": userUid, "room": movedToRoom});
			break;
		}
		if(childNodes.item (i+1)!="error")
		{
        	var userUid     = child.getAttribute ("u");
        	var movedToRoom = child.getAttribute ("r");

        	movedUsers.push ({"uid": userUid, "room": movedToRoom});
		}

        break


      case "invu":
        var invitation = new Object ();
        invitation["user"] = child.getAttribute ("u");
        invitation["room"] = child.getAttribute ("r");

        invitation["text"] = unescapeHTML (child.firstChild.nodeValue);

        newInvitations.push (invitation);

        break;

      case "inva":
      case "invd":
        var invitation = new Object ();
        invitation["user"] = child.getAttribute ("u");
        invitation["room"] = child.getAttribute ("r");
        invitation["accepted"] = child.tagName == "inva" ? true : false;

        invitation["text"] = unescapeHTML (child.firstChild.nodeValue);

        newInvConfirm.push (invitation);
setInterfaceFont();
        break;

      case "fileshare":
        var fsrq = new Object ();
        fsrq["user"] = child.getAttribute ("u");
        fsrq["text"] = unescapeHTML (child.firstChild.nodeValue);

        newFSRq.push (fsrq);

        break;
      case "cfrm":
      	var cfrm = new Object ();
        cfrm["user"] = child.getAttribute ("u");
        cfrm["text"] = unescapeHTML (child.firstChild.nodeValue);
        str=cfrm["text"];
        pos=str.indexOf(",")+1;
        if (pos<=0)
        	pos=str.length;
        msg=str.substr(0,pos-1);
        if (msg=="gag"){
	        args=str.substr(pos);
	        cfrm["minutes"]=parseInt(args);
			newGagCfrm.push (cfrm);
		}else if (msg=="alrt")
			newAlertCfrm.push(cfrm);
		else
        	newFSCfrm.push (cfrm);
        break;

      case "ignu":
      case "nignu":
        var cfrm = new Object ();
        cfrm["user"] = child.getAttribute ("u");
        cfrm["iuid"] = child.getAttribute ("a");
        cfrm["ignored"] = child.tagName == "ignu" ? true : false;

        if (cfrm["iuid"] != user["uid"])
          break;

        cfrm["text"] = unescapeHTML (child.firstChild.nodeValue);

        newIgnCfrm.push (cfrm);

        break;

      case "back":
      case "backt":
        var backmsg = new Object ();
        backmsg["backtime"] = child.tagName == "backt" ? true : false;
        backmsg["param"] = child.getAttribute ("r");

        newBackMsg.push (backmsg);

        break;

      case "msgb":
        var backmsg = new Object ();
        backmsg["room"] = child.getAttribute ("r");
        backmsg["login"] = child.getAttribute ("l");

        backmsg["text"] = unescapeHTML (child.firstChild.nodeValue);

        newMesgB.push (backmsg);

        break;

      case "ralrt":
      case "calrt":
      case "alrt":
      	var alrt = new Object ();

        var langStr = child.tagName == "calrt" ? "misc:chatalert" : "misc:alert";

        alrt["text"] = unescapeHTML (getLanguageString ("dialog", langStr, config["currentLanguage"], null) + child.firstChild.nodeValue);

        newAlrts.push (alrt);
		if (child.tagName=="alrt" && config["showConfirmation"]){
			data = formatConfirmAlert (child.getAttribute ("u"));
      		clearTimeout (timeOutId);
  	  		enqueueMessage (data, sendQueue);
		}

        break;

      case "error":
        var errorType = unescapeHTML (child.firstChild.nodeValue);

        //newErrors.push (errorType);


		var alrt = new Object ();

        //var langStr = child.tagName == "calrt" ? "misc:chatalert" : "misc:alert";+ child.firstChild.nodeValue

		var langStr = lang[errorType];

        alrt["text"] = unescapeHTML (getLanguageString ("dialog", langStr, config["currentLanguage"], null) );
		//alert(alrt["text"]);
        newAlrts.push (alrt);
		if (config["showConfirmation"]){
			data = formatConfirmAlert (child.getAttribute ("u"));
      		clearTimeout (timeOutId);
  	  		enqueueMessage (data, sendQueue);
		}

        break;

      case "lout":
        var logoutMessage = unescapeHTML (child.firstChild.nodeValue);
		loginMsg = logoutMessage;
        newLogout.push (logoutMessage);
		loutMessageTag = true;
        break;

      case "load_av_bg":
      		var txt=unescapeHTML (child.firstChild.nodeValue);
      		var params=txt.split("!#@#!");

      		config["effects"]["background-image-temp"]="." + params[0];
      		ifShowBackground();
      		if(params[1]==4)
      			config["effects"]["background-image-lockthemes-temp"]=1;
      		else
      			config["effects"]["background-image-lockthemes-temp"]=0;
      		//alert(unescapeHTML (child.firstChild.nodeValue));
        break;
      default:
        break;
    } /* switch (tagName) */

    if (config["enableSocketServer"]!=true)
	    comm.msgId = msgId;
    else
	   commmsgId=msgId;



  } /* for - iterate childs of <response> */



  if (hasLoginMessage) {

    var layoutDiv = document.getElementById ("layoutDiv");


    createUILayout (user['role']);
    userList[user["uid"]] = user;

    chatMessages = document.getElementById ("chatMessages");

    registerHandlers ();

    displayBLOCKByNode (layoutDiv);

    inactivityIntervalId = setInterval("logoutHandler();",config["inactivityInterval"] * 1000);

    playSound ("InitialLogin");
  }

  if (hasLanguageMessage) {
    var mainNode = document.getElementById ("AC_main");
    formatUIsLanguage (mainNode, null, {"user": user["login"]});
  }

  if (removeRooms.length > 0) {
    var roomCombo = document.getElementById ("roomSelect");

    while (removeRooms.length > 0) {
      var removeRID = removeRooms.shift ();

      if (rooms[removeRID] == null)
        continue;

      var roomObject = rooms[removeRID]["object"];

      removeSelectOptionByValue (roomCombo, removeRID);

      rooms[removeRID] = null;

      roomObject.remove ();
    }
  }

  if (newRoomsLocks.length > 0) {
    for (key in newRoomsLocks) {
      if (key == "null")
        continue;

      var cRoomL = newRoomsLocks[key];

      var rid = cRoomL["id"];
      if (! rooms[rid]) {
        rooms[rid] = new Array ();
      }

      rooms[rid]["hasPassword"] = true;
    }
  } /* end newRoomLocks */

  if (newRooms.length > 0) {
    var roomCombo = document.getElementById ("roomSelect");
    var roomsDiv = document.getElementById ("roomList");

    var chatRight = false;

    if (roomCombo) {
      roomCombo.disabled = true;

      /* delete all rooms from select combo list, if we don't have rooms in it */
      var firstOption = roomCombo.getElementsByTagName ("option").item (0);
      if ((firstOption) && (firstOption.value == "none"))
        while (roomCombo.length > 0)
          roomCombo.remove (0);
    }

    /* populate the new rooms */
    for (key in newRooms) {
      if (key == "null")
        continue;

      var cRoom = newRooms[key];
      var rid = cRoom["id"];

      if (! rooms[rid])
        rooms[rid] = new Object ();

      rooms[rid]["name"] = cRoom["name"];
      rooms[rid]["id"] = rid;

      if (roomCombo) {
        var opt = document.createElement ("option");
        opt.value = rid;
        opt.appendChild (document.createTextNode (cRoom["name"]));

        roomCombo.appendChild (opt);
      }

      var room = new Room_Object (rid, cRoom["name"], rooms[rid]["hasPassword"]);
      rooms[rid]["object"] = room;
      room.setUserClickHandler (userClickHandler);

      room.appendToParent (roomsDiv);
    } /* end for (newRooms) */

    if (roomCombo)
      roomCombo.disabled = false;

  } /* end if (hasNewRooms) */


  if (removeUsers.length > 0) {
    while (removeUsers.length > 0) {
      var removeUID = removeUsers.shift ();
      var removedUser = userList[removeUID];

      if (removedUser == null)
        continue;
      if (rooms[removedUser["room"]] == null)
        continue;

      room = rooms[removedUser["room"]]["object"];

      room.removeUser (removeUID);

      if ((removedUser["room"] == user["room"]) && (! hasLoginMessage)) {
        var textMessage = languageStringFormat (lang["leaveroom"], {"user": removedUser["login"], "room": rooms[removedUser["room"]]["name"], "time": messageTime});

        hasToScroll |= appendMessage (textMessage,new RGBColor(skinOptsValues["enterRoomNotify"]).toHex());
      }

      userList[removeUID] = null;
    }
  }

  if (movedUsers.length > 0) {
	var roomCombo = document.getElementById ("roomSelect");
	for (key in movedUsers) {

      if (key == "null")
        continue;

      var currentMove = movedUsers[key];

      if (currentMove["uid"] == user["uid"])
        currentUser = user;
      else
        currentUser = userList[currentMove["uid"]];
	  //if (rooms[currentUser["room"]] == null)
      //  continue;
     if(rooms)
      	var oldRoomExists = (rooms[currentUser["room"]] != null) ? true : false;
	else
		var oldRoomExists = false;

      if (oldRoomExists) {
        var oldRoomObj = rooms[currentUser["room"]]["object"];

        oldRoomObj.removeUser (currentUser["uid"]);
      }

      oldroom = currentUser["room"];
      currentUser["room"] = currentMove["room"];

      var newRoomExists = (rooms[currentUser["room"]] != null) ? true : false;

      if (newRoomExists) {
        var newRoomObj = rooms[currentUser["room"]]["object"];
        newRoomObj.addUser (currentUser, userList);
      }

      if (currentUser["uid"] == user["uid"]) {
        if (roomCombo)
          setSelectOptionByValue (roomCombo, currentUser["room"]);

        if (oldRoomExists)
		{
          oldRoomObj.collapse ();
		 }

        if (newRoomExists)
          newRoomObj.expand ();

        playSound ("LeaveRoom");
        playSound ("EnterRoom");
      }
      if (currentUser["room"] == user["room"]) {
        if (currentUser["uid"] == user["uid"])
          var textMessage = languageStringFormat (lang["selfenterroom"], {"room": rooms[currentUser["room"]]["name"], "time": messageTime});
        else
          var textMessage = languageStringFormat (lang["enterroom"], {"user": currentUser["login"], "room": rooms[currentUser["room"]]["name"], "time": messageTime});

        hasToScroll |= appendMessage (textMessage,new RGBColor(skinOptsValues["enterRoomNotify"]).toHex());
      }
      if (oldroom == user["room"]){
	    var textMessage = languageStringFormat (lang["leaveroom"], {"user": currentUser["login"], "room": rooms[oldroom]["name"], "time": messageTime});
		hasToScroll |= appendMessage (textMessage,new RGBColor(skinOptsValues["enterRoomNotify"]).toHex());
      }
    } /* end for */
  } /* end if */

  if (newUsers.length > 0) {
    var roomCombo = document.getElementById ("roomSelect");

    for (key in newUsers) {
      if (key == "null")
        continue;

      var currentUser = newUsers[key];

      if (user["uid"] == currentUser["uid"]) {
        user["room"] = currentUser["room"];
        currentUser = user;
        setSelectOptionByValue (roomCombo, user["room"]);
      }

      userList[currentUser["uid"]] = currentUser;

      userRoomExists = (rooms[currentUser["room"]] != null) ? true : false;

      if (userRoomExists) {
        var roomObj = rooms[currentUser["room"]]["object"];
        if (roomObj != null)
          roomObj.addUser (currentUser, userList);
      }

      if (currentUser["uid"] == user["uid"]) {
        roomObj.expand ();
        playSound ("EnterRoom");
      }
      else{
	    if (config["userListAutoExpand"]==true)
	    	roomObj.expand ();
        playSound ("OtherUserEnters");
      }

      if (((currentUser["room"] == user["room"]) && (! hasLoginMessage)) || (currentUser["uid"] == user["uid"])) {

        var textMessage = null;

        if (currentUser["uid"] == user["uid"])
          textMessage = languageStringFormat (lang["selfenterroom"], {"room": rooms[currentUser["room"]]["name"], "time": messageTime});
        else
          textMessage = languageStringFormat (lang["enterroom"], {"user": currentUser["login"], "room": rooms[currentUser["room"]]["name"], "time": messageTime});

        hasToScroll |= appendMessage (textMessage,new RGBColor(skinOptsValues["enterRoomNotify"]).toHex());
      }
    } /* end for newUsersList */
  } /* end if (hasNewUsers) */

  if (newUsersColors.length > 0) {
    for (key in newUsersColors) {

      if (key == "null")
        continue;
      if (userList[newUsersColors[key]["uid"]] == null)
       	continue;


      var currentColor = newUsersColors[key];

      if (currentColor["uid"] == user["uid"]) {
        currentUser = user;

        var colorChangeButton = document.getElementById ("colorBtn");
        if (colorChangeButton != null)
          colorChangeButton.style["backgroundColor"] = "#" + currentColor["color"];

      	//currentUser["color"] = currentColor["color"];

      	applyMyTextColor();
      }
      else
        currentUser = userList[currentColor["uid"]];

      currentUser["color"] = currentColor["color"];

      var room = rooms[currentUser["room"]];
      if (room != null) {
        var roomObj = room["object"];
        roomObj.changeUserColor (currentUser["uid"], currentUser["color"]);
      }
    } /* end for newColors */
  } /* end newColors */

  if (newUsersStates.length > 0) {
    for (key in newUsersStates) {

      if (key == "null")
        continue;
      if (userList[newUsersStates[key]["uid"]] == null)
       	continue;

      var currentState = newUsersStates[key];

      if (currentState["uid"] == user["uid"])
        currentUser = user;
      else
        currentUser = userList[currentState["uid"]];

      currentUser["state"] = currentState["state"];

      var room = rooms[currentUser["room"]];
      if (room != null) {
        var roomObj = room["object"];
        roomObj.setUserStatus (currentUser["uid"], currentUser["state"]);
      }

      var statusSelect = document.getElementById ("statusSelect");
      if (statusSelect != null && currentState["uid"]==user["uid"])
        setSelectOptionByValue (statusSelect, currentUser["state"]);

    } /* end for newStates */
  } /* end newStates */


  if (newMessages.length > 0) {
    for (key in newMessages) {

      if (key == "null")
        continue;
      var currentMessage = newMessages[key];

      currentMessage["text"] = doSmileyReplacement (currentMessage["text"], config["smiles"]);

      var isPublicMessage = false;
      var isPrivateMessage = false;

      if (currentMessage["room"] != null)
        isPublicMessage = (currentMessage["room"].toString ().length > 0) ? true : false;

      if (currentMessage["priv"] != null)
        isPrivateMessage = (currentMessage["priv"].toString ().length > 0) ? true : false;

      if (! (isPublicMessage || isPrivateMessage))
         if (currentMessage["user"] != user["uid"])
           isPrivateMessage = true;
         else
           isPublicMessage = true;


      var avatarImg="";
      if (userList[currentMessage["user"]])
      	if (userList[currentMessage["user"]]["mc_avatar"])
      		avatarImg = doSmileyReplacement(userList[currentMessage["user"]]["mc_avatar"], config["smiles"]);


      var messageUser = userList[currentMessage["user"]];

	  if (messageUser == undefined)
      	continue;



      if (messageUser["login"] == null)
      	continue;

      var withBRText = currentMessage["text"].replace (/\n/g, "<br />\n... ");

	  //alert(withBRText);

      if (isPublicMessage || (!isPrivateMessage && !isPublicMessage)) {
        /* we have a public message */
        if (! currentMessage["urgent"])
          var textMessage = languageStringFormat (config["labelFormat"], {"user": messageUser["login"], "time": messageTime}) + withBRText;
        else
          var textMessage = messageUser["login"] + " " + withBRText;

        hasToScroll |= appendMessage (avatarImg + textMessage, messageUser["color"]);
        if (currentMessage["user"] != user["uid"])
          playSound ("ReceiveMessage");
      }
      else {
        /* we have a private message */

        if (messageUser["uid"] == user["uid"])
          var sentToUser = currentMessage["priv"];
        else
          var sentToUser = currentMessage["user"];

        var textMessage = languageStringFormat (config["labelFormat"], {"user": messageUser["login"], "time": messageTime}) + withBRText;

        appendPrivateMessage (sentToUser, avatarImg + textMessage, messageUser["color"]);
		if (messageUser["uid"] != user["uid"])
          playSound ("PrivateMessageReceived");
      } /* end if room == null */
    }
  }

  if (newInvitations.length > 0) {
    for (key in newInvitations) {
      if (key == "null")
        continue;

      var currentInvit = newInvitations[key];

      if (rooms[currentInvit["room"]]==null)
      	continue;

      var layoutDiv = document.getElementById ("layoutDiv");

      var invCfrmWin = createConfirmWindow ("invite", {"user": userList[currentInvit["user"]], "room": rooms[currentInvit["room"]], "textMessage": currentInvit["text"]});

      if (invCfrmWin == null)
        continue;

      invCfrmWin.setCloseHandler (simple_closeHandler);
      invCfrmWin.setFormHandler (general_windowOKHandler);
      invCfrmWin.appendToParent (layoutDiv);
      setInterfaceFont();
	  applyColorChanges();
      playSound ("InvitationReceived");
    }
  } /* end hasInvitations */

  if (newInvConfirm.length > 0) {
    for (key in newInvConfirm) {
      if (key == "null")
        continue;

      var currentCfrm = newInvConfirm[key];

      var layoutDiv = document.getElementById ("layoutDiv");

      var informWin = createInformWindow ("invitation", {"user": userList[currentCfrm["user"]], "room": rooms[currentCfrm["room"]], "textMessage": currentCfrm["text"], "accepted": currentCfrm["accepted"]});

      if (informWin == null)
        continue;

      informWin.setCloseHandler (simple_closeHandler);
      informWin.setFormHandler (inform_windowOKHandler);
      informWin.appendToParent (layoutDiv);
	  setInterfaceFont();
      applyColorChanges();

    }
  } /* end newInvConfirm */

  if (newFSRq.length > 0) {
    for (key in newFSRq) {
      if (key == "null")
        continue;

      var currentRq = newFSRq[key];

      var stringTokens = stringSplit ("!#@#!", currentRq["text"]);

      var textString = stringTokens[0];

      var layoutDiv = document.getElementById ("layoutDiv");

      var fsCfrmWin = createConfirmWindow ("fileshare", {"user": userList[currentRq["user"]], "text": textString, "fileUrl": stringTokens[1]});

      if (fsCfrmWin == null)
        continue;

      fsCfrmWin.setCloseHandler (simple_closeHandler);
      fsCfrmWin.setFormHandler (general_windowOKHandler);
      fsCfrmWin.appendToParent (layoutDiv);
      setInterfaceFont();
      applyColorChanges();
    }

  } /* end FS Rq */

  if (newFSCfrm.length > 0) {
    for (key in newFSCfrm) {
      if (key == "null")
        continue;

      var currentCfrm = newFSCfrm[key];

      var layoutDiv = document.getElementById ("layoutDiv");

      var accepted = currentCfrm["text"].match ("flsh_a") ? true : false;

      var informWin = createInformWindow ("fileshare", {"user": userList[currentCfrm["user"]], "accepted": accepted});

      if (informWin == null)
        continue;

      informWin.setCloseHandler (simple_closeHandler);
      informWin.setFormHandler (inform_windowOKHandler);
      informWin.appendToParent (layoutDiv);
      setInterfaceFont();
    }
  } /* end FS Cfrm */

  if (newGags.length > 0){
	for (key in newGags) {
      if (key == "null")
        continue;
      var gag = newGags[key];
      var layoutDiv = document.getElementById ("layoutDiv");
      var duration = parseInt(gag["duration"]);
      var fromuid = gag["fromuid"];

      config["gag"]=true;
      config["gag-timeout-id"] = setTimeout("config[\"gag\"]=false;",60000*duration);


      if(config["showConfirmation"]){
      	data = formatFSConfirm (user, fromuid, "gag,"+duration);
      	clearTimeout (timeOutId);
  	  	enqueueMessage (data, sendQueue);
  	  	timeOutId = setTimeout ("chatLoop ()", 1);
  	  }
      var informWin = createInformWindow ("gag", {"duration": duration});
      if (informWin == null)
        continue;
      informWin.setCloseHandler (simple_closeHandler);
      informWin.setFormHandler (inform_windowOKHandler);
      informWin.appendToParent (layoutDiv);
      setInterfaceFont();
    }
  }

  if (newUnGags.length > 0){
	for (key in newUnGags)
	if (config["gag"]==true){
	  config["gag"]=false;
	  clearTimeout(config["gag-timeout-id"]);
      if (key == "null")
        continue;
      var ungag = newUnGags[key];
      var layoutDiv = document.getElementById ("layoutDiv");
      var username = userList[ungag["uid"]];

      var informWin = createInformWindow ("ungagged", {"user": username});
      if (informWin == null)
        continue;
      informWin.setCloseHandler (simple_closeHandler);
      informWin.setFormHandler (inform_windowOKHandler);
      informWin.appendToParent (layoutDiv);
      setInterfaceFont();

    }
  }

   if (newGagCfrm.length > 0) {
    for (key in newGagCfrm) {
      if (key == "null")
        continue;
      var currentCfrm = newGagCfrm[key];
      var layoutDiv = document.getElementById ("layoutDiv");
      var minutes = currentCfrm["minutes"];
      var username = userList[currentCfrm["user"]];
      var informWin = createInformWindow ("gagconfirm", {"user": username, "minutes": minutes});
      if (informWin == null)
        continue;
      informWin.setCloseHandler (simple_closeHandler);
      informWin.setFormHandler (inform_windowOKHandler);
      informWin.appendToParent (layoutDiv);
      setInterfaceFont();
    }
  }

  if (newAlertCfrm.length > 0) {
    for (key in newAlertCfrm) {
      if (key == "null")
        continue;
      var currentCfrm = newAlertCfrm[key];
      var layoutDiv = document.getElementById ("layoutDiv");
      var username = userList[currentCfrm["user"]];
      var informWin = createInformWindow ("alertconfirm", {"user": username});
      if (informWin == null)
        continue;
      informWin.setCloseHandler (simple_closeHandler);
      informWin.setFormHandler (inform_windowOKHandler);
      informWin.appendToParent (layoutDiv);
      setInterfaceFont();
    }
  }


  if (newIgnCfrm.length > 0) {
    for (key in newIgnCfrm) {
      if (key == "null")
        continue;

      var currentCfrm = newIgnCfrm[key];

      var layoutDiv = document.getElementById ("layoutDiv");

      var informWin = createInformWindow ("ignored", {"user": userList[currentCfrm["user"]], "ignored": currentCfrm["ignored"], "textMessage": currentCfrm["text"]});

      if (informWin == null)
        continue;

      informWin.setCloseHandler (simple_closeHandler);
      informWin.setFormHandler (inform_windowOKHandler);
      informWin.appendToParent (layoutDiv);
      setInterfaceFont();
    }
  }

  if (newBackMsg.length > 0) {
    for (key in newBackMsg) {
      if (key == "null")
        continue;

      var currentBM = newBackMsg[key];

      var textMessage = "/" + (currentBM["backtime"] == true ? "backtime" : "back") + " " + currentBM["param"];

      hasToScroll |= appendMessage (textMessage, null);
    }
  } /* end hasBackMsg */

  if (newMesgB.length > 0) {
    for (key in newMesgB) {
      if (key == "null")
        continue;

      var currentMB = newMesgB[key];

      currentMB["text"] = doSmileyReplacement (currentMB["text"], config["smiles"]);
      var withBRText = currentMB["text"].replace (/\n/g, "<br />\n... ");

      var textMessage = languageStringFormat (config["labelFormat"], {"user": currentMB["login"], "time": messageTime}) + withBRText;

      var userPresentKey = findStrInArrayByKey (currentMB["login"], userList, "login");
      if (userPresentKey != null)
        var userPresent = userList[userPresentKey];

      if (userPresent != null)
        var userColor = userPresent["color"];
      else
        var userColor = null;

      hasToScroll |= appendMessage (textMessage, userColor);
    }
  }

  if (newAlrts.length > 0) {
    var layoutDiv = document.getElementById ("layoutDiv");

    for (key in newAlrts) {
      if (key == "null")
        continue;

      var currentAlrt = newAlrts[key];

      var alertWin = createAlertWindow (currentAlrt["text"]);

      if (alertWin == null)
        continue;

      alertWin.setCloseHandler (simple_closeHandler);
      alertWin.setFormHandler (inform_windowOKHandler);
      alertWin.appendToParent (layoutDiv);
	  setInterfaceFont();
    }
  }

  if (newPictures.length > 0) {
	  for (key in newPictures) {
      	if (key == "null")
        	continue;
        if (userList[newPictures[key]["uid"]] == null)
       		continue;
        var uid = newPictures[key]["uid"];
        var picture = newPictures[key]["picture"];
		userList[uid]["picture"]=picture;
		if (document.getElementById("userpwMessages" + uid)){
			if(document.getElementById("userImg" + uid)){
				if (userList[uid]["picture"]){
					document.getElementById("userImg" + uid).src = "." + userList[uid]["picture"];
					document.getElementById("userImg" + uid).style["height"] = "";
					document.getElementById("userImg" + uid).style["width"] = "";
					document.getElementById("userImg" + uid).style["display"]="none";
				}else{
					document.getElementById("userImg" + uid).src = "imgs/blank.gif" + "?" + Math.random();
					document.getElementById("userImg" + uid).style["height"] = 0  + "px";
					document.getElementById("userImg" + uid).style["width"] = 0 + "px";
					document.getElementById("userImg" + uid).style["display"]="none";
				}
				document.getElementById("userImg" + uid).onload = function() { setTimeout("resizePrivateWindow(" + uid + ");",500);};
			}
		}
	  }
  }
  if (newMcAvatars.length > 0) {
	  for (key in newMcAvatars) {
      	if (key == "null")
        	continue;
        var uid = newMcAvatars[key]["uid"];
        var mc_avatar = newMcAvatars[key]["mc_avatar"];
        if (!userList[uid])
        	continue;
        userList[uid]["mc_avatar"]=mc_avatar;
    }
  }

  if (newRlAvatars.length > 0) {
	  for (key in newRlAvatars) {
      	if (key == "null")
        	continue;
        var uid = newRlAvatars[key]["uid"];
        var rl_avatar = newRlAvatars[key]["rl_avatar"];

        if (!userList[uid])
        	continue;

        userList[uid]["rl_avatar"]=rl_avatar;
        if(document.getElementById("useravatar" + uid))
			if (userList[uid]["rl_avatar"])
				document.getElementById("useravatar" + uid).src = doSmileyImage(userList[uid]["rl_avatar"], config["smiles"]);
			else
				document.getElementById("useravatar" + uid).src = "themes/" + config["theme"]["name"] + "/images/ball.gif";
    }
  }

  if (newErrors.length > 0) {
    var layoutDiv = document.getElementById ("layoutDiv");

    for (key in newErrors) {
      if (key == "null")
        continue;

      var currentErr = newErrors[key];

      switch (currentErr) {
        case "locked":
        case "banned":
          var errorText = getLanguageString ("lang", currentErr, config["currentLanguage"], null);
          break;

        default:
          var errorText = currentErr;
      }

      var errorWin = createAlertWindow (errorText);
      if (errorWin == null)
        continue;

      errorWin.setCloseHandler (simple_closeHandler);
      errorWin.setFormHandler (inform_windowOKHandler);
      errorWin.appendToParent (layoutDiv);
	  setInterfaceFont();
    }
  }

  if (newLogout.length > 0) {
    var message = newLogout.pop ();

    doLogout (message);
  }

  /* Do the actual messages scoll */
  if (hasToScroll){
	chatMessages=document.getElementById ("chatMessages");
    chatMessages.scrollTop = chatMessages.scrollHeight;

    var sHeight = chatMessages.scrollHeight;
    var sTop = chatMessages.scrollTop;
    var cHeight = chatMessages.clientHeight;
    config["messageDiv"]["sHeightBefore"] = sHeight;
    config["messageDiv"]["sTopBefore"] = sTop;
    config["messageDiv"]["cHeightBefore"] = cHeight;
  }

  /* get out chatLoop back, properly */
  processingInProgress = false;

  if (newLogout.length > 0) {
    var message = newLogout.pop ();

    doLogout (message);
  }

  if (childNodes.length>1)
  	applyColorChanges();

	//if(document.getElementById ("userTextInput"))
		//document.getElementById ("userTextInput").focus();

} /* end function xmlDecoder */
