var IsChat=0;
var hChatTimer=null;
var hOnlineTimer=null;
var chatAction="";
var chatAParams="";
var chatAIsCritical=0;
var chatLastID=0;
var chatOlCnt=10;
var chatTimeOut=3000;
var chatTimeMin=1000;
var chatDisabled=0;
var chatBattleMode=0;
var chatIsUpdating=0;

function chatcomm(AID, AData) {
   if (AID=="chatmsgs") {
      UpdateChat(AData);
   }
   else if (AID=="chatcmd") { chatCmd(AData); }
   else {
      var xEl=document.getElementById(AID);
      if (xEl!=null) { xEl.innerHTML = AData; }
   }
}

function chatSetBattleMode(AMode) {
   chatBattleMode=AMode;
   if (AMode==1) {
      chatResetTimeout();
      chatReInit();
   }
}

function chatResetTimeout() {
   return;
   if (httpChain.length>5) {
      if (chatTimeMin==1000) {  chatTimeMin=chatTimeMin + 1000; } else {  chatTimeMin=chatTimeMin + 500; }
      chatTimeOut=chatTimeMin;
   } else {
      chatTimeOut=1000;
      chatTimeMin=1000;
   }
}

function chatSetAction(AAction, AParams, AIsCritical) {
   chatAction=AAction;
   chatAParams=AParams;
   if (!AIsCritical) { chatAIsCritical=0; }
   else { chatAIsCritical=AIsCritical; }
}

function chatRefresh() {
   if (hChatTimer!=null) { clearTimeout(hChatTimer); }
   hChatTimer=setTimeout("chatRefresh()", httpMidTime);
   chatTimeout=httpMidTime;
   if (httpStopped==1) { return; }
   if (httpRq==0) {
      if (chatIsUpdating==0) {
         var params = new Array ();
         params[0] = "ctrlid=chatmsgs";
         params[1] = "lastid=" + chatLastID;
         params[2] = "rooms=" + chatRoomIDs;
         var xAction="chat";
         var xIsCritical=0;
         if (chatOlCnt>=10) {
            chatOlCnt=0;
            xAction="chatonline";
         } else if (chatAction!="") {
            xAction=chatAction;
            params[3]="aparams=" + chatAParams;
            xIsCritical=chatAIsCritical;
         }
         if (chatIsUpdating==0) {
            sndPostReq (xAction, params.join("&"), xIsCritical);
            chatOlCnt++;
         }
      }
   } else {
      httpRq=0;
   }
}

function chatInit() {
   if (chatDisabled==1) { return; }
   var xEl=document.getElementById("chat");
   xEl.style.display="block";
   hChatTimer=setTimeout("chatRefresh()", chatTimeOut);
   IsChat=1;
   chatOlCnt=10;
}

function chatClose() {
   if (hChatTimer!=null) {
       clearTimeout(hChatTimer);
       //clearInterval(hChatTimer);
       hChatTimer=null;
   }
   IsChat=0;
   var xEl=document.getElementById("chat");
   xEl.style.display="none";
}

function chatReInit() {
   chatTimeOut=httpMidTime;
   return;
   if (chatDisabled==1) { return; }
   if (hChatTimer!=null) { clearInterval(hChatTimer); }
   hChatTimer=setInterval("chatRefresh()", chatTimeOut);
}

function chatSetExclusive(ACmd) {
   if (ACmd!="") {
      var xCmds=ACmd.split(" ");
      if (xCmds[1]!=null) {
         var xCmdsS=new String(xCmds[1]);
         var xVars=xCmdsS.split("=");
         if (xVars[0]!=null) {
            if (xVars[0]=="chatTimeout") {
               chatTimeOut=eval(xVars[1]);
               if (chatTimeOut<1000) { chatTimeOut=1000; }
               chatReInit();
            }
            else if (xVars[0]=="showTimeout") { alert(httpInterval + " : " + httpMidTime); }
            else if (xVars[0]=="showAction") { alert("Action: " + chatAction + ", Params: " + chatAParams); }
            else if (xVars[0]=="showRooms") { var xData=""; for (var xi=0; xi<chatRooms.length; xi++) { xData=xData + chatRooms[xi] + "\n"; } alert(xData); }
            else if (xVars[0]=="location") { gamefrm.window.location=xVars[1]; }
            else if (xVars[0]=="inline") { sndPostReq("uex2", "ctrlid=chatmsgs&cmd=" + xVars[1], 0); }
         }
      }
   }
}

function chatCloseTab(AID) {
   var xEl=document.getElementById("chatmsg");
   xEl.value="/q:" + AID;
   chatAdd();
   return false;
}

function chatMakeRoom(AID) {
   var xEl=document.getElementById("chatmsg");
   xEl.value="/j:" + AID;
   chatAdd();
   return false;
}

var caCnt=0;
var cbCnt=0;
var StopTran=0;

function chatAdd() {
   var xEl=document.getElementById("chatmsg");
   var xCmd=xEl.value;
   if (xCmd!="") {
      if (xCmd=="/?") { xEl.value=""; chatHelp(); return false; }
      if (xCmd.indexOf("/set ")==0) { xEl.value=""; chatSetExclusive(xCmd); return false; }
      var params = new Array ();
      params[0] = "ctrlid=chatcmd";
      params[1] = "data=" + Encode(xCmd);
      params[2] = "roomid=" + Encode(chatCurRoom);
      params[3] = "lastid=" + chatLastID;
      sndPostReq ("chatadd", params.join("&"), 0);
      xEl.value="";
   }
   return false;
}

function chatCmd(AData) {
   // alert(chatLastID + " : " + AData);
   if (AData!="") {
      var xDatas=null;
      if (AData.indexOf("JOIN:")>=0) {
         xDatas=AData.split(":");
         chatOpenRoom(xDatas[1], xDatas[2], true);
      } else if (AData.indexOf("QUIT:")>=0) {
         xDatas=AData.split(":");
         chatCloseRoom(xDatas[1]);
      } else if (AData!="OK") {
         UpdateChat("0%LASTID!r_0!" + AData);
      }
   }
}

function chatHelp() {
   var xData="0%LASTID!r_0!<span class=\"chatusr\">КОМАНДЫ ЧАТА</span><br />";
   xData=xData + "<span class=\"chatusr\">/?</span> - Вызов этой справки<br />";
   xData=xData + "<span class=\"chatusr\">/join:#ИмяКомнаты</span> - Вход в комнату.<br />";
   xData=xData + "<span class=\"chatusr\">/quit:#ИмяКомнаты</span> - Выход из комнаты.<br />";
   xData=xData + "<span class=\"chatusr\">/to:ИмяГероя</span> - Сообщение в общем чате, адресованное герою.<br />";
   xData=xData + "<span class=\"chatusr\">/p:ИмяГероя ТестСообщения</span> - Приватное сообщение герою.<br />";
   xData=xData + "<span class=\"chatusr\">/me:</span> - Выражение эмоции или действие.<br />";
   xData=xData + "<span class=\"chatusr\">Команды специальные:</span><br />";
   xData=xData + "<span class=\"chatusr\">/set inline=exit</span> - Выход из зависшего боя.<br />";
   xData=xData + "<span class=\"chatusr\">/set location=changeprof.php</span> - Выбор или смена профессии.<br />";
   xData=xData + "<span class=\"chatusr\">Команды, доступные модераторам:</span><br />";
   xData=xData + "<span class=\"chatusr\">/ban:ИмяГероя</span> - Молчанка на 1 минуту.<br />";
   xData=xData + "<span class=\"chatusr\">/ban:ИмяГероя,Время,Причина</span> - Молчанка на Время минут.<br />";
   UpdateChat(xData);
   return false;
}

function chatPutCmd(ACmdCode, ACmd) {
   var xEl=document.getElementById("chatmsg");
   if ((ACmd.indexOf("/to:")>=0) && (xEl.value==ACmd + " ") && (heroSID) && ((heroSID & 2)!=0)) {
      var xS=ACmd.substr(4);
      xEl.value="/ban:" + xS + ",1,Причина";
      xEl.style.backgroundColor="#FFAA99";
   } else {
      xEl.value=ACmd + " ";
      xEl.style.backgroundColor="#DDC9A4";
   }
   return false;
}

function chatSetBounds(AHeight) {
   var xEl=document.getElementById("chatmsgs");
   xEl.style.height=(AHeight - 40) + "px";
   var xEl=document.getElementById("chatonline");
   xEl.style.height=(AHeight - 16) + "px";
   var xEl=document.getElementById("chatrooms");
   xEl.style.height=(AHeight - 12)+ "px";
}

var chatCurRoom="r_0";
var chatRoomIDs="0";
var chatPvtIDs="";
var chatBuffers=new Array();
chatBuffers["r_0"]=new String();
chatBuffers["battlelog"]=new String();
var chatRooms=new Array("r_0", "Главная", "battlelog", "Бой");
var chatRNew=new Array();

function chatUpdateRooms() {
   var xEl=document.getElementById("chatrooms");
   if (xEl!=null) {
      var xData="<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">";
      var xCnt=0;
      var xID="";
      var xColor="";
      var xRoomCls="chatroom";
      for (var xi=0; xi<chatRooms.length; xi++) {
         if (xCnt==0) {
            xID=chatRooms[xi];
            if (xID==chatCurRoom) { xRoomCls="chatrooma"; } else { xRoomCls="chatroom"; }
         } else {
           if (chatRNew[xID]==1) { xColor=" style=\"color: #F80000;\""; } else { xColor=" style=\"color: #000000;\""; }
           xData=xData + "<tr><td id=\"" + xID + "\" class=\"" + xRoomCls + "\" onclick=\"chatSetRoom('" + xID + "');\"" + xColor + ">";
           if ((xID!="r_0") && (xID!="battlelog")) {
              xData=xData + "<a href=\"#\" onclick=\"return chatCloseTab('" + chatRooms[xi] + "');\"><img src=\""+StylesDir+"cls.gif\" width=\"7\" height=\"7\" alt=\"\" border=\"0\" align=\"right\" /></a>";
           }
           xData=xData + chatRooms[xi] + "</td></tr>";
         }
         xCnt++;
         if (xCnt>=2) { xCnt=0; }
      }
      xData=xData + "</table>";
      xEl.innerHTML=xData;
   }
}

function chatSetRoom(ARoom) {
   var xEl=document.getElementById("chatmsgs");
   if ((chatBuffers[ARoom]!=null) && (chatBuffers[ARoom]!=undefined)) {
      xEl.innerHTML=chatBuffers[ARoom];
      xEl.scrollTop=xEl.scrollHeight;
      xEl.scrollTop=xEl.scrollHeight;
      xEl=document.getElementById(chatCurRoom);
      if (xEl!=null) { xEl.className="chatroom"; xEl.style.color="#000000"; }
      xEl=document.getElementById(ARoom);
      if (xEl!=null) { xEl.className="chatrooma"; xEl.style.color="#F80000"; }
      chatRNew[ARoom]=0;
      chatCurRoom=ARoom;
   }
}

function chatOpenRoom(ARoom, AName, AFlag) {
   //var yEl=document.getElementById("chatmsgs");
   //yEl.innerHTML=yEl.innerHTML + "OpenRoom: " + ARoom + "<br />";

   var xIDs=", " + chatRoomIDs + ", ";
   var yIDs=", " + chatPvtIDs + ", ";
   var xRoom="";
   var xPvt=1;
   if (ARoom.indexOf("r_")==0) {
      xRoom=ARoom.replace(/r_/g, "");
      xPvt=0;
      if (AName=="") { AName="#" + xRoom; } else { AName="#" + AName; }
   } else if (ARoom.indexOf("p_")==0) {
      xRoom=ARoom.replace(/p_/g, "");
      if (AName=="") { AName=xRoom; }
   }
   if ((xRoom!="") && (xIDs.indexOf(", " + xRoom + ", ")<0) && (yIDs.indexOf(", " + xRoom + ", ")<0)) {
      if ((chatBuffers[ARoom]!=null) && (chatBuffers[ARoom]!=undefined)) { delete chatBuffers[ARoom]; }
      chatBuffers[ARoom]=new String();
      if ((xPvt==0) && (xIDs.indexOf(", " + xRoom + ", ")<0)) {
         if (chatRoomIDs!="") { chatRoomIDs=chatRoomIDs + ", "; }
         chatRoomIDs=chatRoomIDs + xRoom;
      } else if (yIDs.indexOf(", " + xRoom + ", ")<0) {
         if (chatPvtIDs!="") { chatPvtIDs=chatPvtIDs + ", "; }
         chatPvtIDs=chatPvtIDs + xRoom;
      }
      chatRooms[chatRooms.length]=ARoom;
      chatRooms[chatRooms.length]=AName;
      if (AFlag) {
         chatCurRoom=ARoom;
         var xEl=document.getElementById("chatmsgs");
         xEl.innerHTML="";
      }
      chatUpdateRooms();
   }
   return false;
}

function chatCloseRoom(AName) {
   if (AName!="") {
      var xCnt=0;
      var xID="2";
      var yID="";
      var xIndex=-1;
      var xRoomIDs="";
      var yRoomIDs="";
      var xEl=null;
      for (var xi=0; xi<chatRooms.length; xi++) {
         if (xCnt==0) {
            if (xIndex<0) { xID=chatRooms[xi]; }
            yID=chatRooms[xi];
         } else if (chatRooms[xi]==AName) {
            xIndex=xi-1;
         } else {
            if (yID.indexOf("r_")==0) {
               if (xRoomIDs!="") { xRoomIDs=xRoomIDs + ", "; }
               xRoomIDs=xRoomIDs + yID.replace(/r_/g, "");
            } else if (yID.indexOf("p_")==0) {
               if (yRoomIDs!="") { yRoomIDs=yRoomIDs + ", "; }
               yRoomIDs=yRoomIDs + yID.replace(/p_/g, "");
            }
         }
         xCnt++;
         if (xCnt>=2) { xCnt=0; }
      }
      chatRoomIDs=xRoomIDs;
      chatPvtIDs=yRoomIDs;
      if (xIndex>=0) {
         chatRooms.splice(xIndex, 2);
         if ((chatBuffers[xID]!=null) && (chatBuffers[xID]!=undefined)) { delete chatBuffers[xID]; }
         chatBuffers[xID]=null;
         if (chatCurRoom==xID) {
            chatCurRoom="r_0";
            xEl=document.getElementById("chatmsgs");
            xEl.innerHTML=chatBuffers["r_0"];
            xEl.scrollTop =xEl.scrollHeight;
            xEl.scrollTop =xEl.scrollHeight;
         }
         chatUpdateRooms();
      }
   }
}

function UpdateChat(AData) {
   var xEl=null;
   if (chatIsUpdating!=0) {
      xEl=document.getElementById("chatmsgs");
      xEl.innerHTML=xEl.innerHTML + "SYNC ERROR " + chatLastID + ", " + chatTimeOut + "<br />";
      return;
   }
   chatIsUpdating=1;
   xEl=document.getElementById("chatmsgs");
   if ((xEl!=null) && (AData!="")) {
      var yEl=null;
      var xDatas=AData.split("%LASTID!");
      var xMsgs=null;
      var xStr="";
      var xStrs=null;
      var xLastID=chatLastID;
      if (xDatas.length<=1) { xDatas[0]=0; }
      if (eval(xDatas[0])!=0) { chatLastID=xDatas[0]; chatResetTimeout(); chatReInit(); }
      else { if ((chatTimeOut<3000) && (chatBattleMode!=1)) { chatTimeOut=chatTimeOut + 250; chatReInit(); } }
      var xData=new String(xDatas[1]);
      if ((xData!="") && (xData!="undefined")) {
         xMsgs=xData.split("!");
         var xCnt=0;
         var xID=0;
         var xMsg="";
         var xMsgID=0;
         var xIndex=0;
         for (var xi=0; xi<xMsgs.length; xi++) {
            if (xCnt==0) {
               xStr=xMsgs[xi];
               if (xStr.indexOf(":")>=0) {
                  xStrs=xStr.split(":");
                  xID=xStrs[0];
                  xMsgID=eval(xStrs[1]);
               } else {
                  xID=xStr;
                  xMsgID=0;
               }
               if ((xID=="sysmsg") && (xMsgs[xi+1]!=null) && (xMsgs[xi+1]!=undefined)) {
                  xMsg=xMsgs[xi+1];
                  xMsg=xMsg.replace(/#21;/g, "!");
                  HideMsgWnd(0);
                  alert1(xMsg);
               } else {
                  if (chatBuffers[xID]==null) {
                     chatOpenRoom(xID, "", false);
                  }
               }
            } else {
               xMsg=xMsgs[xi];
               if ((xMsg!="") && ((xMsgID==0) || (xMsgID>xLastID))) {
                  xMsg=xMsg.replace(/#21;/g, "!");
                  if ((xMsg!="") && (xMsg.indexOf(" &gt; ")>0) && (xMsg.indexOf(heroName + "</b></a>:")>0)) {
                     xMsg="<div style=\"background-color: #E9D9BB\">" + xMsg + "</div>";
                  }
                  xStr=chatBuffers[xID] + xMsg;
                  delete chatBuffers[xID];
                  if (xStr.length>32768) { xIndex=xStr.indexOf("<br />"); if (xIndex<0) { xIndex=0; } } else { xIndex=0; }
                  if (xIndex==0) {
                     chatBuffers[xID]=new String(xStr);
                  } else {
                     chatBuffers[xID]=new String(xStr.substring(xIndex + 6));
                  }
                  chatRNew[xID]=1;
                  if (chatCurRoom==xID) {
                     xEl.innerHTML=chatBuffers[xID];
                     //xEl.innerHTML=xEl.innerHTML + xMsg;
                     xEl.scrollTop=xEl.scrollHeight;
                  } else {
                     yEl=document.getElementById(xID);
                     if (yEl!=null) { yEl.style.color="#F80000"; }
                  }
               }
            }
            xCnt++;
            if (xCnt>=2) { xCnt=0; }
         }
      }
   }
   chatIsUpdating=0;
}

function UpdateBattleLog(AData) {
   chatBuffers["battlelog"]=chatBuffers["battlelog"] + AData;
   if (chatCurRoom=="battlelog") {
      var xEl=document.getElementById("chatmsgs");
      if (xEl!=null) {
         xEl.innerHTML=chatBuffers["battlelog"];
         xEl.scrollTop=xEl.scrollHeight;
      }
   }
}

function ResetBattleLog() {
   chatBuffers["battlelog"]="";
   if (chatCurRoom=="battlelog") {
      var xEl=document.getElementById("chatmsgs");
      if (xEl!=null) {
         xEl.innerHTML="";
      }
   }
}

