/* public chat lib */
var pubChat = {
  users:  [],
  users_loaded:  false,
  messages: [],
  messages_length: 30,
  
  is_logged_in:     0,
  is_invisible:     1,
  change_invisibility_url:  null,
  
  send_message_url: null,
  load_messages_ch: null,
  load_messages_url: null,
  
  load_users_ch:  null,
  load_users_url: null,
  roomId:  0,
  
  setChangeInvisibilityUrl:  function(url){
    this.change_invisibility_url    = url;
  },
  
  getChangeInvisibilityUrl:  function(){
    return this.change_invisibility_url;
  },
  
  setInvisible:  function(invisible){
    if( invisible ) {
      $("#visibility_status").text("Deltag i chatten (viser profil som deltager)");
    } else {
      $("#visibility_status").text("Skjul mig (din profil vises ikke som deltager)");
    }
    
    this.is_invisible   = invisible;
  },
  
  isInvisible:  function(){
    return this.is_invisible;
  },
  
  setLoggedIn:  function(loggedin){
    this.is_logged_in   = loggedin;
  },
  
  isLoggedIn:  function(){
    return this.is_logged_in;
  },
  
  setUp:  function() {
    
    if(this.isLoggedIn() && this.getRoomId() > 0) {
      $("#chat_visible_mode_area").show();
    } else {
      $("#chat_visible_mode_area").hide();
    }
    
    if( this.isInvisible()) {
      $("#chat_controls_area").hide();
    }
    
    $("#chat_rooms_list li a").click(function(){
      $("#chat_rooms_list li a").each(function(i){
        $(this).removeClass('current');
      });
        
      $(this).addClass('current');
      pubChat.setChatRoom($(this).attr('href'));
      return false;
    });
    
    // send chat message
    $("#chat_message_input").keypress(function(e){
      var text = $(this).val();
      if( e.keyCode == 13) {
        if ( text.length ) {
          pubChat.sendMessage(text);
          $(this).val("");
        }
       }
    });
    
    
    // send chat message
    $("#chat_message_input").keyup(function(e){
      var text = $(this).val();
      if(text.length > chat.maxMessageLength) {
        $(this).val(text.substr(0, chat.maxMessageLength));
      }
    });
    
    
    
    
    $("#emoticons img").click(function(){
      var src = $(this).attr('src');
      var pos = src.lastIndexOf('/');
      if(pos != -1) {
        var image = src.substr(pos+1, src.length-pos);
        for(var k in chat.smilesMap) {
          var item = chat.smilesMap[k];
          if(item.to == image ) {
            var from = item.from.split(" ");
            $("#chat_message_input").val($("#chat_message_input").val() + " "+ from[0]);
            $("#chat_message_input").focus();
            break;
          }
        }
      }
    });
    
    $("#visibility_status").click(function(){
      var new_status = pubChat.isInvisible() ? 0 : 1;
      $.ajax({
        url: pubChat.getChangeInvisibilityUrl(),
        cache: false,
        data: {invisible: new_status},
        success: function(data){
          
          if( new_status) {
            $("#chat_controls_area").hide();
          } else {
            $("#chat_controls_area").show();
          }
          
          pubChat.setInvisible(new_status);
        }
      });
    });
    
    this.loadUsers();
    this.load_messages_ch  = setInterval(this.loadMessages, 7000);
  },
  
  setChatRoom:  function(url){
    $.ajax({
      url: url,
      cache: false,
      dataType: "json",
      success: function(data){
        $("#chat_notice").hide();
        $("#chat_messages_list").empty();
        $("#chat_users_list ul").empty();
        $("#chat_current_room").text('Aktivt chatrum: '+ data.name);
      
        pubChat.users_loaded    = false;
        pubChat.messages    = [];
        pubChat.users       = [];
        pubChat.setRoomId(data.id);
        pubChat.loadUsers();
      }
    });
  },
  
  setRoomId: function(id) {
    
    if(id > 0) {
      if(this.isLoggedIn()) {
        $("#chat_visible_mode_area").show();
        if( !this.isInvisible()) {
          $("#chat_controls_area").show();
        }
      }
    }
    
    this.roomId = id;
  },
  
  getRoomId: function() {
    return this.roomId;
  },
  
  setLoadUsersUrl:  function(url){
    this.load_users_url = url;
  },
  
  getLoadUsersUrl:  function(){
    return this.load_users_url;
  },
  
  loadUsers: function(){
    $.ajax({
      url: pubChat.getLoadUsersUrl(),
      cache: false,
      dataType: "json",
      data: {room_id: pubChat.getRoomId()},
      success: function(data){
        // find offline users
        for (var i in pubChat.users) {
          var curr_buddy  = pubChat.users[i];
          var user_offline_now = true;
          for (var j in data) {
            var new_buddy  = data[j]; 
            if(curr_buddy.user_id == new_buddy.user_id) {
              user_offline_now  = false;
              break;
            }
          }

          // update online status
          if(curr_buddy.online && user_offline_now ) {
            $("#user_id_"+curr_buddy.user_id).remove();
          } else if(!curr_buddy.online && !user_offline_now ) {
            var li = '<li id="user_id_'+curr_buddy.user_id+'">'+curr_buddy.username+'</li>';
            $("#chat_users_list ul").append(li);
          }
          
          curr_buddy.online = !user_offline_now;
        }
        
        // find new users
        for (var j in data) {
          var new_buddy  = data[j];
          var not_in_list = true;
          for (var i in pubChat.users) {
            var curr_buddy  = pubChat.users[i];
            if(curr_buddy.user_id == new_buddy.user_id) {
              not_in_list  = false;
              break;
            }
          }

          if(not_in_list) {
            var li = '<li id="user_id_'+new_buddy.user_id+'">'+new_buddy.username+'</li>';
            $("#chat_users_list ul").append(li);
            pubChat.users.push(new_buddy);
          }
        }
        
        if(!pubChat.users_loaded){
          pubChat.loadMessages();
        }
        
        pubChat.users_loaded    = true;
      }
    });
  },
  
  setLoadMessagesUrl:  function(url){
    this.load_messages_url = url;
  },
  
  getLoadMessagesUrl:  function(){
    return this.load_messages_url;
  },
  
  loadMessages:  function(){
    var max_message_id = 0;
    var messages = pubChat.messages;
    for(var i in messages){
      var message = messages[i];
      if(message.id && message.id > max_message_id ) {
        max_message_id    = message.id;
      }
    }
    
    var postData    = {
      last_message_id:  max_message_id,
      room_id:  pubChat.getRoomId()
    };
    
    $.ajax({
      url: pubChat.getLoadMessagesUrl(),
      cache: false,
      data:  postData,
      dataType:  "json",
      type: "GET",
      success: function(data){
        if(data.length) {
          for(var i in data){
            var val = data[i];
            var message = {
              id:       parseInt(val.log_id),
              user_id:  val.log_user_id,
              username: val.log_username,
              time:     val.log_time,
              message:  val.log_message
            };
            
            pubChat.addMessageToList(message);
            pubChat.renderMessageToList(message);
          }
        }
      }
    });
  },
  
  addMessageToList:  function(message) {
    var messages  = this.messages, message_exists = false;
    for(var i = 0, n = messages.length; i < n; i++) {
      if(messages[i].id == message.id ) {
        message_exists  = true;
        break;
      }
    }
    
    if(!message_exists ) {
      this.messages.push(message);
      this.messages    = this.messages.slice(0-this.messages_length);
    }
  },
  
  setSendMessagesUrl:  function(url){
    this.send_messages_url = url;
  },
  
  getSendMessagesUrl:  function(){
    return this.send_messages_url;
  },
  
  sendMessage:  function(text) {
    clearInterval(this.load_messages_ch);
    
    // post data
    var postData    = {
      room_id:   pubChat.getRoomId(),
      message:   chat.preParseMessage(text)
    };
    
    $.ajax({
      url: pubChat.getSendMessagesUrl(),
      cache: false,
      data:  postData,
      dataType: "json",
      type: "POST",
      success: function(data){
        if ( data.error) {
          var message = {
            error:    parseInt(data.error),
            message:  data.message
          };
            
          pubChat.addMessageToList(message);
          pubChat.renderMessageToList(message);
        } else {
          var message = {
            id:       data.id,
            user_id:  data.user_id, 
            username: data.username,
            time:     data.time,
            message:  data.message
          };
          
          pubChat.addMessageToList(message);
          pubChat.renderMessageToList(message);
        }
        
        pubChat.load_messages_ch  = setInterval(pubChat.loadMessages, 5000);
      },
      error: function(xmlHttp){
        var message = {
          error:    true,
          message: 'An error occured during sending request.'
        };
        
        pubChat.renderMessageToList(message);
        pubChat.load_messages_ch  = setInterval(pubChat.loadMessages, 5000);
      }
    });
  },
  
  refreshMessagesList:  function(){
    var targetElem = $("#chat_messages_list");
    
    var html    = '';
    for(var i = 0, n = pubChat.messages.length; i < n; i++) {
      html  += pubChat.renderMessage(pubChat.messages[i]);
    }
    
    targetElem.html(html);
    targetElem.attr({scrollTop: targetElem.attr('scrollHeight') });
  },
  
  renderMessageToList:  function(message){
    var targetElem = $("#chat_messages_list");
    targetElem.append(pubChat.renderMessage(message));
    targetElem.attr({scrollTop: targetElem.attr('scrollHeight') });
  },
  
  renderMessage:  function(message){
    var html    = '';
    if(message.error ) {
      html += '<div class="error_message">'+message.message+'</div>';
    } else {
      html += '<div class="message"><span class="time">'+message.time+'</span> <span class="username">'+message.username+'</span>: '+chat.postParseMessage(message.message)+'</div>';
    }
    
    return html; 
  }
  
}
