(function ($) {

    var Config = {
        ServerURL: "/Controller/Acquista.ashx",
        ServerUtilityURL: "/Controller/Utility.ashx",
        ClientURL: "/Plugins/comAcquista/Acquista.htm",
        StyleURL: "/Plugins/comAcquista/Acquista.css",
        Container: "",
        FormData: {},
        IdProdotto: "",
        IdListino: "",
        ConfigCamere: {},
        RiepilogoCosti: {},
        Nazionalita: {},
        Agenzia: {},
        MostraPrezzoNetto: false,
        ConnettoriAttivi: false,
        ConfermaConnettori: {},
        IsRQ: false,
        StatoProdotto: "",
        NumeroOrdine: "",
        TentativiCarta: 0,
        TrattamentoScelto: ""
    };


    $.fn.Acquista = function (options) {
        // integro le configurazioni con quelle passate (injection di parametri)
        if (options) {
            Config = $.extend(Config, options);
            Config.IdProdotto = Config.FormData.IdProdotto;
            Config.IdListino = Config.FormData.IdListino;
            Config.IsRQ = Config.FormData.IsRQ;
            Config.TrattamentoScelto = Config.FormData.TrattamentoScelto;
        }

        // setto il container
        Config.Container = $(this);

        // lancio la funzione di ingresso
        Init();
    };

    $.fn.Acquista.GetConfig = function () {
        return Config;
    }

    function Init() {
        // carico la pagina html
        Config.Container.load(Config.ClientURL, function () {

            var checkDisponibilita = true;

            $.fn.Utility.CaricaBanner(".prezzoChiaro", "/prezzo.htm");

            // calcola il totale, la quota base, e i costi della prenotazione            
            PreparaTotaliPrenotazione();

            // controllo se i connettori open-tour sono attivi sul prodotto
            //CheckConnettoriAttivi();

            // verifico la disponibilita su open tour se il prodotto lo prevede
            //if (Config.ConnettoriAttivi) {

            //t// VerificaDisponibilitaProdotto();

            //t// RenderizzaDisponibilitaProdotto();

            // controllo che si possa proseguire con l'acquisto                        
            //t// if (!$.isEmptyObject(Config.ConfermaConnettori) && Config.ConfermaConnettori.Stato == "NON_DISPONIBILE") {
            //t//     checkDisponibilita = false;
            //t// }
            //            } //se e' un prodotto che non richiede verifica disponibilita' faccio comparire l'immagine di DISPONIBILITA OK
            //            else {
            //                RenderizzaDisponibilitaProdotto("DISPONIBILE");
            //            }

            //t// VisualizzaRicercaAgenzia();

            // proseguo con la costruzion della pagina
            /*//t//
            if (checkDisponibilita) {

            // carico le configurazioni
            CaricaConfigurazioniCamere();

            // carico la lista di nazionalità
            CaricaNazionalita();

            // riepilogo prodotto
            RenderizzaRiepilogoProdotto();

            // carico il riepilogo costi
            CaricaRiepilogoCosti();

            // renderizzo riepilogo costi
            RenderizzaRiepilogoCosti();

            // carico l'agenzia
            CaricaAgenzia();

            // form agenzia
            RenderizzaFormAgenzia();

            // form acquirente
            RenderizzaFormAcquirente();

            // form pax
            RenderizzaFormPax();

            // form condizioni
            RenderizzaFormCondizioni();

            // form pagamenti
            RenderizzaFormPagamenti();

            // renderizza totale
            RenderizzaTotale();
            }*/

            // riepilogo prodotto
            RenderizzaRiepilogoProdotto();

            // carico il riepilogo costi
            CaricaRiepilogoCosti();

            // renderizzo riepilogo costi
            RenderizzaRiepilogoCosti();

            RenderizzaBoxDettaglioDefinitivoCosti();

            // setto i bindings sull'interfaccia
            Bindings();

            // salvo lo stato del plugin
            $.fn.Travelmind.SaveState("Acquista", Config);

            // rilancio l'evento "pagina pronta"            
            $(Config.Container).trigger("ComponentLoaded");

            // pareggio le altezze (destra, sinistra)
            $.fn.Travelmind.AdjustBoxHeight("#acquista #left", "#acquista #right");

            // smusso gli angoli dell'interfaccia
            $.fn.Travelmind.RoundCorners();

        });
    }


    $.fn.Acquista.Destroy = function () {
        // distruzione degli oggetti interni al plugin        
        Config.Container = "";
        Config.FormData = {};
        Config.IdProdotto = {};
        Config.IdListino = {};
        Config.ConfigCamere = {};
        Config.Nazionalita = {};
        Config.Agenzia = {};
        Config.RiepilogoCosti = {};
        Config.ConfermaConnettori = {};
        Config.MostraPrezzoNetto = false;
        Config.ConnettoriAttivi = false;
        Config.IsRQ = false;
        Config.StatoProdotto = "";
        Config.NumeroOrdine = "";
        Config.TentativiCarta = 0;
        Config.TrattamentoScelto = "";
        $("#form_acquista").validationEngine("hideAll");
    };


    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 VerificaDisponibilitaProdotto() {
        var parameters = {};
        parameters.action = "VerificaDisponibilita";
        parameters.idListino = Config.IdListino;
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                Config.ConfermaConnettori = (returnData != "" && returnData != "-1") ? $.parseJSON(returnData) : {};
            }
        });
    }

    function VisualizzaRicercaAgenzia() {
        $("#cerca_agenzia .contents").CercaAgenzia({ "Layout": "InPage", "SearchByCAP": true, "SearchByProv": false });

        $("#acquista").bind("agenziaCambiata", function (event) {
            Config.Agenzia = event.agenzia;
            if (!$.isEmptyObject(Config.Agenzia)) {
                RenderizzaFormAgenzia();
                Config.IsB2B2C = true;
                $("#agenzia .header").html("<strong>concludi l'acquisto in agenzia</strong>");
                $("#agenzia").show();
                //RenderizzaPagaInAgenzia($("#paga_in_agenzia .contents"));
                //$("#paga_in_agenzia").show();
                $("#pagamenti").hide();
            } else {
                Config.IsB2B2C = false;
                $("#pagamenti").show();
                $("#agenzia").hide();
                //$("paga_in_agenzia").hide();
            }
            $("#ListaAgenzie").dialog("close");
        });
    }

    function PreparaTotaliPrenotazione() {
        var parameters = {};
        parameters.action = "PreparaTotaliPrenotazione";

        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) { }
        });
    }


    function RenderizzaDisponibilitaProdotto() {
        if (!$.isEmptyObject(Config.ConfermaConnettori)) {
            var stato = Config.ConfermaConnettori.Stato.toLowerCase();
            //            var testo1 = Config.ConfermaConnettori.Messaggio;
            //            var testo2 = Config.ConfermaConnettori.Messaggio;
            switch (stato) {
                case "disponibile":
                    //testo1 = "Il prodotto risulta disponibile!";
                    //testo2 = "Prosegui pure con l'acquisto";
                    Config.StatoProdotto = stato;
                    $("#box_disponibilita").addClass("disponibile");
                    CheckConnettoriAttivi();
                    break;

                case "prezzo_variato":
                    //testo1 = "Il prodotto risulta disponibile, ma il prezzo e&egrave;!";
                    //testo2 = "Prosegui pure con l'acquisto";
                    Config.StatoProdotto = stato;
                    $("#box_disponibilita").addClass("prezzoVariato");
                    CheckConnettoriAttivi();
                    break;

                case "richiesta":
                    //testo1 = "Il prodotto risulta disponibile!";
                    //testo2 = "Prosegui pure con l'acquisto";
                    Config.StatoProdotto = stato;
                    $("#box_disponibilita").addClass("richiesta");
                    break;

                case "non_disponibile":
                    //testo1 = "Il prodotto non risulta disponibile!";
                    //testo2 = "Effettua una nuova ricerca";
                    Config.StatoProdotto = stato;
                    $("#box_disponibilita").addClass("nonDisponibile");
                    break;
            }

            //$("#box_disponibilita .titoloDisponibilita").html(testo1);
            //$("#box_disponibilita .contents").html(testo2);


            $("#box_disponibilita").show();


            //            var $box_border = $("<div/>", { "class": "box_border" });
            //            $box = $("<div/>", { "class": "box" }).appendTo($box_border);
            //            $("<div/>", { "class": "header_" + stato }).html("Verifica Disponibilit&agrave; Prodotto:").appendTo($box);
            //            $("<div/>", { "class": "contents" }).html(Config.ConfermaConnettori.Messaggio).appendTo($box);
            //            $("#acquista #box_disponibilita").html($box_border);

            //            var $box_border = $("<div/>", { "class": "box_border rounded" }).appendTo("#acquista #right .prezzoChiaro");
            //            $box = $("<div/>", { "class": "box rounded" }).appendTo($box_border);
            //            $("<div/>", { "class": "header_" + stato + " rounded_top" }).html("Verifica Disponibilit&agrave; Prodotto:").appendTo($box);
            //            $("<div/>", { "class": "contents" }).html(Config.ConfermaConnettori.Messaggio).appendTo($box);


            // se il prodotto non è disponibile nascondo il resto della pagina
            if (stato == "non_disponibile") {
                $("#travelmind").css({ "height": "680px" });
                $(".titoloAcquista").hide();
                $("#agenzia").hide();
                $("#acquirente").hide();
                $("#pax").hide();
                $("#condizioni").hide();
                $("#pagamenti").hide();
                $("#note").hide();
                $("#tot").hide();
                $("#concludi").hide();
                $("#concludi").hide();
                $("#riepilogo_pacchetto_vacanza").hide();
                $("#riepilogo_costi").hide();
                $("#download_preventivo").hide();
            }
        }
        //        else {
        //            if (ok != null && ok != undefined) {
        //                $("#box_disponibilita").show();
        //                $("#box_disponibilita").addClass("disponibile");
        //            }
        //        }
    }


    function Bindings() {

        //pulsante concludi
        //t// $("#concludi").bind("click", VaiAllaConferma);

        // navigation menu
        $("#nav_menu #riavvia_ricerca").bind("click", function () { $.fn.Travelmind.RestorePlugin("Home"); });
        $("#nav_menu #torna_risultati").bind("click", function () { $.fn.Travelmind.RestorePlugin("Risultati"); });
        $("#torna_home").bind("click", function () { $.fn.Travelmind.RestorePlugin("Home"); });

        // gestione tastiera (F8/F9)        
        //t// $(document).bind("keyup", GestisciTastiera);

        //datepicker
        /*//t// 
        $(".datepicker").datepicker({
        changeYear: true,
        yearRange: '1900:2020'
        });

        // validation engine
        $("#form_acquista").validationEngine({
        success: false,
        failure: function () { },
        validationEventTrigger: "blur"
        });
        */

        // download preventivo
        $("#download_preventivo .contents").PreventivoPdf({
            IdProdotto: Config.IdProdotto,
            IdListino: Config.IdListino
        });

        //immagini metodo pagamento (anche clickando l'immagine cambia il metodo di pagamento)
        /*//t//
        $(".img_pagamento").bind("click", function () {
        var value = $(this).attr("rel");
        $("#txtPagamenti[value=" + value + "]").attr("checked", true);
        });

        //"tooltip" metodo pagamento
        $(".img_pagamento").mouseenter(function () {
        var metodo = $(this).attr("rel");
        ShowTooltipPagamento(metodo);
        }).mouseleave(function () {
        $("#pagamenti .tooltipPagamenti").hide();
        });

        // link scheda tecnica tour operator
        $("#condizioniGenerali").bind("click", function () {
        //var pdf = $("#riepilogo_prodotto").attr("nome_tour_operator") + ".pdf";
        //window.open("/Docs/Contratti/" + pdf);
        window.open("/Docs/Contratti/CONTRATTO-DI-VENDITA-DEI-PACCHETTI-TURISTICI.pdf");
        });

        // link scheda tecnica tour operator
        $("#scheda_tecnica").bind("click", function () {
        var pdf = $("#riepilogo_prodotto").attr("nome_tour_operator") + ".pdf";
        window.open("/Docs/Contratti/" + pdf);
        });

        // link privacy tour operator
        $("#privacy").bind("click", function () {
        window.open("/Docs/Contratti/dati_personali.pdf");
        });
        */

        //se skype e' installato niente altrimenti fa puntare i links di skype alla pagina di download
        $.fn.Utility.UpdateSkypeLinks();
    }


    function ShowTooltipPagamento(metodo) {
        var testo = "";
        switch (metodo) {
            case "bonifico":
                testo = "Pagamento autorizzato per prenotazioni con  ALMENO 30 GIORNI DI ANTICIPO sulla data di partenza, dopo tale termine richiediamo di procedere con Carta di Credito, Pagonline o al Telefono.<br>"
                + "Richiediamo acconto del 25% e saldo a 30 giorni data partenza.<br>"
                + "La prenotazione ti sar&agrave; confermata solo ad avvenuto pagamento.<br>";
                break;

            case "carta_credito":
                testo = "Saldi subito l'intero importo con carta di credito Visa o Mastercard. Turistia si avvale di alti standard di sicurezza, il sito della banca &egrave; protetto con certificato SSL a 128 bit.<br>"
                + "La tua vacanza verr&agrave; immediatamente confermata.<br>";
                break;

            case "paga_conto":
                testo = "Se sei titolare di conto online Unicredit, PagOnline &egrave; il servizio di pagamento che consente di utilizzare il tuo home banking abituale.<br>"
                + "Verrai collegato al sito Unicredit dove inserirai  le tue credenziali (Codice adesione e Pin).<br>"
                + "La tua vacanza verr&agrave immediatamente confermata.<br>";
                break;

            case "paga_telefono":
                testo = "Verrai contattato da un nostro operatore, potrai effettuare il pagamento con carta di credito o bonifico bancario.<br>"
                + "Per partenze con almeno 30 giorni di anticipo sulla data partenza potrai effettuare un acconto del 25% e il saldo a 30 giorni.";
                break;

            default:
                $("#pagamenti .tooltipPagamenti").html("").show();
                break;
        }

        $("#pagamenti .tooltipPagamenti").html(testo).show();
    }

    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;
                    ConvertiCostiNetto(true);
                }
                break;

            case 120: // F9: prezzo lordo                
                if ($.fn.Utility.IsAgenziaLoggata() && Config.MostraPrezzoNetto == true) {
                    Config.MostraPrezzoNetto = false;
                    ConvertiCostiNetto(false);
                }
                break;
        }
    }

    function ConvertiCostiNetto() {

        // seleziono l'elenco di costi coretto (netto o base)
        var RiepilogoCosti = (Config.MostraPrezzoNetto) ? Config.RiepilogoCosti.CostiNetti : Config.RiepilogoCosti.CostiBase;

        // modifico riepilogo costi sx
        $("#riepilogo_costi .costo").each(function (i) {
            $(this).find(".value").html(RiepilogoCosti[i].Value + " &euro;");
            if (Config.MostraPrezzoNetto) {
                $(this).find(".value").addClass("netto");
            } else {
                $(this).find(".value").removeClass("netto");
            }
        });

        // modifico totale a dx        
        $("#prezzo_totale").html(RiepilogoCosti[RiepilogoCosti.length - 1].Value + " &euro;");
        if (Config.MostraPrezzoNetto) {
            $("#prezzo_totale").addClass("netto");
        } else {
            $("#prezzo_totale").removeClass("netto");
        }
    }


    function CaricaRiepilogoCosti() {
        if ($.isEmptyObject(Config.RiepilogoCosti)) {
            var parameters = {};
            parameters.action = "RiepilogoCosti";
            parameters.idListino = Config.IdListino;
            $.ajax({
                async: false,
                cache: false,
                url: Config.ServerURL,
                data: parameters,
                success: function (returnData) {
                    Config.RiepilogoCosti = (returnData != "-1") ? $.parseJSON(returnData) : {};
                }
            });
        }
    }


    function RenderizzaRiepilogoCosti() {
        var $div = null;
        var $text = null;
        var $value = null;
        if (!$.isEmptyObject(Config.RiepilogoCosti)) {
            var RiepilogoCosti = (Config.MostraPrezzoNetto) ? Config.RiepilogoCosti.CostiNetti : Config.RiepilogoCosti.CostiBase;
            $.each(RiepilogoCosti, function (i) {
                $div = $("<div/>", { "class": "costo" }).appendTo("#riepilogo_costi .contents");
                $text = $("<div/>", { "class": "text" }).html(RiepilogoCosti[i].Text).appendTo($div);
                $value = $("<div/>", { "class": "value" }).html(RiepilogoCosti[i].Value + " &euro;").appendTo($div);
            });
        }
    }


    function RenderizzaBoxDettaglioDefinitivoCosti() {
        var $div = null;
        var $text = null;
        var $value = null;
        if (!$.isEmptyObject(Config.RiepilogoCosti)) {
            var RiepilogoCosti = (Config.MostraPrezzoNetto) ? Config.RiepilogoCosti.CostiNetti : Config.RiepilogoCosti.CostiBase;
            $.each(RiepilogoCosti, function (i) {
                if (RiepilogoCosti[i].Text.toLowerCase() != "totale") {
                    $div = $("<div/>", { "class": "costo" }).appendTo("#boxDettaglioDefinitivoCosti");
                    $text = $("<span/>", { "class": "desc" }).html(RiepilogoCosti[i].Text + ":").appendTo($div);
                    $value = $("<span/>", { "class": "prezzo" }).html(RiepilogoCosti[i].Value + " &euro;").appendTo($div);
                }
            });

            $.each(RiepilogoCosti, function (i) {
                if (RiepilogoCosti[i].Text.toLowerCase() == "totale") {
                    $div = $("<div/>", { "class": "costo" }).appendTo("#boxDettaglioDefinitivoCosti_Totale");
                    $text = $("<span/>", { "class": "desc totale" }).html(RiepilogoCosti[i].Text + ":").appendTo($div);
                    $value = $("<span/>", { "class": "prezzo" }).html(RiepilogoCosti[i].Value + " &euro;").appendTo($div);
                }
            });
        }
    }

    function RenderizzaTotale() {
        var RiepilogoCosti = (Config.MostraPrezzoNetto) ? Config.RiepilogoCosti.CostiNetti : Config.RiepilogoCosti.CostiBase;
        $("#prezzo_totale").html(RiepilogoCosti[RiepilogoCosti.length - 1].Value + " &euro;");
    }


    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 CaricaConfigurazioniCamere() {
        if ($.isEmptyObject(Config.ConfigCamere)) {
            var parameters = {};
            parameters.action = "SelConfigCameraPax";
            parameters.camere = JSON.stringify(Config.FormData.Camere);
            $.ajax({
                async: false,
                cache: false,
                url: Config.ServerURL,
                data: parameters,
                type: "POST",
                success: function (returnData) {
                    Config.ConfigCamere = (returnData != "-1" && returnData != "") ? $.parseJSON(returnData) : {};
                }
            });
        }
    }


    function CaricaNazionalita() {
        if ($.isEmptyObject(Config.Nazionalita)) {
            var parameters = {};
            parameters.action = "SelNazionalitaLista";
            $.ajax({
                async: false,
                cache: false,
                url: Config.ServerURL,
                data: parameters,
                success: function (returnData) {
                    if (returnData != "-1") {
                        Config.Nazionalita = $.parseJSON(returnData);
                    }
                }
            });
        }
    }

    function RenderizzaRiepilogoProdotto() {
        $("#box_riepilogo_prodotto").RiepilogoProdotto({ "Align": "vertical", "IdProdotto": Config.IdProdotto, "IdListino": Config.IdListino, "TrattamentoScelto": Config.TrattamentoScelto });
        $("#box_riepilogo_prodotto").bind("ModuleLoaded", function () {
            return;
        });
    }


    function RenderizzaFormAgenzia() {
        if (!$.isEmptyObject(Config.Agenzia) && Config.Agenzia.Id != 0) {
            // precompilo il form dell'agenzia (non necessita di validazione perchè è tutto readonly).
            $("#txtAgenziaRagioneSociale").val(Config.Agenzia.RagioneSociale).attr("readonly", true);
            $("#txtAgenziaCodiceFiscale").val(Config.Agenzia.CodiceFiscale).attr("readonly", true);
            $("#txtAgenziaPartitaIva").val(Config.Agenzia.PartitaIva).attr("readonly", true);
            $("#txtAgenziaNomeBanconista").val(Config.Agenzia.NomeBanconista).attr("readonly", true);
            $("#txtAgenziaCognomeBanconista").val(Config.Agenzia.CognomeBanconista).attr("readonly", true);
            $("#txtAgenziaIndirizzo").val(Config.Agenzia.Indirizzo).attr("readonly", true);
            $("#txtAgenziaCap").val(Config.Agenzia.Cap).attr("readonly", true);
            $("#txtAgenziaCitta").val(Config.Agenzia.Citta).attr("readonly", true);
            $("#txtAgenziaProvincia").val(Config.Agenzia.Prov).attr("readonly", true);
            $("#txtAgenziaStato").val(Config.Agenzia.Stato).attr("readonly", true);
            $("#txtAgenziaCellulare1").val(Config.Agenzia.Cellulare1).attr("readonly", true);
            $("#txtAgenziaCellulare2").val(Config.Agenzia.Cellulare2).attr("readonly", true);
            $("#txtAgenziaEmail").val(Config.Agenzia.Email).attr("readonly", true);

            // se l'agenzia non necessita di avere i dati del proprio cliente nascondo il form acquirente
            //$("#acquirente").hide();

        } else {
            // se non c'è un agenzia in sessione tolgo il form agenzia
            $("#agenzia").hide();
        }
    }

    function RenderizzaFormAcquirente() {

        // riempio la combo provincie        
        var parameters = {};
        parameters.action = "SelProvinceLista";
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                if (returnData != "-1") {
                    var Provincie = $.parseJSON(returnData);
                    var $option = null;
                    $option = $("<option/>", { "value": "--", "text": "--" }).appendTo("#txtAcquirenteProvincia");
                    $.each(Provincie, function (i) {
                        $option = $("<option/>", { "value": Provincie[i].Value, "text": Provincie[i].Text }).appendTo("#txtAcquirenteProvincia");
                    });
                }
            }
        });


        // riempio la combo stato
        var parameters = {};
        parameters.action = "SelNazioneLista";
        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            success: function (returnData) {
                if (returnData != "-1") {
                    var Nazioni = $.parseJSON(returnData);
                    var $option = null;
                    $.each(Nazioni, function (i) {
                        $option = $("<option/>", { "value": Nazioni[i].Value, "text": Nazioni[i].Text }).appendTo("#txtAcquirenteStato");
                    });
                    $("#txtAcquirenteStato").val("Italia"); // default                    
                }
            }
        });

        // bindings
        $("#txtAcquirenteStato").bind("change", function () {
            if ($(this).val() != "Italia") {
                $("#txtAcquirenteProvincia").val("--").attr("disabled", true);
            } else {
                $("#txtAcquirenteProvincia").attr("disabled", false);
            }
        });

        $("#txtAcquirenteCodiceFiscale").bind("keyup", function () {
            $(this).val($(this).val().toUpperCase());
        });

        // inserisco le classi di validazione
        $("#txtAcquirenteNome").addClass("validate[required]");
        $("#txtAcquirenteCognome").addClass("validate[required]");
        $("#txtAcquirenteCodiceFiscale").addClass("validate[required,custom[codice_fiscale]]");
        $("#txtAcquirenteIndirizzo").addClass("validate[required]");
        $("#txtAcquirenteCap").addClass("validate[required,custom[onlyNumber]]");
        $("#txtAcquirenteCitta").addClass("validate[required]");
        $("#txtAcquirenteProvincia").addClass("validate[required]");
        $("#txtAcquirenteStato").addClass("validate[required]");
        $("#txtAcquirenteCellulare1").addClass("validate[required, custom[onlyNumber]]");
        $("#txtAcquirenteCellulare2").addClass("validate[custom[onlyNumber]]");
        $("#txtAcquirenteEmail").addClass("validate[required,custom[email]]");
    }


    function RenderizzaFormCondizioni() {
        $("#txtCondizioni").addClass("validate[required]");
        $("#txtPrivacy").addClass("validate[required]");
    }


    function RenderizzaFormPax() {
        var camere = Config.ConfigCamere;

        // creo la tabella
        var $table = $("<table/>", { "id": "form_pax", "cellspacing": "0", "cellpadding": "3" }).appendTo("#pax .contents");
        var $row = null;

        var contatoreCamere = 0;
        // ciclo ogni tipo di camera
        for (x = 0; x < camere.length; x++) {

            // ciclo sul numero di sistemazioni x tipo di camera
            for (y = 0; y < camere[x].Qta; y++) {
                contatoreCamere++;
                // intestazione camera
                $row = $("<tr/>", { "class": "row_room rounded_top", "descrizione_camera": camere[x].Descrizione }).appendTo($table);
                $("<td/>", { "colspan": "6" }).html("Camera " + contatoreCamere + ": <span class='descrizione_camera'>" + camere[x].Descrizione + "</span>").appendTo($row);

                // intestazione colonne
                $row = $("<tr/>", { "class": "row_head" }).appendTo($table);
                $("<td/>", { "class": "genere" }).html("Genere").appendTo($row);
                $("<td/>", { "class": "nome" }).html("Nome").appendTo($row);
                $("<td/>", { "class": "cognome" }).html("Cognome").appendTo($row);
                $("<td/>", { "class": "nazionalita" }).html("Nazionalit&agrave;").appendTo($row);
                $("<td/>", { "class": "altro" }).html("Altro").appendTo($row);
                $("<td/>", { "class": "data_nascita" }).html("Data Nascita").appendTo($row);

                // adulti
                if (camere[x].Adulti > 0) {
                    $row = $("<tr/>", { "class": "row_pax_type" }).appendTo($table);
                    $("<td/>", { "colspan": "6" }).html("Adulti").appendTo($row);
                    for (z = 0; z < camere[x].Adulti; z++) {
                        var idSuffix = "-" + x + "-" + y + "-" + z;
                        $row = RenderizzaInputPax(camere[x], "Adulto", idSuffix, contatoreCamere);
                        $row.appendTo($table);
                    }
                }

                // bambini
                if (camere[x].Bambini > 0) {
                    $row = $("<tr/>", { "class": "row_pax_type" }).appendTo($table);
                    $("<td/>", { "colspan": "6" }).html("Bambini").appendTo($row);
                    for (z = 0; z < camere[x].Bambini; z++) {
                        var idSuffix = "-" + x + "-" + y + "-" + z;
                        $row = RenderizzaInputPax(camere[x], "Bambino", idSuffix, contatoreCamere);
                        $row.appendTo($table);
                    }
                }

                // separatore
                $row = $("<tr/>", { "class": "row_separator" }).appendTo($table);
                $("<td/>", { "colspan": "6" }).html("&nbsp;").appendTo($row);

            }
        }
    }


    function RenderizzaInputPax(Camera, tipoPax, idSuffix, numeroCamera) {
        var $row = $("<tr/>", { "class": "row_input", "descrizione_camera": Camera.Descrizione, "numero_camera": numeroCamera, "tipo_pax": tipoPax, "EtaBambino1Da": Camera.EtaBambino1Da, "EtaBambino1A": Camera.EtaBambino1A, "EtaBambino2Da": Camera.EtaBambino2Da, "EtaBambino2A": Camera.EtaBambino2A });
        var $col = null;
        var $roundBox = null;
        var $input = null;
        var validationClass = ""; // definisce il tipo di validazione da applicare al campo

        //genere
        $col = $("<td/>", { "class": "genere" }).appendTo($row);
        $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo($col);
        $input = $("<select/>", { "id": "txtGenere" + tipoPax + idSuffix, "class": "inputbox txtGenere" }).appendTo($roundBox);
        $.each({ 0: "Mr", 1: "Mrs" }, function (key, value) {
            $("<option/>", { "value": value, "text": value }).appendTo($input);
        });
        validationClass = "validate[required]";
        $input.addClass(validationClass);

        //nome
        $col = $("<td/>", { "class": "nome" }).appendTo($row);
        $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo($col);
        $input = $("<input/>", { "type": "text", "id": "txtNome" + tipoPax + idSuffix, "class": "inputbox txtNome" }).css({ "width:": "80px" }).appendTo($roundBox);
        validationClass = "validate[required]";
        $input.addClass(validationClass);

        //cognome
        $col = $("<td/>", { "class": "cognome" }).appendTo($row);
        $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo($col);
        $input = $("<input/>", { "type": "text", "id": "txtCognome" + tipoPax + idSuffix, "class": "inputbox txtCognome" }).appendTo($roundBox);
        validationClass = "validate[required]";
        $input.addClass(validationClass);

        //nazionalità
        $col = $("<td/>", { "class": "nazionalita" }).appendTo($row);
        $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo($col);
        $input = $("<select/>", { "id": "txtNazionalita" + tipoPax + idSuffix, "class": "inputbox txtNazionalita" }).appendTo($roundBox);
        $.each(Config.Nazionalita, function (x) {
            $("<option/>", { "value": Config.Nazionalita[x].Value, "text": Config.Nazionalita[x].Text }).appendTo($input);
        });
        // se nazionalità == "Altro" mostro l'input box "altro", altrimenti lo nascondo.
        $input.bind("change", function () {
            if ($(this).val().toUpperCase() == "ALTRO") {
                $(this).parents("tr").find(".txtAltraNazionalita").parent(".rounded_input").show();
                $(this).parents("tr").find(".txtAltraNazionalita").addClass("validate[required]");
            } else {
                $(this).parents("tr").find(".txtAltraNazionalita").val("");
                $(this).parents("tr").find(".txtAltraNazionalita").removeClass("validate[required]");
                $(this).parents("tr").find(".txtAltraNazionalita").parent(".rounded_input").hide();
            }
        });
        validationClass = "validate[required]";
        $input.addClass(validationClass);

        //altro
        $col = $("<td/>", { "class": "altro" }).appendTo($row);
        $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo($col);
        $input = $("<input/>", { "type": "text", "id": "txtAltraNazionalita" + tipoPax + idSuffix, "class": "inputbox txtAltraNazionalita" }).appendTo($roundBox);
        validationClass = ""; // required se nazionalita = altro
        $input.addClass(validationClass);
        $roundBox.hide();

        // data nascita
        $col = $("<td/>", { "class": "data_nascita" }).appendTo($row);
        $roundBox = $("<div/>", { "class": "rounded_input" }).appendTo($col);
        $input = $("<input/>", { "type": "text", "id": "txtDataNascita" + tipoPax + idSuffix, "class": "inputbox datepicker txtDataNascita" }).appendTo($roundBox);
        //validationClass = (tipoPax == "Adulto" && !Camera.DataAdultiObb) ? "" : "validate[required]";
        validationClass = "validate[required]";
        $input.addClass(validationClass);

        return $row;
    }


    function RenderizzaFormPagamenti() {
        $div = null;
        $input = null;
        $label = null;

        $div = $("<div/>").appendTo("#pagamenti .contents .metodi");

        // bonifico
        $divImg = $("<div/>", { "class": "img_pagamento", "rel": "bonifico" }).css({ "background-image": "url(/Plugins/comAcquista/Images/BONIFICO.png)", "height": "75px", "width": "255px", "background-repeat": "no-repeat", "clear": "right" }).appendTo($div);
        $input = $("<input/>", { "type": "radio", "id": "txtPagamenti", "name": "txtPagamenti", "value": "bonifico", "checked": "" }).css({ "margin-left": "20px", "margin-top": "15px" }).appendTo($divImg);


        if (Config.ConnettoriAttivi && (Config.StatoProdotto == "disponibile" || Config.StatoProdotto == "prezzo_variato")) {
            // carta di credito
            $divImg = $("<div/>", { "class": "img_pagamento", "rel": "carta_credito" }).css({ "background-image": "url(/Plugins/comAcquista/Images/CARTA-DI-CREDITO.png)", "height": "75px", "width": "255px", "background-repeat": "no-repeat", "clear": "right" }).appendTo($div);
            $input = $("<input/>", { "type": "radio", "id": "txtPagamenti", "name": "txtPagamenti", "value": "carta_credito", "checked": "" }).css({ "margin-left": "20px", "margin-top": "15px" }).appendTo($divImg);
            //$input = $("<input/>", { "type": "radio", "id": "txtPagamenti", "name": "txtPagamenti", "value": "carta_credito" }).css({ "float": "left", "clear": "left" }).appendTo($div);
            //$img = $("<img/>", { "class": "img_pagamento", "rel": "carta_credito", "src": "/Plugins/comAcquista/Images/CARTA-DI-CREDITO.png" }).css({ "float": "left" }).appendTo($div);

            //paga in conto
            $divImg = $("<div/>", { "class": "img_pagamento", "rel": "paga_conto" }).css({ "background-image": "url(/Plugins/comAcquista/Images/pagonline.png)", "height": "75px", "width": "255px", "background-repeat": "no-repeat", "clear": "right" }).appendTo($div);
            $input = $("<input/>", { "type": "radio", "id": "txtPagamenti", "name": "txtPagamenti", "value": "paga_conto", "checked": "" }).css({ "margin-left": "20px", "margin-top": "15px" }).appendTo($divImg);
            //$input = $("<input/>", { "type": "radio", "id": "txtPagamenti", "name": "txtPagamenti", "value": "paga_conto" }).css({ "float": "left,"clear": "left"  }).appendTo($div);
            //$img = $("<img/>", { "class": "img_pagamento", "rel": "paga_conto", "src": "/Plugins/comAcquista/Images/pagonline.png" }).css({ "float": "left" }).appendTo($div);
        }

        // paga al telefono
        if (Config.Agenzia.Canale.Nome.toUpperCase() != "IBM1003") { // disabilitato per IBM
            $divImg = $("<div/>", { "class": "img_pagamento", "rel": "paga_telefono" }).css({ "background-image": "url(/Plugins/comAcquista/Images/PAGA-AL-TELEFONO.png)", "height": "75px", "width": "255px", "background-repeat": "no-repeat", "clear": "right" }).appendTo($div);
            $input = $("<input/>", { "type": "radio", "id": "txtPagamenti", "name": "txtPagamenti", "value": "paga_telefono", "checked": "" }).css({ "margin-left": "20px", "margin-top": "15px" }).appendTo($divImg);
        }

        // paypal
        // $input = $("<input/>", { "type": "radio", "id": "txtPagamenti", "name": "txtPagamenti", "value": "pay_pal" }).css({ "float": "left","clear": "left"  }).appendTo($div);
        // $img = $("<img/>", { "class" : "img_pagamento", "rel": "pay_pal", "src": "/Plugins/comAcquista/Images/PAYPAL.png" }).css({ "float": "left" }).appendTo($div);

        // validazione
        $("input[name='txtPagamenti']").addClass("validate[required]");
    }


    function VaiAllaConferma() {

        if ($("#form_acquista").validationEngine('validate')) {

            // controllo che i bambini non siano al di sotto dei 12 anni
            var check = true;
            var count = 0;
            $("#form_pax .row_input").each(function () {
                var tipoPax = $(this).attr("tipo_pax");
                if (tipoPax == "Bambino") {
                    count++;
                    var dataNascita = $(this).find(".txtDataNascita").val();
                    var dataPartenza = $("#riepilogo_prodotto .data_partenza").html();
                    var anniDa = (count == 1) ? $(this).attr("EtaBambino1Da") : $(this).attr("EtaBambino2Da");
                    var anniA = (count == 1) ? $(this).attr("EtaBambino1A") : $(this).attr("EtaBambino2A");
                    var elementId = $(this).find(".txtDataNascita").attr("id");
                    var diff = dateDiff(dataNascita, dataPartenza);
                    if (!(age(dataNascita, anniDa) < diff && diff < age(dataNascita, anniA))) {
                        $("#" + elementId).validationEngine('showPrompt', "L'et&agrave; del bambino deve essere compresa tra " + anniDa + " e " + anniA + " anni.", "topRight", false);
                        check = false;
                    }
                }
            });


            if (!check) {
                $("html, body").animate({ scrollTop: 50 }, 'slow');
            } else {

                var FormData = {};
                FormData.IdProdotto = Config.IdProdotto;
                FormData.IdListino = Config.IdListino;
                FormData.Pax = [];

                // ricavo i dati dei pax
                $("#form_pax .row_input").each(function () {
                    var Pax = {};
                    Pax.CameraDescrizione = $(this).attr("descrizione_camera");
                    Pax.Tipo = $(this).attr("tipo_pax");
                    Pax.Genere = $(this).find(".txtGenere").val();
                    Pax.Nome = $(this).find(".txtNome").val();
                    Pax.Cognome = $(this).find(".txtCognome").val();
                    Pax.Nazionalita = ($(this).find(".txtNazionalita").val().toUpperCase() != "ALTRO") ? $(this).find(".txtNazionalita").val() : $(this).find(".txtAltraNazionalita").val();
                    Pax.DataNascita = $(this).find(".txtDataNascita").val();
                    Pax.CameraNumero = $(this).attr("numero_camera");
                    FormData.Pax.push(Pax);
                });

                // ricavo i dati dell'acquirente
                var Acquirente = {};
                Acquirente.Nome = $("#txtAcquirenteNome").val();
                Acquirente.Cognome = $("#txtAcquirenteCognome").val();
                Acquirente.CodiceFiscale = $("#txtAcquirenteCodiceFiscale").val();
                Acquirente.Indirizzo = $("#txtAcquirenteIndirizzo").val();
                Acquirente.Cap = $("#txtAcquirenteCap").val();
                Acquirente.Citta = $("#txtAcquirenteCitta").val();
                Acquirente.Provincia = $("#txtAcquirenteProvincia").val();
                Acquirente.Stato = $("#txtAcquirenteStato").val();
                Acquirente.Cellulare1 = $("#txtAcquirenteCellulare1").val();
                Acquirente.Cellulare2 = $("#txtAcquirenteCellulare2").val();
                Acquirente.Email = $("#txtAcquirenteEmail").val();
                FormData.Acquirente = Acquirente;

                // ricavo il tipo di pagamento
                FormData.Pagamento = $("input[name='txtPagamenti']:checked").val();

                // ricavo le note
                FormData.Note = $("#txtNote").val();

                // salvo la prenotazione                
                Config.NumeroOrdine = SalvaPrenotazione(FormData, Config.NumeroOrdine);
                if (Config.NumeroOrdine != "-1" && Config.NumeroOrdine != "") {

                    // se richiesto gestisco i pagamenti con carta di credito
                    if (FormData.Pagamento == "carta_credito" || FormData.Pagamento == "paga_conto") {
                        GestisciPagamentoCarte(FormData.Pagamento, Config.NumeroOrdine);
                        $("body").bind("PagamentoFinished", function () {
                            var statoPagamento = $("#statoPagamento").val();
                            if (statoPagamento.toUpperCase() == "OK") {
                                $.fn.Travelmind.LoadPlugin("Conferma", FormData);
                            } else {
                                ShowMessage("Attenzione", "Si &egrave; verificato un errore nel pagamento con carta di credito.");
                            }
                        });

                    } else {
                        $.fn.Travelmind.LoadPlugin("Conferma", FormData);
                    }

                } else {
                    ShowMessage("Attenzione", "Si &egrave; verificato un errore nel salvataggio della prenotazione.");
                }

            }
        }
    }


    function SalvaPrenotazione(FormData, numeroOrdine) {
        var result = "";
        var parameters = {};
        parameters.action = "SalvaPrenotazione";
        parameters.Pax = JSON.stringify(FormData.Pax);
        parameters.Acquirente = JSON.stringify(FormData.Acquirente);
        parameters.Pagamento = FormData.Pagamento;
        parameters.Note = FormData.Note;
        parameters.NumeroOrdine = numeroOrdine;

        $.ajax({
            async: false,
            cache: false,
            url: Config.ServerURL,
            data: parameters,
            type: "POST",
            success: function (returnData) {
                result = returnData;
            }
        });

        return result;
    }


    function GestisciPagamentoCarte(tipoPagamento, numeroOrdine) {
        var parameters = {};

        // gestisco il numero di tentativi (unicredit non consente di usare 2 volte lo stesso numero ordine quindi gli aggiungiamo un progressivo).
        if (Config.TentativiCarta > 0) {
            numeroOrdine += "_" + Config.TentativiCarta.toString();
        }
        Config.TentativiCarta++;

        // totale ordine
        var totaleOrdine = $.trim(Config.RiepilogoCosti.CostiBase[Config.RiepilogoCosti.CostiBase.length - 1].Value.replace(".", ""));
        totaleOrdine += "00"; // aggiungo "00" per adeguarmi allo standard ISO (ex: 100 = 1,00)

        // tipo pagamento (specifico x unicredit)        
        if (tipoPagamento == "carta_credito") {
            tipoPagamento = "CartCred";
        } else {
            tipoPagamento = "ContoCorr";
        }

        var url = "/Pagamenti/Unicredit/GoUnicredit.aspx?numeroOrdine=" + numeroOrdine + "&totaleOrdine=" + totaleOrdine + "&tipoPagamento=" + tipoPagamento;
        window.open(url, "unicredit", "width=800,height=550");

        // parametri x test carta di credito
        //numero carta: 4444499922200000 codice siurezza: 111 scadenza: 11/2019        
    }


    function ShowMessage(title, msg) {
        var msgBox = $("<div/>");
        $(Config.Container).append(msgBox);
        $(msgBox).html(msg).dialog({
            width: 500,
            title: title,
            modal: true,
            draggable: true,
            buttons: {
                "Chiudi": function () { $(this).dialog("close"); }
            },
            close: function () {
                $(this).dialog("destroy");
            }
        });
        $(msgBox).dialog('open');
    }




})(jQuery);
