// Jabber chat client.
// Author Petrov A.G. aka Sq.Piglet, E-mail: piglet@freeartists.ru.
window.last_message='';
function handleIQ(aIQ){
  if(aIQ.getNode().getElementsByTagName("field")){
    var fields = aIQ.getNode().getElementsByTagName("field");
    for(var i=0;i<fields.length;i++){
      if(fields[i].getAttribute("var") == "muc#roominfo_occupants" && chat[0].countUsers != fields[i].getElementsByTagName('value')[0].childNodes[0].nodeValue){
        chat[0].countUsers = fields[i].getElementsByTagName('value')[0].childNodes[0].nodeValue;
        setChatInfo();
      }
    }
  }
  con.send(aIQ.errorReply(ERR_FEATURE_NOT_IMPLEMENTED));
}
function handleConnected(){
  document.getElementById("chat-place-chat").innerHTML = "";
  //textTranslationeInit();
  joinChat();
}
function joinChat(){
  con.send(new JSJaCPresence());
  sendPresence2Groupchats();
  sendPresenceAllMessage();
  getIQ("get","http://jabber.org/protocol/disco#info");
  setCahtOnload();
}
function handlePresence(presence){
  var presenceFrom = presence.getNode().getAttribute("from").substring(presence.getNode().getAttribute("from").indexOf("/")+1,presence.getNode().getAttribute("from").length);
  //alert(presence.xml());
  if(presence.getNode().getElementsByTagName("status")[0] && presenceFrom == user[0].nick){
    var code = presence.getNode().getElementsByTagName("status")[0].getAttribute("code");
    if(code != null){
      kickOrBan(code);
    }
    else if(presence.getNode().getElementsByTagName("status")[0].childNodes[0].nodeValue=='Replaced by new connection'){
      handleConnected();
    }
  }else if(presence.getNode().getElementsByTagName("status")[0] && presenceFrom.substring(presenceFrom.indexOf("/")+1,presenceFrom.length) != user[0].nick){
    var code = presence.getNode().getElementsByTagName("status")[0].getAttribute("code");
    if(code != null){
      kickOrBanAnotherUser(code, presenceFrom);
    }
  }
  if(presence.getNode().getElementsByTagName("error")[0]){
    var code = presence.getNode().getElementsByTagName("error")[0].getAttribute("code");
    if(code != null){
      kickOrBan(code);
    }
  }
}
function handleError(e){
  if(con.connected()) con.disconnect();
  crashJabberServer(e.getAttribute("code"));
}
function handleDisconnected(){
  chatLoginWelcome("chat-place-chat");
}
function handleIqTime(iq){
  var now = new Date();
  con.send(iq.reply([iq.buildNode('display',
                                  now.toLocaleString()),
                     iq.buildNode('utc',
                                  now.jabberDate()),
                     iq.buildNode('tz',
                                  now.toLocaleString().substring(now.toLocaleString().lastIndexOf(' ')+1))
                     ]));
  return true;
}
function handleIqVersion(iq){
  con.send(iq.reply([
                     iq.buildNode('name', 'sportBox chat'),
                     iq.buildNode('version', '1.0 beta'),
                     iq.buildNode('os', navigator.userAgent)
                     ]));
  return true;
}
/*
if(window.addEventListener) window.addEventListener("load",function(){setUserInfoInit()},false);
else if(window.attachEvent) window.attachEvent("onload",function(){setUserInfoInit()});
*/
var chat = [ // Информация о джаббер сервере.
  {
    commentators:"",
    countUsers:0,
    httpbase:"",
    domain:"",
    sendTo:""
  }
];
var user = [ // Информация о юзере.
  {
    login:"",
    password:"",
    nick:"",
    role:"user",
    viewMessageFrom:"all"
  }
];
window.ie = (document.all && navigator.userAgent.indexOf('Opera')<0)?true:false;
window.messageArhiv = "";
window.LastModified = "Sat, 1 Jan 2000 00:00:00 GMT";
var commentators = new Array();
var sportIcons = [ // Массив с иконками событей.
  {
    type:"for-all",
    icons:{"!компенсированное_время!":"for-all-compensate-time.gif","!_начало!":"for-all-beginning.gif","!_конец!":"for-all-end.gif","!нарушение_правил!":"for-all-violation.gif","!_овертайм!":"for-all-over-time.gif","!тайм_aут!":"for-all-time-out.gif","!_удаление!":"for-all-delete.gif","!первое_место!":"for-all-first.gif","!второе_место!":"for-all-second.gif","!третье_место!":"for-all-third.gif","!_травма!":"for-all-trauma.gif","!опасный_момент!":"for-all-dangerous.gif","!_статистика!":"for-all-stats.gif"}
  },
  {
    type:"basketball",
    icons:{"!баскетбол_одноочковый_бросок!":"basketball-upthrow-1.gif","!баскетбол_двухочковый_бросок!":"basketball-upthrow-2.gif","!баскетбол_трехочковый_бросок!":"basketball-upthrow-3.gif"}
  },
  {
    type:"football",
    icons:{"!футбол_гол!":"football-goal.gif","!футбол_желтая_карточка!":"football-yellow-card.gif","!футбол_пенальти!":"football-penalty.gif","!футбол_замена!":"football-replace.gif","!футбол_штанга!":"football-barbell.gif"}
  },
  {
    type:"handball",
    icons:{"!гандбол_гол!":"handball-goal.gif","!гандбол_7-метровый!":"handball-7m.gif"}
  },
  {
    type:"hockey",
    icons:{"!хоккей_забитая_шайба!":"hockey-puck.gif","!хоккей_удаление_на_две_минуты!":"hockey-delete-2.gif","!хоккей_удаление_на_четыре_минуты!":"hockey-delete-4.gif","!хоккей_удаление_на_пять_минут!":"hockey-delete-5.gif","!хоккей_удаление_на_десять_минут!":"hockey-delete-10.gif","!хоккей_замена_вратаря_на_полевого_игрока!":"hockey-replace.gif"}
  },
  {
    type:"volleyball",
    icons:{"!волейбол_очко!":"volleyball-point.gif"}
  },
  {
    type:"biathlon",
    icons:{"!биатлон_пять_промахов!":"biathlon-5-miss.gif","!биатлон_четыре_промаха!":"biathlon-4-miss.gif","!биатлон_три_промаха!":"biathlon-3-miss.gif","!биатлон_два_промаха!":"biathlon-2-miss.gif","!биатлон_однин_промах!":"biathlon-1-miss.gif","!биатлон_пять_попаданий!":"biathlon-5-hits.gif","!биатлон_дополнительный_патрон!":"biathlon-1-ammunition.gif","!биатлон_два_дополнительных_патрона!":"biathlon-2-ammunition.gif","!биатлон_три_дополнительных_патрона!":"biathlon-3-ammunition.gif","!биатлон_желтая_майка!":"biathlon-yellow-shirt.gif","!биатлон_красная_майка!":"biathlon-red-shirt.gif","!биатлон_стрельба_стоя!":"biathlon-upright.gif","!биатлон_стрельба_лежа!":"biathlon-lie.gif"}
  }
];
function setUserInfoInit(){ // Делает Ajax запрос по userId и вытаскивает регистрационные данные юзера.
  var url = "http://"+window.location.host+"/chatlogin/"+window.chatRum;
  loadXMLDoc("GET",url,processReqChange);
}
function setUserInfo(reqXML){ // Устанавливает инфу о юзере.
  if(reqXML.getElementsByTagName("user")[0]){
    var userXML = reqXML.getElementsByTagName("user")[0];
    user[0].login = userXML.getAttribute("login").replace(/@/,"%40");
    user[0].password = userXML.getAttribute("password");
    user[0].nick = userXML.getAttribute("nick");
  }else{
    chatLoginWelcome("chat-place-chat");
  }
  if(reqXML.getElementsByTagName("commentator")[0]){
    var commentatorsXML = reqXML.getElementsByTagName("commentator");
    for(var i=0;i<commentatorsXML.length;i++){
      window.commentators[i] = commentatorsXML[i].getAttribute("nick");
    }
    user[0].role = getUserRole(user[0].nick);
  }
  if(reqXML.getElementsByTagName("chatserver")[0]){
    chat[0].domain = reqXML.getElementsByTagName("chatserver")[0].getAttribute("url");
    chat[0].sendTo = window.chatRum+"@conference."+chat[0].domain;
  }
  if(document.getElementById("chat-place-text")){
      $("#chat-place-text").resizer('<span class="spb_cmp_reel_chat_chat_txta_r"></span>');
      textTranslationeInit();
  }
  if(reqXML.getElementsByTagName("user")[0] && reqXML.getElementsByTagName("chatserver")[0]){
    __init();
  }
}

function setCahtOnload(){ // Инициализирует чат.
  initHTML("chat-place-chat");
  setChatInfo();
}

function initHTML(id){ // Выводит окно чата.
  if(document.getElementById(id)){
    if(user[0].role == "user") document.getElementById(id).innerHTML += '<div id="chat-user-text-fieldset"><input type="text" name="chat-user-text" id="chat-user-text" maxlength="300" onblur="window.inputUserTextPos = saveCursorPosition(this)" onkeypress="if(event.keyCode == 13){chatOnsubmit();return false}" /><input type="submit" id="chat-submit" value="Отправить" onclick="chatOnsubmit();return false" /></div><div class="spb_cmp_reel_chat_text_show" onclick="spb_cmp_reel_chat_text_show(\'spb_cmp_reel_chat_chat_show_box\', this, \'spb_cmp_reel_chat_text_show\', \'spb_cmp_reel_chat_text_hide\')"></div><div id="spb_cmp_reel_chat_chat_show_box" class="spb_cmp_reel_chat_chat_show_box"><div id="chat-window">'+window.messageArhiv+'</div><div id="chat-info"></div></div>';
    else{
      document.getElementById(id).innerHTML += '<fieldset id="chat"><fieldset id="sport-icons">Вид спорта: <select onchange="sportIconsInit(this)"><option value="for-all">выберите вид спорта</option><option value="basketball">баскетбол</option><option value="biathlon">биатлон</option><option value="volleyball">волейбол</option><option value="handball">гандбол</option><option value="football">футбол</option><option value="hockey">хоккей</option></select><div></div></fieldset><fieldset id="chat-user-text-fieldset"><textarea type="text" name="chat-user-text" id="chat-user-text" cols="58" rows="4" maxlength="300" onkeypress="if(event.keyCode == 13){chatOnsubmit();return false}"></textarea><input type="submit" id="chat-submit" class="chat-submit-commentator" value="Отправить" onclick="chatOnsubmit();return false" /></fieldset><fieldset><div id="chat-window">'+window.messageArhiv+'</div><div id="chat-info"></div></fieldset><fieldset id="chat-user-settings"><legend>Показывать:</legend><label for="chat-commentators"><input type="checkbox" name="chat-commentators" id="chat-commentators" checked="checked" onclick="changeViewMessageFrom()" />&mdash;&nbsp;комментаторов</label>,<label for="chat-users"><input type="checkbox" name="chat-users" id="chat-users" onclick="changeViewMessageFrom()" />&mdash;&nbsp;посетителей</label>.</fieldset>';
      sportIconsInit();
      changeViewMessageFrom();
    }
    $("#chat-window").resizer('<span class="spb_cmp_reel_chat_chat_txta_r"></span>');
  }
  getCommentatorHistore();
}
function sportIconsInit(_this){
  
  var sportIconsPlace = document.getElementById("sport-icons");
  var sportType = "";
  if(_this){
    sportType = _this.value;
    sportIconsPlace.getElementsByTagName("div")[0].innerHTML = "";
  }
  for(var i=0;i<sportIcons.length;i++){
    if(sportIcons[i].type == sportType || sportIcons[i].type == "for-all"){
      for(var j in sportIcons[i].icons){
        if(j.toString() != "toJSONString"){
          var img = document.createElement("img");
          img.setAttribute("src","/d/0/jabberchat/img/icons/"+sportIcons[i].icons[j]);
          img.setAttribute("width","30");
          img.setAttribute("height","26");
          img.setAttribute("alt",j);
          img.setAttribute("title",j);
          if(window.ie){
            img.setAttribute("onclick",function(){insertEvent(this.alt);return false});
          }else{
            img.setAttribute("onclick","insertEvent(this.alt);return false");
          }
          sportIconsPlace.getElementsByTagName("div")[0].appendChild(img);
        }
      }
    }
  }
}
function insertEvent(icon){
  var textarea = document.getElementById("chat-user-text");
  if(window.ie){
    textarea.focus();
    var TR = document.selection.createRange();
    TR.text = icon;
    TR.select();
  }else{
    var scrollPos = textarea.scrollTop;
    start = textarea.selectionStart;
    end = textarea.selectionEnd;
    text = textarea.value;
    part1 = text.slice(0, start);
    part2 = text.slice(start, end);
    part3 = text.slice(end, text.length);
    textarea.value = part1+icon+part2+part3;
    textarea.focus();
    textarea.setSelectionRange((textarea.value.length - part3.length),(textarea.value.length - part3.length));
    textarea.scrollTop = scrollPos;
  }
}
function chatLoginWelcome(id){ // Приглашение залогиниться.
  if(document.getElementById(id) && user[0].login == ""){
    var tmp = document.getElementById(id).innerHTML;
    document.getElementById(id).innerHTML = '<p class="attention">Для участия в обсуждении <a href="#" onclick="document.getElementById(\'sb_cp_auth_top_auth\').style.display = \'block\'; document.getElementById(\'sb_cp_auth_top_auth_mail\').focus(); return false;">войдите на портал</a>!</p>'+tmp;
	//document.getElementById(id).innerHTML = '<p class="attention">Для участия в обсуждении <a href="#" onclick="elementVisibleSwitch(\'enterDiv\',\'visible\');document.getElementById(\'uEmail\').focus();return false;">войдите на портал</a>!</p>'+tmp;
  }
}
function setChatInfo(){ // Устанавливает инфу о чате.
  var chatInfo = document.getElementById("chat-info");
  chatInfo.innerHTML = "<strong>Человек в&nbsp;чате:</strong> "+chat[0].countUsers+".";
}
function chatOnsubmit(){ // Отправляет сообщение пользователя.
  var chat_user_text = document.getElementById("chat-user-text");
  if(chat_user_text.value.length > 0){
    var filtredUserText = filterUserText(chat_user_text.value);
    sendMsg(chat[0].sendTo,user[0].login+"@"+chat[0].domain,filtredUserText);
    chat_user_text.value = "";
  }
}

function changeViewMessageFrom(){ // Установка режима просмотра сообщений (юзеры || комментаторы).
  var chatCommentators = document.getElementById("chat-commentators").checked;
  var chatUsers = document.getElementById("chat-users").checked;
  if(chatCommentators && chatUsers){
    user[0].viewMessageFrom = "all";
  }else if(chatCommentators){
    user[0].viewMessageFrom = "commentator";
  }else if(chatUsers){
    user[0].viewMessageFrom = "user";
  }else{
    user[0].viewMessageFrom = "nobody";
  }
  viewMessageFilter();
}

function viewMessageFilter(){ // Скрывает или показывает сообщения в зависимости от режима просмотра.
  var messages = document.getElementById("chat-window").getElementsByTagName("div");
  for(var i=0;i<messages.length;i++){
    messages[i].style.display = getMessageDisplay(messages[i].className);
  }
}
function getMessageDisplay(messageClass){ // Возвращает видимость для конкретного сообщения.
  if(user[0].viewMessageFrom == "all") return "block";
  else if(user[0].viewMessageFrom == "nobody") return "none";
  else if(user[0].viewMessageFrom == "commentator"){
    if(messageClass == "commentator") return "block";
    else return "none";
  }else if(user[0].viewMessageFrom == "user"){
    if(messageClass == "user" || messageClass == "system-message") return "block";
    else return "none";
  }
}
function filterUserText(userText){ // Обрезает сообщение юзера до userTextMaxLength.
  var userTextMaxLength = 400;
  userText = htmlspecialchars(trim(userText.substring(0,userTextMaxLength)));
  return userText;
}
function htmlspecialchars(text){ // Заменяет теги на спецсимволы HTML.
  var replacements = [
    {
      html:/\</g,
      htmlSC:"&lt;"
    },
    {
      html:/\>/g,
      htmlSC:"&gt;"
    },
    {
      html:/FLV/g,
      htmlSC:"FLV"
    }
  ]
  for(var i=0;i<replacements.length;i++){
    text = text.replace(replacements[i].html,replacements[i].htmlSC);
  }
  return text;
}
function trim(string){ // Отрезает лишние пробелы.
  string = string.replace(/(^\s+)|(\s+$)/g,"");
  string = string.replace(/\s{1}/g,"&nbsp;");
  string = string.replace(/(\S)&nbsp;{1}/g,"$1 ");
  return string;
}
function smilesFilter(userText){ // Меняет текстовые смайлы на графические.
  var smiles = [
    {
      code:/:\)/g,
      text:":)",
      img:"icon1.gif"
    },
    {
      code:/:-\)/g,
      text:":-)",
      img:"icon1.gif"
    },
    {
      code:/:\(/g,
      text:":(",
      img:"icon2.gif"
    },
    {
      code:/:-\(/g,
      text:":-(",
      img:"icon2.gif"
    },
    {
      code:/;-\)/g,
      text:";-)",
      img:"icon3.gif"
    },
    {
      code:/;\)/g,
      text:";)",
      img:"icon3.gif"
    },
    {
      code:/:-D/g,
      text:":-D",
      img:"icon4.gif"
    },
    {
      code:/:-d/g,
      text:":-d",
      img:"icon4.gif"
    },
    {
      code:/:D/g,
      text:":D",
      img:"icon4.gif"
    },
    {
      code:/:-@/g,
      text:":-@",
      img:"icon5.gif"
    },
    {
      code:/:@/g,
      text:":@",
      img:"icon5.gif"
    }
  ];
  for(var i=0;i< smiles.length;i++){
    userText = userText.replace(smiles[i].code,'<img src="/d/0/jabberchat/img/smiles/'+smiles[i].img+'" width="15" height="15" alt="'+smiles[i].text+'" />');
  }
  return userText;
}
function iconsFilter(userText){ // Меняет текстовые строки на иконки спортивных событей.
  var icons = [
    {
      code:/!компенсированное_время!/g,
      text:"компенсированное время",
      img:"for-all-compensate-time.gif"
    },
    {
      code:/!_начало!/g,
      text:"начало",
      img:"for-all-beginning.gif"
    },
    {
      code:/!_конец!/g,
      text:"конец",
      img:"for-all-end.gif"
    },
    {
      code:/!нарушение_правил!/g,
      text:"нарушение правил",
      img:"for-all-violation.gif"
    },
    {
      code:/!_овертайм!/g,
      text:"овертайм (дополнительное время)",
      img:"for-all-over-time.gif"
    },
    {
      code:/!тайм_aут!/g,
      text:"тайм aут",
      img:"for-all-time-out.gif"
    },
    {
      code:/!_удаление!/g,
      text:"удаление",
      img:"for-all-delete.gif"
    },
    {
      code:/!первое_место!/g,
      text:"первое место",
      img:"for-all-first.gif"
    },
    {
      code:/!второе_место!/g,
      text:"второе место",
      img:"for-all-second.gif"
    },
    {
      code:/!третье_место!/g,
      text:"третье место",
      img:"for-all-third.gif"
    },
    {
      code:/!_травма!/g,
      text:"травма",
      img:"for-all-trauma.gif"
    },
    {
      code:/!опасный_момент!/g,
      text:"опасный момент",
      img:"for-all-dangerous.gif"
    },
    {
      code:/!_статистика!/g,
      text:"статистика",
      img:"for-all-stats.gif"
    },
    {
      code:/!футбол_гол!/g,
      text:"гол",
      img:"football-goal.gif"
    },
    {
      code:/!футбол_желтая_карточка!/g,
      text:"желтая карточка",
      img:"football-yellow-card.gif"
    },
    {
      code:/!футбол_пенальти!/g,
      text:"пенальти",
      img:"football-penalty.gif"
    },
    {
      code:/!футбол_замена!/g,
      text:"замена",
      img:"football-replace.gif"
    },
    {
      code:/!футбол_штанга!/g,
      text:"штанга",
      img:"football-barbell.gif"
    },
    {
      code:/!баскетбол_одноочковый_бросок!/g,
      text:"одноочковый бросок",
      img:"basketball-upthrow-1.gif"
    },
    {
      code:/!баскетбол_двухочковый_бросок!/g,
      text:"двухочковый бросок",
      img:"basketball-upthrow-2.gif"
    },
    {
      code:/!баскетбол_трехочковый_бросок!/g,
      text:"трехочковый бросок",
      img:"basketball-upthrow-3.gif"
    },
    {
      code:/!хоккей_забитая_шайба!/g,
      text:"забитая шайба",
      img:"hockey-puck.gif"
    },
    {
      code:/!хоккей_удаление_на_две_минуты!/g,
      text:"удаление на две минуты",
      img:"hockey-delete-2.gif"
    },
    {
      code:/!хоккей_удаление_на_четыре_минуты!/g,
      text:"удаление на четыре минуты",
      img:"hockey-delete-4.gif"
    },
    {
      code:/!хоккей_удаление_на_пять_минут!/g,
      text:"удаление на пять минут",
      img:"hockey-delete-5.gif"
    },
    {
      code:/!хоккей_удаление_на_десять_минут!/g,
      text:"удаление на десять минут",
      img:"hockey-delete-10.gif"
    },
    {
      code:/!хоккей_замена_вратаря_на_полевого_игрока!/g,
      text:"замена вратаря на полевого игрока",
      img:"hockey-replace.gif"
    },
    {
      code:/!волейбол_очко!/g,
      text:"очко",
      img:"volleyball-point.gif"
    },
    {
      code:/!гандбол_гол!/g,
      text:"гол",
      img:"handball-goal.gif"
    },
    {
      code:/!гандбол_7-метровый!/g,
      text:"7-метровый",
      img:"handball-7m.gif"
    },
    {
      code:/!биатлон_пять_промахов!/g,
      text:"пять промахов",
      img:"biathlon-5-miss.gif"
    },
    {
      code:/!биатлон_четыре_промаха!/g,
      text:"четыре промаха",
      img:"biathlon-4-miss.gif"
    },
    {
      code:/!биатлон_три_промаха!/g,
      text:"три промаха",
      img:"biathlon-3-miss.gif"
    },
    {
      code:/!биатлон_два_промаха!/g,
      text:"два промаха",
      img:"biathlon-2-miss.gif"
    },
    {
      code:/!биатлон_однин_промах!/g,
      text:"однин промах",
      img:"biathlon-1-miss.gif"
    },
    {
      code:/!биатлон_пять_попаданий!/g,
      text:"пять попаданий",
      img:"biathlon-5-hits.gif"
    },
    {
      code:/!биатлон_дополнительный_патрон!/g,
      text:"дополнительный патрон",
      img:"biathlon-1-ammunition.gif"
    },
    {
      code:/!биатлон_два_дополнительных_патрона!/g,
      text:"два дополнительных патрона",
      img:"biathlon-2-ammunition.gif"
    },
    {
      code:/!биатлон_три_дополнительных_патрона!/g,
      text:"три дополнительных патрона",
      img:"biathlon-3-ammunition.gif"
    },
    {
      code:/!биатлон_желтая_майка!/g,
      text:"желтая майка",
      img:"biathlon-yellow-shirt.gif"
    },
    {
      code:/!биатлон_красная_майка!/g,
      text:"красная майка",
      img:"biathlon-red-shirt.gif"
    },
    {
      code:/!биатлон_стрельба_стоя!/g,
      text:"стрельба стоя",
      img:"biathlon-upright.gif"
    },
    {
      code:/!биатлон_стрельба_лежа!/g,
      text:"стрельба лежа",
      img:"biathlon-lie.gif"
    }
  
  ];
  for(var i=0;i<icons.length;i++){
    userText = userText.replace(icons[i].code,'<img src="/d/0/jabberchat/img/icons/'+icons[i].img+'" width="30" height="26" alt="'+icons[i].text+'" title="'+icons[i].text+'" /> ');
  }
  return userText;
}
function copyUserName(_this){ // Добавляет имя пользователя в строку сообщения при клике на нем.
  var name = "["+_this.childNodes[0].nodeValue.substring(0,_this.childNodes[0].nodeValue.length-1)+"]";
  var userString = document.getElementById("chat-user-text");
  if(userString.value.indexOf(name)<0){
    if(typeof(inputUserTextPos) != "undefined"){
      var part1 = userString.value.substring(0,inputUserTextPos);
      var part2 = userString.value.substring(inputUserTextPos,userString.value.length);
      userString.value = part1+name+" "+part2;
    }else userString.value = name+" ";
    userString.focus();
  }
}
function saveCursorPosition(_this){ // Запоминает позицию курсора в поле ввода.
  var caretPos = 0;
  if(user[0].brouser == "ie"){
    //caretPos = range.value.length;
  }else if(_this.selectionStart){
    caretPos = _this.selectionStart;
  }
  return caretPos;
}
function writeChatPostsInWindow(message){ // Пишет сообщения в окно чата.
  var messageFrom = message.getFrom().substring(message.getFrom().indexOf("/")+1,message.getFrom().length);
  var messageClass = getUserRole(messageFrom);
  var messageNode = message.getNode();
  var chat_user_chat = document.getElementById("chat-window");
  var d = new Date();
  var time = hours = minutes = 0;
  var params = "";
  var post = messageNode.getElementsByTagName('body')[0].childNodes[0].nodeValue;
  if(post==window.last_message){
    return;
  }
  window.last_message=post;
  if(chat_user_chat.innerHTML) window.messageArhiv = chat_user_chat.innerHTML;
  if(messageNode.getElementsByTagName('x')[0]){
    var messageDate = messageNode.getElementsByTagName('x')[0].getAttribute('stamp');
    hours = new Number(messageDate.substring(messageDate.length-8,messageDate.length-6));
    minutes = new Number(messageDate.substring(messageDate.length-5,messageDate.length-3));
    seconds = new Number(messageDate.substring(messageDate.length-2,messageDate.length));
  }else{
    hours = d.getUTCHours();
    minutes = d.getUTCMinutes();
    seconds = d.getUTCSeconds();
  }
  time = minutes+hours*60-d.getTimezoneOffset();
  hours = Math.floor(time/60);
  if(hours >= 24) hours = hours-24;
  if(minutes < 10) minutes = "0"+minutes;
  if(hours < 10) hours = "0"+hours;
  if(seconds < 10) seconds = "0"+seconds;
  if(messageFrom == user[0].nick) params = ' class="you"';
  else if(messageFrom == "botanick") params = ' class="botanick"';
  else{
    params = ' onclick="copyUserName(this)"';
    if(messageClass == "commentator") params += ' title="комментатор"';
  }
  var re = new RegExp("("+user[0].nick+")");
  var displayMesage = 'style="display: '+getMessageDisplay(messageClass)+';"';
  if(messageClass  == "user" && messageFrom != user[0].nick) chat_user_chat.innerHTML = '<div class="'+messageClass+'" '+displayMesage+'><span class="smalldate">'+hours+':'+minutes+':'+seconds+'</span>&nbsp;<strong'+params+'>' + messageFrom + ':</strong>&nbsp;' + smilesFilter(htmlspecialchars(post)).replace(re,"<span class=\"you\">$1</span>") + '</div>' + window.messageArhiv;
  if(messageClass  == "user" && messageFrom == user[0].nick) chat_user_chat.innerHTML = '<div class="'+messageClass+'" '+displayMesage+'><span class="smalldate">'+hours+':'+minutes+':'+seconds+'</span>&nbsp;<strong'+params+'>' + messageFrom + ':</strong>&nbsp;' + smilesFilter(htmlspecialchars(post)) + '</div>' + window.messageArhiv;
  if(messageClass  == "commentator"){
    var commentatorMessage = '<div class="'+messageClass+'" '+displayMesage+'><span class="smalldate">'+hours+':'+minutes+':'+seconds+'</span>&nbsp;<strong title="комментатор">:</strong> ' + iconsFilter(smilesFilter(htmlspecialchars(post))) + '</div>';
      chat_user_chat.innerHTML = commentatorMessage + window.messageArhiv;
  }
  window.messageArhiv = chat_user_chat.innerHTML;
  getIQ("get","http://jabber.org/protocol/disco#info");
}
function getUserRole(messageFrom){ // Ставит класс для div сообщений в зависимости от кого.
  for(var i=0;i<commentators.length;i++){
    if(commentators[i] == messageFrom){
      return "commentator";
    }
  }
  return "user";
}
function getIQ(type,query){ // Посылает запросы jabber северу.
  var iq = new JSJaCIQ();
  iq.setType(type);
  iq.setTo(new JSJaCJID(chat[0].sendTo));
  iq.setQuery(query);
  con.send(iq);
}
// Jabber Client init
function doLogin(){ // Логиниться к джаббер серверу.
  try{
    // setup args for contructor
     var text = document.getElementById("chat-place-text");
     if(text) text.style.background="url(/d/0/jabberchat/img/load.gif) 50% 50% no-repeat";
     if(user[0].login != ""){
      oArgs = new Object();
      oArgs.httpbase = chat[0].httpbase;
      oArgs.timerval = 1;
      if(typeof(oDbg) != 'undefined') oArgs.oDbg = oDbg;
      con = new FlashSocketConnection(oArgs);
      con.registerHandler('message',writeChatPostsInWindow);
      con.registerHandler('iq',handleIQ);
      con.registerHandler('presence',handlePresence);
      con.registerHandler('onconnect',handleConnected);
      con.registerHandler('onerror',handleError);
      con.registerHandler('ondisconnect',handleDisconnected);
      con.registerIQGet('query', NS_VERSION, handleIqVersion);
      con.registerIQGet('query', NS_TIME, handleIqTime);
      // setup args for connect method
      oArgs = new Object();
      oArgs.domain = chat[0].domain;
      oArgs.username = user[0].login;
      oArgs.resource = window.chatRum;
      oArgs.pass = user[0].password;
      oArgs.register = false;
      oArgs.authtype = 'nonsasl';
      con.connect(oArgs);
    }
  }catch(e){
  }finally{
    return false;
  }
}
function sendMsg(sendTo,sendFrom,sendBody){ // Посылает сообщение.
  if(sendTo.indexOf('@') == -1) sendTo += '@' + con.domain;
      try{
        var aMsg = new JSJaCMessage();
        aMsg.setFrom(sendFrom);
        aMsg.setTo(new JSJaCJID(sendTo));
        aMsg.setBody(sendBody);
        aMsg.setType("groupchat");
        con.send(aMsg);
        return false;
      }catch(e){
        return false;
      }
}

function kickOrBan(code){ // Кикает или банет перцев.
  if(code == 503){
    var message = 'Стадион забит до отказа, попробуйте подождать и зайти позже. <input type="button" id="chatEnterButton" value="Войти в чат" class="submit" onclick="joinChat()" />';
  }else if(code == 307){
    var message = 'Вы нарушили <a href="http://news.sportbox.ru/Text/main/rules/">правила</a> сайта, вас выкинули из чата.';
  }else if(code == 301 || code == 403){
    var message = 'Вы нарушили <a href="http://news.sportbox.ru/Text/main/rules/">правила</a> сайта, вам запрещено участвовать в чате.';
  }
  if(message){
    document.getElementById("chat-place-chat").innerHTML = '<p class="attention">'+message+"</p>";
    if(code != 503) con.disconnect();
  }
}
function kickOrBanAnotherUser(code, nick){ // Выводит сообщение о бане юзеров.
  if(code == 307){
    var message = '['+nick+']'+' нарушил <a href="http://news.sportbox.ru/Text/main/rules/">правила</a> и был выкинут из чата.';
  }else if(code == 301 || code == 403){
    var message = '['+nick+']'+' нарушил <a href="http://news.sportbox.ru/Text/main/rules/">правила</a> и ему запретили участвовать в чате.';
  }
  if(message){
    var d = new Date();
    minutes = d.getUTCMinutes();
    hours = d.getUTCHours();
    seconds = d.getUTCSeconds();
    time = minutes+hours*60-d.getTimezoneOffset();
    hours = Math.floor(time/60);
    if(hours >= 24) hours = hours-24;
    if(minutes < 10) minutes = "0"+minutes;
    if(hours < 10) hours = "0"+hours;
    if(seconds < 10) seconds = "0"+seconds;
    var chat_user_chat = document.getElementById("chat-window");
    var tmp = chat_user_chat.innerHTML;
    chat_user_chat.innerHTML = '<div class="system-message"><span class="smalldate">'+hours+':'+minutes+':'+seconds+'</span>&nbsp;<strong class="moderator">Модератор:</strong> '+message+'</div>'+tmp;
    getIQ("get","http://jabber.org/protocol/disco#info");
  }
}
function crashJabberServer(code){
  if(code==502||code==503){
    document.getElementById("chat-place-chat").innerHTML = '<p class="attention">Чат временно не доступен! Попробуйте обновить страницу.</p>';
  } else if(code==500){
    document.getElementById("chat-place-chat").innerHTML = '<p class="attention">Не удалось установить связь с сервером! Возможно, прокси-сервер блокирует передачу. Свяжитесь с вашим системным администратором или провайдером.</p>';
  }
}
function __init(){ // Инициализирует работу с джаббер сервером.
  /*if(typeof(Debugger) == 'function'){
      oDbg = new Debugger(2,'sportbox-chat');
      oDbg.start();
  }else{
      oDbg = new JSJaCConsoleLogger(2);
  }*/
  if(!document.getElementById("chatEnterButton")){
    document.getElementById("chat-place-chat").innerHTML += '<p><br /><input type="button" id="chatEnterButton" value="Войти в чат" class="submit" onclick="doLogin();return false" /></p>';
    $("#chat-place-text").resizer('<span class="spb_cmp_reel_chat_chat_txta_r"></span>');
  }
}
function sendPresence2Groupchats(){ // Перекидывает юзера в комнату.
  aPresence = new JSJaCPresence();
  aPresence.setTo(chat[0].sendTo+"/"+user[0].nick);
  aPresence.setStatus("online")
  con.send(aPresence);
}
function sendPresenceAllMessage(){
  aPresence = new JSJaCPresence();
  aPresence.setTo(chat[0].sendTo);
  var x = aPresence.getDoc().createElement('x');
  x.appendChild(aPresence.getDoc().createElement('history')).setAttribute('maxchars','0');
  aPresence.getNode().appendChild(x);
  con.send(aPresence);
}
function loadXMLDoc(method,url,_function){ // AJAX Section
    if(window.XMLHttpRequest){
        req = new XMLHttpRequest();
        req.onreadystatechange = _function;
        req.open(method, url, true);
        req.setRequestHeader("If-Modified-Since", window.lastModified);
        req.send(null);
    }else if(window.ActiveXObject){
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if(req){
            req.onreadystatechange = _function;
            req.open(method, url, true);
            req.setRequestHeader("If-Modified-Since", window.lastModified);
            req.send(null);
        }
    }
}
function processReqChange(_function){ // Функция, выполняемая при изменении статуса запроса, если статус равен 200, данные получены.
    if(req.readyState == 4 && req.status == 200){
      setUserInfo(req.responseXML.documentElement);
    }
}
function textTranslationeReqChange(_function){ // Функция, выполняемая при изменении статуса запроса, если статус равен 200, данные получены.
    if(req.readyState == 4 && req.status == 200){
      window.LastModified = req.getResponseHeader("Last-Modified");
      textTranslationeParser(req.responseText);
    }
}
function getCommentatorHistore(){
  var chatPlaceText = document.getElementById("chat-place-text");
  if(chatPlaceText){
    chatPlaceText.style.display = "none";
    var chat_user_chat = document.getElementById("chat-window");
    var messages = chatPlaceText.getElementsByTagName("p");
    for(var i=0;i<messages.length;i++){
      var time = messages[i].getElementsByTagName("strong")[0].childNodes[0].nodeValue;
      var message = messages[i].innerHTML.substring(31,messages[i].innerHTML.length);
      chat_user_chat.innerHTML += '<div class="commentator" style="display:block"><span class="smalldate">'+time+'</span>&nbsp;<strong title="комментатор">:</strong> '+message+'</div>';
    }
  }
}
// Text translatione for guest
function textTranslationeInit(){
  var textTranslationeURL = "http://"+window.location.host+"/history/"+window.chatRum;
  loadXMLDoc("get",textTranslationeURL,textTranslationeReqChange)
}
function textTranslationeParser(responseText){
  var chatPlaceText = document.getElementById("chat-place-text");
  if(chatPlaceText){
  var messages = new Array();
  //var chatPlaceText = document.getElementById("spb_cmp_reel_chat_text_txta");
  var newMesage = "";
  messages = responseText.split("\n");
  for(var i=0;i<messages.length-1;i++){
    var time = messages[i].substring(11,19);
    var message = iconsFilter(messages[i].substring(messages[i].indexOf(": ")+2,messages[i].length));
      newMesage = "<p><strong>"+time+"</strong>&nbsp;"+message+"</p>"+newMesage;
  }
  chatPlaceText.innerHTML = newMesage;
  //chatPlaceText.innerHTML += '<p><br /><input type="button" value="Войти в чат" class="submit" onclick="joinChat();return false" /></p>';
  setTimeout("textTranslationeInit()",10000);
  }
}
