﻿/* jQuery Paginazione plugin 1.0
 * Copyright (c) 2011 Domenico Coloni
 * $Id: jquery.paginazione.js 2011-02-01 domenico.coloni $ */

;(function($){
            
    var colonna_progressivo = "id_progressivo";
    var ui_paginate = "ui_paginate";
    var ui_paginate_show = "ui_paginate_show";
    var pagine_visibili = 0;
    var pagine_totali = 0;
    var msgs = false;
    
    $.fn.extend({
        paginazione: function(settings) {
            
            var config = { div_paginazione:                  "div_paginazione",
                           righe_per_pagina:                 "2",
                           classe_div_paginazione:           "paginazione",
                           elementi_righe:                   "TR",
                           classi_da_escludere:              "bkgIntestazione",
                           elementi_colonne:                 "TD",
                           elemento_riga:                    "TD.progressivo",
                           nascondi_numero_riga:             true,
                           elemento_contenitore_numero_riga: "",
                           classe_pagina:                    "pagina",
                           classe_pagina_attiva:             "pagina_attiva",
                           mostra_paginazione_iniziale:      true,
                           classe_mostra_paginazione:        "mostra_paginazione",
                           mostra_rimuovi_paginazione:       false,
                           messaggio_mostra:                 "[Mostra paginazione]",
                           messaggio_rimuovi:                "[Rimuovi paginazione]",
                           tutte_le_pagine:                  false,
                           inizio_fine:                      false,
                           testo_torna_all_inizio:           "<<",
                           testo_torna_alla_fine:            ">>",
                           classe_torna_all_inizio:          "prima_ultima_pagina",
                           classe_torna_alla_fine:           "prima_ultima_pagina",
                           salta_pagine:                     true,
                           valore_avanza_retrocedi:          10,
                           testo_retrocedi:                  "<",
                           testo_avanza:                     ">",
                           classe_retrocedi:                 "avanza_retrocedi_pagina",
                           classe_avanza:                    "avanza_retrocedi_pagina",
                           mostra_colonna_numero_pagina:     false,
                           classe_colonna_numero_pagina:     "",
                           testo_altre_pagine:               "...",
                           classe_altre_pagine:              "altre_pagine",
                           range_pagine_visibili:            10,
                           mostra_paginazione_sotto:         true,
                           test:                             ""
                };
            if (settings) {
                jQuery.extend(config, settings);
            }
            if (config.range_pagine_visibili / 2 == parseInt(config.range_pagine_visibili / 2)) {
                pagine_visibili = config.range_pagine_visibili / 2;
            } else {
                pagine_visibili = parseInt(config.range_pagine_visibili / 2) + 1;
            }

            if (config.test == "true") {
                msgs = true;
            } else {
                msgs = false;
            }

            return this.each(function() {

                var elemento_contenitore = $(this);

                $(elemento_contenitore).hide();
                if (config.mostra_paginazione_sotto) {
                    $(elemento_contenitore).after("<div id=\"" + config.div_paginazione + "\" class=\"" + config.classe_div_paginazione + "\"></div>");
                } else {
                    $(elemento_contenitore).before("<div id=\"" + config.div_paginazione + "\" class=\"" + config.classe_div_paginazione + "\"></div>");
                }
                $("#" + config.div_paginazione).hide();
                var mostra_colonna = "";
                if (!config.mostra_colonna_numero_pagina) {
                    mostra_colonna = " style=\"display: none\"";
                }
                var classe_colonna = config.classe_colonna_numero_pagina == "" ? "" : " " + config.classe_colonna_numero_pagina;
                var elemento_colonna = "<" + config.elementi_colonne + " id=\"" + colonna_progressivo + "_[id_colonna]\" class=\"" + ui_paginate + classe_colonna + "\"" + mostra_colonna + ">[progressivo]</" + config.elementi_colonne + ">";
                var elementi = 0;
                var indice = 1;
                $($("#" + $(elemento_contenitore).attr("id") + ">" + config.elementi_righe)).eachAsync({
                    loop: function(index, value) {
                        if (!elementoDaEscludere(value)) {
                            var elemento_numero_riga = config.elemento_contenitore_numero_riga == "" ? elementi++ : "<" + config.elemento_contenitore_numero_riga + ">" + elementi++ + "</" + config.elemento_contenitore_numero_riga + ">";
                            $(this).append(elemento_colonna.replace("[id_colonna]", indice++).replace("[progressivo]", elemento_numero_riga)).addClass(ui_paginate).hide();
                        }
                    },
                    end: function() {
                        $(elemento_contenitore).show();
                        pagine_totali = parseInt((elementi - 1)/config.righe_per_pagina) + 1;
                        var paginazione_necessaria = elementi/config.righe_per_pagina > 1;
                        
                        if (paginazione_necessaria) {
                            var i = 1;
                            var limite = pagine_totali + 1;
                            $("#" + config.div_paginazione).html("<div id=\"links_pagine\"></div>");
                            var mostra_tutte_le_pagine = "";
                            if (!config.tutte_le_pagine) {
                                mostra_tutte_le_pagine = " style=\"display: none\"";
                            }
                            $.whileAsync({
                                test: function() { return i < limite; },
                                loop: function() {
                                    $("#" + config.div_paginazione).children("DIV#links_pagine").append("<a href=\"#\" id=\"mostra_pag_" + i + "\" class=\"" + config.classe_pagina + "\"" + mostra_tutte_le_pagine + ">" + i + "</a>");
                                    i++;
                                },
                                end: function() {
                                    if (elementi) {
                                        $("#" + config.div_paginazione).children("DIV#links_pagine").prepend("<span id=\"altre_pagine_prima\" style=\"display:none;\" class=\"" + config.classe_altre_pagine + "\">" + config.testo_altre_pagine + "</span>");
                                        $("#" + config.div_paginazione).children("DIV#links_pagine").append("<span id=\"altre_pagine_dopo\" style=\"display:none;\" class=\"" + config.classe_altre_pagine + "\">" + config.testo_altre_pagine + "</span>");
                                        var retrocedi = "";
                                        var avanza = "";
                                        if (config.salta_pagine) {
                                            retrocedi = "<a href=\"#\" id=\"retrocedi_pagine\" class=\"" + config.classe_retrocedi + "\">" + config.testo_retrocedi + "</a>";
                                            avanza = "<a href=\"#\" id=\"avanza_pagine\" class=\"" + config.classe_avanza + "\">" + config.testo_avanza + "</a>";
                                        }
                                        var prima = "";
                                        var ultima = "";
                                        if (config.inizio_fine) {
                                            prima = "<a href=\"#\" id=\"vai_a_prima_pagina\" class=\"" + config.classe_torna_all_inizio + "\">" + config.testo_torna_all_inizio + "</a>";
                                            ultima = "<a href=\"#\" id=\"vai_a_ultima_pagina\" class=\"" + config.classe_torna_alla_fine + "\">" + config.testo_torna_alla_fine + "</a>";
                                        }
                                        $("#" + config.div_paginazione).children("DIV#links_pagine").html(prima + retrocedi + $("#" + config.div_paginazione).children("DIV#links_pagine").html() + avanza + ultima);
                                        $("#" + config.div_paginazione + ">DIV#links_pagine>A#vai_a_prima_pagina, #" + config.div_paginazione + ">DIV#links_pagine>A#vai_a_ultima_pagina, #" + config.div_paginazione + ">DIV#links_pagine>A#avanza_pagine, #" + config.div_paginazione + ">DIV#links_pagine>A#retrocedi_pagine").bind("click", function(e) {
                                            e.preventDefault();
                                            var elementi_bk = $($("#" + $(elemento_contenitore).attr("id") + ">" + config.elementi_righe + "." + ui_paginate)).length;
                                            var pagine_totali_bk = parseInt((elementi_bk - 1)/config.righe_per_pagina) + 1;
                                            if ($(this).attr("id") == "vai_a_prima_pagina") {
                                                impostaPagina(1, elemento_contenitore);
                                            } else if ($(this).attr("id") == "vai_a_ultima_pagina") {
                                                impostaPagina(pagine_totali_bk, elemento_contenitore);
                                            } else if ($(this).attr("id") == "avanza_pagine") {
                                                var ultima = pagine_totali_bk;
                                                var avanza = parseInt($("." + config.classe_pagina_attiva).attr("id").substring($("." + config.classe_pagina_attiva).attr("id").lastIndexOf("_") + 1)) + config.valore_avanza_retrocedi;
                                                if (avanza > ultima) {
                                                    avanza = ultima;
                                                }
                                                impostaPagina(avanza, elemento_contenitore);
                                            } else if ($(this).attr("id") == "retrocedi_pagine") {
                                                var prima = 1;
                                                var retrocedi = parseInt($("." + config.classe_pagina_attiva).attr("id").substring($("." + config.classe_pagina_attiva).attr("id").lastIndexOf("_") + 1)) - config.valore_avanza_retrocedi;
                                                if (retrocedi < prima) {
                                                    retrocedi = prima;
                                                }
                                                impostaPagina(retrocedi, elemento_contenitore);
                                            }
                                        });
                                        if (config.mostra_rimuovi_paginazione) {
                                            var messaggio = config.messaggio_rimuovi;
                                            if (config.mostra_paginazione_iniziale) {
                                                messaggio = config.messaggio_rimuovi;
                                                $("#" + config.div_paginazione).children("DIV#links_pagine").show();
                                            } else {
                                                messaggio = config.messaggio_mostra;
                                                $("#" + config.div_paginazione).children("DIV#links_pagine").hide();
                                            }
                                            $("#" + config.div_paginazione).append("<div id=\"mostraRimuoviPaginazione\" class=\"" + config.classe_mostra_paginazione + "\"><a href=\"#\">" + messaggio + "</a></div>");
                                            
                                            $("#" + config.div_paginazione + ">#mostraRimuoviPaginazione").bind("click", function(e) {
                                                e.preventDefault();
                                                var messaggio;
                                                if ($(this).children("A").html().indexOf("Rimuovi") != -1) {
                                                    mostraRimuoviPaginazione($(this), true, $("#" + config.div_paginazione));
                                                    impostaPagina(0, elemento_contenitore);
                                                } else {
                                                    mostraRimuoviPaginazione($(this), false, $("#" + config.div_paginazione));
                                                    impostaPagina(1, elemento_contenitore);
                                                }
                                            });
                                            
                                        }
                                        if (config.mostra_rimuovi_paginazione && !config.mostra_paginazione_iniziale) {
                                            impostaPagina(0, elemento_contenitore);
                                            $("#" + config.div_paginazione).children("DIV#links_pagine").hide();
                                        } else {
                                            impostaPagina(1, elemento_contenitore);
                                        }
                                    } else {
                                        $("#" + config.div_paginazione).hide();
                                    }
                                    
                                    $("#" + config.div_paginazione + ">#links_pagine A." + config.classe_pagina).eachAsync({
                                        loop: function() {
                                            $(this).bind("click", function(e) {
                                                e.preventDefault();
                                                var pagina = parseInt($(this).html());
                                                if (!$(this).hasClass(config.classe_pagina_attiva)) {
                                                    impostaPagina(pagina, elemento_contenitore);
                                                }
                                            });
                                        },
                                        end: function() {
                                            $("#" + config.div_paginazione).show();
                                        }
                                    });
                                }
                            });
                        } else {
                            $("#" + config.div_paginazione).hide();
                            impostaPagina(0, elemento_contenitore);
                        }
                    }
                });
                
            });
            
            function mostraRimuoviPaginazione(elemento_messaggio, mostra, elemento_contenitore) {
                var messaggio;
                if (mostra) {
                    messaggio = config.messaggio_mostra;
                    $("#" + config.div_paginazione).children("DIV#links_pagine").hide();
                } else {
                    messaggio = config.messaggio_rimuovi;
                    $("#" + config.div_paginazione).children("DIV#links_pagine").show();
                }
                $(elemento_messaggio).children("A").html(messaggio);
            }
            
            function elementoDaEscludere(elemento) {
                var escludi = false;
                for (var i = 0; i < parseInt(config.classi_da_escludere.split(" ").length); i++) {
                    if ($(elemento).hasClass(config.classi_da_escludere.split(" ")[i])) {
                        escludi = true;
                        i = config.classi_da_escludere.split(' ').lenght;
                    }
                }
                return escludi;
            }
            
            function impostaPagina(pag, elemento_contenitore) {
                var elementi_bk = $($("#" + $(elemento_contenitore).attr("id") + ">" + config.elementi_righe + "." + ui_paginate)).length;
                var pagine_totali_bk = parseInt((elementi_bk - 1)/config.righe_per_pagina) + 1;
                if (pag > 0) {
                    if (!config.tutte_le_pagine) {
                        if (pag > pagine_visibili + 1) {
                            $("#" + config.div_paginazione + " DIV#links_pagine SPAN#altre_pagine_prima").show();
                        } else {
                            $("#" + config.div_paginazione + " DIV#links_pagine SPAN#altre_pagine_prima").hide();
                        }
                        if (pag < pagine_totali_bk - pagine_visibili) {
                            $("#" + config.div_paginazione + " DIV#links_pagine SPAN#altre_pagine_dopo").show();
                        } else {
                            $("#" + config.div_paginazione + " DIV#links_pagine SPAN#altre_pagine_dopo").hide();
                        }
                        mostraPagine(pag, elemento_contenitore);
                    }
                    $("#" + config.div_paginazione).children("DIV#links_pagine").children("A." + config.classe_pagina_attiva).removeClass(config.classe_pagina_attiva);
                    $("#" + $(elemento_contenitore).attr("id") + ">" + config.elementi_righe + "." + ui_paginate_show).removeClass(ui_paginate_show).hide();
                    
                    $("#" + config.div_paginazione).children("DIV#links_pagine").children("A#mostra_pag_" + pag).addClass(config.classe_pagina_attiva);
                    var righe_da_mostrare = new Array();
                    for(var i = (pag - 1) * config.righe_per_pagina; i < pag * config.righe_per_pagina; i++) {
                        righe_da_mostrare.push(i);
                    }
                    $.map(righe_da_mostrare, function(val, idx) {
                        $("#" + $(elemento_contenitore).attr("id") + ">" + config.elementi_righe + "." + ui_paginate + " TD#id_progressivo_" + (val + 1)).parent().addClass(ui_paginate_show).show();
                    });
                } else {
                    $("#" + $(elemento_contenitore).attr("id") + ">" + config.elementi_righe + "." + ui_paginate).addClass(ui_paginate_show).show();
                }
            }
            
            function mostraPagine(pag, elemento_contenitore) {
                var elementi_bk = $($("#" + $(elemento_contenitore).attr("id") + ">" + config.elementi_righe + "." + ui_paginate)).length;
                var pagine_totali_bk = parseInt((elementi_bk - 1)/config.righe_per_pagina) + 1;
                $("#" + config.div_paginazione).children("DIV#links_pagine").children("A." + ui_paginate_show).removeClass(ui_paginate_show).hide();
                for(var i = pag - pagine_visibili; i <= pag + pagine_visibili; i++) {
                    if (i > 0 || i < pagine_totali_bk) {
                        $("#" + config.div_paginazione).children("DIV#links_pagine").children("A#mostra_pag_" + i).addClass(ui_paginate_show).show();
                    }
                }
            }
        }
    });
    
})(jQuery);
