var $WM = {
    hasFocus: true,
    nbUnread: 0,
    title: null,

    isDev: function(){
        return (jQuery.inArray(Global.ip, ['::1','127.0.0.1','88.160.247.53']) != -1 );
    },

    test: function(){
    },

    //ordered_colorslist: ["#CCCCCC","#000000","#66361F","#C33B3B","#B037B0","#80267F","#4545E6","#3636B2","#D9A641","#3DCC3D","#2A8C2A","#2F8C74","#1A5555","#4C4C4C","#959595"],
    colorslist: ["#CCCCCC","#000000","#3636B2","#2A8C2A","#C73232","#80267F","#66361F","#D9A641","#3DCC3D","#1A5555","#2F8C74","#4545E6","#B037B0","#4C4C4C","#959595"],
    color_index: null,
    nicknames_color: new Object(),

    colorize: function(name){

        if( $WM.color_index == null ){
            $WM.color_index = Math.round(Math.random()*($WM.colorslist.length-1));
        }

        if( !$WM.nicknames_color[name] ){
            $WM.color_index++;
            $WM.color_index = $WM.color_index % $WM.colorslist.length;
            $WM.nicknames_color[name] = $WM.colorslist[$WM.color_index];

        }

        return $WM.nicknames_color[name];
    },

    load: function(js_version, ip){
        Global.version = js_version;
        Global.ip = ip;

        debug('LOADING');

        jsDump.multiline = false;
        
        $WM.hideFormNotice();

        $WM.title = $(document).attr('title');
        $WM.test();

        var show_debug = (Cookie.get('show_debug') == 'true')?true:false;
        if( !show_debug || !$WM.isDev() ){
            toggleDebug();
        }

        $(window).blur($WM.lostFocus);
        $(window).focus($WM.gotFocus);

        FormsManager.ajaxify();
        $WM.loadTabs();

        $(Global.MessageInput).bind('keydown', MessageInputHandler.exec);
        $('img.smiley').click($WM.smileys);

        $('#smiley_show').click($WM.showSmileysBar);
        $('#smiley_hide').click($WM.hideSmileysBar);

        if( Cookie.get('display_smileys') == 'false' ){
            $('#tr_smileys').hide();
            $('#smiley_show').show();
            $('#smiley_hide').hide();
            $WM.resizeChat(true);
        }

        $('#UsersToggler').addClass('ui-corner-all');
        $('#UsersToggler').click(function(){
            $('td.userslist').toggle();
            Cookie.set('display_users', $('td.userslist').css('display') != 'none');
        });

        Updater.update(function(){
            if( Cookie.get('display_users') == 'false' ){
                $('td.userslist').toggle();
            }

            $(window).resize($WM.resizeChat);
        });
    },

    gotFocus: function(){
        $WM.hasFocus = true;
        $WM.resetUnread();
        $(Global.MessageInput).focus();
    },

    lostFocus: function(){
        $WM.hasFocus = false;
        //$(document).attr('title', $WM.title);
    },

    incUnread: function(nb){
        if( !$WM.hasFocus ){
            $WM.nbUnread = $WM.nbUnread + nb;
            if( $WM.nbUnread < 0){
                $WM.resetUnread();
                return;
            }

            $(document).attr('title', '[' + $WM.nbUnread + ']' + $WM.title);
        }
    },

    resetUnread: function(){
        $WM.nbUnread = 0;
        setTimeout(function(){
                $(document).attr('title', " " + $WM.title + " " );
            }, 100);
        //$(document).attr('title', $WM.title);
    },

    checkJS: function(new_version){
        if( Global.version != new_version ){
            window.location.reload();
        }
    },

    ajaxError: function(div, label, xml, serror, ex, clean){
        if( !$WM.isDev() ){
            return ;
        }
        var res = xml.responseText;
        if( clean || clean == undefined){
            $(div).html('');
        }
        $(div).append(label + ' ERROR:' + serror + ', EX:' + ex + '<br/>');
        $(div).append(label + ' STATUS:' + xml.status + '<br/>');
        $(div).append(xmlentities(res));
        debug('-----');
        debug(label + ' ERROR = ' + xml + ":" + serror + "=>" + ex);
        debug('-----');
    },

    cleanTabs: function (tabs){
        var length = $(tabs).tabs('length');
        for( var i = length - 1; i >= 0; i--){
            $(tabs).tabs('remove', i);
        }
    },

    w_loadTabs: function(){
        $tabs = $('#w_tabs').w_tabs({
            tabTemplate: '<li><a href="#{href}"><img src="/img/smiley/cubiste.gif"/><span class="title">#{label}</span><span class="unread"></span></a><span class="close">Remove Tab</span></li>',
            add: function(ui){
                var tab_content = '<table class="room"><tr><td class="messageslist"><ul id="messages-' + ui.id + '" class="messages"></ul><div id="topic-' + ui.id + '" class="announce"></div></td>'
                + '<td class="userslist"><ul id="users-' + ui.id + '" class="users"></ul></td></tr></table>';

                var tab_content = '<table class="room"><tr><td class="messageslist"><div id="topic-' + ui.id + '" class="announce"></div><ul id="messages-' + ui.id + '" class="messages"></ul></td>'
                + '<td class="userslist"><ul id="users-' + ui.id + '" class="users"></ul></td></tr></table>';

                $(ui.content_id).append(tab_content);
                $('#messages-' + ui.id).scroll(function(){
                    scrollMessagesHandler($(this), ui.id);
                });

                $WM.resizeChat();
            },
            select: function(ui){
                var room = ui.id;
                Room.set(room);

                var elt = $('#messages-' + room);
            
                // ne pas utiliser la fonction sinon les tabs non active ne scrollerons pas bien
                if( Room.__scrollPos[room] == Room.__scrollMax[room] || Room.__scrollPos[room] == null || Room.__scrollPos[room] == undefined) {
                    elt.scrollBottom();
                }
                else{
                    elt.scrollTop(Room.__scrollPos[room]);
                }
                scrollMessagesHandler($('#messages-' + room), room);
                $WM.resizeChat();
            },
            remove: function(ui){
                var room_id = ui.id;
                var room = Room.getRoomFromId(room_id);
                debug("trying to leave : " + room.name);
                var room_name = $('<span>' + room.name + '</span>').text();
                debug("Room_name = " + room_name);
                FormsManager.getForm('WhispsWhispsForm').sendLeaveRoom(room_name, $(Global.NickInput).val());
            }
        });
    },

    loadTabs: function(){
        $tabs = $('#tabs').tabs({
            tabTemplate: '<li><a href="#{href}"><img src="/img/smiley/cubiste.gif"/><span class="title">#{label}</span><span class="unread"></span></a><span class="ui-icon ui-icon-close">Remove Tab</span></li>',
            add: function(event, ui) {
                var tabid = ui.panel.id.replace('tabs-', '');
                var tab_content = '<table class="room"><tr><td class="messageslist"><div id="topic-' + tabid + '" class="announce"></div><ul id="messages-' + tabid + '" class="messages"></ul></td>'
                + '<td class="userslist"><ul id="users-' + tabid + '" class="users"></ul></td></tr></table>';

                $(ui.panel).append(tab_content);
                $('#messages-' + tabid).scroll(function(){
                    scrollMessagesHandler($(this), tabid);
                });

                $WM.resizeChat();
            },
            select: function(event, ui){
                var tab_id = ui.tab;
                var room = $(tab_id).attr('href').replace('#tabs-', '');
                Room.set(room);

                var elt = $('#messages-' + room);
                debug('#tabnav a[href$=' + ui.panel.id + '] strike');
                if( $('#tabnav a[href$=' + ui.panel.id + '] strike').length != 0 ){
                //$(Global.MessageInput).attr('disabled', true);
                }
                else{
            //$(Global.MessageInput).removeAttr('disabled');
            }
                
            },
            show: function(event, ui){
                var room = ui.panel.id.replace('tabs-', '');
                var elt = $('#messages-' + room);
                
                // ne pas utiliser la fonction sinon les tabs non active ne scrollerons pas bien
                if( Room.__scrollPos[room] == Room.__scrollMax[room] || Room.__scrollPos[room] == null || Room.__scrollPos[room] == undefined) {
                    elt.scrollBottom();
                }
                else{
                    elt.scrollTop(Room.__scrollPos[room]);
                }
                scrollMessagesHandler($('#messages-' + room), room);
                $WM.resizeChat();
            },
            remove: function(index){
                if( index > 1 ){
                    $tabs.tabs('select', index - 1);
                }
            //$(Global.MessageInput).removeAttr('disabled');
            }

        });
        $('#tabs span.ui-icon-close').live('click', function() {
            var li = $(this).parent();
            var room_id = $(li).find('a:eq(0)').attr('href').replace('#tabs-', '');
            var room = Room.getRoomFromId(room_id);
            debug("trying to leave : " + room.name);
            var room_name = $('<span>' + room.name + '</span>').text();
            debug("Room_name = " + room_name);
            FormsManager.getForm('WhispsWhispsForm').sendLeaveRoom(room_name, $(Global.NickInput).val());
        });


        $WM.cleanTabs($tabs);
    },

    prompt_nickname: function(){
        $WM.cleanTabs($tabs);
        if( timer != null ){
            timer.stop();
        }

        $("#auth-pwd").hide();
        $("#dialog").dialog("destroy");
        $("#dialog-form").dialog({
            modal: true,
            resizable: false,
            closeOnEscape: false,
            open: function(event, ui) {
                $(".ui-dialog-titlebar-close").hide();
            },
            buttons: {
                'Ok': function() {
                    /*var bValid = true;*/
                    var nickname = $(Global.NickPromptInput), allFields = $([]).add(nickname);
                    allFields.removeClass('ui-state-error');

                    $('#ChatterJoinForm').submit();
                }
            },
            close: false
        });
        $('#ChatterNickname').focus();
    },

    prompt_auth: function(){
        $("#auth-pwd").show();
    },

    change_nickname: function(chatter_id, new_nick){
        $('#span_nickname').html(new_nick);
        $(Global.NickInput).val(new_nick);
        if( Room.activeRoom != undefined ){
            Room.activeRoom.addChatter(chatter_id, new_nick);
        }
        else{
            debug('ERROR change_nickname : room = ' + Room.activeRoom);
        }
    },

    oldHeights: {},

    resizeChat: function (force){

        var canScroll = true;
        var elt = null;
        var a_canScroll = {};


        if( Room.activeRoom != null ){
            elt = $('#messages-' + Room.activeRoom.id );
        }
        if( elt != null && elt.length > 0){
            canScroll = elt.canScroll();
        }
        else{
            elt = null;
            $('.room tr td.messageslist ul.messages').each(function(){
                a_canScroll[$(this).attr('id')] = $(this).canScroll();
            });
        }

        var heights = $WM.calcNewHeights();
        if( !force && $WM.oldHeights.chat == heights.chat && $WM.oldHeights.content == heights.content ){
            return;
        }
        $WM.oldHeights = heights;
        $('.room tr td.messageslist').children().each(function(){
            if( $(this).context.nodeName == "UL"){
                $(this).height(heights.chat);
            }
        });
        $('.room tr td.userslist').children().each(function(){
            $(this).height(heights.users);
        });
        /*$('.room tr td.messageslist').each(function(){
            $(this).height(heights.chat);
        });
        $('.room tr td.userslist').each(function(){
            $(this).height(heights.users);
        });*/

        if( canScroll ){
            if( elt != null ){
                if( Global.append ){
                    elt.scrollBottom();
                }
                else{
                    elt.scrollTop(0);
                }
            }
            else{
                debug('ACTIVE ROOM IS NULL');
                $('.room tr td.messageslist ul.messages').each(function(){
                    if( a_canScroll[$(this).attr('id')] != undefined && a_canScroll[$(this).attr('id')] ){
                        if( Global.append ){
                            $(this).scrollBottom();
                        }
                        else{
                            elt.scrollTop(0);
                        }
                    }
                });
            }
            
        }
    },

    calcNewHeights: function(){
        var heights = {
            'chat': $(window).height(),
            'users': $(window).height(),
            'content': $(window).height()
        }

        
        //debug("window = " + h);

        heights.chat -= $('#headers').outerHeight(true);
        
        //heights.content -= $('#headers').outerHeight(true);

        heights.chat -= $('#iDebug').outerHeight(true);
        //heights.content -= $('#iDebug').outerHeight(true);
        
        heights.chat -= $('#tabs ul.ui-tabs-nav').outerHeight(true);
        //heights.chat -= $('#w_tabsnav').outerHeight(true);
        heights.chat -= $('div.form').outerHeight(true);

        if( $('#iDebug').height() == 0 ){
            heights.chat -= $('#footers').outerHeight(true);
            heights.chat += 12;
        }
        else{
            heights.chat -= 10;
            heights.chat += 6;
        }
        //heights.content -= $('#footers').outerHeight(true);
        //heights.content -= $('#iAjax').outerHeight(true);
        //heights.content -= $('#iAjax2').outerHeight(true);

        heights.chat -= 6;
        heights.users = heights.chat;
        if( Room.activeRoom && Room.activeRoom.topic != ''){
            //heights.chat -= $('#tabs td.messageslist div.announce').outerHeight(true);
            heights.chat -= $('#topic-' + Room.activeRoom.id).outerHeight(true);
            heights.chat += 3;
        }

        return heights;
    },

    hideFormNotice: function(){
        $('#formNotice').html("");
        $(Global.MessageInput).removeClass('ui-state-error');
        $('#formNotice').hide();
        $('#formNotice').height(0);
        $WM.resizeChat();
    },

    cmdNotice: function(message){
        debug('CMD NOTICE: ' + xmlentities(message));
        $('#formNotice').html( $('<div class="ui-state-error-text"><span class="ui-state-hightlight">' + message + '</span></div>') );
        $('#formNotice').show();
        $WM.resizeChat();
        setTimeout($WM.hideFormNotice, 6000);
    },

    cmdError: function(message){
        debug('CMD ERROR:' + xmlentities(message));
        $(Global.MessageInput).addClass('ui-state-error');
        $('#formNotice').html( $('<div class="ui-state-error-text"><span class="ui-icon ui-icon-alert">!</span>' + message + '</div>') );
        $('#formNotice').show();
        $WM.resizeChat();
        setTimeout($WM.hideFormNotice, 6000);
    },

    smileys: function(){
        var caret = $(Global.MessageInput).caret();
        var inputText = $(Global.MessageInput).val();
        var startText = inputText.substr(0, caret.start);
        var endText = inputText.substr(caret.end);

        var sml = ' ' + $(this).attr('title') + ' ';
        debug("sml = " + sml);
        
        $(Global.MessageInput).val(startText + sml + endText);
        $(Global.MessageInput).focus();
    },

    showSmileysBar: function(){
        Cookie.set('display_smileys', true);
        $('#tr_smileys').show();
        $('#smiley_hide').show();
        $('#smiley_show').hide();
        $WM.resizeChat(true);
    },

    hideSmileysBar: function(){
        Cookie.set('display_smileys', false);
        $('#tr_smileys').hide();
        $('#smiley_show').show();
        $('#smiley_hide').hide();
        $WM.resizeChat(true);
    }
};

var MessageInputHandler = {
    autocomplete_keys: [Global.KEY.TAB],

    exec: function(event){
        var code = event.charCode ? event.charCode : event.keyCode ? event.keyCode : event.which;
        if( jQuery.inArray(code, MessageInputHandler.autocomplete_keys) >= 0 ){
            Autocompletor.complete(Global.MessageInput);
            History.reset();
            return false;
        }
        else if( code == Global.KEY.UP ){
            return History.history(1);
        }
        else if( code == Global.KEY.DOWN ){
            return History.history(-1);
        }
        else if( event.ctrlKey && code == Global.KEY.U ){
            $(Global.MessageInput).val('');
        }
        else{
            History.reset();
            Autocompletor.reset();
        }

        

        return true;
    }
};
