/*
 * Lista interattiva
 * -----------------
 *
 * Collassa la vista della lista UL contenente molti items, visualizzando solo
 * quelli piu' "importanti", ovvero quelli con Peso maggiore.  Il Peso di un
 * elemento e' stabilito dal valore dell'attributo `class`, a cui e' applicato
 * il PrefissoPeso.
 *
 * La sintassi riconosciuta e' "c-N", con N numero intero, e "c-" Prefisso Peso.
 * Per esempio
 *
 *     <li class="c-15" ...
 *
 * e' un elemento con Peso 15.  Il peso viene calcolato ricorsivamente sommando
 * il peso degli elementi discendenti.
 *
 * Richiede JQuery!
 *
 * $Id: lista-interattiva.js 5714 2011-06-21 08:34:41Z davide $
 */

 jQuery(document).ready(function($) {
    if($.browser.msie && parseInt($.browser.version.substr(0,1)) <= 6) {
        return;
    }

    var Commutatore = function (elemento, funzioniCallback) {
        this.elemento = elemento;
        this.funzioniCallback = funzioniCallback;
        $(this.elemento).addClass('Commutatore Ridotto');

    };

    Commutatore.prototype = {
        getElemento: function () {
            return this.elemento;
        },

        notifica: function (stato) {
            if(stato == "Ridotto") {
                $(this.elemento).removeClass("Espanso");
                $(this.elemento).addClass("Ridotto");
            } else if (stato == "Espanso") {
                $(this.elemento).removeClass("Ridotto");
                $(this.elemento).addClass("Espanso");
            }
            if(typeof this.funzioniCallback == "object") {
                for(var i in this.funzioniCallback) {
                    if(typeof this.funzioniCallback[i] == "function") {
                        this.funzioniCallback[i](this.elemento, stato);
                    }
                }
            }
        }
    };

    var ListaInterattiva = function (elemento, selezionaPeso, statoIniziale) {
        this.elemento = elemento;
        this.stato = statoIniziale;
        this.altezzaRidotto = false;
        this.altezzaEspanso = false;
        this.commutatori = [];

        var prefissoPeso = 'c-';

        /*
         * Calcola il peso di `nodo`, ricorsivamente.
         */
        var inizializzaPeso = function (indice, nodo) {
            var peso = leggiPeso($(nodo), 'class');
            $(nodo).data('peso', peso);

            /*
             * Chiamata ricorsiva a `inizializzaPeso`
             */
            var discendenti = $(nodo).children('ul').children();

            if(discendenti.size() > 0) {
                discendenti.each(inizializzaPeso);
            }

            var elementoPadre = $(nodo).parent().closest('li');

            elementoPadre.data('peso', peso + elementoPadre.data('peso'));
        };

        /*
         * Cerca il valore del peso nell'attributo `class` del nodo
         * identificando il prefisso "c-"
         */
        var leggiPeso = function(elemento) {
            var peso = 0;
            var listaClassi = elemento.attr('class').split(' ');
            for(var i = 0; i < listaClassi.length; i++) {
                if(listaClassi[i].substr(0,2) == prefissoPeso) {
                    peso = parseInt(listaClassi[i].substr(2));
                    break;
                }
            }
            return peso;
        };

        /*
         * Seleziona i primi 6 elementi con peso maggiore.
         */
        var selezionaPesiMigliori = function (elemento) {
            var arr = jQuery.makeArray($(elemento).children()).sort(function(B, A) {
                return Number($(A).data('peso')) - Number($(B).data('peso'));
            });

            for(var i = 0; i < 6 && i < arr.length; i++) {
                $(arr[i]).addClass('Selezionato');
            }
        };

        if(selezionaPeso === true) {
            $(elemento).children().each(inizializzaPeso);
            selezionaPesiMigliori(elemento);
        }

        this.altezzaEspanso = $(elemento).height();
    };

    ListaInterattiva.prototype = {
        registraCommutatore: function (commutatore) {
            this.commutatori.push(commutatore);
            $(commutatore.getElemento()).children("a").bind("click", {soggetto: this}, function (e) {
                if(e.data.soggetto.stato == "Ridotto") {
                    e.data.soggetto.espandi();
                } else {
                    e.data.soggetto.riduci();
                }
                e.preventDefault();
            });
        },

        notificaCommutatori: function () {
            for(var i = 0; i < this.commutatori.length; i++) {
                if(this.commutatori[i].notifica) {
                    this.commutatori[i].notifica(this.stato);
                }
            }
        },

        riduci: function (skipAnimation) {
            if(this.stato == "Ridotto") {
                return;
            }

            var mostraRidotto = function () {
                $(this).removeClass('Animato');
                $(this).addClass('Ridotto');
            };

            this.stato = "Ridotto";

            $(this.elemento).removeClass('Espanso');
            if(skipAnimation === true) {            
                $(this).height(this.altezzaRidotto);
                $(this).addClass('Ridotto');
            } else {
                $(this.elemento).addClass('Animato');
                $(this.elemento).animate({height: this.altezzaRidotto}, {complete: mostraRidotto});
            }
            this.notificaCommutatori();
        },


        espandi: function (skipAnimation) {
            if(this.stato == "Espanso") {
                return;
            }

            var mostraEspanso = function () {
                $(this).removeClass('Animato');
                $(this).addClass('Espanso');
            };

            this.stato = "Espanso";

            $(this.elemento).removeClass('Ridotto');

            if(skipAnimation === true) {
                $(this).height(this.altezzaEspanso);
                $(this).addClass('Espanso');
                $(this).dequeue();
            } else {
                $(this.elemento).addClass('Animato');
                $(this.elemento).animate({height: this.altezzaEspanso}, {complete: mostraEspanso});
            }
            this.notificaCommutatori();
        },

        inizializza: function () {
            $(this.elemento).data("ListaInterattiva", this);
            $(this.elemento).addClass("Ridotto");
            this.altezzaRidotto = $(this.elemento).height();

            if(this.stato == "Espanso") {
                // Previene il ritorno immediato di espandi()
                this.stato = "Ridotto";
                $(this.elemento).dequeue();
                this.espandi(true);
            } else {
                this.stato = "Ridotto";
                $(this.elemento).height(this.altezzaRidotto);                
                this.notificaCommutatori();
            }
        },

        end: false
    };

    $('ul.ListaInterattiva').each( function(indice, elemento) {

        var commutatoreTitolo = $(elemento).closest('div.csc-wrap').prev('div.csc-header').children('h1');

        /*
         * Ignora le liste senza titolo, o con titolo cliccabile,
         * o più piccole di 12 elementi.
         */
        if (commutatoreTitolo.size() == 0
            || commutatoreTitolo.children('a').size() > 0
            || $(elemento).find('li').size() < 12) {
            return;
        }

        var commutatoreTag = '<a href="#" />';

        commutatoreTitolo.wrapInner(commutatoreTag);

        var commutatoreManiglia = $(elemento).after('<div class="Maniglia"><span/></div>').next();
        commutatoreManiglia.wrapInner(commutatoreTag);

        var modificaTooltip = function(elemento, stato) {
            if(stato == "Ridotto") {
                $(elemento).attr("title", "Mostra la lista completa");
            } else if(stato == "Espanso") {
                $(elemento).attr("title", "Riduci la lista");
            }
        };

        var modificaEtichetta = function(elemento, stato) {
            if(stato == "Ridotto") {
                $(elemento).find("span").text("Espandi");
            } else if(stato == "Espanso") {
                $(elemento).find("span").text("Riduci");
            }
        };

        var listaInterattiva = new ListaInterattiva(elemento, true, "Ridotto");
        listaInterattiva.registraCommutatore(new Commutatore(commutatoreTitolo.get(0), [modificaTooltip] ));
        listaInterattiva.registraCommutatore(new Commutatore(commutatoreManiglia.get(0), [modificaTooltip, modificaEtichetta]));
        listaInterattiva.inizializza();
    });

    $('div.notizie.archivio ul').each ( function (indice, elemento) {
        var commutatoreTitolo = $(elemento).parent().prev('dt');
        var commutatoreTag = '<a href="#" />';
        commutatoreTitolo.wrapInner(commutatoreTag);
        var modificaTooltip = function(elemento, stato) {
            if(stato == "Ridotto") {
                $(elemento).attr("title", "Mostra la lista completa");
            } else if(stato == "Espanso") {
                $(elemento).attr("title", "Riduci la lista");
            }
        };
        var listaInterattiva = new ListaInterattiva(elemento, false, (indice == 0 ? "Espanso" : "Ridotto"));
        listaInterattiva.registraCommutatore(new Commutatore(commutatoreTitolo.get(0), [modificaTooltip] ));
        listaInterattiva.inizializza();
    });
});


