/**
** Gestion et évènements des horloges
** ________________________________________
**/

/*
* Manipulateur des indices d'horloges
*/
ClockIndicer = {
    indices : '¹²³⁴⁵⁶⁷⁸⁹',
    /*
    / Parse une horloge HH:MM[:SS[i]] et renvoi un array contenant 
    / l'horloge de base et son indice le cas échéant
    */
    parse_clock : function(clock) {
        if(clock.length > 8) {
            return [clock.substr(0,8), clock.substr(8,2)];
        } else if(clock.length < 8) {
            return [clock];
        }
        return [clock, 1];
    },
    
    /*
    / Transforme une horloge 'longue' HH:MM[:SS[:ii]] en horloge à indice 
    / HH:MM[:SS[i]]
    */
    number_to_indice : function(clock) {
        clock = ClockIndicer.parse_clock(clock);
        if(clock.length>1) {
            var i = parseInt(clock[1]);
            if( i > 1 ) {
                clock[1] = ClockIndicer.indices[i-1];
            } else {
                clock[1] = '';
            }
        }
        return clock.join("");
    },
    
    /*
    / Transforme une horloge à indice HH:MM[:SS[i]] en horloge 'longue' 
    / HH:MM[:SS[:ii]]
    */
    indice_to_number : function(clock) {
        var src = clock;
        clock = ClockIndicer.parse_clock(clock);
        if(clock.length>1) {
            var i = ClockIndicer.indices.indexOf(clock[1]);
            // Cherche un indice sous forme d'exposant
            if( i > -1 ) {
                clock[1] = ClockIndicer.lpadding(i+1);
            // Cherche un indice numérique supérieur à 1
            } else if( i == -1 && clock[1] > 1) {
                clock[1] = ClockIndicer.lpadding(clock[1]);
            // Par défaut l'indice est mis à 1
            } else {
                clock[1] = '01';
            }
            if(DEBUG) console.log("INDICE_TO_NUMBER| source:"+src+" / clock_pattern:"+ClockIndicer.parse_clock(src)+" / indexof:"+i+" / Res:"+clock.join(":"));
        }
        return clock.join(":");
    },
    
    /*
    / Transforme une horloge à indice HH:MM[:SS[i]] en horloge 'longue' 
    / HH:MM[:SS[:ii]]
    / DEPRECATED: Ancienne version
    */
    past_indice_to_number : function(clock) {
        clock = ClockIndicer.parse_clock(clock);
        if(clock.length>1) {
            var i = ClockIndicer.indices.indexOf(clock[1]);
            if( i > -1 ) {
                clock[1] = ClockIndicer.lpadding(i+1);
            } else {
                clock[1] = '01';
            }
        }
        return clock.join(":");
    },
    
    /*
    / Formatte un indice d'horloge en nombre sur deux digits
    */
    lpadding : function(indice) {
        if(indice > 0 && indice < 10) {
            return '0'+indice;
        }
        return "01";
    }
};

/*
* Manipulateur des horloges de références
*/
ReferenceClockManipulator = {
    /*
    / Gestion du click sur l'horloge
    */
    click : function(node) {
        clock = ClockIndicer.number_to_indice( jQuery.trim( $(node).text() ) );
        // Fonction dédicacée pour injecter le texte sans problèmes avec IE
        insertTextAtCursor($("#id_content"), clock + " ");
    },
    
    /*
    / Survol
    */
    mouseover : function(node) {
        // Highligth de la ligne d'un post si son horloge de référence est survolée
        var clock = jQuery.trim( $(node).text() );
        if( !$(node).parent().hasClass("ui_clock_highlight_1") ) {
            $(node).parent().addClass("ui_clock_highlight_1");
            clock = ClockIndicer.number_to_indice(clock);
            // Highligth de la ligne d'un post si son horloge référente est survolée
            //var clockList = $('#tribune_list ul .horloge_ref').filter(":contains("+ clock +")");
            var clockList = $('#tribune_list ul .horloge_ref').filter(function(index) {
                if($(this).text() == clock) {
                    return true;
                }
                return false;
            });
            clockList.parents("li[class^='ts']").addClass("ui_clock_highlight_2");
        }
    },
    
    /*
    / Sortie du survol
    */
    mouseout : function(node) {
        // Highligth de la ligne d'un post si son horloge de référence est survolée
        var clock = jQuery.trim( $(node).text() );
        if( $(node).parent().hasClass("ui_clock_highlight_1") ) {
            $(node).parent().removeClass("ui_clock_highlight_1");
            clock = ClockIndicer.number_to_indice(clock);
            // Highligth de la ligne d'un post si son horloge référente est survolée
            var clockList = $('#tribune_list ul .horloge_ref').filter(":contains("+ clock +")");
            clockList.parents("li[class^='ts']").removeClass("ui_clock_highlight_2");
        }
    }
};


/*
* Manipulateur des horloges référantes
*/
PointerClockManipulator = {
    set_highlight_class : function(node) {
        if( !$(node).hasClass("ui_clock_highlight_2") ) {
            $(node).addClass("ui_clock_highlight_2");
        }
    },
    
    /*
    / Highligth de l'horloge qui pointe sur une ou des référentes
    */
    mouseover : function(node) {
        var clock_url = wrapPreference.getPref("tribune_root_url") + wrapPreference.getPref("tribune_clock_path");
        
        // Retrouve la version timestamp de l'horloge qui est utilisée dans 
        // les @class de chaque post
        var clockstamp = ClockstampManipulator.get_from_clock( 
            ClockIndicer.indice_to_number(
                jQuery.trim( $(node).text() )
            )
        );
        
        // Highlight de l'horloge référante
        PointerClockManipulator.set_highlight_class(node);
        
        // Highligth des posts contenant l'horloge pointée si ils sont présents 
        // dans le backend
        var clockList = $('#tribune_list ul .item'+clockstamp);
        // Si on a rien trouvé en standard (trois segments), on fait une tentative 
        // de recherche d'horloge pointée à deux segments
        if(clockList.length == 0){
            clockList = $("#tribune_list ul li[class*='item" +clockstamp+ "']");
        }
        
        // Highligth des posts trouvés visibles à l'écran
        clockList.each( function(i){
            PointerClockManipulator.set_highlight_class(this);
        });
        
        if( $('#'+ID_CONTAINER_CLOCKREF).css('display') == 'none' ){
            var items = '';
            // Si les horloges pointés existent bien dans le DOM courant
            if(clockList.length>0){
                // Si les horloges pointés sont en dehors de l'écran, on les 
                // affichent dans la boiboite spéciale
                // (=>Si le Haut du conteneur de la liste des postes EST SUPERIEUR au 
                // de la liste des postes)
                var screen_top_offset = safePageYOffset();
                if(screen_top_offset > clockList.offset()['top']) {
                    items = ClockstampManipulator.get_clockposts_in_backend(clockList.slice(0, 3));
                    displayAbsolutePost(node, items);
                }
            // L'horloge n'existe pas dans le DOM, on cherche dans le cache
            } else if( typeof(OUTTED_CLOCKREF[clockstamp]) != 'undefined' ) {
                if(OUTTED_CLOCKREF[clockstamp] != false){
                    items = OUTTED_CLOCKREF[clockstamp];
                    displayAbsolutePost(node, items);
                }
            // L'horloge n'existe pas dans le cache, on fait une requete 
            // pour voir si elle existe
            } else {
                clock_url = clock_url+clockstamp+"/";
                if(DEBUG) console.log("Clock url: "+clock_url);
                $.ajax({
                    type: "GET",
                    global: false,
                    dataType: tribuneParser.get_dataType_response(),
                    url: clock_url,
                    success: function (data, textStatus) {
                        if(DEBUG) console.log("Request textStatus: "+textStatus);
                        tribuneParser.get_clocks_backend(data, clockstamp, node);
                    }
                });
            }
        }
    },
    
    /*
    / Désactive le highlight lorsque la souris n'est plus sur l'horloge
    */
    mouseout : function(node) {
        // Retrouve la version timestamp de l'horloge qui est utilisée dans 
        // les @class de chaque post
        var clockstamp = ClockstampManipulator.get_from_clock( 
            ClockIndicer.indice_to_number(
                jQuery.trim( $(node).text() )
            )
        );
        // Retire le highlight de l'horloge référante
        $(node).removeClass("ui_clock_highlight_2");
        
        // Retire le highlight des posts contenant l'horloge pointée si ils sont 
        // présents dans le backend
        var clockList = $('#tribune_list ul .item' + clockstamp);
        // Si on a rien trouvé en standard (trois segments), on fait une tentative 
        // de recherche d'horloge pointée à deux segments
        if(clockList.length == 0){
            clockList = $("#tribune_list ul li[class*='item" +clockstamp+ "']");
        }
        clockList.removeClass("ui_clock_highlight_2");
        $('#'+ID_CONTAINER_CLOCKREF).hide();
    }
};

/*
* Manipulateur des horloges et timestamp
*/
ClockstampManipulator = {
    /*
    / Renvoi un timestamp HHMMSS à partir d'une horloge
    */
    get_from_clock : function(clock) {
        var sep = clock.split("#");
        if(sep.length > 1){
            return sep[0].split("/").join("") + sep[1].split(":").join("");
        } else {
            return sep[0].split(":").join("");
        }
    },
    
    /*
    / Renvoi une horloge à partir d'un timestamp complet
    */
    convert_to_clock : function(ts) {
        return ts.substr(8,2)+":"+ts.substr(10,2)+":"+ts.substr(12,2);
    },
    
    /*
    / Renvoi un nom de classe composé d'une horloge sans les : à partir d'un 
    / timestamp complet
    */ 
    convert_to_clockclass : function(ts) {
        return ts.substr(8,6);
    },

    /*
    / Sépare en deux parties : date et time
    */
    split_datetime : function(ts) {
        return [ts.substr(0,8), ts.substr(8)];
    },
    
    /*
    / Renvoi la partie du timestamp concernant la date, sans l'horloge et le reste
    */
    get_date : function(ts) {
        return this.split_datetime(ts)[0];
    },
    
    /*
    / Récupère une liste de posts et renvoi un string contenant un duplicata HTML 
    / des posts pour leur affichage séparément
    /
    / @clockList: Liste de nodes de posts
    */
    get_clockposts_in_backend : function(clockList) {
        var items = '';
        var row_class = '';
        // Met chaque message ciblé dans le highlight en absolute
        clockList.each( function(i){
            if((i+1) == clockList.length){
                row_class = ' last';
            }
            items += '<div class="row'+row_class+'">' + $(this).html() +"</div>";
        });
        return items;
    }
};

