(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,
        Agenzia: {}
    };

    $.fn.Risultati = function (options) {
        // sovrascrivo le proprietà con quelle eventualmente passate
        if (options) {
            Config = $.extend(Config, options);
        }
        Config.Container = $(this);
        Init();
    };


    $.fn.Risultati.GetConfig = function () {
        return Config;
    }


    $.fn.Risultati.Destroy = function () {
        // resetto gli oggetti interni al plugin
        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;
        Config.Agenzia = {};
    }


    function Init() {

        // carico l'html della pagina
        Config.Container.load(Config.ClientURL, function () {

            // verifico se è presente un agenzia in sessione
            CheckAgenziaInSessione();

            // carico l'agenzia
            if (Config.AgenziaInSessione) {
                CaricaAgenzia();
            }

            // 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();

                // setto i bindings
                Bindings();

                // salvo lo stato del plugin
                $.fn.Travelmind.SaveState("Risultati", Config);

                // stondo gli angoli
                $.fn.Travelmind.RoundCorners();

                // rilancio l'evento "il plugin ha finito il caricamento"
                $(Config.Container).trigger("ComponentLoaded");

                // aggiusto le altezze
                $.fn.Travelmind.AdjustBoxHeight("#risultati #left", "#risultati #right");

            } else {

                // messaggio di errore se la ricerca non produce risultati            
                $.fn.Utility.ShowMessage("Attenzione", "La ricerca non ha prodotto risultati");
                $.fn.Travelmind.LoadPlugin("Home");

            }
        });
    }


    function CaricaAgenzia() {
        if ($.isEmptyObject(Config.Agenzia)) {
            var parameters = {};
            parameters.action = "SelAgenzia";
            $.ajax({
                async: false,
                cache: false,
                url: Config.ServerUtilityURL,
                data: parameters,
                success: function (returnData) {
                    if (returnData != "-1") {
                        Config.Agenzia = $.parseJSON(returnData);
                    }
                }
            });
        }
    }


    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' });

        // testo per tornare alla home
        $("#riavvia_ricerca").bind("click", function () { $.fn.Travelmind.RestorePlugin("Home"); });
    }


    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.Agenzia.IsB2B && Config.MostraPrezzoNetto == false) {
                    Config.MostraPrezzoNetto = true;
                    RenderizzaListaProdotti();
                }
                break;

            case 120: // F9: prezzo lordo                
                if (Config.AgenziaInSessione && Config.Agenzia.IsB2B && 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();
        $.fn.Travelmind.AdjustBoxHeight("#risultati #left", "#risultati #right");
    }


    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;
                    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: "220",
            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);
        }

        // 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) { // espongo un messaggio...
            var $border = $("<div/>", { "class": "box_border rounded" }).appendTo("#prodotti");
            $box = $("<div/>", { "class": "box rounded" }).appendTo($border);
            $("<div/>", { "class": "header_warning rounded_top" }).html("Attenzione:").appendTo($box);
            $("<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($box);
            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).attr("nome_operatore", prodotto.Operatore.Nome);
        $(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);
        $(tplProdotto).find(".durata").html(prodotto.DurataNotti + " notti ");
        $(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 > 70) {
            $(tplProdotto).find(".header").addClass("doubleHeight");
        }

        // se il pacchetto è "VACANZE MIRATE" unisco le colonne "prezzo catalogo" e "sconto" e tolgo le intestazioni        
        if (prodotto.Operatore.Nome.indexOf("VM") != -1) {
            $(tplProdotto).find("table.partenze thead td.sconto").remove();
            $(tplProdotto).find("table.partenze thead td.prezzo_catalogo").html("").attr("colspan", "2");
        }

        // listini
        $.each(prodotto.Listini, function (i) {
            var rowClass = (i % 2 == 0) ? "even" : "odd";
            var newRow = RenderizzaListino(prodotto.Listini[i], prodotto.Operatore.Nome);
            $(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, nomeOperatore) {

        var $row = $("<tr/>");
        var $col = null;

        // tipologia
        $col = $("<td/>", { "class": "tipologia" }).appendTo($row);
        var $img = "";
        if (Config.AgenziaInSessione && Config.Agenzia.IsB2B) {
            var title = "";
            switch (Listino.PrezzoTipo.toUpperCase()) {
                case "N":
                    title = "Netta";
                    break;
                case "O":
                    title = "Offerta";
                    break;
                case "C":
                    title = "Catalogo";
                    break;
            }
            if (Listino.PrezzoTipo.toString().indexOf(" ", 0) != -1 || Listino.PrezzoTipo.toString() == "") {
                $img = $("<img/>", { "class": "tipologia_prezzo", "src": "/Plugins/comRisultati/Images/none.png", "title": title });
            } else {
                // Se è Vacanze Mirate Carico sempre il Logo VM
                if (nomeOperatore.indexOf("VM") != -1) {
                    title = "Vacanze Mirate";
                    $img = $("<img/>", { "class": "tipologia_prezzo", "src": "/Plugins/comRisultati/Images/VM.png", "title": title });
                }
                else {
                    $img = $("<img/>", { "class": "tipologia_prezzo", "src": "/Plugins/comRisultati/Images/" + Listino.PrezzoTipo.toLowerCase() + ".png", "title": title });
                }
                $img.css({ "cursor": "pointer" }).bind("mouseover", function () {
                    $(this).tooltip({
                        effect: 'slide',
                        slideOffset: 10,
                        offset: [10, 2],
                        tipClass: 'tooltip_voli',
                        cancelDefault: true,
                        onShow: function () {
                            $img.attr("title", "");
                        }
                    });
                    var api = $(this).data("tooltip");
                    api.show();
                });
            }

        }
        $col.html($img);

        // 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);
        });


        // se il pacchetto è "VACANZE MIRATE" le colonne "prezzo catalogo" e "sconto" si uniscono e mostrano un messaggio di promozione                
        if (nomeOperatore.indexOf("VM") != -1) {
            $col = $("<td/>", { "class": "prezzo_catalogo", "colspan": "2" }).appendTo($row);
            $col.css({ "width": "100px", "color": "#F29400", "text-align": "center", "font-weight": "bold", "text-decoration": "blink" });
            $col.html("QUOTA BASE");

        } else {

            // 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 {
            $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);
        if (Config.MostraPrezzoNetto) {
            $col.html(Listino.PrpubblicoNetto + " &euro;").addClass("netto");
        } else {
            $col.html(Listino.Prpubblico + " &euro;").removeClass("netto");
        }

        // 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);
        }).css({ "cursor": "pointer" });

        return $row;
    }


    function VaiAlPreventivo(idProdotto, idListini) {
        var FormData = {};
        FormData.IdProdotto = idProdotto;
        FormData.IdListini = idListini;
        // salvo la configurazione
        $.fn.Travelmind.SaveState("Risultati", Config);
        // attendo che sia stata salvata
        $(document).delay(1000);
        // carico il preventivo
        $.fn.Travelmind.LoadPlugin("Preventivo", 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);
                var nomeOperatore = $("#" + idProdotto).attr("nome_operatore");
                $.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], nomeOperatore);
                    $(newRow).addClass(rowClass);
                    $("#" + idProdotto + " table.partenze tbody").append(newRow);
                });

                // disattivo il link
                $("#" + idProdotto + " li.tutte_partenze").unbind("click").css({ "opacity": "0.5", "cursor": "default" });

                // aggiusto le altezze
                $.fn.Travelmind.AdjustBoxHeight("#risultati #left", "#risultati #right");
            } else {
                //$.fn.Utility.ShowMessage("Attenzione", "Non sono presenti altre partenze o si &egrave; verificato un errore. Riprovare in seguito.");
                $.fn.Utility.ShowMessage("Attenzione", "Non sono presenti altre partenze.");
            }
        });

    }


})(jQuery);
