(function ($) {

    var Config = {
        ServerURL: "/Controller/Preventivo.ashx",
        ServerUtilityURL: "/Controller/Utility.ashx",
        ClientURL: "/Plugins/comPreventivo/Preventivo.htm",
        StyleURL: "/Plugins/comPreventivo/Preventivo.css",
        Container: "",
        FormData: {},
        DataPartenza: "",
        IdProdotto: "",
        IdAeroporti: "",
        IdListini: "",
        IdListino: "",
        Camere: [],
        CostiOpzionali: {},
        CostiPacchetto: {},
        ConnettoriAttivi: false,
        CheckCamereAlternative: false,
        MostraPrezzoNetto: false,
        Trattamenti: {},
        TrattamentoScelto: ""
    };


    $.fn.Preventivo = function (options) {
        // integro le configurazioni con quelle passate (injection di parametri)
        if (options) {
            Config = $.extend(Config, options);
        }

        // setto il container
        Config.Container = $(this);

        // lancio la funzione di ingresso
        Init();
    };


    $.fn.Preventivo.GetConfig = function () {
        return Config;
    }

    function Init() {

        // aggiorno i parametri interni con quelli passati
        if (!$.isEmptyObject(Config.FormData)) {
            Config.IdProdotto = Config.FormData.IdProdotto;
            Config.IdListini = Config.FormData.IdListini;
            Config.DataPartenza = Config.FormData.DataPartenza;
            Config.IdAeroporti = Config.FormData.IdAeroporti;
        }

        // carico la pagina html
        Config.Container.load(Config.ClientURL, function () {

            $.fn.Utility.CaricaBanner(".prezzoChiaro", "/prezzo.htm");

            // gestisco le chiamate provenienti direttamente dalle offerte in home page
            GestisciChiamateEsterne();

            // setto i bindings sull'interfaccia
            Bindings();

            // effettuo la chiamata che serve per mettere in sessione 
            // la lista di recs associata ai listini del preventivo (servirà poi lato server).
            CaricaServerRecs();


            // controllo se per il tour operator del prodotto sono previste le ceamere alternatiove.
            // Cristian 27/04/2011 
            CheckCamereAlternative();

            // controllo se i connettori open-tour sono attivi sul prodotto
            CheckConnettoriAttivi();

            // personalizzo il riepilogo del prodotto.
            // da qui partiranno le renderizzazioni di camere e costi opzionali perchè questi dipendono dall'aeroporto (quindi listino) scelto.
            RenderizzaRiepilogoProdotto();

            $("#box_riepilogo_prodotto").bind("ModuleLoaded", function () {
                // salvo lo stato del plugin
                $.fn.Travelmind.SaveState("Preventivo", Config);

                // rilancio l'evento "pagina pronta"            
                $(Config.Container).trigger("ComponentLoaded");

                // smusso gli angoli dell'interfaccia
                $.fn.Travelmind.RoundCorners();

                // pareggio le altezze (destra, sinistra)
                $.fn.Travelmind.AdjustBoxHeight("#preventivo #left", "#preventivo #right");
            });

            $("#divTratt").hide();
            RenderizzaTrattamenti();

        });
    }


    $.fn.Preventivo.Destroy = function () {
        // distruzione degli oggetti interni al plugin
        Config.Container = "";
        Config.FormData = {};
        Config.IdAeroporti = "";
        Config.DataPartenza = "";
        Config.IdProdotto = "";
        Config.IdListini = "";
        Config.IdListino = "";
        Config.Camere = [];
        Config.CostiOpzionali = {};
        Config.CostiPacchetto = {};
        Config.MostraPrezzoNetto = false;
        Config.ConnettoriAttivi = false;
        Config.CheckCamereAlternative = false;
        Config.Trattamenti = {};
        Config.TrattamentoScelto = "";

    }


    function GestisciChiamateEsterne() {

        // le chiamate provenienti dalle offerte passano l'id_prodotto, una lista di aeroporti e la data partenza.
        // questa funzione permette di ricavare da questi dati un elenco di listini, in modo che il processo possa proseguire tranquillamente.
        // (questo perchè gli id_listino cambiano ogni notte per via degli importatori).
        if (Config.DataPartenza != "" && Config.DataPartenza != undefined) { // riusciamo a capire se la chiamata proviene dalle offerte dalla presenza di questo campo.
            var parameters = {};
            parameters.action = "SelListiniByAeroporti";
            parameters.idProdotto = Config.IdProdotto;
            parameters.idAeroporti = Config.IdAeroporti;
            parameters.dataPartenza = Config.DataPartenza;
            $.ajax({
                async: false,
                cache: false,
                url: Config.ServerURL,
                data: parameters,
                success: function (returnData) {
                    Config.IdListini = (returnData != "-1" && returnData != "") ? returnData : "";
                }
            });
        }
    }


    function CercaCamereAlternative(idCameraPadre) {

        // faccio partire il loader
        var imgTrigger = $("#form_camere tbody tr[id=" + idCameraPadre + "] td.col7 img");
        imgTrigger.attr("src", "/Plugins/comPreventivo/Images/loader.gif");

        // recupero camera e prodotto
        var RiepilogoProdotto = $.fn.RiepilogoProdotto.GetRiepilogoProdotto();
        var Camera = CercaCamera(idCameraPadre);

        // imposto i parametri da passare al server
        var parameters = {};
        parameters.action = "SelCamereAlternative";
        parameters.camera = JSON.stringify(Camera);
        parameters.idProdotto = RiepilogoProdotto.Id;
        parameters.idListino = Config.IdListino;
        parameters.idStruttura = RiepilogoProdotto.Struttura.Id;
        parameters.dataPartenza = RiepilogoProdotto.Listini[0].Partenza;
        parameters.durataNotti = RiepilogoProdotto.DurataNotti;
        parameters.iata = RiepilogoProdotto.Listini[0].VoloAndata.AeroportoPartenza.CodiceIata;

        // chiamo il server e ricavo i dati in risposta.
        var CamereAlternative = {};
        $.ajax({
            async: true,
            cache: false,
            type: "POST",
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                CamereAlternative = (returnData != "-1" && returnData != "") ? $.parseJSON(returnData) : {};

                // renderizzo le camere alternative
                if (!$.isEmptyObject(CamereAlternative)) {
                    // aggiungo le camere alternative alle camere standard e le renderizzo in tabella 
                    $.each(CamereAlternative, function (i) {
                        Config.Camere.push(CamereAlternative[i]);
                        RenderizzaCamera(CamereAlternative[i]);
                    });
                    // disabilito il pulsante
                    imgTrigger.attr("src", "/Plugins/comPreventivo/Images/btn-camere-aggiuntive.png").css({ "opacity": "0.5", "cursor": "default" }).unbind("click");
                } else {
                    imgTrigger.parent().empty().html("-");
                }
            }
        });
    }


    function PrezzaCameraAlternativa(idCamera) {

        // faccio partire il loader
        var $imgTrigger = $("#form_camere tbody tr[id=" + idCamera + "] td.col2 img");
        $imgTrigger.attr("src", "/Plugins/comPreventivo/Images/loader2.gif");

        // recupero camera da prezzare e prodotto
        var RiepilogoProdotto = $.fn.RiepilogoProdotto.GetRiepilogoProdotto();
        var Camera = CercaCamera(idCamera);
        var CameraPrezzata = {};

        // chiamo il server per la prezzatura
        var parameters = {};
        parameters.action = "SelPrezzaCameraAlternativa";
        parameters.camera = JSON.stringify(Camera);
        parameters.idProdotto = RiepilogoProdotto.Id;
        parameters.idListino = Config.IdListino;
        parameters.dataPartenza = RiepilogoProdotto.Listini[0].Partenza;
        parameters.durataNotti = RiepilogoProdotto.DurataNotti;
        $.ajax({
            async: true,
            cache: false,
            type: "POST",
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                // se il server risponde sovrascrivo la camera attuale con quella prezzata
                CameraPrezzata = (returnData != "-1" && returnData != "") ? $.parseJSON(returnData) : Camera;

                // tolgo la camera non prezzata dalla lista e aggiungo al suo posto quella prezzata
                $.each(Config.Camere, function (i) {
                    if (Config.Camere[i].Id == CameraPrezzata.Id) {
                        //Config.Camere.splice(i, 1);
                        //Config.Camere.push(CameraPrezzata);
                        Config.Camere[i] = CameraPrezzata;
                        return;
                    }
                });

                // renderizzo i nuovi prezzi
                var $col = null;
                var prezzo = 0;
                // prezzo adulto
                prezzo = (Config.MostraPrezzoNetto) ? CameraPrezzata.PrAdultoNetto : CameraPrezzata.PrAdulto;
                $col = $imgTrigger.parents("tr").find("td.col2").empty().html(prezzo);
                // prezzo terzo letto
                prezzo = (Config.MostraPrezzoNetto) ? CameraPrezzata.Pr3lettoNetto : CameraPrezzata.Pr3letto;
                $col = $imgTrigger.parents("tr").find("td.col3").empty().html(prezzo);
                // prezzo quarto letto
                prezzo = (Config.MostraPrezzoNetto) ? CameraPrezzata.Pr4lettoNetto : CameraPrezzata.Pr4letto;
                $col = $imgTrigger.parents("tr").find("td.col4").empty().html(prezzo);
                // abilito la combo sistemazioni
                if (CameraPrezzata.PrAdultoNetto != "N.D." || CameraPrezzata.PrAdulto != "N.D.") {
                    $("#form_camere tbody tr[id='" + CameraPrezzata.Id + "'] td.col5 .rounded_input .txtSistemazioni").attr("disabled", "");
                }
            }
        });
    }


    function Bindings() {
        //pulsante prosegui
        $("img#prosegui").bind("click", VaiAllAcquisto);

        //Nuova gestione del pulsante prosegui in base alla selezione di una camera
        $('#form_camere td.col5 select').live('change', function () {
            var selezione = "";
            $("#form_camere td.col5 select option:selected").each(function () {
                selezione = selezione + $(this).text();
                if (selezione > 0) {
                    $("img#prosegui").fadeIn("fast");
                    $("img#prosegui2").fadeIn("fast");
                }
                else {
                    $("img#prosegui").fadeOut("fast");
                    $("img#prosegui2").fadeOut("fast");
                }
            });
        });

        //Preparo le camere per la riprezzatura cambiando il trattamento
        $('#DatiTrattamenti').live('change', function () {
            var codTratSel = $("#DatiTrattamenti option:selected").val();
            Config.TrattamentoScelto = $("#DatiTrattamenti option:selected").text();

            // Tolgo il prezzo alle camere per permettere alla renderizzazione
            // di riprezzare le camere.
            // Cambio anche il CodProdottoOrigine pasando il codice trattamento scelto.
            $.each(Config.Camere, function (i) {
                Config.Camere[i].PrAdultoNetto = "";
                Config.Camere[i].PrAdulto = "";
                var arrCod = Config.Camere[i].CodProdottoOrigine.split("#");
                Config.Camere[i].CodProdottoOrigine = arrCod[0] + "#" + arrCod[1] + "#" + arrCod[2] + "#" + codTratSel + "#" + arrCod[4];
            });


            //pulizia delle camere esistenti in tabella
            $("#form_camere tbody").empty();
            // azzero il totale
            $("#prezzo_totale").html("0 &euro;");

            $.each(Config.Camere, function (i) {
                RenderizzaCamera(Config.Camere[i]);
            });
        });




        // navigation menu
        $("#nav_menu #riavvia_ricerca").bind("click", function () { $.fn.Travelmind.RestorePlugin("Home"); });
        $("#nav_menu #torna_risultati").bind("click", function () { $.fn.Travelmind.RestorePlugin("Risultati"); });

        // gestione tastiera (F8/F9)        
        $(document).bind("keyup", GestisciTastiera);

        //se skype e' installato niente altrimenti fa puntare i links di skype alla pagina di download
        $.fn.Utility.UpdateSkypeLinks();
    }

    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 ($.fn.Utility.IsAgenziaLoggata() && Config.MostraPrezzoNetto == false) {
                    Config.MostraPrezzoNetto = true;
                    if (Config.IdListino != "") {
                        ConvertiCostiNetto(true);
                        CalcolaCostiCamere();
                    }
                }
                break;

            case 120: // F9: prezzo lordo                
                if ($.fn.Utility.IsAgenziaLoggata() && Config.MostraPrezzoNetto == true) {
                    Config.MostraPrezzoNetto = false;
                    if (Config.IdListino != "") {
                        ConvertiCostiNetto(false);
                        CalcolaCostiCamere();
                    }
                }
                break;
        }
    }


    function ConvertiCostiNetto(netto) {
        // converto i prezzi delle camere
        var idCamera = 0;
        var Camera = {};
        $("#form_camere tbody tr").each(function (x) {
            idCamera = $(this).attr("id");
            Camera = CercaCamera(idCamera);
            if (netto) {
                // prezzo adulto                
                if (Camera.PrAdultoNetto != "") { // se c'è ancora l'immagine x la prezzatura non faccio nulla
                    $(this).find("td.col2").html(Camera.PrAdultoNetto).addClass("netto");
                } else {
                    $(this).find("td.col2").addClass("netto");
                }
                // prezzo 3 letto                
                $(this).find("td.col3").html(Camera.Pr3lettoNetto).addClass("netto");
                // prezzo 4 letto
                $(this).find("td.col3").html(Camera.Pr4lettoNetto).addClass("netto");
                // totale parziale
                $(this).find("td.col6").addClass("netto");
            } else {
                // prezzo adulto                
                if (Camera.PrAdulto != "") { // se c'è ancora l'immagine x la prezzatura non faccio nulla
                    $(this).find("td.col2").html(Camera.PrAdulto).removeClass("netto");
                } else {
                    $(this).find("td.col2").removeClass("netto");
                }
                // prezzo 3 letto                
                $(this).find("td.col3").html(Camera.Pr3letto).removeClass("netto");
                // prezzo 4 letto                
                $(this).find("td.col3").html(Camera.Pr4letto).removeClass("netto");
                // totale parziale
                $(this).find("td.col6").removeClass("netto");
            }
        });
    }


    function CheckConnettoriAttivi() {
        var parameters = {};
        parameters.action = "CheckConnettoriAttivi";
        parameters.idProdotto = Config.IdProdotto;
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerUtilityURL,
            data: parameters,
            success: function (returnData) {
                Config.ConnettoriAttivi = (returnData == "1") ? true : false;
            }
        });
    }

    function CaricaServerRecs() {
        var parameters = {};
        parameters.action = "SelRecsByIdListini";
        parameters.listaIdListino = Config.IdListini;
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters
        });
    }

    function CaricaCostiPacchetto() {
        var parameters = {};
        parameters.action = "SelCostiPacchetto";
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                Config.CostiPacchetto = (returnData != "-1" && returnData != "") ? $.parseJSON(returnData) : [];
            }
        });
    }

    function CaricaCamere(idListino) {
        var parameters = {};
        parameters.action = "SelCamereByIdListino";
        parameters.idListino = idListino;
        parameters.prezzoPerCamera = $("#riepilogo_prodotto").attr("prezzo_per_camera");
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                Config.Camere = (returnData != "-1" && returnData != "") ? $.parseJSON(returnData) : [];
            }
        });
    }


    function CaricaCostiOpzionali(idListino) {
        var parameters = {};
        parameters.action = "SelCostiOpzionaliByIdListini";
        parameters.idListino = idListino;
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                Config.CostiOpzionali = (returnData != "-1") ? $.parseJSON(returnData) : {};
            }
        });
    }


    function RenderizzaCostiOpzionali(idListino) {

        // verifico che il listino sia effettivamente cambiato (altrimenti non rieseguo inutilmente tutto).
        if (idListino != "") {
            $("#form_costi_opzionali thead").empty();
            $("#form_costi_opzionali tbody").empty();

            // carico dal server i costi opzionali
            CaricaCostiOpzionali(idListino);

            // renderizzo i costi opzionali
            if (!$.isEmptyObject(Config.CostiOpzionali)) {
                $("#costi_opzionali").show();

                var $table = null;
                var $thead = null;
                var $tbody = null;
                var $row = null;
                var $col = null;
                var $roundBox = null;
                var $input = null;
                var cssClass = "";

                // tabella
                $table = $("<table/>", { "id": "form_costi_opzionali", "cellspacing": "0", "cellpadding": "3" }).appendTo("#costi_opzionali .contents");

                // intestazione tabella
                $thead = $("<thead/>").appendTo($table);
                $row = $("<tr/>").appendTo($thead);
                $col = $("<td/>", { "class": "descrizione" }).html("Descrizione").appendTo($row);
                $col = $("<td/>", { "class": "prezzo" }).html("Prezzo Cad.").appendTo($row);
                $col = $("<td/>", { "class": "quantita" }).html("Quantit&agrave;").appendTo($row);
                $col = $("<td/>", { "class": "totale_parziale" }).html("Totale Parziale").appendTo($row);

                // righe costi opzionali
                $tbody = $("<tbody/>").appendTo($table);
                $.each(Config.CostiOpzionali, function (i) {
                    cssClass = (i % 2 != 0) ? "even" : "odd";
                    $row = $("<tr/>", {
                        "id": Config.CostiOpzionali[i].Id,
                        "class": cssClass,
                        "applica_tutti": Config.CostiOpzionali[i].SuTutti,
                        "applica_adulto": Config.CostiOpzionali[i].SuAdulto,
                        "applica_bambino": Config.CostiOpzionali[i].SuBambino
                    }).appendTo($tbody);

                    // descrizione
                    $col = $("<td/>", { "class": "descrizione" }).html(Config.CostiOpzionali[i].Descrizione).appendTo($row);

                    // prezzo
                    $col = $("<td/>", { "class": "prezzo" }).html(Config.CostiOpzionali[i].PrVendita).appendTo($row);

                    // quantita
                    $col = $("<td/>", { "class": "quantita" }).appendTo($row);
                    if (Config.CostiOpzionali[i].SuPacchetto) {
                        $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo($col);
                        $input = $("<select/>", { "class": "inputbox txtQuantita" });
                        for (i = 0; i <= 3; i++) {
                            $("<option/>", { "value": i, "text": i }).appendTo($input);
                        }
                    } else {
                        $roundBox = $("<div/>", { "class": "rounded_check" }).appendTo($col);
                        $input = $("<input/>", { "type": "checkbox", "class": "txtQuantita" });
                    }
                    $input.appendTo($roundBox);
                    $input.bind("change", CalcolaCostiCamere);

                    // totale parziale
                    $col = $("<td/>", { "class": "totale_parziale" }).html("0").appendTo($row);

                });

                // nascondo i costi opzionali se non presenti
            } else {
                $("#costi_opzionali").hide();
            }
        }
    }

    function RenderizzaCostiPacchetto() {

        // elimino i costi già presenti                             
        $("#form_costi_pacchetto tbody").empty();

        // azzero il totale
        $("#prezzo_totale").html("0 &euro;");

        // ricavo l'elenco dei Costi a Pacchetto dal server
        CaricaCostiPacchetto();

        if (Config.CostiPacchetto.length > 0) {
            $("#costi_pacchetto").show();
            $("#form_costi_pacchetto thead td.col0").html("Descrizione");
            $("#form_costi_pacchetto thead td.col1").html("Prezzo");

            // aggiungo le camere alla tabella
            $.each(Config.CostiPacchetto, function (i) {
                RenderizzaCostoPacchetto(Config.CostiPacchetto[i]);
            });
        }
        else {
            $("#costi_pacchetto").hide();
        }

        $.fn.Travelmind.RoundCorners();

    }

    function RenderizzaCostoPacchetto(Costo) {

        var cssClass = "";
        var $row = null;
        var $col = null;
        var $roundedBox = null;
        var $input = null;

        // nuova riga
        cssClass = "odd";
        $row = $("<tr/>", { "id": Costo.Id, "class": cssClass });

        // colonna descrizione camera
        $("<td/>", { "class": "col0" }).html(Costo.Descrizione).appendTo($row);


        // colonna totale parziale
        $("<td/>", { "class": "col1" }).html(Costo.PrVendita).appendTo($row);


        $row.appendTo("#form_costi_pacchetto tbody").fadeIn("fast");
    }



    function RenderizzaCamere(idListino) {

        $.fn.RiepilogoProdotto.ChangeListino(idListino);

        // elimino le camere già presenti                             
        $("#form_camere tbody").empty();

        // azzero il totale
        $("#prezzo_totale").html("0 &euro;");

        // ricavo l'elenco delle camere dal server
        if (idListino != "") {

            if (idListino != Config.IdListino) {
                CaricaCamere(idListino);
                Config.IdListino = idListino;
            }

            if (!$.isEmptyObject(Config.Camere)) {

                // cambio le intestazioni della tabella camere a seconda che i prezzi siano per pax o per camera  
                var prezzoPerCamera = $("#riepilogo_prodotto").attr("prezzo_per_camera").toString();
                if (prezzoPerCamera === "true") {
                    $("#form_camere thead td.col0").html("Disp.");
                    $("#form_camere thead td.col1").html("Camera");
                    $("#form_camere thead td.col2").html("Prezzo Camera");
                    $("#form_camere thead td.col3").html("");
                    $("#form_camere thead td.col4").html("");
                    $("#form_camere thead td.col5").html("Nr. Camere");
                    $("#form_camere thead td.col6").html("Totale Parziale");
                    $("#form_camere thead td.col7").html("Camere Alternative");
                } else {
                    $("#form_camere thead td.col0").html("Disp.");
                    $("#form_camere thead td.col1").html("Camera");
                    $("#form_camere thead td.col2").html("Prezzo Adulto");
                    $("#form_camere thead td.col3").html("Terzo Letto");
                    $("#form_camere thead td.col4").html("Quarto Letto");
                    $("#form_camere thead td.col5").html("Nr. Sistemazioni");
                    $("#form_camere thead td.col6").html("Totale Parziale");
                    $("#form_camere thead td.col7").html("Altre Camere");
                }

                // aggiungo le camere alla tabella
                $.each(Config.Camere, function (i) {
                    RenderizzaCamera(Config.Camere[i]);
                });
            }

            $.fn.Travelmind.RoundCorners();
            RenderizzaTrattamenti();

        } else {
            // nascondo il bottone "prosegui"
            $("img#prosegui").fadeOut("fast");
        }
    }

    function RenderizzaCamera(Camera) {

        var cssClass = "";
        var $row = null;
        var $col = null;
        var $roundedBox = null;
        var $input = null;

        // nuova riga
        cssClass = (Camera.Alternativa) ? "even" : "odd";
        $row = $("<tr/>", { "id": Camera.Id, "class": cssClass });

        // colonna disponibilita
        $col = $("<td/>", { "class": "col0" }).appendTo($row);
        if (Camera.TipoAllot.toUpperCase() == "R") {
            $("<img/>", { "src": "/Plugins/comPreventivo/Images/ico-rq.png" }).appendTo($col);
        } else {
            $("<img/>", { "src": "/Plugins/comPreventivo/Images/ico-ok.png" }).appendTo($col);
        }

        // colonna descrizione camera
        $("<td/>", { "class": "col1" }).html(Camera.Descrizione).appendTo($row);

        // colonna prezzo adulto/camera
        $col = $("<td/>", { "class": "col2" }).appendTo($row);
        if (Config.MostraPrezzoNetto) {
            $col.html(Camera.PrAdultoNetto).addClass("netto");
        } else {
            $col.html(Camera.PrAdulto).removeClass("netto");
        }
        //if (Camera.Alternativa && (Camera.PrAdultoNetto == "" || Camera.PrAdulto == "")) { // camera alternativa da prezzare                
        if ((Camera.PrAdultoNetto == "" || Camera.PrAdulto == "")) { // camera alternativa da prezzare                
            $col.empty();
            $input = $("<img/>", { "src": "/Plugins/comPreventivo/Images/loader2_static.gif" }).css({ "cursor": "pointer" }).appendTo($col);
            $input.bind("click", function () { PrezzaCameraAlternativa(Camera.Id); });
        }

        // colonna terzo letto
        $col = $("<td/>", { "class": "col3" }).appendTo($row);
        if (Config.MostraPrezzoNetto) {
            $col.html(Camera.Pr3lettoNetto).addClass("netto");
        } else {
            $col.html(Camera.Pr3letto).removeClass("netto");
        }

        // colonna quarto letto
        $col = $("<td/>", { "class": "col4" }).appendTo($row);
        if (Config.MostraPrezzoNetto) {
            $col.html(Camera.Pr4lettoNetto).addClass("netto");
        } else {
            $col.html(Camera.Pr4letto).removeClass("netto");
        }

        // colonna combo sistemazioni  
        $col = $("<td/>", { "class": "col5" }).appendTo($row);
        $roundedBox = $("<div/>", { "class": "rounded_input" }).css({ "width": "30px" }).appendTo($col);
        $input = $("<select/>", { "class": "inputbox txtSistemazioni" }).appendTo($roundedBox);
        var tipoAllotment = $("#riepilogo_prodotto").attr("tipo_allotment");
        var maxBound = (tipoAllotment == "Q") ? Camera.Disponibilita : 5;
        for (x = 0; x <= maxBound; x++) {
            $("<option/>", { "value": x }).html(x).appendTo($input);
        }
        $input.bind("change", CalcolaCostiCamere);
        // disabilito la combo se la camera è alternativa e non è ancora stata fatta la prezzatura
        //if (Camera.Alternativa && Camera.PrAdulto == "") {
        if (Camera.PrAdulto == "") {
            $input.attr("disabled", true);
        }
        // valorizzo la combo se esiste già un quantità preselezionata (browser back)
        if (Camera.QtaCamera != 0) {
            $input.val(Camera.QtaCamera);
        }

        // colonna totale parziale
        $("<td/>", { "class": "col6" }).html("0").appendTo($row);

        // colonna cerca altre camere
        $col = $("<td/>", { "class": "col7" }).html("-").appendTo($row);
        if (!Camera.Alternativa && Config.CheckCamereAlternative) {
            $col.html("");
            $input = $("<img/>", { "src": "/Plugins/comPreventivo/Images/btn-camere-aggiuntive.png", "title": "cerca camere aggiuntive" }).appendTo($col);
            $input.css({ "cursor": "pointer" });
            $input.bind("click", function () { CercaCamereAlternative(Camera.Id); });
        }

        // appendo la riga alla tabella (se la camera è alternativa la appendo sotto la camera padre)
        if (Camera.Alternativa) {
            $row.insertAfter("#form_camere tbody tr[id='" + Camera.IdPadre + "']").fadeIn("fast");
        } else {
            $row.appendTo("#form_camere tbody").fadeIn("fast");
        }
    }


    function RenderizzaRiepilogoProdotto() {

        // carico il riepilogo del prodotto                        
        $("#box_riepilogo_prodotto").RiepilogoProdotto({ "Align": "horizontal", "IdProdotto": Config.IdProdotto, "IdListino": Config.IdListini.split(",")[0], "TrattamentoScelto": "" });


        // dopo che il riepilogo ha finito il caricamento lo personalizzo
        $("#box_riepilogo_prodotto").bind("ModuleLoaded", function () {
            RenderizzaCostiPacchetto();
            // se ci sono più listini creo la combo di selezione dell'aeroporto
            if (Config.IdListini.split(",").length > 1) {
                CreaComboAeroporto();
                $("#riepilogo_prodotto ul.menu li.info_voli").hide();
                $("#riepilogo_prodotto ul.menu li.locandina").hide();
            } else {
                // se c'è un solo listino avvio direttamente la renderizzazione di camere e costi opzionali                
                RenderizzaCamere(Config.IdListini);
                RenderizzaCostiOpzionali(Config.IdListini);

                CalcolaCostiCamere();
                CalcolaCostiOpzionali();
                CalcolaTotale();
                if ($("#riepilogo_prodotto .aeroporto").html() == "Solo soggiorno") {
                    $("#riepilogo_prodotto ul.menu li.info_voli").hide();
                }
                else
                    $("#riepilogo_prodotto ul.menu li.info_voli").show();

                if (!$.fn.Utility.IsAgenziaLoggata()) {
                    $("#riepilogo_prodotto ul.menu li.locandina").hide();
                } else {
                    $("#riepilogo_prodotto ul.menu li.locandina").show();
                }
            }

//            // prezzo include
//            var prezzoInclude = $("#riepilogo_prodotto").attr("prezzo_include");
//            if (prezzoInclude != "") {
//                prezzoInclude = $.parseJSON(prezzoInclude);
//                var $ul = $("<ul/>").appendTo("#prezzo_include");
//                $.each(prezzoInclude, function (i) {
//                    $("<li/>").html(prezzoInclude[i]).appendTo($ul);
//                });
//            }

//            // prezzo non include
//            var prezzoNonInclude = $("#riepilogo_prodotto").attr("prezzo_non_include");
//            if (prezzoNonInclude != "") {
//                prezzoNonInclude = $.parseJSON(prezzoNonInclude);
//                $ul = $("<ul/>").appendTo("#prezzo_non_include");
//                $.each(prezzoNonInclude, function (i) {
//                    $("<li/>").html(prezzoNonInclude[i]).appendTo($ul);
//                });
//            }

        });
    }


    function CreaComboAeroporto() {
        // svuoto il marker dell'aeroporto nel riepilogo prodotto
        $("#riepilogo_prodotto .aeroporto").html("");
        $("#divTratt").hide();
        // chiamo il server per trovare le corrispondenze tra id_listino e nome_aeroporto
        var parameters = {};
        var Aeroporti = []; // Aeroporto.Value = idListino - Aeroporto.Text = nome aeroporto
        parameters.action = "SelAeroportiByListini";
        parameters.listaListini = Config.IdListini;
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                Aeroporti = (returnData != "-1") ? $.parseJSON(returnData) : [];
            }
        });
        var $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo("#riepilogo_prodotto .aeroporto");
        var $input = $("<select/>", { "id": "txtAeroporto", "class": "inputbox" });
        $("<option/>", { "value": "", "text": "Seleziona" }).appendTo($input);
        $.each(Aeroporti, function (i) {
            $("<option/>", { "value": Aeroporti[i].Value, "text": Aeroporti[i].Text }).appendTo($input);
        });
        $input.appendTo($roundBox);
        // al cambiamento dell'aeroporto...
        $input.bind("change", function () {
            RenderizzaCamere($(this).val());
            RenderizzaCostiOpzionali($(this).val());
            // visualizzo/nascondo locandina e info voli in base alla scelta dell'aeroporto
            if ($(this).val() == "") {
                $("#riepilogo_prodotto ul.menu li.info_voli").hide();
                $("#riepilogo_prodotto ul.menu li.locandina").hide();
                $("#divTratt").hide();
                $("#tooltip_aeroporto").show();
            } else {
                $("#riepilogo_prodotto ul.menu li.info_voli").show();
                $("#tooltip_aeroporto").hide();
                if ($.fn.Utility.IsAgenziaLoggata()) {
                    $("#riepilogo_prodotto ul.menu li.locandina").show();
                }
            }
        });

        // visualizzo un messaggio per ricordare all'utente che deve scegliere l'aeroporto
        var $tooltipAeroporto = $("<img>", { "id": "tooltip_aeroporto", "width": "178", "height": "54", "src": "/Plugins/comPreventivo/Images/tooltip_aeroporto.png" }).appendTo("#riepilogo_prodotto .aeroporto");
        $tooltipAeroporto.css({ "position": "relative", "top": "-18px" });

        // se è già presente un idListino (l'utente fa back sul browser) recupero lo stato precedente del plugin
        if (Config.IdListino != "") {
            $input.val(Config.IdListino);
            RenderizzaCamere(Config.IdListino);
            RenderizzaCostiOpzionali(Config.IdListino);
            CalcolaCostiCamere();
            CalcolaCostiOpzionali();
            CalcolaTotale();
            $("#tooltip_aeroporto").hide();
            $("#riepilogo_prodotto ul.menu li.info_voli").show();
            if (!$.fn.Utility.IsAgenziaLoggata()) {
                $("#riepilogo_prodotto ul.menu li.locandina").hide();
            } else {
                $("#riepilogo_prodotto ul.menu li.locandina").show();
            }
        }

    }

    function RenderizzaTrattamenti() {
        var parameters = {};
        parameters.action = "SelTrattamenti";
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {

                if (returnData != "-1") {
                    Config.Trattamenti = $.parseJSON(returnData);
                    $("#divTratt").hide();
                    if (Config.Trattamenti.length > 1) {
                        $("#divTratt").show();
                    }
                    $('#DatiTrattamenti').children().remove();
                    jQuery.each(Config.Trattamenti, function (index, obj) {
                        $('#DatiTrattamenti').append(
                               $('<option/>', { "value": obj.Value }).html(obj.Text)
                         );
                    });
                }
            }
        });
    }


    function CalcolaCostiCamere() {

        var nrAdulti = 0;
        var nrBambini = 0;

        // costi camere
        $("#form_camere tbody tr").each(function (x) {
            var idCamera = $(this).attr("id");
            var Camera = CercaCamera(idCamera);

            var prezzoCamera = (!isNaN($(this).find("td.col2").html())) ? parseFloat($(this).find("td.col2").html().replace(".", "").replace(",", ".")) : 0;
            var prezzoTerzoLetto = ($(this).find("td.col3").html() != "") ? parseFloat($(this).find("td.col3").html().replace(".", "").replace(",", ".")) : 0;
            var prezzoQuartoLetto = ($(this).find("td.col4").html() != "") ? parseFloat($(this).find("td.col4").html().replace(".", "").replace(",", ".")) : 0;
            var moltiplicatore = parseInt(Camera.MoltiplicatoreAdulto, 10);
            var nrSistemazioni = parseInt($(this).find(".txtSistemazioni option:selected").val(), 10);
            var totaleParziale = (((prezzoCamera * moltiplicatore) * nrSistemazioni) + (prezzoTerzoLetto * nrSistemazioni) + (prezzoQuartoLetto * nrSistemazioni));

            // ricavo il numero di adulti e bambini dalla camera che sto processando
            nrAdulti += (Camera.NAdult * nrSistemazioni);
            nrBambini += (Camera.NChild * nrSistemazioni);

            $(this).find("td.col6").html(totaleParziale.currencyFormat());

        });

        CalcolaCostiOpzionali(nrAdulti, nrBambini);

        CalcolaTotale();
    }

    function CalcolaCostiOpzionali(nrAdulti, nrBambini) {

        if ($("#costi_opzionali").is(":visible")) {
            $("#form_costi_opzionali tbody tr").each(function (y) {

                // ricavo la quantita per il costo selezionato
                var quantita = 0;
                var $input = $(this).find("td .txtQuantita");
                if ($input.is("input[type='checkbox']")) {
                    quantita = ($input.is(":checked")) ? 1 : 0;
                } else {
                    quantita = $input.val();
                }

                // ricavo l'applicabilità del costo opzionale 
                var applicaTutti = $(this).attr("applica_tutti");
                var applicaAdulto = $(this).attr("applica_adulto");
                var applicaBambino = (($(this).attr("applica_bambino").indexOf("-") != -1) && $(this).attr("applica_bambino").indexOf("Q") == -1) ? true : false;

                // calcolo il totale parziale per il costo aggiuntivo
                var prezzo = parseFloat($(this).find("td.prezzo").html()); //.replace(".", "").replace(",", "."));
                var totaleParziale = 0; // parseFloat($(this).find("td.totale_parziale").html().replace(".", "").replace(",", "."));
                if (applicaTutti == "true") {
                    totaleParziale += (quantita * (nrAdulti + nrBambini) * prezzo);
                } else if (applicaAdulto == "true" && !applicaBambino) {
                    totaleParziale += (quantita * nrAdulti * prezzo);
                } else if (applicaAdulto == "false" && applicaBambino) {
                    totaleParziale += (quantita * nrBambini * prezzo);
                } else {
                    // si applica al pacchetto
                    totaleParziale += (quantita * prezzo);
                }
                // inserisco in tabella il totale parziale calcolato
                $(this).find("td.totale_parziale").html(totaleParziale.currencyFormat());
            });

        }

    }


    function CalcolaTotale() {
        var totale = 0;
        var totale_parziale = 0;

        // sommo i parziali delle camere
        $("#form_camere tbody tr").each(function (i) {
            totale_parziale = parseFloat($(this).find("td.col6").html().replace(".", "").replace(",", "."));
            totale += totale_parziale;
        });

        if (totale > 0) {
            // sommo i costi a pacchetto
            $("#form_costi_pacchetto tbody tr").each(function (i) {
                totale_parziale = parseFloat($(this).find("td.col1").html()); //.replace(".", "").replace(",", "."));
                totale += totale_parziale;
            });

            // sommo i parziali dei costi aggiuntivi
            $("#form_costi_opzionali tbody tr").each(function (i) {
                totale_parziale = parseFloat($(this).find("td.totale_parziale").html().replace(".", "").replace(",", "."));
                totale += totale_parziale;
            });
        }
        // espongo il totale
        if (Config.MostraPrezzoNetto) {
            $("#prezzo_totale").addClass("netto");
        } else {
            $("#prezzo_totale").removeClass("netto");
        }
        $("#prezzo_totale").html(totale.currencyFormat() + " &euro;");

        // espongo (o no) il pulsante prosegui
        /*if (totale != 0) {
        $("img#prosegui").fadeIn("fast");
        } else {
        $("img#prosegui").fadeOut("fast");
        }*/
    }


    function CercaCamera(idCamera) {
        var Camera = {};
        $.each(Config.Camere, function (i) {
            if (Config.Camere[i].Id == idCamera) {
                Camera = Config.Camere[i];
                return false;
            }
        });
        return Camera;
    }

    function CercaCostoOpzionale(idCostoOpzionale) {
        var CostoOpzionale = {};
        $.each(Config.CostiOpzionali, function (i) {
            if (Config.CostiOpzionali[i].Id == idCostoOpzionale) {
                CostoOpzionale = Config.CostiOpzionali[i];
                return false;
            }
        });
        return CostoOpzionale;
    }

    function CheckCamereAlternative() {
        var parameters = {};
        parameters.action = "CheckCamereAlternative";
        parameters.idProdotto = Config.IdProdotto;
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerUtilityURL,
            data: parameters,
            success: function (returnData) {
                Config.CheckCamereAlternative = (returnData == "1") ? true : false;
            }
        });
    }

    function VaiAllAcquisto() {
        var FormData = {};

        // ricavo i dati pax
        FormData.Camere = [];
        FormData.IsRQ = false;
        $("#form_camere tbody tr").each(function (i) {
            var quantita = $(this).find(".txtSistemazioni option:selected").val();
            if (quantita != "0") {
                var Camera = CercaCamera($(this).attr("id"));
                Camera.QtaCamera = quantita;
                FormData.Camere.push(Camera);
                if (Camera.TipoAllot.toUpperCase() == "R") {
                    FormData.IsRQ = true;
                }
            }
        });

        // ricavo i costi opzionali
        FormData.CostiOpzionali = [];
        if ($("#costi_opzionali").is(":visible")) {
            $("#form_costi_opzionali tbody tr").each(function (i) {
                var quantita = 0;
                var $input = $(this).find("td .txtQuantita");
                if ($input.is("input[type='checkbox']")) {
                    quantita = ($input.is(":checked")) ? 1 : 0;
                } else {
                    quantita = $input.val();
                }
                // se l'utente ha selezionato il costo setto la quantità e inserisco il costo opzionale nell'elenco che verrà inviato al server
                if (quantita != "0") {
                    var idCostoOpzionale = $(this).attr("id");
                    var CostoOpzionale = CercaCostoOpzionale(idCostoOpzionale);
                    CostoOpzionale.Qta = quantita;
                    CostoOpzionale.PrVendita = parseFloat($(this).find("td.totale_parziale").html().replace(".", "").replace(",", "."));
                    FormData.CostiOpzionali.push(CostoOpzionale);
                }
            });
        }

        $.fn.Travelmind.SaveState("Preventivo", Config);
        $(document).delay(1000);

        // ricavo prodotto e listino
        FormData.IdProdotto = Config.IdProdotto;
        FormData.IdListino = Config.IdListino;
        FormData.TrattamentoScelto = Config.TrattamentoScelto;
        // prima di andare all'acquisto chiamo il server che salverà in sessione l'oggetto prenotazione 
        // con i primi dati dell'utente
        var parameters = {};
        parameters.action = "SetPrenotazioneInSessione";
        parameters.TrattamentoScelto = FormData.TrattamentoScelto;
        parameters.idProdotto = FormData.IdProdotto;
        parameters.idListino = FormData.IdListino;
        parameters.camere = JSON.stringify(FormData.Camere);
        parameters.costiOpzionali = JSON.stringify(FormData.CostiOpzionali);
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            type: "POST",
            success: function (returnData) {
                if (returnData != "-1") {
                    $.fn.Travelmind.LoadPlugin("Acquista", FormData);
                } else {
                    $.fn.Utility.ShowMessage("Errore", "Si &egrave; verificato un problema con la prenotazione, riprovare.");
                }
            }
        });
    }


})(jQuery);
