/**
* 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;
        }
    },

    /*
    * 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 
            if(USER_POSTS_CLOCK[ClockIndicer.indice_to_number($(this).text())] == true) {
                // Grossie l'horloge
                $(this).addClass("ui_userclockref");
                // Rajoute la class css qui va bien
                //
                if( $(this).parent().parent().hasClass("ui_postresponse") != true && postObject['sender'] != wrapPreference.getPref("username")){
                    $(this).parent().parent().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) );
            } );
        }
    },
    
    /*
    *  HTML de l'avatar optionnel
    */
    get_avatar : function(postObject) {
        // Si l'option est activé dans DashCoincoin
        if(USE_AVATARS){
            if( postObject['is_anonymous'] ){
                // Les anonymes ont un avatar vide
                return '<div class="anonymous_vcard"></div>';
            } else {
                // Si l'user a bien un avatar
                if( typeof(postObject['avatar']) != "undefined" && postObject['avatar'] ){
                    return '<img src="'+ postObject['avatar'][0] +'" alt=""/>';
                } else {
                    // Pas d'avatar, on en met un commun
                    return '<div class="empty_vcard"></div>';
                }
            }
        }
        
        return '';
    },
    
    /*
    *  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'] +'">'+
            this.get_avatar(postObject) +
            '<span class="'+ refclocksclass +'"'+ clock_events +'>'+ postObject['clock'] + clock_indice +'</span>'+ clock_cale +
            identity +
            '<span class="post_content">'+ postObject['text'] +'</span>'+
        '</'+ rootElement +'>';
    }
};
