var Chat = {
    user: null,
    last: null,
    
    init: function(){
                
        $('#chat-button').click(Chat.clickEvt);
        $('#chat-message').keypress(Chat.keypressEvt);
        
        $('#username-button').click(Chat.setUser);
        
        Chat.poll(true);
    },
    
    setUser: function(){
        var nameEl = $('#chat-name');
        var user = nameEl.val();
        
        if( !$.trim(user) ){
            alert("Please enter your name.");
            return nameEl.focus();
        }
        
        var limit = 20;
        if(user.length > limit){
            alert("Please enter username not more than "+limit+" characters.");
            return nameEl.focus();
        }
        
        Chat.user = (user) ? user : "Anonymous"; 

        $('#username-container').hide("slow", function(){ $('#message-container').show("slow") });        

    },
    
    clickEvt: function(){
       
        var msgEl = $('#chat-message');
    
        var message = util.str.removeNL(msgEl.val());
        message = util.str.htmlEntities(message);

        var limit = 120;
        if(message.length > limit){
            alert("Please limit your message below "+limit+" characters.");
            return msgEl.focus();
        }        
       
        if($.trim(message)){
        
            //user is already logged-in
            if(Chat.user){               
                Chat.append(Chat.user, message, 'sender');
                Chat.send(message, Chat.receive);
                Chat.srollDown();    

                msgEl.val('');                
            }else{
                $('#modal').css('display','block');
                $('#register-login').css('display','block');
            }
            
        }            
        else
            alert("You must enter a message.");
        
    },
    
    keypressEvt:function(evt){
        
        if(13 == evt.keyCode){
            Chat.clickEvt();
            evt.preventDefault();
        }
    },
    
    
    append:function(user, msg, cls, datetime){
    
        
        var sender = '<strong>' + util.str.addWordBreak(user,15) + '</strong>:&nbsp;';
        var message = '<span>' + Chat.checkMessage(msg) + '</span><br />';
        var dt = (datetime) ? '<small>' + util.date.sanitize(datetime) + '</small>' : '';
    
        var li = $('<li></li>')
                    .attr({ 'class': cls })
                    .html(sender+message+dt);  
                    
        $('#chat-history').append(li);
    },
    
    receive:function(data){
    
        var shouts = data.shouts;
        var users = data.users;
    
        if(data && 'OK' == data.STATUS){    
            if(shouts && $.isArray(shouts)){
                
                $('#chat-history').html('');
                
                var len = shouts.length - 1;                
                var cls, rec;
                
                do{  
                    rec = shouts[len];
                    cls = (Chat.user == rec.sender) ? 'sender' : 'receiver';
                    Chat.append(rec.sender, rec.shout, cls, rec.tmstmp);
                }while(0 <= --len);
                
                Chat.srollDown();
            }
            
        }       
              
        
        //poll
        Chat.poll();
  
    },
    
    srollDown : function()
    {
        var hist = $('#chat-history').get(0);
        if(hist) hist.scrollTop = hist.scrollHeight;      
    }, 
    
    poll:function(first){
        
        function doPoll(first){
            var args = {};
            if(first) args.first = first;
            Chat.request("fetch", args, Chat.receive);            
        }
        window.setTimeout(doPoll, 6000, (first)?true:false);
    },    
    
    send:function(message){
        var args = {
            shout: message,
            sender: Chat.user
        };
        Chat.request("send", args, null);
    },
    
    checkMessage:function(msg){
    
        var urlpattern = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
        var matches = msg.match(urlpattern);

        if(matches){
            $.each(matches, function(i, url){                
                msg = msg.replace(url, '<a href="'+url+'">'+url+'</a>');
            });
        }
    
        return util.str.addWordBreak(msg,15);
    },
    
    
    
    request:function(mode, args, cb){
        $.post(
            "shouts/"+mode,
            args,
            cb,
            'json'
        );
    }
    
};

$(document.body).ready(function(){    
    Chat.init();    
});

