
var Updater = {
    __url: "/whisps/ajax",
    __dataType: "xml",
    __type: "POST",
    __todo: [],
    __lastUpdate: new Date(),

    update: function(callback){
        var start = new Date();

        //debug( "lastUpdate : " + (start.getTime() - Updater.__lastUpdate.getTime()) + "ms");
        $.ajax({
            cache: false,
            type: Updater.__type,
            url: Updater.__url,
            dataType: Updater.__dataType,
            data: {
                data: {
                    'history': ($firstLoad == 1)
                }
            },
            async: true,
            success: function(res) {

                var xml = $(res).find('response');
                $(xml).attr('parse_id', start.getTime() );
                $(xml).attr('id', 'u' + $(xml).attr('id'));
                Updater.parse(xml, 'success', res);

                var xmlstring = res;
                if( Updater.__dataType == 'xml'){
                    xmlstring = xmlToString(res) ;
                }
                $('#iAjax').html( xmlentities(xmlstring) );

                if( $firstLoad == 1 ){
                    //$('#iAjax2').html( xmlentities(xmlstring) );
                    $WM.resizeChat();
                    
                    var room_name = $(Global.RoomInput).attr('value');
                    var room = Room.getRoomFromName(room_name);
                    debug("FIRST LOAD: " + room_name + '=>' + room);
                    if( room != undefined){
                        if( Global.append ){
                            $('#messages-' + room.id).scrollBottom();
                        }
                        else{
                            $('#messages-' + room.id).scrollTop(0);
                        }
                    }
                }
                $firstLoad = 0;
                $('#ping').html((new Date().getTime() - start.getTime()) + 'ms');
                if( callback != undefined){
                    callback();
                }
                Updater.__lastUpdate = new Date();
            },
            error: function(xml, serror, ex){
                if( timer != null ){
                    timer.start();
                }
                $WM.ajaxError('#iAjax2', "UPDATER", xml, serror, ex, true);
                debug('UPDATE ERROR = ' + xml + ":" + serror + "=>" + ex);
            }
        });
    },
    parse: function(xml, from){
        return Updater.parseXML(xml, from);
    },
    parseXML: function(xml, from, res){

        if( $lockUpdate == 0){
            $lockUpdate = 1;

            var response_id = $(xml).attr('id');
            var parse_id = $(xml).attr('parse_id');
            if( !response_id || !parse_id ){
                var xmlstring = res;
                if( Updater.__dataType == 'xml'){
                    xmlstring = xmlToString(res) ;
                }
                $('#iAjax2').append('FROM =' + from +'<br/>');
                $('#iAjax2').append( xmlentities(xmlstring) );
            }
            response_id = from + '_' + response_id + '_' + parse_id;

            $(xml).find('debugs').find('debug').each(function(){
                //$('#iAjax2').prepend( $(this).text() + '<br>');
                debug('UPDATER[debug]:' + $(this).text());
            });

            $(xml).find('json').find('script').each(function(){
                try{
                    eval( $(this).text() );
                }
                catch(e){
                    debug("[" + xmlentities($(this).text()) + ']:' + e);
                }
            });

            $(xml).find('rooms').find('room').each(function(){
                var room = $(this, xml);
                var room_id = room.find('infos').find('id').text();
                var room_name = room.find('infos').find('name').text();
                var room_title = room.find('infos').find('title').text();
                var room_topic = room.find('infos').find('topic').text();

                var room_obj = Room.add(room_id, room_name, room_title);
                room_obj.setTopic(room_topic);

                room.find('messages').find('message').each(function(){
                    var msg_id = $(this).attr('id');
                    if( $('#' + msg_id).length == 0 ){
                        room_obj.addMessage(msg_id, $(this).text(), undefined, response_id);
                    }
                });

                Updater.addChatters(room, room_obj);
            });

            for( var i in Updater.__todo){
                eval(Updater.__todo[i]);
            }
            Updater.__todo = [];

            $lockUpdate = 0;
        }
        else{
            debug("LOCK FOOND");
            $(xml).attr('id', 't_' + $(xml).attr('id'));
            setTimeout(function(){
                Updater.parse(xml, 'timeout', res);
                }, 100);
        }
    },

    addChatters: function(room_xml, room_obj){
        var room_name = room_obj.name;
        //var chatters = [];
        var chatters = {};
        var i = 0;
        room_xml.find('chatters').find('chatter').each(function(){
            var id = $(this).attr('id');
            var html = $(this).text();

            chatters[id] = true;
            room_obj.addChatter(id, html);
        });

        var ul_id = Room.buildId(room_obj.id, true) + ' .users';

        $(ul_id).find('li').each(function(){
            var chatter = $(this).text();
            var chatter_id = $(this).attr('id').replace('chatter_' + room_obj.id + '_', '');

            if( chatters[chatter_id] == undefined){
                debug("Removing chatter : " + room_name + " -> " + chatter);
                room_obj.removeChatter(chatter_id);
            }
        });
    },

    addTodo: function(task){
        Updater.__todo[ Updater.__todo.length ] = task;
    },

    toLambda: function(){
        return function(){
            Updater.update();
        }
    }
};
