String.prototype.trim = function() {
  a = this.replace(/^\s+/, '');
  return a.replace(/\s+$/, '');
};

logging = false;
function log(mesg){
    if (!logging){
        return ;
    };
    if ($('body').children('div.log').length == 0){
        $('body').append('<div class="log"></div>');
    };
    $('div.log').append('<span>'+mesg+'</span><br>');
};

function toggle(element){
  return $(element).hasClass('hidden')? $(element).removeClass('hidden').addClass('visible'):$(element).removeClass('visible').addClass('hidden');
};

function toggleChatScreen(){
  return toggle($('div.chatbase'));
};

function toggleLoginForm(){
  return toggle($('div.loginform'));
};

function toggleLoginScreen(){
  return toggle($('div.login'));
};

function scrollDown(obj){
    $(obj).scrollTop($(obj).get(0).scrollHeight);
};

function login(){
  $.ajax({
      url: 'chat/',
      type: 'POST',
      data: {'data':$.toJSON({
        'command': 'login',
        'username': $("[name='username']").val(),
        'password': $("[name='password']").val()
        })
      },
      dataType: 'json',
      success: function(data){
        userid = parseInt(data);
        
        if (userid > 0) {
          // logini kapat
          toggleLoginScreen();
          updateUserList();
        };
      },
      error: function(){
       $('span.error').removeClass('hidden').addClass('visible');      
      }
  });
};


function updateUserList(timeout){
  // global
  getUserList();
  h = userlist;
  var ul = $('div.chatuserlist ul'); 
  var lis = $(ul).children('li');
  $(lis).each(function(item){
    //remove the non existing users from list
    var id = $(this).attr('id');
    if(!(id in h)){
        $(this).remove();
    }else {
        // remove the existing users from the list
        delete h[id];
    }
  });

  // only update new users
  for (var key in h){    
    var li;
    var val = h[key];
    if (val.is_artist){
      li = $('<li class="chatlistitem" id="'+ key +'" ></li>').append('<img class="avatar" src="'+val.avatar+ '"><span >'+ val.fullname +'</span>');
      if (val.is_owner){
        $(li).addClass('owner');
        $(ul).prepend($(li));
      }else {
        $(ul).append($(li));
      };
    } else {
      li = $('<li class="chatlistitem" id="'+ key +'" ></li>').append('<span >'+ val.fullname +'</span>');
      $(ul).append($(li));
    };  

    if (parseInt(key) == userid){

      if (!val.is_owner){
        $(li).addClass('self');
      }
      // kendimize mesaj atmıyoruz
      continue;
    }; 

    $(li).click(function(evt){
      var elm;
      if (evt.currentTarget){
        elm = $(evt.currentTarget);
      } else { // enter ie
        elm= $(evt.srcElement);
      };
      var id = $(elm).attr('id');
      var name = $(elm).children('span').text();
      //remove message icon
      $(elm).removeClass('newmesg');
      if (userid != -1){
        // add background 
        if($('div.chatwindow_background').hasClass('hidden')){
          $('div.chatwindow_background').removeClass('hidden').addClass('visible');
        }
        if($('div.chatinput_background').hasClass('hidden')){
          $('div.chatinput_background').removeClass('hidden').addClass('visible');
          $('textarea.chatinput').focus();
        }
        openChatScreen(id, name, false);
        
      };
      return false;
    });
  };
  // update background
  $('div.chatuserlist_background').height($('div.chatuserlist').height());

  if (!!timeout){
    setTimeout(function(){updateUserList(timeout)}, timeout);
  }
};


function getUserList(){
  $.ajax({
    url: 'chat/',
    type: 'POST',
    data: {'data':$.toJSON({
      'command':'listusers'
      })},
    dataType: 'json',
    success: function(data){
      userlist = data;
      return false;
    },
    error: function(){
      // ignore erroru
    }
  })
};

function getLatestTen(one, other, win){
  if (userid > 0 ){
    $.ajax({
      url:'chat/', 
      type: 'POST',
      data: {'data': $.toJSON({
                    'command':'get_latest_10',
                    'data': {
                      'one':one,
                      'other': other
                    }
                })
      },
      dataType: 'json',
      // callback 
      success: function(mlist){
        // check data, then update chat windows 
        if (mlist){
          
          for (var i in mlist){
            var mesg = mlist[i];
            var type = (mesg.rcpt == userid)? 'received':'sent';
            $(win).children('.chatscreen').append('<span class="'+ type +'">'+"<span class='msgstart'>></span>" +mesg.content+'</span>');
          };
        };
      },
      error: function(){
        // ignore erroru
      }
    });
  }
  
};

function getLatest(timeout) {
  if (typeof(timeout) == 'undefined'){
     //log('olmaz');
     return;
  };

  //log('getting latest for ' + userid);
  if (userid > 0 ){
    $.ajax({
      url:'chat/', 
      type: 'POST',
      data: {'data': $.toJSON({
                    'command':'recv',
                    'data': {
                        'checked': checked,
                        'lastid': lastid
                    }
                })
      },
      dataType: 'json',
      // callback 
      success: function(data){
        // check data, then update chat windows 
        if (data){
          checked = data.checked;
          lastid = data.lastid; 
          //log('checked '+checked+' lastid '+lastid);
          var mesglist = data.messages;
          for( var id in mesglist){
            //log('got ' + mesglist[id]);
            updateChat(mesglist[id], id, 'received');
          };
        };
      },
      error: function(){
        // ignore erroru
      }
    });
  }
  
  setTimeout(function(){getLatest(timeout)}, timeout);
    
};

function getOrCreateChatScreen(id, name){
  if (!userid){
    return false;
  };

  var cwin = $('div.chatbase').children('div#'+id);
  // show the requested one 

  if ($(cwin).length == 0){
    // create if not exists 
    cwin = $('#base_chatwindow').clone().appendTo($('.chatbase')).attr({'id':id}).addClass('hidden');
    $(cwin).children('div.chattitle').text(name);
    $(cwin).children('span.close').click(function(){
        closeChatScreen(id)
        // remove background 
        if($('div.chatwindow_background').hasClass('visible')){
          $('div.chatwindow_background').addClass('hidden').removeClass('visible');
        };
        if($('div.chatinput_background').hasClass('visible')){
          $('div.chatinput_background').addClass('hidden').removeClass('visible');
        };
    });
    getLatestTen(userid, id, cwin);
    
    $(cwin).children('textarea.chatinput').keypress(function(evt){
      var item; 
      if (evt.currentTarget){
        item = $(evt.currentTarget);
      } else { // enter ie
        item = $(evt.srcElement);
      };

      var text = $(item).val();
      var id = $(item).parent().attr('id');

      if (evt.keyCode == 13){
        if (text.trim().length != 0){
          send(text, id);
          updateChat([text], id, 'sent');
        };
        $(item).val('');
        return false;
      };
    });
  };
  return cwin;
};


function openChatScreen(id, name, hidden){
  // id == user id
  if (!userid){
    return false;
  };

  var cwin = getOrCreateChatScreen(id, name);
  // invisible all chatscreens 
  if (typeof(hidden) == 'undefined' || hidden == false){
    $('div.chatbase').children('div.chatwindow').removeClass('visible').addClass('hidden');
  // show the requested one 
    $(cwin).removeClass('hidden').addClass('visible');
  };
};


function closeChatScreen(id){
  var cwin = $('div.chatbase').children('div#'+id);
  toggle($(cwin));
  return false;
}

function send(mesg, id){
  $.post(
    'chat/',
    {'data': $.toJSON({
        'command':'send',
        'rcpt': id,
        'message':mesg
      })
    },

      function(data){
        //log(data);
        return false;
      },
    'json'
  );
};


function updateChat(messagelist, id, type){
  // alert that chat has a new message 
  // append message 
  var name = $('.chatuserlist ul li#'+id).children('span').text();
  var cwin = getOrCreateChatScreen(id, name);
  var cscr = $(cwin).children('.chatscreen');

  // add all messages to chatscreen
  for (var mesg in messagelist){
    $(cscr).append('<span class="'+ type +'">'+"<span class='msgstart'>></span>" +messagelist[mesg]+'</span>');
  };



  if ($(cwin).length == 0 || $(cwin).hasClass('hidden')){
    // new message alert
    var item = $('.chatuserlist li#'+id);
    if (!$(item).hasClass('newmesg')){
        $(item).addClass('newmesg');
    };
  } else {
    // scroll to bottom 
    scrollDown($(cscr));
  };
}
/*
function onOpenChat(id){
  // stop blinking on focus 
  $('div#chat_'+id+' span.title').removeClass('blink');
  $('div#chat_'+id).removeClass('hidden').addClass('visible');
}

function onCloseChat(id){
  // hide chat window 
  $('div#chat_'+id).removeClass('visible').addClass('hidden');
}*/

