/**
* DashCoincoin
* Developed and designed by Thenon David
* www.sveetch.biz
* 
* Parser wrapper
*/

/*
Interface d'accès aux méthodes du parser
*/
tribuneParser = {
    // Identifiant dans la liste des parsers
    format_id : false,
    // Format de données pour les réponses de POST 
    // avec jQuery.ajax.options.dataType
    dataType : false,
    // Objet du parser de backend commun
    parser : false,
    // Objet du parser de backend pour les réponses aux POST
    post_parser : null,
    // Position du switch [row1|row2] en cours
    actual_post_row : 1,
    
    /*
    *  Change le switch de position [row1|row2] en cours à la position suivante
    */
    nextRowSequence : function() {
        if(this.actual_post_row == 1){
            this.actual_post_row = 2;
        }else{
            this.actual_post_row = 1;
        }
    },
    
    /*
    * Réinitialise le format sur un nouvel id
    */
    set_format : function() {
        this.format_id = wrapPreference.getPref("tribune_parser");
        this.post_format_id = wrapPreference.getPref("tribune_post_response");
        
        if(DEBUG) console.log("set_format> With format_id '"+this.format_id+"' and post_format '"+this.post_format_id+"'");
        
        this.dataType = PARSER_TYPES[ this.format_id ][0];
        
        this.parser = eval("Tribune_"+ this.format_id +"_Parser");
        
        if (this.post_format_id.length > 0) {
            this.post_parser = eval("Tribune_"+ this.post_format_id +"_Parser");
        } else {
            this.post_parser = null;
        }
    },
    
    /*
    * Renvoi le datatype approprié selon la méthode de requete et les options 
    * de config
    */
    get_dataType_response : function(post_method) {
        if(typeof(post_method) == "undefined" && !post_method){
            // Méthode GET, renvoi directement le datatype standard
            return this.dataType;
        } else {
            // Méthode POST, selon l'option de config, on renvoi un datatype 
            // vide pour les cas ou on se fout de la réponse, ou pas
            if(this.post_format_id != "") {
                // Renvoi le dataType du format configuré pour les réponses 
                // de POST
                return PARSER_TYPES[ this.post_format_id ][0];
            } else {
                return null;
            }
        }
    },
    
    /*
    * Parse le backend dans le format prédéfini
    */
    get_last_post_id_arg : function(post_id) {
        return wrapPreference.getPref("tribune_lastid_arg").replace("%s", post_id);
    },
    
    /*
    * Parse le backend dans le format prédéfini
    */
    get_backend : function(backend) {
        if(DEBUG) console.log("get_backend> Parsing GET response");
        if(this.parser) {
            var b = this.parser.get_backend(backend);
            return b;
        }
        return null;
    },
    
    /*
    * Parse le backend renvoyé après un POST
    */
    get_post_backend : function(backend) {
        if(DEBUG) console.log("get_post_backend> Parsing POST response");
        if(this.post_parser != null) {
            var b = this.post_parser.get_backend(backend);
            return b;
        }
        return null;
    },
    
    /*
    * Parse le backend d'horloges hors historique dans le format prédéfini
    */
    get_clocks_backend : function(backend, clockstamp, node) {
        if(DEBUG) console.log("get_clocks_backend() for "+this.format_id+" started");
        items = '';
        var postList = backend['data']['postList'];
        // Test si le resultat de la requete est pas vide
        if( postList.length > 0 ) {
            // On mappe la liste du backend sur une liste html mise en forme
            $.each( postList.slice(0, 3), function(i, n){
                // Rajoute le post html à la liste
                var supClass = 'row';
                if (i+1 == postList.length) {
                    supClass += ' last';
                }
                items += tribuneParser.postObjetToHtml(i, n, 'div', supClass);
            });
            OUTTED_CLOCKREF[clockstamp] = items;
            displayAbsolutePost(node, items);
        } else {
            OUTTED_CLOCKREF[clockstamp] = false;
        }
    },
    
    /*
    * Retrouve le timestamp d'un message qui est à une position fixe dans 
    * l'attribut @class de sa ligne
    */
    get_timestamp_from_class : function(css_class) {
        var foo = css_class.split(' ');
        for (var value in foo) {
            if(foo[value].substr(0,2)=='ts') {
                return foo[value].substr(2); 
            }
        }
    },
    
    /*
    *  Ajoute un datestamp à la liste de ceux du registre d'une horloge, si l'horloge 
    *  existait pas déja dans le registre, on l'y créé et on initialise sa liste avec le 
    *  datestamp
    */
    set_timestamp_registry_list : function(registry, datestamp) {
        if( registry && registry.length > 0 ) {
            if( $.inArray( datestamp, registry )<0 ){
                registry.push(datestamp);
            }
        } else {
            registry = [datestamp];
        }
        return registry;
    },
    
    /*
    *  Transformation de l'objet d'un message en html
    */
    postObjetToHtml : function(key, postObject, rootElement, forceClass) {
        var i_row = this.actual_post_row;
        this.nextRowSequence();
        
        // Attributs html à vides
        var clock_events = '';
        var refclocksclass = 'horloge';
        var supclass = '';
        var clock_indice = '';
        var clock_cale = '';
        
        // Identité selon anonyme ou pas
        if( postObject['is_anonymous'] ){
            var identity = '<span class="ua_login" title="'+ postObject['ua'] +'">'+ postObject['truncated_ua'] +'</span>';
        } else {
            var identity = '<span class="login" title="'+ postObject['ua'] +'">'+ postObject['sender'] +'</span>';
            // Marque l'horloge de référence si elle appartient à l'utilisateur
            if( postObject['sender'] == wrapPreference.getPref("username") ) {
                refclocksclass += ' mine';
            }
        }
        
        // Gestion des "moules-broadcast" ou d'appel d'un utilisateur particulier
        if( postObject['text'].toLowerCase().search(/moules&lt;/) != -1 || postObject['text'].toLowerCase().search(/moules&#60;/) != -1 ){
            supclass += 'ui_usercast ';
        } else if ( wrapPreference.getPref("username") && ( postObject['text'].toLowerCase().search( new RegExp(wrapPreference.getPref("username")+"&#60;") ) != -1 || postObject['text'].toLowerCase().search( new RegExp(wrapPreference.getPref("username")+"&lt;") ) != -1 ) ){
            supclass += 'ui_usercast ';
        }
        
        // Classes CSS injectés
        if(forceClass) {
            supclass += forceClass;
        } else {
            supclass += 'row'+ i_row;
        }
        
        // Indice d'horloge
        if(postObject['clock_indice'] > 1) {
            clock_indice = '<sup>'+ postObject['clock_indice'] +'</sup>';
        } else {
            clock_cale = '&nbsp;';
        }
        
        // Rajoute le html à la liste
        return '<'+ rootElement +' class="ts'+ postObject['timestamp'] +' item'+ postObject['clockclass'] + ' ' + supclass +'" rel="'+ postObject['pk'] +'">'+
            '<span class="'+ refclocksclass +'"'+ clock_events +'>'+ postObject['clock'] + clock_indice +'</span>'+ clock_cale +
            identity +
            '<span class="post_content">'+ postObject['text'] +'</span>'+
        '</'+ rootElement +'>';
    },

    /*
    * Attache les évènements sur les objets contenus dans le message (lien, 
    * horloges, smileys..) qui a déja été ajouté au DOM
    */
    attach_message_events : function(postObject, light_mode) {
        // Sélécteur de la ligne du post
        var itemSelector = "li[rel='"+ postObject['pk'] +"']";
        
        // Initialise les évènements de l'horloge de référence de la
        // ligne du post
        if( !light_mode ){
            var itemClockRefSelector = itemSelector + " span.horloge";
            $( itemClockRefSelector ).mouseover( function() {
                ReferenceClockManipulator.mouseover( $(this) );
            } );
            $( itemClockRefSelector ).mouseout( function() {
                ReferenceClockManipulator.mouseout( $(this) );
            } );
            $( itemClockRefSelector ).click( function() {
                ReferenceClockManipulator.click( $(this) );
            } );
        }
        
        // Active l'ouverture des urls dans une nouvelle fenêtre
        $( itemSelector + " a" ).click( function() {
            return controledOpenURL( $(this).attr("href") );
        } );
        
        // Initialise les évènements des horloges référantes contenus 
        // dans le post
        var itemClockPointerSelector = itemSelector + " span.horloge_ref";
        $( itemClockPointerSelector ).each( function(i){
            // Vérifie si la référence correspond à une réponse d'un post 
            // appartenant à l'utilisateur courant 
            var top_parent_li = $(this).parents("li[class^='ts']");
            var ts = tribuneParser.get_timestamp_from_class( top_parent_li.attr('class') );
            if(ts) {
                var datesamp = ClockstampManipulator.get_date(ts);
                var bar = USER_POSTS_CLOCK[ClockIndicer.indice_to_number($(this).text())];
                if(bar && $.inArray( datesamp, bar)>-1) {
                    // Grossie l'horloge
                    $(this).addClass("ui_userclockref");
                    // Rajoute la class css qui va bien
                    if( top_parent_li.hasClass("ui_postresponse") != true && postObject['sender'] != wrapPreference.getPref("username")){
                        top_parent_li.addClass("ui_postresponse");
                    }
                }
                // Evènements de survol
                $( $(this) ).mouseover( function() {
                    PointerClockManipulator.mouseover( $(this) );
                } );
                $( $(this) ).mouseout( function() {
                    PointerClockManipulator.mouseout( $(this) );
                } );
            }
        });
        
        // Récupère les smileys potentiels pour leur évènements
        if(SHOW_SMILEYS){
            var itemSmileysSelector = itemSelector + " a.smiley,"+ itemSelector + " a.totoz";
            $( itemSmileysSelector ).mouseover( function() {
                toggleSmiley( $(this) );
            } );
            $( itemSmileysSelector ).mouseout( function() {
                toggleSmiley( $(this) );
            } );
        }
    }
};

