/**
** Gestion du refresh, des posts et méthodes diverses
** ________________________________________
**/

/*
*  Récupère le backend et met à jour la liste des messages
*/
function get_TribuneBackend() {
    // Url du backend
    var remote_url = wrapPreference.getPref("tribune_root_url") + wrapPreference.getPref("tribune_backend_path");
    // Rajoute le dernier id des messages dans l'historique pour ne recevoir 
    // que les posts depuis ce dernier id
    var postList = $("#tribune_list ul li");
    if( postList.length > 0 ){
        remote_url += tribuneParser.get_last_post_id_arg( postList.slice(-1).attr("rel") );
    }
    if(DEBUG) console.log("Backend url: "+remote_url);
    // Configuration et lancement de la requete
    $.ajax({
        type: "GET",
        global: false,
        dataType: tribuneParser.get_dataType_response(),
        url: remote_url,
        data: {"nocache": (new Date()).getTime()},
        beforeSend: function(req){
            $("#ui_load_animation").show();
            req.setRequestHeader("User-Agent", wrapPreference.getPref("user-agent"))
        },
        success: function (data, textStatus) {
            if(DEBUG) console.log("get_TribuneBackend> Request textStatus: "+textStatus);
            tribuneParser.get_backend(data);
            $("#ui_load_animation").hide();
            if( $("#ui_load_error").css('display') != 'none' ) {
                $("#ui_load_error").hide();
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){
            if(DEBUG) console.log("get_TribuneBackend> Error request textStatus: "+textStatus);
            if(DEBUG) console.log("get_TribuneBackend> Error request errorThrown: "+textStatus);
            EXCEPTIONS_TRIBUNE_COUNT += 1
            $("#ui_load_animation").hide();
            $("#ui_load_error").show();
        }
    });
    // Rappel dans (X)ms
    refreshTimer.setTimer( "backend", 'get_TribuneBackend()', wrapPreference.getPref("refresh_time_shifting") );
}

/**
*  Gestion de l'envoi d'un message par le champs de missive
*/
function handle_postSubmit() {
    // Url de réception des données
    var post_url = wrapPreference.getPref("tribune_root_url") + wrapPreference.getPref("tribune_post_path");
    // Id du parser séléctionné pour accéder à ses attributs
    var parser_id = wrapPreference.getPref("tribune_parser");
    // Contenu de l'input du message
    var post_value = $("#id_content").val();
    // Input du captcha optionnel
    var captcha_elem = $('#'+wrapPreference.getPref("captcha_input_id"));
    
    if( post_value.length > 1 && !HACKBLOCKSTUPIDKONQUEROR ){
        // Retrouve l'id du dernier message de la liste récupérée par l'user
        var postList = $("#tribune_list ul li");
        if( postList.length > 0 ){
            post_url += tribuneParser.get_last_post_id_arg( postList.slice(-1).attr("rel") );
        }
        if(DEBUG) console.log("handle_postSubmit> Post url: "+post_url);
        
        // Stop le refresh si il est activé
        if( $("#ui_postreload_trigger").attr("checked") ){
            refreshTimer.stopTimer( "backend" );
        }
        
        // Forme l'objet de la requête POST à transmettre
        if(DEBUG) console.log("handle_postSubmit> Message ID: "+wrapPreference.getPref("tribune_message_id"));
        var dataObject = {};
        var dataType = tribuneParser.get_dataType_response(true);
        dataObject[wrapPreference.getPref("tribune_message_id")] = post_value;
        // Si le formulaire contient un champs de captcha, on le passe dans 
        // la requête
        if ( captcha_elem.length ) {
            dataObject[wrapPreference.getPref("captcha_input_name")] = [$('#'+wrapPreference.getPref("captcha_hidden_id")).val(), captcha_elem.val()];
        }
        
        // Envoi le message au serveur
        $.ajax({
            type: "POST",
            global: false,
            dataType: dataType,
            url: post_url,
            data: dataObject,
            beforeSend: function(req){
                //req.setRequestHeader("User-Agent", "téléphone ß mâçon");
                $('#id_content').css('background-color', '#C0C0C0');
            },
            success: function (data, textStatus) {
                if(DEBUG) console.log("handle_postSubmit> Success request textStatus: "+textStatus);
                $('#id_content').css('background-color', '#FFFFFF');
                
                if(dataType != null) {
                    // Si on a un dataType on l'utilise pour lire la réponse 
                    // qui contient un backend d'update
                    if(DEBUG) console.log("handle_postSubmit> Getting response POST request");
                    tribuneParser.get_post_backend(data);
                    if( $("#ui_postreload_trigger").attr("checked") ){
                        refreshTimer.setTimer( "backend", 'get_TribuneBackend()', wrapPreference.getPref("refresh_time_shifting") );
                    }
                } else {
                    // Pas de dataType, donc on ne lit pas la réponse et on 
                    // va récupérer à la main l'update, en prenant soin de 
                    // couper le timer pour pas avoir plusieurs update qui 
                    // se chevauchent
                    if(DEBUG) console.log("handle_postSubmit> Passing response POST request and refresh backend");
                    refreshTimer.stopTimer( "backend" );
                    get_TribuneBackend();
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                EXCEPTIONS_TRIBUNE_COUNT += 2;
                $('#id_content').css('background-color', '#FF7373');
                if(DEBUG) console.log("handle_postSubmit> Error request textStatus: "+textStatus);
                if(DEBUG) console.log("handle_postSubmit> Error request errorThrown: "+textStatus);
            },
            complete: function (XMLHttpRequest, textStatus) {
                if( XMLHttpRequest.getResponseHeader("X-Post-Controlled") == 'False' ) {
                    CaptchaFormManipulator(XMLHttpRequest.getResponseHeader("X-Control-Key"), XMLHttpRequest.getResponseHeader("X-Control-Image"));
                } else if ( XMLHttpRequest.getResponseHeader("X-Post-Controlled") == 'True' ) {
                    $('#'+wrapPreference.getPref("captcha_container_id")).remove();
                }
            }
        });
    }
    // Vide le(s) input(s)
    $("#id_content").val("");
    if ( captcha_elem.length ) {
        captcha_elem.val("");
    }
}

/*
* Manipulateur du html du formulaire de Captcha
*/
function CaptchaFormManipulator(capcha_key, captcha_image) {
    // Update du formulaire
    if($('#'+wrapPreference.getPref("captcha_container_id")).length ){
        $('#'+wrapPreference.getPref("captcha_hidden_id")).val( 'captcha.'+capcha_key );
        $('#'+wrapPreference.getPref("captcha_img_id")).attr( 'src', captcha_image );
    // Insertion du formulaire si il n'existe pas
    } else {
        $('#'+wrapPreference.getPref("tribune_form_id")).prepend('<div id="'+wrapPreference.getPref("captcha_container_id")+'" class="ui-state-error ui-corner-all">'+
        '<p><span class="ui-icon ui-icon-alert"></span><strong>Vous venez d\'ouvrir une nouvelle session anonyme, indiquez le texte que vous voyez dans l\'image ci-dessous pour pouvoir poster un message</strong></p><div class="cale"></div>'+
        '<input type="hidden" value="captcha.'+ capcha_key +'" name="'+wrapPreference.getPref("captcha_input_name")+'" id="'+wrapPreference.getPref("captcha_hidden_id")+'"/>'+
        '<img class="control_img_id" alt="" src="'+ captcha_image +'" id="'+wrapPreference.getPref("captcha_img_id")+'"/>'+
        '<input type="text" class="control_text_id text" id="'+wrapPreference.getPref("captcha_input_id")+'" name="'+wrapPreference.getPref("captcha_input_name")+'"/>'+
        '<p>Une fois rempli correctement, vous ne reverrez plus ce message tant que votre navigateur conservera votre cookie de session</p></div>');
    }
}

/*
* Switch d'affichage d'un smiley en cadre flottant à partir du pointeur de la 
* souris
*/
function toggleSmiley(node) {
    // Si le cadre flottant n'est pas déja affiché, on le rempli, on le 
    // positionne et on l'affiche
    if( $('#'+ID_CONTAINER_SMILEY).css('display') == 'none' ){
        var top_pos = (node.offset()['top']+15);
        var left_pos = (node.offset()['left']+15);
        var smiley_url = node.attr("href");
        var i = smiley_url.lastIndexOf("/");
        smiley_url = wrapPreference.getPref("smileys_host_url") + smiley_url.substr(i+1);
        var item = "<p><img src=\""+ smiley_url +"\" alt=\""+ node.text() +"\"/>"+"</p>";
        if(DASHCOINCOIN_IN_WIDGET){
            if( top_pos > (TRIBUNE_HEIGHT/2)) {
                // Afficher en haut
                var foo = ((TRIBUNE_HEIGHT-top_pos)+50);
                $('#'+ID_CONTAINER_SMILEY).html( item ).css("position","absolute").css("top", "auto").css("bottom", foo+"px").css("left", left_pos+"px").show();
            } else {
                // Afficher en bas
                $('#'+ID_CONTAINER_SMILEY).html( item ).css("position","absolute").css("bottom", "auto").css("top", top_pos+"px").css("left", left_pos+"px").show();
            }
        }else{
            $('#'+ID_CONTAINER_SMILEY).html( item ).css("position","absolute").css("top", top_pos+"px").css("left", left_pos+"px").show();
        }
    
    // Si le cadre flottant est déja affiché, on le cache
    } else {
        $('#'+ID_CONTAINER_SMILEY).hide();
    }
}

/*
* Affiche le DOM renvoyé des messages ciblés dans un conteneur en 
* position absolue
*
* @node: le noeud DOM de l'horloge référente (celle survolée pas celle visée)
* @html: string contenant le html du post ciblé par l'horloge référente
*/
function displayAbsolutePost(node, html) {
    // Ajoute le html tout de suite
    $('#'+ID_CONTAINER_CLOCKREF).html( html );
    
    // Affichage en haut ou en bas selon la position de l'horloge référante
    var screen_top_offset = safePageYOffset();
    // Offset bas du container en absolus des posts
    var container_final_height = screen_top_offset + $('#'+ID_CONTAINER_CLOCKREF).height() + (ABSOLUTE_POST_VERTICAL_MARGIN*2);
    // Si l'horloge est hors des coordonnées verticales que va remplir le post 
    // absolu, on peut l'afficher en haut de l'écran, sinon on l'affiche en bas
    if( $(node).position()['top'] > container_final_height) {
        //affiche en haut
        $('#'+ID_CONTAINER_CLOCKREF).css("top",ABSOLUTE_POST_VERTICAL_MARGIN+"px").css("bottom","auto").show();
    } else {
        //affiche en bas
        $('#'+ID_CONTAINER_CLOCKREF).css("bottom",ABSOLUTE_POST_VERTICAL_MARGIN+"px").css("top","auto").show();
    }
}

/*
* Met le focus et ajoute un texte dans un Input à la position définie, si la 
* position n'est pas spécifié il sera mis à la fin du texte de l'input.
*/
function insertTextAtCursor(node, text_value, pos) {
    element = node[0];
    if (!pos) {
        pos = text_value.length;
    }
    // Réservé à IE en théorie
    // Ce n'est probablement pas le support à tester qui soit le plus 
    // judicieux mais j'ai rien de trouver de mieux.
    if(jQuery.support.style){
        var selectionEnd = element.selectionStart + pos;
        element.value = element.value.substring(0, element.selectionStart) + text_value +
                        element.value.substr(element.selectionEnd);
        element.focus();
        element.setSelectionRange(selectionEnd, selectionEnd);
    } else {
        element.focus();
        var textRange = document.selection.createRange();
        textRange.text = text_value;
        textRange.moveStart("character", +pos);
        textRange.moveEnd("character", +pos);
    }
}

/*
* Ouvre les liens dans une nouvelle fenêtre si l'option est activée, sinon 
* laisse le navigateur se débrouiller
*/
function controledOpenURL(url) {
    if( wrapPreference.getPref("tribune_urlopen_blank") ){
        widget.openURL( url );
        return false;
    }
    return true;
}

/*
* Méthode de récupération de la position du scroll d'une facon compatible pour 
* IE
*/
function safePageYOffset() {
    return window.pageYOffset || document.documentElement && document.documentElement.scrollTop ||  document.body.scrollTop;
}