/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
function Messages() {

    this.regional = [];

    // Variable de l'objet messages
    var pageSize;
    var toDisplay;

    // Elements XHTML du composant messages
    var messagesListe;
    var pagerLinks;

    // Variables calculé
    var nbPages;
    var nbMessages;
    var currentPage;
    var nbPagerLinks;


    // Fonctions de l'objet messages

    this.initialize = function() {
        /* Activation de la pagination des messages */
        // Initialisation des variables globales
        messagesListe = $("*[data-o-role='messages-list'] > div");
        pageSize = parseInt($("*[data-o-role='messages-list']").attr("data-o-pagesize"));
        nbMessages = $("*[data-o-role='messages-list'] > div").length;
        toDisplay = $("*[data-o-role='messages-list']").attr("data-o-todisplay")

        if (toDisplay == "true") {

            if (pageSize != 0 && nbMessages > pageSize) {
                // Calcul du nombre de pages
                nbPages = 0;
                if (pageSize == 0) {
                    nbPages = 1;
                } else {
                    nbPages = parseInt(nbMessages / pageSize);
                    if (nbMessages % pageSize != 0) {
                        nbPages++;
                    }
                }

                // On generation du XHTML du pager
                orion.messages.initPager();

                // On pagine
                orion.messages.paginate();
            } else {
                $("*[data-o-role='messages-pager']").hide();
            }
            // Affichage globale de la zone messages
            $("*[data-o-role='messages']").show();
        }
        else {
            $("*[data-o-role='messages']").hide();
        }
    };

    /* Fonction de génération XHTML du Pager */
    this.initPager = function() {
        var pagerMessages =$("*[data-o-role='messages-pager']");
        if(pagerMessages.find("ul").length===0){
            // On se positionne sur la première page
            currentPage = 0;
            var htmlPager = '<ul class="pagination pagination-sm">';

            htmlPager += orion.messages.appendPagerLink("first", orion.messages.regional["orion.messages.pager.firstPage.title"], "&lt;&lt;");
            htmlPager += orion.messages.appendPagerLink("previous", orion.messages.regional["orion.messages.pager.previousPage.title"], "&lt;");
            for (var i = 1; i <= nbPages; i++) {
                htmlPager += orion.messages.appendPagerLink("goto", orion.messages.regional["orion.messages.pager.page.title"] + i, i);
            }
            htmlPager += orion.messages.appendPagerLink("next", orion.messages.regional["orion.messages.pager.nextPage.title"], "&gt;");
            htmlPager += orion.messages.appendPagerLink("last", orion.messages.regional["orion.messages.pager.lastPage.title"], "&gt;&gt;");

            htmlPager += '</ul>';
            $(htmlPager).appendTo("*[data-o-role='messages-pager']");

            // Variables liées au Pager
            pagerLinks = $("*[data-o-role='messages-pager'] li");
            nbPagerLinks = $("*[data-o-role='messages-pager'] li").length;

            // Callbacks
            var testSelector = $("*[data-o-role='messages-pager'] li[action='goto']").text();
            $("*[data-o-role='messages-pager'] li[data-o-action='first']").on("click", orion.messages.firstPage);
            $("*[data-o-role='messages-pager'] li[data-o-action='last']").on("click", orion.messages.lastPage);
            $("*[data-o-role='messages-pager'] li[data-o-action='next']").on("click", orion.messages.nextPage);
            $("*[data-o-role='messages-pager'] li[data-o-action='previous']").on("click", orion.messages.firstPage);
            $("*[data-o-role='messages-pager'] li[data-o-action='goto']").on("click", orion.messages.gotoPage);
        }
    };


    /* Fonction de génération du code XHTML pour un lien du Pager */
    this.appendPagerLink = function(action, title, label) {
        return '<li data-o-action="' + action + '"><a href="#" title="' + title + '">' + label + '</a></li>';
    };

    /* Fonction mutualisée de pagination */
    this.paginate = function() {

        var indexStart = currentPage * pageSize;
        var indexEnd = (currentPage + 1) * pageSize;
        // selection de tous les message de la liste        
        for (var i = 0; i < nbMessages; i++) {
            if (i >= indexStart && i < indexEnd) {
                $(messagesListe[i]).show();
            } else {
                $(messagesListe[i]).hide();
            }
        }
        // MAJ du pager
        orion.messages.updatePager();
    };

    /* Gestion de la page precedente */
    this.previousPage = function() {
        currentPage = currentPage - 1;
        // On pagine
        orion.messages.paginate();
    };

    /* Gestion de la page suivante */
    this.nextPage = function() {
        currentPage = currentPage + 1;
        // On pagine
        orion.messages.paginate();
    };

    /* Gestion de la premiere page */
    this.firstPage = function() {
        currentPage = 0;
        // On pagine
        orion.messages.paginate();
    };

    /* Gestion de la derniere page */
    this.lastPage = function() {
        currentPage = nbPages - 1;
        // On pagine
        orion.messages.paginate();
    };

    /* Gestion de la page suivante */
    this.gotoPage = function() {
        var page = parseInt($(this).text());
        currentPage = page - 1;
        // On pagine
        orion.messages.paginate();
    };

    /* Mise a jour des boutons du pager */
    this.updatePager = function() {
        for (var i = 0; i < nbPagerLinks; i++) {
            if (i < 2) {
                if (orion.messages.hasPreviousPage()) {
                    $(pagerLinks[i]).removeClass("disabled");
                } else {
                    $(pagerLinks[i]).addClass("disabled");
                }
            } else if (i >= (nbPagerLinks - 2)) {
                if (orion.messages.hasNextPage()) {
                    $(pagerLinks[i]).removeClass("disabled");
                } else {
                    $(pagerLinks[i]).addClass("disabled");
                }
            } else if ((i - 2) == currentPage) {
                $(pagerLinks[i]).addClass("active");
            } else {
                $(pagerLinks[i]).removeClass("active");
            }
        }

    };

    /* Determine si il y a une page supplémentaire */
    this.hasNextPage = function() {
        return (((currentPage + 1) * pageSize) < nbMessages);
    };

    /* Determiner si il y a une page precedente */
    this.hasPreviousPage = function() {
        return (currentPage > 0);
    };

}

orion.messages = new Messages();

$(document).ready(function() {
    orion.messages.initialize();
    orion.event.listenToAfterAjax(orion.messages.initialize);
});