/**
** 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) {
        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 + " ");
    },
    
    /*
    / Assigne une valeure à une clé des préférences
    */
    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 +")");
            // if(clockList.length == 0){
            //  clockList = $('#tribune_list ul .horloge_ref').filter(":contains("+ clock.substr(0,5) +")");
            // }
            clockList.parent().parent().addClass("ui_clock_highlight_2");
        }
    },
    
    /*
    / Assigne une valeure à une clé des préférences
    */
    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 +")");
            // if(clockList.length == 0){
            //  clockList = $('#tribune_list ul .horloge_ref').filter(":contains("+ clock.substr(0,5) +")");
            // }
            clockList.parent().parent().removeClass("ui_clock_highlight_2");
        }
    }
};


/*
* Manipulateur des horloges référantes
*/
PointerClockManipulator = {
    /*
    / 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
        if( !$(node).hasClass("ui_clock_highlight_2") ) {
            $(node).addClass("ui_clock_highlight_2");
        }
        
        // 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){
            if( !$(this).hasClass("ui_clock_highlight_2") ) {
                $(this).addClass("ui_clock_highlight_2");
            }
        });
        
        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(timestamp) {
        return timestamp.substr(8,2)+":"+timestamp.substr(10,2)+":"+timestamp.substr(12,2);
    },
    
    /*
    / Renvoi un nom de classe composé d'une horloge sans les : à partir d'un 
    / timestamp complet
    */ 
    convert_to_clockclass : function(timestamp) {
        return timestamp.substr(8,6);
    },

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