﻿// chat.js
//
// Chat Javascript Class
// ver 0.01  2007/05/06 
// Copyright 2007 Inutsuka Yusuke (inutch)   http://d.hatena.ne.jp/inutch/



/////// Common Function //////////////////////////////////////////////

if( typeof( window.escapeHtml ) == "undefined" ){
  function escapeHtml(str)
  {
    if(!str){ return ""; }
    var str2 = "";
    var tmp;
    for(var i=0; i<str.length; i++){
      if( str.charAt(i) == "<"){ tmp = "&lt;"; }
      else if( str.charAt(i) == ">"){ tmp = "&gt;"; }
      else if( str.charAt(i) == "\""){ tmp = "&quot;"; }
      else if( str.charAt(i) == "$"){ tmp = "&amp;"; }
      else { tmp = str.charAt(i); }
      str2 += tmp;
    }
    return str2;
  }
}



/////// Chat Class //////////////////////////////////////////////

function Chat(myname, roomid)
{
  document.getElementById("nickwrap").style.visibility = "visible";
  document.getElementById("nickname").focus();

  this.objname = myname;
  this.roomid = roomid;
  this.pre_time = 0;
  this.ts_interval = 5*60*1000;

  this.lingr = new LingrCom(this.objname + ".lingr");
  this.lingr.setOcupantsChangeCallback(this.cb_ocupants_change.bind(this));
  this.lingr.createSession();
  this.lingr.enterRoom(roomid, null);
  this.lingr.getMessages(-200, this.getMessages1st.bind(this));

  this.getmsg1st_timer = setTimeout(this.getMessages1st.bind(this), 10*1000);
}


//start prototype
Chat.prototype = {


  getMessages1st:function(msgs)
  {
    if(this.getmsg1st_timer){
      clearTimeout(this.getmsg1st_timer);
    }
    this.addArchiveLink();
    if(msgs){
      this.getMessages(msgs);
    }
    this.lingr.observe(this.getMessages.bind(this));
  },


  addArchiveLink:function()
  {
    var log = document.createElement('div');
    log.className = "chatlog_acv";
    log.innerHTML = "<a href='http://www.lingr.com/room/" + this.roomid
                           + "/archives' target='_blank'>古いメッセージを見る</a>";
    document.getElementById("chatlog").appendChild(log);
    document.getElementById("chatlog").scrollTop = document.getElementById("chatlog").scrollHeight;
  },

  getMessages:function(msgs)
  {
    //displog(this.objname + ".getMessages: len=" + msgs.length);
    if(!msgs){
      displog(this.objname + ".getMessages: No Messages");
      return;
    }
    for(var i=0; i<msgs.length; i++ ){
      this.dispMessage(msgs[i]);
    }
  },


  dispMessage:function(msg)
  {
    //displog(this.objname + ".dispMessage: msg=" + msg.text);

    var log = document.createElement('div');
    log.className = "chatlog_item";

    if(msg.type == "user"){
      if(msg.occupant_id == this.lingr.my_id){
        log.className = "chatlog_item_myself";
      }
      
      var name = document.createElement('span');
      name.className = "chatlog_name";
      name.innerHTML = escapeHtml(msg.nickname);
      log.appendChild(name);
      
      text = msg.text;
    }
    else if(msg.type == "system:enter"){
      log.className = "chatlog_item_enter";
      text = msg.nickname + "さんが入室しました";
    }
    else if(msg.type == "system:leave"){
      log.className = "chatlog_item_leave";
      text = msg.nickname + "さんが退室しました";
    }
    
    var logtext = document.createElement('span');
    logtext.className = "chatlog_text";
    logtext.innerHTML = escapeHtml(text);
    log.appendChild(logtext);
    
    if(msg.type == "user"){
      var ts = msg.timestamp;
      ts = ts.replace("T", " ");
      ts = ts.replace(/-/g, "/");
      ts = ts.replace(/Z$/, "");
      ts = ts.replace(/\+.+$/, "");
      
      var c_time = Date.parse(ts);
      
      ts = ts.replace(/:..$/, "");
      
      if( c_time - this.pre_time > this.ts_interval ){
        var logtime = document.createElement('div');
        logtime.className = "chatlog_time";
        logtime.innerHTML = escapeHtml(ts);
        log.appendChild(logtime);
        this.pre_time = c_time;
      }
    }

    document.getElementById("chatlog").appendChild(log);
    document.getElementById("chatlog").scrollTop = document.getElementById("chatlog").scrollHeight;
  },


  setNickname:function()
  {
    var nick = document.getElementById("nickname");
    var nickwrap = document.getElementById("nickwrap");
    if( nick.value != "" && this.lingr.setNickname(nick.value)){
      nickwrap.style.visibility = "hidden";
      this.nick_toporg = nickwrap.style.top;
      nickwrap.style.top -= (nickwrap.style.height + 10);
      document.getElementById("chattext").focus();
    }
  },


  say:function()
  {
    var textobj = document.getElementById("chattext");
    if(textobj.value != "" ){
      this.lingr.say(textobj.value);
      textobj.value = "";
    }
  },


  keyPress:function(event)
  {
    if(event.keyCode == 13){
      this.say();
      return false;
    }
    return true;
  },


  cb_ocupants_change:function(ocps)
  {
    var i;
    var parent = document.getElementById("ocupants");
    for(i=parent.childNodes.length-1; i>=0; i--){
      parent.removeChild(parent.childNodes[i]);
    }

    var ocptop = document.createElement('div');
    ocptop.className = "ocp_item_top";
    ocptop.innerHTML = "参加者";
    parent.appendChild(ocptop);

    if(!ocps){ return; }
    displog(this.objname + ".cb_ocupants_change: " + ocps.length);
    for(i=0; i<ocps.length; i++){
      if(ocps[i].nickname != undefined){
        var ocp = document.createElement('div');
        ocp.className = "ocp_item";
        ocp.innerHTML = escapeHtml(ocps[i].nickname);
        if(ocps[i].id == this.lingr.my_id){
          ocp.className = "ocp_item_myself";
        }
        parent.appendChild(ocp);
      }
    }
  },


  leaveRoom:function()
  {
    this.lingr.leaveRoom();
    var nickwrap = document.getElementById("nickwrap");
    nickwrap.style.visibility = "visible";
    nickwrap.style.top = this.nick_toporg;
    nickwrap.focus();
    this.lingr.enterRoom(this.roomid, null);
    this.lingr.observe(this.getMessages.bind(this));
  },


  end:function()
  {
    this.lingr.destroySession();
  }

};
//end prototype


/////// Chat Class //////////////////////////////////////////////

