function debug(txt) {
  try {
    console.log(txt);
  }
  catch(e) {}
}

function Chat(handler, sessionid, buddyid, buddyname, myname) {

  var thisref = this;
  this.handler = handler;
  this.sessionid = sessionid;
  this.buddyname = buddyname;
  this.buddyid = buddyid;
  this.active = false;
  this.myname = myname;
  this.tab = null;
  this.chatarea = null;
  this.history = null;

  this.getMessHtml = function() {
    var html = "<div class='chatheader'>" + translate("Chatt med") + " " + this.buddyname + "</div>";
    html += "<div><textarea id='chatta" + this.sessionid + "' class='ta_chat' onkeypress='sendChatOnEnter(event)'></textarea></div>";
    html += "<div class='sendmessdiv' id='chatsend" + this.sessionid + "'><a href='javascript:void(0)' onfocus='this.blur()'>" + translate("Skicka (Ctrl-Enter)") + "</a></div>";
    html += "<div class='dashdivider'></div>";
    html += "<div id='chathistory" + this.sessionid + "' class='chathistory'>X</div>";
    html += "<div class='dashdivider'></div>";
    html += "<div class='sessionclose'><a href='javascript:void(0)' onclick='chathandler.closeChat(" + this.sessionid + ")'>" + translate("Stäng chatt med") + " " + this.buddyname + "</a></div>";
    return html;
  }

  this.setup = function() {
    this.tab = document.createElement("LI");
    this.tab.id = "ctab" + this.sessionid;
    var hlp = this.buddyname.split(' ');
    this.tab.innerHTML = "<span>" + hlp[0] + "</span>"
    N$('chattabs').firstChild.appendChild(this.tab);

    this.chatarea = document.createElement("DIV");
    this.chatarea.style.display = "none";
    this.chatarea.id = "carea" + this.sessionid;
    this.chatarea.innerHTML = this.getMessHtml();
    N$('chat_messarea').appendChild(this.chatarea);
    N$('chatsend' + this.sessionid).onclick = function(){thisref.send();};
    N$('chatta' + this.sessionid).onkeypress = function(e){return thisref.chatKeypress(e);};
    this.history = $("#chathistory" + this.sessionid).scroller({imagepath: 'gfx/scroller'}, function(){thisref.scrollerDone();});
  }

  this.chatKeypress = function(e) {
    var keynum = 0;
    e = (window.event ? window.event : e);
    if (window.event) keynum = e.keyCode;
    else if (e.which) keynum = e.which;
    if (keynum == 13 && e.ctrlKey || (window.event && keynum == 10)) {
      thisref.send();
      return false;
    }
  }

  this.scrollerDone = function() {
    this.history.setContent("");
  }

  this.close = function() {
    N$('chattabs').firstChild.removeChild(this.tab);
    N$('chat_messarea').removeChild(this.chatarea);
    handler.activateFirst();
  }

  this.activate = function() {
    if (handler.activeChat) handler.activeChat.inactivate();
    handler.activeChat = this;
    this.chatarea.style.display = "block";
    this.tab.className = "current";
    var hlp = this.buddyname.split(' ');
    this.tab.firstChild.innerHTML = hlp[0];
    this.active = true;
    this.history.setVertPos(100);
  }

  this.inactivate = function() {
    this.chatarea.style.display = "none";
    this.tab.className = "";
    var a = document.createElement("A");
    a.href = "javascript:void(0)";
    a.onclick = function() {thisref.activate()};
    var hlp = this.buddyname.split(' ');
    a.innerHTML = hlp[0];
    this.tab.firstChild.innerHTML = "";
    this.tab.firstChild.appendChild(a);
    this.active = false;
  }

  this.pending = function() {
    this.inactivate();
    this.tab.className = "pending";
  }

  this.send = function() {
    var mess = N$('chatta' + this.sessionid).value.replace(/\n/g, "<br />");
    if (mess.length == 0) return;
    N$('chatta' + this.sessionid).value = "";
    Master.SendChatMess(this.sessionid, mess);
    var now = new Date();
    html = this.history.getContent();
    if (html.length > 0) html += "<br /><br />";
    html += "<b>" + now.getHours() + ":" + now.getMinutes() + " - " + this.myname + " " + translate("skrev") + ":</b><br />" + mess;
    this.history.setContent(html);
    this.history.setVertPos(100);
  }

  this.gotMessage = function(mess) {
    if (!this.history.setupdone()) {
      setTimeout(function(){thisref.gotMessage(mess);}, 300);
      return;
    }
    var now = new Date();
    var html = this.history.getContent();
    if (html.length > 0) html += "<br /><br />";
    html += "<b>" + now.getHours() + ":" + now.getMinutes() + " - " + this.buddyname + " skrev:</b><br />" + mess;
    this.history.setContent(html);
    this.history.setVertPos(100);
    if (!this.active) this.pending();
  }

  this.setHistory = function(history) {
    this.history.setContent(history);
  }

  this.setup();
}


function ChatHandler() {

  var thisref = this;
  var chatarea = null;
  var allChats = new Array();
  this.activeChat = null;
  this.myname = null;


  this.initChats = function() {
    chatarea = new AnimDiv("chatarea", {moveDiv:"chatmove", moveable:true, afterDrag:function(pos){thisref.windowDragged(pos);} }, true);
    chatarea.setup(function(){thisref.initChats2();});
  }

  this.initChats2 = function() {
    Master.GetActiveChats(function(r){thisref.initChats3(r);});
  }

  this.initChats3 = function(response) {
    for (var i=0; i < response.value.length-1; i++) {
      var vals = response.value[i].split('|');
      var achat = new Chat(this, vals[0], vals[1], vals[2], this.myName());
      allChats.push(achat);
      achat.setHistory(vals[3]);
      achat.activate();
    }
    if (allChats.length > 0) {
      allChats[0].activate();
      if (response.value[response.value.length-1].length > 0) {
        var hlp = response.value[response.value.length-1].split('|');
        var pos = {left:parseInt(hlp[0]), top:parseInt(hlp[1])}
        chatarea.reposition(pos);
      }
      chatarea.open();
    }
  }

  this.matchChats = function(clientchats, serverchats) {
    var oldchats = new Array();
    var currchats = new Array();
    var newchats = new Array();
    for (var i=0; i < clientchats.length; i++) {
      var achat = null;
      for (var j=0; j < serverchats.length && !achat; j++)
        if (clientchats[i].sessionid == serverchats[j].sessionid)
          achat = serverchats[j];
      if (achat) currchats.push({client:clientchats[i], server:achat});
      else oldchats.push(clientchats[i]);
    }
    for (var i=0; i < serverchats.length; i++) {
      var found = false;
      for (var j=0; j < clientchats.length && !found; j++)
        found = (serverchats[i].sessionid == clientchats[j].sessionid);
      if (!found) newchats.push(serverchats[i]);
    }
    return {oldchats:oldchats, currchats:currchats, newchats:newchats};
  }

  this.updateChats = function(chats) {
    var match = this.matchChats(allChats, chats);

    for (var i=0; i < match.oldchats.length; i++)
      this.closeChat(match.oldchats[i].sessionid);

    for (var i=0; i < match.currchats.length; i++)
      if (match.currchats[i].server.message.length > 0)
        match.currchats[i].client.gotMessage(match.currchats[i].server.message);

    for (var i=0; i < match.newchats.length; i++) {
      if (match.newchats[i].message.length > 0) {
        var achat = new Chat(this, match.newchats[i].sessionid, match.newchats[i].senderid, match.newchats[i].sendername, this.myName());
        allChats.push(achat);
        achat.gotMessage(match.newchats[i].message);
        if (allChats.length == 1) {
          achat.activate();
          chatarea.open();
        }
        else {
          achat.pending();
        }
        this.alertNewChat();
      }
    }
  }

  this.alertNewChat = function() {
    window.focus();
  }

  this.startChat = function(uname) {
    var achat = null;
    for (var i=0; i < allChats.length && !achat; i++)
      if (allChats[i].buddyid == uname) achat = allChats[i];
    if (achat) achat.activate();
    else Master.StartChatWith(uname, function(r){thisref.startChat2(r);});
  }

  this.startChat2 = function(response) {
    var achat = new Chat(this, response.value[0], response.value[1], response.value[2], this.myName());
    allChats.push(achat);
    achat.activate();
    chatarea.open();
  }

  this.closeChat = function(sessionid) {
    if (allChats.length == 1) this.closeAll();
    else {
      var achat = null;
      var idx = -1;
      for (var i=0; i < allChats.length && idx == -1; i++)
        if (allChats[i].sessionid == sessionid) idx = i;
      if (idx != -1) {
        allChats[idx].close();
        allChats.splice(idx, 1);
        Master.CloseChats(String(sessionid));
      }
    }
  }

  this.closeAll = function() {
    var ids = "";
    for (var i=0; i < allChats.length; i++) {
      if (ids.length > 0) ids += ",";
      ids += allChats[i].sessionid;
    }
    Master.CloseChats(ids, function(r){thisref.closeAll2(r);});
  }

  this.closeAll2 = function() {
    chatarea.close();
    for (var i=0; i < allChats.length; i++)
      allChats[i].close();
    allChats.clear();
  }

  this.closeEnded = function(allids) {
    for (var i=0; i < allChats.length; i++) {
      var found = false;
      for (var j=0; j < allids.length; j++)
        found = (allids[j] == allChats[i].sessionid);
      if (!found) this.closeChat(allids[j]);
    }
  }

  this.activateFirst = function() {
    if (allChats.length > 0)
      allChats[0].activate();
  }

  this.myName = function() {
    if (!this.myname) {
      var response = Master.GetRealName();
      this.myname = response.value;
    }
    return this.myname;
  }

  this.windowDragged = function(pos) {
    Master.ChatDragged(pos.left, pos.top);
  }
}


