(function ($) {

    var Config = {
        ServerURL: "/Controller/Risultati.ashx",
        ServerRiepilogoProdottoURL: "/Controller/RiepilogoProdotto.ashx",
        ServerUtilityURL: "/Controller/Utility.ashx",
        ClientURL: "/Plugins/comRisultati/Risultati.htm",
        StyleURL: "/Plugins/comRisultati/Risultati.css",
        ProdottoURL: "/Plugins/comRisultati/Prodotto.htm",
        Container: "",
        FormData: {},
        Prodotti: {},
        Filtri: {},
        FiltriForm: {},
        PageMaxSize: 5,
        CurrentPage: 1,
        TplProdotto: null,
        MostraPrezzoNetto: false,
        NumMaxProdotti: 200,
        AgenziaInSessione: false
    };

    // costruttore
    $.fn.Risultati = function (options) {
        // sovrascrivo le proprietà con quelle eventualmente passate
        if (options) {
            Config = $.extend(Config, options);
        }
        Config.Container = $(this);
        Init();
    };

    // distruttore
    $.fn.Risultati.Destroy = function () {
        Config.Container = "";
        Config.FormData = {};
        Config.Prodotti = {};
        Config.Filtri = {};
        Config.FiltriForm = {};
        Config.TplProdotto = null;
        Config.MostraPrezzoNetto = false;
        Config.NumMaxProdotti = 300;
        Config.AgenziaInSessione = false;
        Config.CurrentPage = 1;
    }


    function Init() {

        // carico l'html della pagina
        Config.Container.load(Config.ClientURL, function () {

            //Loggo su google Analytics
            $.fn.Utility.Analytics("PAGEVIEW", "/Default.htm#Risultati");

            // setto i bindings
            Bindings();

            // verifico se è presente un agenzia in sessione
            CheckAgenziaInSessione();

            // carico il template per l'impaginazione dei prodotti            
            CaricaTemplateProdotto();

            // carico i risultati            
            if ($.isEmptyObject(Config.Prodotti)) {
                CaricaRisultati();
            }

            // se ci sono prodotti da visualizzare ...
            if (Config.Prodotti.length > 0) {

                // renderizzo i filtri
                RenderizzaFiltri();

                // renderizzo i prodotti
                RenderizzaListaProdotti();

                // personalizzo l'interfaccia
                Personalizza();

                // salvo lo stato del plugin
                $.fn.Travelmind.SaveState("Risultati", Config);

                // rilancio l'evento "il plugin ha finito il caricamento"
                $(Config.Container).trigger("ComponentLoaded");

                // stondo gli angoli
                $.fn.Travelmind.RoundCorners();

            } else {
                // messaggio di errore se la ricerca non produce risultati            
                $.fn.Utility.ShowMessage("Attenzione", "La ricerca non ha prodotto risultati");
                var homeBack = (Config.FormData.HistoryBack != undefined && Config.FormData.HistoryBack != "") ? Config.FormData.HistoryBack : "Home";
                $.fn.Travelmind.LoadPlugin(homeBack);
                //location.href = "/Default.htm";
            }
        });
    }


    function CheckAgenziaInSessione() {
        var parameters = {};
        parameters.action = "CheckAgenziaInSessione";
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerUtilityURL,
            data: parameters,
            success: function (returnData) {
                Config.AgenziaInSessione = (returnData == "1") ? true : false;
            }
        });
    }


    function Personalizza() {
        // nascondo il filtro struttura
        $("#filtri #struttura").hide();
    }


    function Bindings() {
        // tasto per sbloccare il limite sui risultati
        $("#unlock").bind("click", SbloccaLimiteRisultati);

        // gestione tastiera (F8/F9)        
        $(document).bind("keyup", GestisciTastiera);

        // quando clicco sulla paginazione a fondo pagina mi riporta su
        $(".pagination img, .pageNumbers .normal, .pageNumbers .active").live("click", function () {
            $("html, body").animate({ scrollTop: 50 }, 'slow');
        });

        // istanzio la photogallery
        $("img.prettyPhoto").prettyPhoto({ theme: 'light_rounded' });

        //bindo il pulsante per riavviare la ricerca
        var homeBack = (Config.FormData.HistoryBack != undefined && Config.FormData.HistoryBack != "") ? Config.FormData.HistoryBack : "Home";
        $("#nav_menu #nuova_ricerca").bind("click", function () {
            //Loggo su google Analytics
            $.fn.Utility.Analytics("EVENT", "RISULTATI_NUOVA_RICERCA", "CLICK", "");

            $.fn.Travelmind.RestorePlugin(homeBack);
        });
    }


    function GestisciTastiera(event) {
        var e;
        if (event.which != "") { e = event.which; }
        else if (event.charCode != "") { e = event.charCode; }
        else if (event.keyCode != "") { e = event.keyCode; }
        switch (e) {
            case 119: // F8: prezzo netto                       
                if (Config.AgenziaInSessione && Config.MostraPrezzoNetto == false) {
                    Config.MostraPrezzoNetto = true;
                    RenderizzaListaProdotti();
                }
                break;

            case 120: // F9: prezzo lordo                
                if (Config.AgenziaInSessione && Config.MostraPrezzoNetto == true) {
                    Config.MostraPrezzoNetto = false;
                    RenderizzaListaProdotti();
                }
                break;
        }
    }


    function SbloccaLimiteRisultati() {
        Config.NumMaxProdotti = 10000;
        CaricaRisultati();
        RenderizzaFiltri();
        RenderizzaListaProdotti();
        Personalizza();
        $.fn.Travelmind.SaveState("Risultati", Config);
        $.fn.Travelmind.RoundCorners();
    }


    function CaricaTemplateProdotto() {
        $.ajax({
            async: false,
            cache: false,
            url: Config.ProdottoURL,
            success: function (returnData) {
                Config.TplProdotto = returnData;
            }
        });
    }


    function CaricaRisultati() {
        parameters = {};
        parameters.action = "SelRicercaProdotti";
        Config.FormData.NumMaxProdotti = Config.NumMaxProdotti;
        parameters.formRicerca = JSON.stringify(Config.FormData);

        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                if (returnData != "-1" && returnData != "") {
                    // salvo gli oggetti nella configurazione
                    Config.Prodotti = $.parseJSON(returnData).Prodotti;

                    var newListaProdotti = $.grep(Config.Prodotti, function (obj) {
                        //rimuove tutti i VM --disabilitata--
                        //if (obj.Operatore.Nome.toUpperCase().indexOf("VM") != -1) { return false; } else { return true; }
                        //rimuove tutti i Frigerio e LiuTravel --abilitata--
                        if (obj.Operatore.Nome.toUpperCase().indexOf("FRIGERIO") != -1 || obj.Operatore.Nome.toUpperCase().indexOf("LIU TRAVEL") != -1) { return false; } else { return true; }
                    });
                    Config.Prodotti = newListaProdotti;

                    Config.Filtri = $.parseJSON(returnData).Filtri;
                }
            }
        });
    }


    function CambiaPagina(pageNumber) {
        Config.CurrentPage = pageNumber;
        RenderizzaListaProdotti();
    }


    function FiltraRisultati() {

        var ProdottiFiltrati = [];
        var FiltriForm = {};
        Config.FiltriForm = FiltriForm;

        // ricavo i valori di confronto dal form dei filtri
        FiltriForm.BudgetDa = parseFloat($('#hdnBudgetDa').val());
        FiltriForm.BudgetA = parseFloat($('#hdnBudgetA').val());
        FiltriForm.StelleDa = parseInt($('#hdnStrutturaDa').val(), 10);
        FiltriForm.StelleA = parseInt($('#hdnStrutturaA').val(), 10);
        FiltriForm.Trattamenti = [];
        $("#filtri #trattamento input[type='checkbox']:checked").each(function () {
            FiltriForm.Trattamenti.push(parseInt($(this).val(), 10));
        });
        FiltriForm.Destinazioni = [];
        $("#filtri #destinazione ul li label input[type='checkbox']:checked").each(function () {
            FiltriForm.Destinazioni.push(parseInt($(this).val(), 10));
        });
        FiltriForm.Singola = false;
        FiltriForm.Tripla = false;
        FiltriForm.Quadrupla = false;
        FiltriForm.Child = false;
        $("#filtri #viaggiatori input[type='checkbox']:checked").each(function () {
            FiltriForm.Singola = ($(this).val() == "Singola") ? true : false;
            FiltriForm.Tripla = ($(this).val() == "Tripla") ? true : false;
            FiltriForm.Quadrupla = ($(this).val() == "Quadrupla") ? true : false;
            FiltriForm.Child = ($(this).val() == "Con Bambini") ? true : false;
        });
        FiltriForm.TipiAlloggio = [];
        $("#filtri #alloggio input[type='checkbox']:checked").each(function () {
            FiltriForm.TipiAlloggio.push(parseInt($(this).val(), 10));
        });

        // ciclo i prodotti ed eseguo i confronti (check = false quando il prodotto viene escluso dal filtro)
        var Prodotti = Config.Prodotti;
        var prezzoMin = 0;
        var prezzoMax = 0;
        var stelle = 0;
        var idTrattamento = 0;
        var idDestinazione = 0;
        var idAlloggio = 0;
        $.each(Prodotti, function (x) {
            var check = true;

            // filtro per budget            
            prezzoMin = parseFloat(Prodotti[x].PrezzoMinimo);
            prezzoMax = parseFloat(Prodotti[x].PrezzoMassimo);
            check = (!(prezzoMin >= FiltriForm.BudgetDa && prezzoMax <= FiltriForm.BudgetA)) ? false : true;

            // filtro per struttura (stelle)
            stelle = parseInt(Prodotti[x].Struttura.Classe.Numero, 10);
            if (check) {
                check = (!(stelle >= FiltriForm.StelleDa && stelle <= FiltriForm.StelleA)) ? false : true;
            }

            // filtro per trattamento            
            if (check && FiltriForm.Trattamenti.length > 0) {
                idTrattamento = parseInt(Prodotti[x].IdTrattamento, 10);
                check = (!FiltriForm.Trattamenti.exists(idTrattamento)) ? false : true;
            }

            // filtro per destinazione
            if (check && FiltriForm.Destinazioni.length > 0) {
                idDestinazione = parseInt(Prodotti[x].Struttura.DestinazionePolitica.Id, 10);
                check = (!FiltriForm.Destinazioni.exists(idDestinazione)) ? false : true;
            }

            // filtro per viaggiatori
            if (check) {
                check = (
                   (!FiltriForm.Singola || FiltriForm.Singola && Prodotti[x].Singola) // check singola
                && (!FiltriForm.Tripla || FiltriForm.Tripla && Prodotti[x].Tripla) // check tripla
                && (!FiltriForm.Child || FiltriForm.Child && Prodotti[x].Child) // check child
                && (!FiltriForm.Quadrupla || FiltriForm.Quadrupla && Prodotti[x].Quadrupla) // check quadrupla
                );
            }

            // filtro per alloggio
            if (check && FiltriForm.TipiAlloggio.length > 0) {
                idAlloggio = parseInt(Prodotti[x].Struttura.IdTipologia, 10);
                check = (!FiltriForm.TipiAlloggio.exists(idAlloggio)) ? false : true;
            }

            // se il prodotto ha superato i filtri lo inserisco nella lista di prodotti che verranno renderizzati
            if (check) {
                ProdottiFiltrati.push(Prodotti[x]);
            }

        });

        return ProdottiFiltrati;
    }




    function RenderizzaFiltri() {

        var Filtri = Config.Filtri;
        var FiltriForm = Config.FiltriForm;

        var $item = null;
        var $roundBox = null;
        var $input = null;
        var checked = "";

        // budget
        var budgetDa = (!$.isEmptyObject(FiltriForm)) ? parseFloat(FiltriForm.BudgetDa) : parseFloat(Filtri.BudgetDa);
        var budgetA = (!$.isEmptyObject(FiltriForm)) ? parseFloat(FiltriForm.BudgetA) : parseFloat(Filtri.BudgetA);
        $("#budget .budgetDa").html(budgetDa + " &euro;");
        $("#budget .budgetA").html(budgetA + " &euro;");
        $('#hdnBudgetDa').val(budgetDa);
        $('#hdnBudgetA').val(budgetA);
        $("#budget .contents .slider").slider({
            min: Filtri.BudgetDa,
            max: Filtri.BudgetA,
            range: true,
            values: [budgetDa, budgetA],
            step: 100,
            stop: function (event, ui) {
                RenderizzaListaProdotti();
            },
            slide: function (event, ui) {
                $(".budgetDa").html(ui.values[0] + " &euro;");
                $(".budgetA").html(ui.values[1] + " &euro;");
                $('#hdnBudgetDa').val(ui.values[0]);
                $('#hdnBudgetA').val(ui.values[1]);
            }
        });

        // struttura
        var stelleDa = (!$.isEmptyObject(FiltriForm)) ? parseFloat(FiltriForm.StelleDa) : parseFloat(Filtri.StelleDa);
        var stelleA = (!$.isEmptyObject(FiltriForm)) ? parseFloat(FiltriForm.StelleA) : parseFloat(Filtri.StelleA);
        $("#struttura .strutturaDa").html(stelleDa);
        $("#struttura .strutturaA").html(stelleA);
        $('#hdnStrutturaDa').val(stelleDa);
        $('#hdnStrutturaA').val(stelleA);
        $("#struttura .contents .slider").slider({
            min: Filtri.StelleDa,
            max: Filtri.StelleA,
            range: true,
            values: [stelleDa, stelleA],
            step: 1,
            stop: function (event, ui) {
                RenderizzaListaProdotti();
            },
            slide: function (event, ui) {
                $(".strutturaDa").html(ui.values[0]);
                $(".strutturaA").html(ui.values[1]);
                $('#hdnStrutturaDa').val(ui.values[0]);
                $('#hdnStrutturaA').val(ui.values[1]);
            }
        });

        // trattamento
        var idTrattamento = 0;
        var labelTrattamento = "";
        $.each(Filtri.Trattamenti, function (i) {
            idTrattamento = parseInt(Filtri.Trattamenti[i].Value, 10);
            labelTrattamento = Filtri.Trattamenti[i].Text;
            $item = $("<div/>", { "class": "filter_item" }).appendTo("#trattamento .contents");
            $roundBox = $("<div/>", { "class": "rounded_check" }).appendTo($item);
            checked = (!$.isEmptyObject(FiltriForm) && FiltriForm.Trattamenti.exists(idTrattamento)) ? "checked" : "";
            $("<input/>", { "type": "checkbox", "value": idTrattamento, "checked": checked }).bind("click", RenderizzaListaProdotti).appendTo($roundBox);
            $("<span/>").html(labelTrattamento).appendTo($item);
        });

        // destinazioni
        $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo("#destinazione .contents");
        $input = $("<select/>", { "id": "txtDestinazioni" }).appendTo($roundBox);
        $.each(Filtri.Destinazioni, function (x) {
            var $optgroup = $("<optgroup/>", { "label": Filtri.Destinazioni[x].Text.capitalize() }).appendTo($input);
            var idDestinazione = 0;
            var labelDestinazione = "";
            $.each(Filtri.Destinazioni[x].Lista, function (y) {
                idDestinazione = parseInt(Filtri.Destinazioni[x].Lista[y].Value, 10);
                labelDestinazione = Filtri.Destinazioni[x].Lista[y].Text.capitalize();
                $("<option/>", { "value": idDestinazione }).html(labelDestinazione).appendTo($optgroup);
            });
        });
        $input.multiselect({
            minWidth: "175",
            autoOpen: true,
            checkAllText: 'Tutte',
            uncheckAllText: 'Nessuna',
            noneSelectedText: 'Seleziona',
            selectedText: '# selezionate',
            click: function () {
                RenderizzaListaProdotti();
            },
            checkAll: function () {
                RenderizzaListaProdotti();
            },
            uncheckAll: function () {
                RenderizzaListaProdotti();
            },
            optgrouptoggle: function () {
                RenderizzaListaProdotti();
            }
        });
        $input.multiselect("uncheckAll");
        // preseleziono i check (browser back)
        if (!$.isEmptyObject(FiltriForm) && FiltriForm.Destinazioni.length > 0) {
            var idDestinazione = 0;
            $input.multiselect("widget").find(":checkbox").each(function () {
                idDestinazione = parseInt($(this).val(), 10);
                checked = (FiltriForm.Destinazioni.exists(idDestinazione)) ? "checked" : "";
                $(this).attr("checked", checked);
            })
        }


        // viaggiatori
        if (Filtri.Singola) {
            $item = $("<div/>", { "class": "filter_item" }).appendTo("#viaggiatori .contents");
            $roundBox = $("<div/>", { "class": "rounded_check" }).appendTo($item);
            checked = (!$.isEmptyObject(FiltriForm) && FiltriForm.Singola) ? "checked" : "";
            $("<input/>", { "type": "checkbox", "value": "Singola", "checked": checked }).bind("click", RenderizzaListaProdotti).appendTo($roundBox);
            $("<span/>").html("Singola").appendTo($item);
        }
        if (Filtri.Tripla) {
            $item = $("<div/>", { "class": "filter_item" }).appendTo("#viaggiatori .contents");
            $roundBox = $("<div/>", { "class": "rounded_check" }).appendTo($item);
            checked = (!$.isEmptyObject(FiltriForm) && FiltriForm.Tripla) ? "checked" : "";
            $("<input/>", { "type": "checkbox", "value": "Tripla", "checked": checked }).bind("click", RenderizzaListaProdotti).appendTo($roundBox);
            $("<span/>").html("Tripla").appendTo($item);
        }
        if (Filtri.Quadrupla) {
            $item = $("<div/>", { "class": "filter_item" }).appendTo("#viaggiatori .contents");
            $roundBox = $("<div/>", { "class": "rounded_check" }).appendTo($item);
            checked = (!$.isEmptyObject(FiltriForm) && FiltriForm.Quadrupla) ? "checked" : "";
            $("<input/>", { "type": "checkbox", "value": "Quadrupla", "checked": checked }).bind("click", RenderizzaListaProdotti).appendTo($roundBox);
            $("<span/>").html("Quadrupla").appendTo($item);
        }
        if (Filtri.Child) {
            $item = $("<div/>", { "class": "filter_item" }).appendTo("#viaggiatori .contents");
            $roundBox = $("<div/>", { "class": "rounded_check" }).appendTo($item);
            checked = (!$.isEmptyObject(FiltriForm) && FiltriForm.Child) ? "checked" : "";
            $("<input/>", { "type": "checkbox", "value": "Con Bambini", "checked": checked }).bind("click", RenderizzaListaProdotti).appendTo($roundBox);
            $("<span/>").html("Con Bambini").appendTo($item);
        }
        if (!Filtri.Child && !Filtri.Quadrupla && !Filtri.Tripla && !Filtri.Singola) {
            $("#viaggiatori").hide();
        }

        // alloggio
        var idAlloggio = 0;
        var labelAlloggio = "";
        $.each(Filtri.TipiAlloggio, function (i) {
            idAlloggio = parseInt(Filtri.TipiAlloggio[i].Value, 10);
            labelAlloggio = Filtri.TipiAlloggio[i].Text;
            $item = $("<div/>", { "class": "filter_item" }).appendTo("#alloggio .contents");
            $roundBox = $("<div/>", { "class": "rounded_check" }).appendTo($item);
            checked = (!$.isEmptyObject(FiltriForm) && FiltriForm.TipiAlloggio.exists(idAlloggio)) ? "checked" : "";
            $("<input/>", { "type": "checkbox", "value": idAlloggio, "checked": checked }).bind("click", RenderizzaListaProdotti).appendTo($roundBox);
            $("<span/>").html(labelAlloggio).appendTo($item);
        });
    }


    function RenderizzaListaProdotti() {

        // svuoto il container
        $("#prodotti").html("");

        // filtro i prodotti
        var Prodotti = FiltraRisultati();

        // gestisco il caso in cui i filtri escludono tutti i prodotti
        if (Prodotti.length == 0) {
            var $warning_border = $("<div/>", { "class": "box_border_warning rounded" }).appendTo("#prodotti");
            $warning = $("<div/>", { "class": "box rounded" }).appendTo($warning_border);
            $("<div/>", { "class": "header_warning rounded_top" }).html("Attenzione:").appendTo($warning);
            $("<div/>", { "class": "contents" }).html("I filtri selezionati hanno escluso tutti i prodotti presenti.<br/>Riproponiamo l'elenco completo con il consiglio di rivedere le opzioni di filtraggio.").appendTo($warning);
            Prodotti = Config.Prodotti;
        }

        // setto il counter dei prodotti
        var totProdotti = Prodotti.length;
        $("#counter").html(totProdotti);
        $("#counterString").html((Prodotti.length == 1 ? "Risultato Trovato" : "Risultati Trovati"));

        // nascondo il "unlock" se il numero di prodotti è inferiore al limite stabilito
        if (totProdotti < Config.NumMaxProdotti) {
            $("#unlock").hide();
        }

        // creo la paginazione
        RenderizzaPaginazione(totProdotti);

        // impagino i prodotti
        var da = ((Config.CurrentPage * Config.PageMaxSize) - Config.PageMaxSize);
        var a = (Config.CurrentPage * Config.PageMaxSize);
        a = (a > Prodotti.length) ? Prodotti.length : a;
        da = (Prodotti.length == 0) ? 0 : da;
        for (i = da; i < a; i++) {
            var htmlProdotto = RenderizzaProdotto(Config.TplProdotto, Prodotti[i]);
            $("#prodotti").append($(htmlProdotto));
        }

        $.fn.Travelmind.RoundCorners();
    }




    function RenderizzaProdotto(tplProdotto, prodotto) {
        tplProdotto = $(tplProdotto).clone();

        // dati prodotto
        $(tplProdotto).attr("id", prodotto.Id);
        $(tplProdotto).find(".title_struttura").html(prodotto.Nome);
        $(tplProdotto).find(".title_destinazione").html(prodotto.Struttura.DestinazionePolitica.Nome + ", " + prodotto.Struttura.DestinazionePolitica.Padre);
        $(tplProdotto).find(".img_struttura").attr("src", prodotto.Struttura.Immagini[0].Path);
        $(tplProdotto).find(".img_tour_operator").attr("src", prodotto.Operatore.Logo);
        $(tplProdotto).find(".description").html(prodotto.Descrizione);

        var durataGiorni = "";
        if (!isNaN(prodotto.DurataGiorni)) {
            durataGiorni = ", " + prodotto.DurataGiorni + " giorni ";
        }
        $(tplProdotto).find(".durata").html(prodotto.DurataNotti + " notti " + durataGiorni);

        $(tplProdotto).find(".trattamento").html(prodotto.Trattamento);
        $(tplProdotto).find("input.txtPrezzoPerCamera").val(prodotto.PrezzoPerCamera);

        //raddoppio l'altezza dell'header se il testo e' troppo lungo
        if ($(tplProdotto).find(".title_struttura").html().length + $(tplProdotto).find(".title_destinazione").html().length > 75) {
            $(tplProdotto).find(".header").addClass("doubleHeight");
        }

        // listini
        $.each(prodotto.Listini, function (i) {
            var rowClass = (i % 2 == 0) ? "even" : "odd";
            var newRow = RenderizzaListino(prodotto.Listini[i]);
            $(newRow).addClass(rowClass);
            $(tplProdotto).find("table.partenze tbody").append(newRow);
        });

        // bindings sul menu
        $(tplProdotto).find("ul.menu li.info_alloggio").bind("click", function () { ApriInfoAlloggio(prodotto.Id); });
        $(tplProdotto).find("ul.menu li.info_prezzi").bind("click", function () { ApriInfoPrezzi(prodotto.Id); });
        $(tplProdotto).find("ul.menu li.info_varie").bind("click", function () { ApriInfoVarie(prodotto.Id); });
        $(tplProdotto).find("ul.menu li.photogallery").bind("click", function () { ApriPhotogallery(prodotto.Id); });
        $(tplProdotto).find("ul.menu li.map").bind("click", function () { ApriMappa(prodotto.Id); });
        $(tplProdotto).find("ul.menu li.tutte_partenze").bind("click", function () { VisualizzaTuttePartenze(prodotto.Id, prodotto.PrezzoPerCamera); });

        // disabilito la photogallery se non sono presenti immagini
        if (prodotto.Struttura.Immagini[0].Path.indexOf("nondisponibile.gif") != -1) {
            $(tplProdotto).find("ul.menu li.photogallery").hide();
        }

        // disabilito le voci di menu le cui funzioni non sono diponibili
        $(tplProdotto).find("ul.menu li.map").hide();
        $(tplProdotto).find("ul.menu li.info_varie").hide();
        $(tplProdotto).find("ul.menu li.info_prezzi").hide();

        return $(tplProdotto);
    }


    function RenderizzaListino(Listino) {

        var $row = $("<tr/>");
        var $col = null;

        // data partenza
        $col = $("<td/>", { "class": "data_partenza" }).appendTo($row);
        $col.html(Listino.Partenza);

        // aeroporto partenza
        var $col = $("<td/>", { "class": "aeroporto_partenza" }).appendTo($row);
        var listaIata = Listino.ListaIata.split(",");
        var listaIdListini = Listino.ListaIdListino.split(",");
        var htmlIata = "";
        $.each(listaIata, function (i) {
            htmlIata = (i == 0) ? listaIata[i] : ", " + listaIata[i];
            $("<span/>").css({ "cursor": "pointer" }).html(htmlIata).bind("mouseover", function () { ApriInfoVoli($(this), listaIdListini[i]); }).appendTo($col);
        });

        //        // prezzo catalogo
        //        var prezzoCatalogo = "&nbsp;";
        //        $col = $("<td/>", { "class": "prezzo_catalogo" }).appendTo($row);
        //        if (Listino.Prcatalogo > 0) prezzoCatalogo = Listino.Prcatalogo + " &euro;";
        //        $col.html(prezzoCatalogo);

        //        // sconto
        //        var sconto = "&nbsp;";
        //        $col = $("<td/>", { "class": "sconto" }).appendTo($row);
        //        if (Listino.Prcatalogo > 0) sconto = (Listino.ScontoFE.indexOf("-") == -1) ? Listino.ScontoFE : "0%";
        //        $col.html(sconto);


        // quota base
        $col = $("<td/>", { "class": "quota_base" }).appendTo($row);
        if (Config.MostraPrezzoNetto) {
            $col.html(Listino.Prnetto + " &euro;").addClass("netto");
        } else {
            var costiExtra = (parseInt(Listino.Prpubblico.replace(".", ""), 10) - parseInt(Listino.Prbase.replace(".", ""), 10));
            if ((parseInt(Listino.Prcatalogo.replace(".", ""), 10) - costiExtra) - parseInt(Listino.Prbase.replace(".", ""), 10) > 10) {
                $col.html("<span style='text-decoration: line-through;'>" + ((parseInt(Listino.Prcatalogo.replace(".", ""), 10) - costiExtra).currencyFormat()) + " &euro;</span>&nbsp;&nbsp;&nbsp;" + Listino.Prbase + " &euro;").removeClass("netto");
            } else {
                $col.html(Listino.Prbase + " &euro;").removeClass("netto");
            }
        }

        // costi extra
        $col = $("<td/>", { "class": "costi_extra" }).appendTo($row);
        var $img = $("<img/>", { "class": "tooltip_costiobbligatori", "src": "/Plugins/comRisultati/Images/info.png" }).css({ "cursor": "pointer" }).appendTo($col);
        $img.attr("id_listino", Listino.Id).attr("title", "");
        $img.bind("mouseover", function () {
            ApriCostiObbligatori($(this));
        });

        // totale
        $col = $("<td/>", { "class": "totale" }).appendTo($row);
        var $prezzoTot = $("<span/>");
        if (Config.MostraPrezzoNetto) {
            $prezzoTot.html(Listino.PrpubblicoNetto + " &euro;").appendTo($col);
            $col.addClass("netto");
        } else {
            $prezzoTot.html(Listino.Prpubblico + " &euro;").appendTo($col);
            $col.removeClass("netto");
        }
        $prezzoTot.css({ "cursor": "pointer" });
        $prezzoTot.bind("mouseover", function () {
            var $tooltip = $("<div/>").html("<strong>Prezzo chiaro tutto compreso!</strong><br>Altri siti potrebbero mostrare un prezzo che poi aumenta nel percorso di prenotazione.");

            $(this).attr("title", $tooltip.html());
            $(this).tooltip({
                effect: 'slide',
                slideOffset: 10,
                offset: [10, 2],
                tipClass: 'tooltip_tuttoincluso',
                cancelDefault: true,
                onShow: function () {
                    $prezzoTot.attr("title", "");
                }
            });
            var api = $(this).data("tooltip");
            api.show();
        });


        // vai
        $col = $("<td/>", { "class": "vai" }).appendTo($row);
        var $img = $("<img/>", { "src": "/Plugins/comRisultati/Images/vai.png" }).appendTo($col);
        $img.bind("click", function () {
            var idProdotto = $(this).parents(".prodotto").attr("id");
            VaiAlPreventivo(idProdotto, Listino.ListaIdListino, Listino.Partenza);
        }).css({ "cursor": "pointer" });

        return $row;
    }


    function VaiAlPreventivo(idProdotto, idListini, dataPartenza) {
        //Loggo su google Analytics
        $.fn.Utility.Analytics("EVENT", "VAI", "CLICK", "P: " + idProdotto + " L: " + idListini);

        var FormData = {};
        FormData.IdProdotto = idProdotto;
        FormData.IdListini = idListini;
        FormData.HistoryBack = Config.FormData.HistoryBack;
        FormData.PartenzaInterna = dataPartenza;
        // salvo la configurazione
        $.fn.Travelmind.SaveState("Risultati", Config);
        // attendo che sia stata salvata
        $(document).delay(1000);
        // carico il preventivo
        $.fn.Travelmind.LoadPlugin("PreventivoPlus", FormData);
    }


    function RenderizzaPaginazione(totProdotti) {

        // svuoto il container
        $(".pagination").html("");

        var pageMaxSize = parseInt(Config.PageMaxSize, 10);
        var currentPage = parseInt(Config.CurrentPage, 10);
        var round = parseInt(2, 10);
        var totPages = parseInt(totProdotti / pageMaxSize, 10);

        if ((totProdotti % pageMaxSize) > 0) {
            totPages = totPages + 1;
        }

        if (currentPage >= totPages) {
            currentPage = totPages;
            Config.CurrentPage = totPages;
        }

        var pagination = $("<div>").appendTo($(".pagination"));

        // page first
        var imgFirst = $("<img>", { "src": "/Plugins/comRisultati/Images/pagination-first.png", "title": "prima pagina" }).appendTo(pagination);
        var firstPage = 1;
        $(imgFirst).bind("click", function () { CambiaPagina(firstPage) });

        // page prev
        var imgPrev = $("<img/>", { "src": "/Plugins/comRisultati/Images/pagination-prev.png", "title": "pagina precedente" }).appendTo(pagination);
        var prevPage = (currentPage == 1) ? 1 : (currentPage - 1);
        $(imgPrev).bind("click", function () { CambiaPagina(prevPage) });

        // page numbers
        var pageNumbers = $("<div/>", { "class": "pageNumbers" }).appendTo(pagination);
        var da = (currentPage == 1) ? 1 : parseInt(currentPage - round, 10);
        var a = parseInt(currentPage + round, 10);
        if (da <= 1) {
            da = 1;
            a = (totPages < 5) ? totPages : 5;
        } else if (a >= totPages) {
            a = totPages;
            da = a - 4;
            da = (da < 1) ? 1 : da;
        }
        for (i = da; i <= a; i++) {
            var cssClass = (i == currentPage) ? "active" : "normal";
            var pageLink = $("<span/>", { "class": cssClass, "title": i }).appendTo(pageNumbers);
            $(pageLink).html(i);
            $(pageLink).bind("click", function () {
                var pageNumber = $(this).attr("title");
                CambiaPagina(pageNumber);
            });
        }

        // page next
        var imgNext = $("<img/>", { "src": "/Plugins/comRisultati/Images/pagination-next.png", "title": "pagina seguente" }).appendTo(pagination);
        var nextPage = (currentPage == totPages) ? totPages : (currentPage + 1);
        $(imgNext).bind("click", function () { CambiaPagina(nextPage) });

        // page last
        var imgLast = $("<img/>", { "src": "/Plugins/comRisultati/Images/pagination-last.png", "title": "ultima pagina" }).appendTo(pagination);
        var lastPage = totPages;
        $(imgLast).bind("click", function () { CambiaPagina(lastPage) });

    }




    function ApriInfoAlloggio(idProdotto) {
        var Struttura = {};
        var parameters = {};
        parameters.action = "SelInfoAlloggioByIdProdotto";
        parameters.idProdotto = idProdotto;
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerRiepilogoProdottoURL,
            data: parameters,
            success: function (returnData) {
                Struttura = (returnData != "-1") ? $.parseJSON(returnData) : {};
                var $content = $("<div/>");
                $("<div/>").html(Struttura.DescrizioneLungaStruttura).appendTo($content).find("a").click(function () {
                    this.target = "_blank";
                });
                $("<img/>", { "src": Struttura.LogoOperatore }).appendTo($content);
                $.fn.Utility.ApriPopUp("Info Alloggio", $content, 800, 400);
            }
        });
    }


    function ApriInfoPrezzi(idProdotto) {

    }


    function ApriInfoVarie(idProdotto) {

    }


    function ApriPhotogallery(idProdotto) {
        var parameters = {};
        parameters.action = "SelImmaginiByIdProdotto";
        parameters.idProdotto = idProdotto;
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerRiepilogoProdottoURL,
            data: parameters,
            success: function (returnData) {
                var Immagini = [];
                var Titoli = [];
                var Descrizioni = [];
                var Images = (returnData != "-1") ? $.parseJSON(returnData) : [];
                var titolo = "";
                var descrizione = "";
                if (!$.isEmptyObject(Images)) {
                    $.each(Images, function (i) {
                        Immagini.push(Images[i].Path);
                        //titolo = (Images[i].Nome != undefined && Images[i].Nome != "") ? Images[i].Nome : "";
                        Titoli.push(titolo);
                        descrizione = (Images[i].Descrizione != undefined && Images[i].Descrizione != "") ? Images[i].Descrizione : "";
                        Descrizioni.push(descrizione);
                    });
                    $.prettyPhoto.open(Immagini, Titoli, Descrizioni);
                    //$.prettyPhoto.open(Immagini);
                } else {
                    $("#" + idProdotto + " li.photogallery").css({ "opacity": "0.5", "cursor": "default" });
                }
            }
        });
    }


    function ApriMappa(idProdotto) {

    }


    function ApriInfoVoli($element, idListino) {
        var Voli = [];

        Voli = $element.data("Voli");

        if (Voli == undefined) {
            var parameters = {};
            parameters.action = "SelVoliByIdListino";
            parameters.idListino = idListino;
            $.ajax({
                async: false,
                cache: false,
                url: Config.ServerUtilityURL,
                data: parameters,
                success: function (returnData) {
                    Voli = (returnData != "-1") ? $.parseJSON(returnData) : [];
                    $element.data("Voli", Voli);
                }
            });
        }

        if (Voli.length > 0) {
            $tooltip = $("<div/>");
            $("<div/>").html(Voli[0].AeroportoPartenza.Nome).appendTo($tooltip);

            $element.attr("title", $tooltip.html());
            $element.tooltip({
                effect: 'slide',
                slideOffset: 10,
                offset: [10, 2],
                tipClass: 'tooltip_voli',
                cancelDefault: true,
                onShow: function () {
                    $element.attr("title", "");
                }
            });
            var api = $element.data("tooltip");
            api.show();
        }

    }


    function ApriCostiObbligatori($element) {

        var CostiObbligatori = [];

        CostiObbligatori = $element.data("CostiObbligatori");

        if (CostiObbligatori == undefined) {
            var parameters = {};
            parameters.action = "SelRecsByIdListino";
            parameters.idListino = $element.attr("id_listino");
            $.ajax({
                async: false,
                cache: false,
                url: Config.ServerURL,
                data: parameters,
                success: function (returnData) {
                    CostiObbligatori = (returnData != "-1") ? $.parseJSON(returnData) : [];
                    $element.data("CostiObbligatori", CostiObbligatori);
                }
            });
        }

        if (CostiObbligatori.length > 0) {
            $tooltip = $("<div/>");
            $.each(CostiObbligatori, function (i) {
                $("<div/>").html(CostiObbligatori[i].Descrizione + ": " + CostiObbligatori[i].PrVendita + " &euro;").appendTo($tooltip);
            });
            $element.attr("title", $tooltip.html());
            $element.tooltip({
                effect: 'slide',
                slideOffset: 10,
                offset: [10, 2],
                cancelDefault: true,
                onShow: function () {
                    $element.attr("title", "");
                }
            });
            var api = $element.data("tooltip");
            api.show();
        }
    }


    function VisualizzaTuttePartenze(idProdotto, prezzoPerCamera) {

        var parameters = {};
        parameters.action = "SelListiniTutteLeDate";
        parameters.formRicerca = JSON.stringify(Config.FormData);
        parameters.idProdotto = idProdotto;
        parameters.prezzoPerCamera = prezzoPerCamera;

        $.post(Config.ServerURL, parameters, function (returnData) {
            if (returnData != "-1" && returnData != "") {
                var Listini = $.parseJSON(returnData);
                $.each(Listini, function (i) {
                    var numRows = parseInt($('#' + idProdotto + " table.partenze tbody").attr('rows').length, 10);
                    var rowClass = (numRows % 2 > 0) ? "odd" : "even";
                    var newRow = RenderizzaListino(Listini[i]);
                    $(newRow).addClass(rowClass);
                    $("#" + idProdotto + " table.partenze tbody").append(newRow);
                });

                // disattivo il link
                $("#" + idProdotto + " li.tutte_partenze").unbind("click").css({ "opacity": "0.5", "cursor": "default" });

            } else {
                $.fn.Utility.ShowMessage("Attenzione", "Non sono presenti altre partenze.");
            }
        });

    }

})(jQuery);
