﻿// Initialise un simulateur Règlette utilisant des données en paramètre
function initSimulateur(pId, pRegletteItems, pMaxPPR) {
    var regletteItems = pRegletteItems;
    var simulateur = $("#" + pId);
    var selBesoin = $("select.besoin", simulateur);
    var lblMontant = $(".LblMontant", simulateur);
    var txtMontant = $("input.montant", simulateur);
    var selMois = $("select.selectMois", simulateur);
    var txtMensualite = $("input.mensualite", simulateur);
    var maxPPR = pMaxPPR;
    var montantMin;
    var montantMax;
    var moisMin;
    var moisMax;
    var seuil;
    var saisieMensualite;
    var saisieDuree;
    var wsPattern = /\s+/g;

    function validerSaisieSimulator() {
        if (selBesoin.val() == "-1") {
            //alert('Veuillez séléctionner un besoin de la liste.');
            showErrorInput(selBesoin.get(0).id, 'Veuillez sélectionner un besoin de la liste.');
            return false;
        }

        var montant = txtMontant.val().replace(wsPattern, "");
        if (montant == "") {
            //alert('Veuillez entrer un montant.');
            showErrorInput(txtMontant.get(0).id, 'Veuillez entrer un montant.');
            return false;
        }

        if (montant.search(/^[0-9]+$/) == 0) {
            var montantSaisi = parseInt(montant);

            if ((montantSaisi < montantMin) || (montantSaisi > montantMax)) {
                //alert('Le montant n\'est pas compris entre ' + montantMin + ' et ' + montantMax + '. Veuillez ré-essayer.');
                showErrorInput(txtMontant.get(0).id, 'Le montant n\'est pas compris entre ' + formateNombre(montantMin, ",", " ") + ' et ' + formateNombre(montantMax, ",", " ") + '. Veuillez ré-essayer.');
                return false;
            }
        }
        else {
            //alert('Le montant doit etre un entier. Veuillez re-essayer.');
            showErrorInput(txtMontant.get(0).id, 'Le montant doit être un entier. Veuillez ré-essayer.');
            return false;
        }

        if (!saisieMensualite || montantSaisi < seuil) {

            if (montantSaisi > maxPPR) {

                // Confirmation de redirection
                if (!confirm("Nous pouvons vous proposer un prêt personnel pour un montant de " + seuil + " euros.")) return false;
                
                txtMontant.val(seuil);
                txtMensualite.val('');
                selMois.val('12');
            }
            return true;
        }

        if (selMois.val() == "-1") {
            var mensualite = txtMensualite.val().replace(wsPattern, "");
            if (mensualite == "") {
                //alert('Veuillez choisir une durée ou renseigner une mensualite.');
                showErrorInput(txtMensualite.get(0).id, 'Veuillez choisir une durée ou renseigner une mensualité.');
                return false;
            }
            if (!(mensualite.search(/^[0-9]+$/) == 0)) {
                //alert('La mensualite doit etre un entier. Veuillez re-essayer.');
                showErrorInput(txtMensualite.get(0).id, 'La mensualité doit être un entier. Veuillez ré-essayer.');
                return false;
            }
            if (parseInt(mensualite) >= montantSaisi) {
                showErrorInput(txtMensualite.get(0).id, 'La mensualité doit être inférieure au montant. Veuillez ré-essayer.');
                return false;
            }
        }

        return true;
    }

    selBesoin.change(function(evt) {
        var val = $(this).val();
        if (val == "-1") {
            // on efface le libellé montant
            lblMontant.text("");

            // on disable efface les autres champs du control
            txtMontant.attr("disabled", "disabled");
            selMois.val("-1");
            selMois.attr("disabled", "disabled");
            txtMensualite.val("");
            txtMensualite.attr("disabled", "disabled");

        } else {
            // on recherche le montant minimum et le montant maximum pour le projet choisi
            montantMin = regletteItems[val].montantMin;
            montantMax = regletteItems[val].montantMax;
            moisMin = 12;
            moisMax = regletteItems[val].moisMax;
            seuil = regletteItems[val].seuil;
            saisieMensualite = regletteItems[val].saisieMensualite;
            saisieDuree = (moisMax != 0);

            // on affiche le min et max pour le projet choisi
            lblMontant.text("(de " + formateNombre(montantMin, ",", " ") + " à " + formateNombre(montantMax, ",", " ") + " €)");

            // Activation des champs de saisie
            txtMontant.removeAttr("disabled");
            txtMensualite.removeAttr("disabled");

            if (saisieDuree) {
                // Construction du select mois
                var options = '<option value="-1">-</option>';
                for (var i = moisMin; i <= moisMax; i += 12) {
                    options += '<option value="' + i + '">' + i + '</option>';
                }
                selMois.html(options);

                // on enable les autres champs du control
                selMois.removeAttr("disabled");
                selMois.change();
            }
            else {
                // on disable efface la duréee
                selMois.val("-1");
                selMois.attr("disabled", "disabled");
                txtMensualite.val("");
            }

            if (!saisieMensualite) {
                txtMensualite.attr("disabled", "disabled");
            }
        }
    });

    selMois.change(function(evt) {
        var val = $(this).val();
        if (val == "-1") {
            txtMensualite.removeAttr("disabled");
        }
        else {
            txtMensualite.val("");
            txtMensualite.attr("disabled", "disabled");
        }
    });

    $(".submit", simulateur).click(function(evt) {
        if (!validerSaisieSimulator()) {
            evt.stopImmediatePropagation();
            evt.preventDefault();
        }
    });

    // Sauvegarde les valeurs pré-renseignées
    var valDuree = selMois.val();

    // Vide la sélection de la durée
    selMois.html('<option value="-1">-</option>');

    // Rejoue les saisies utilisateurs
    selBesoin.change();
    selMois.val(valDuree);
    selMois.change();
}

// Initialise un simulateur PPC utilisant l'Ajax
function initSimulateurAjax(pId, pURLSvc) {

    var simulateur = $("#" + pId);
    var selBesoin = $("select.besoin", simulateur);
    var simulation = $("input[id$=idSimulation]", simulateur);
    var nbMois = $("input[id$=nbMois]", simulateur);
    var lblMontant = $(".LblMontant", simulateur);
    var txtMontant = $("input.montant", simulateur);
    var selMois = $("select.selectMois", simulateur);
    var txtMensualite = $("input.mensualite", simulateur);
    var btnSubmitSimul = $(".blockSaisie .submit", simulateur);
    var lnkModify = $("a.modify", simulateur);
    var montantMin = 0;
    var montantMax = 999999;
    var mensualiteMin = 1;
    var mensualiteMax = 9999;
    var moisMin = 1;
    var moisMax = 999;
    var valProjet;
    var valMontant;
    var valDuree;
    var step;
    var wsPattern = /\s+/g;

    var ajaxPost = function(method, data, success, error) {
        simulateur.addClass('waiting');
        $.ajax({
            type: "POST",
            url: pURLSvc + method,
            data: data,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data) {
                simulateur.removeClass('waiting');
                success(data);
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                simulateur.removeClass('waiting');
                if ($.isFunction(error)) {
                    error(XMLHttpRequest, textStatus, errorThrown);
                }
            }
        });
    };

    var lancerSimulation = function(projet, montant, duree, mensualite, idSimulation) {
        $(".blockSaisie", simulateur).hide();
        simulateur.addClass('blockResult');
        ajaxPost('CalculeSimulation', '{"reglette":"' + projet + '", "montant":' + montant + ', "duree":' + duree + ', "mensualite":' + mensualite + ',"simulation":"' + idSimulation + '"}',
            actualiserResultats,
            function() {
                $.modal.close();
                if ($(".blockResultat", simulateur).is(":hidden")) {
                    $(".blockSaisie", simulateur).show();
                    simulateur.removeClass('blockResult');
                }

                if (idSimulation == "" || idSimulation == null) {
                    showErrorModal("Une erreur technique est survenue");
                }
                else {
                    var options = {
                        persist: true,
                        closeHTML: "",
                        zIndex: 100000
                    };
                    $('#layerEvo').modal(options);
                }
            }
        );
    };

    function validerMontant(val) {
        val = val.replace(wsPattern, "");
        if (val == "") {
            //alert('Veuillez entrer un montant.');
            showErrorInput(txtMontant.get(0).id, 'Veuillez entrer un montant.');
            return false;
        }

        if (val.search(/^[0-9]+$/) == 0) {
            var montantSaisi = parseInt(val);

            if ((montantSaisi < montantMin) || (montantSaisi > montantMax)) {
                //alert('Le montant n\'est pas compris entre ' + montantMin + ' et ' + montantMax + '. Veuillez ré-essayer.');
                showErrorInput(txtMontant.get(0).id, 'Le montant n\'est pas compris entre ' + montantMin + ' et ' + montantMax + '. Veuillez ré-essayer.');
                return false;
            }
        }
        else {
            //alert('Le montant doit etre un entier. Veuillez re-essayer.');
            showErrorInput(txtMontant.get(0).id, 'Le montant doit etre un entier. Veuillez re-essayer.');
            return false;
        }

        return true;
    }

    function validerSaisieSimulator() {
        if (selBesoin.val() == "-1") {
            //alert('Veuillez séléctionner un besoin de la liste.');
            showErrorInput(selBesoin.get(0).id, 'Veuillez séléctionner un besoin de la liste.');
            return false;
        }
        if (!validerMontant(txtMontant.val())) {
            return false;
        }

        if (selMois.val() == "-1") {
            var mensualite = txtMensualite.val().replace(wsPattern, "");
            if (mensualite == "") {
                //alert('Veuillez choisir une durée ou renseigner une mensualite.');
                showErrorInput(txtMensualite.get(0).id, 'Veuillez choisir une durée ou renseigner une mensualite.');
                return false;
            }
            if ((mensualite.search(/^[0-9]+$/) == 0)) {
                var mensuSaisie = parseInt(mensualite);

                if ((mensuSaisie < mensualiteMin) || (mensuSaisie > mensualiteMax)) {
                    showErrorInput(txtMensualite.get(0).id, 'La mensualité n\'est pas comprise entre ' + mensualiteMin + ' et ' + mensualiteMax + '. Veuillez ré-essayer.');
                    return false;
                }
            }
            else {
                //alert('La mensualite doit etre un entier. Veuillez re-essayer.');
                showErrorInput(txtMensualite.get(0).id, 'La mensualite doit etre un entier. Veuillez re-essayer.');
                return false;
            }
        }
        return true;
    }

    function serializeResultats(data) {
        var result = '{"d":{';

        for (key in data.d) {
            var val = data.d[key];

            switch (typeof val) {
                case 'string':
                    val = '"' + val + '"';
                    break;

                case 'number':
                    val = isFinite(val) ? String(val) : 'null';
                    break;

                case 'boolean':
                    val = String(val);
                    break;
            }
            result += '"' + key + '": ' + val + ",";
        }
        
        result = result.substr(0, result.length - 1) + '}}';
        return result;
    }

    function actualiserResultats(data) {
        $.modal.close();
        var blockresulat = $(".blockResultat", simulateur);
        blockresulat.show();
        $(".highlight", blockresulat).hide().show(10);
        $("input[id$=showResultats]", simulateur).val("X");
        $("input[id$=cachedResultats]", simulateur).val(serializeResultats(data));
        var projet = $("option:selected", selBesoin).text();
        $(".libelle", blockresulat).text(projet);
        $(".plageMontant", blockresulat).text(lblMontant.text());
        $(".montant", blockresulat).text(formateNombre(data.d.montant, ',', ' ') + " €");
        $(".mensualite", blockresulat).text(data.d.mensualite);
        $(".duree", blockresulat).text(data.d.duree + " mois");
        //$(".cout", blockresulat).text(data.d.cout);
        $(".totaldu", blockresulat).text(data.d.totaldu);
        $(".taux", blockresulat).text(data.d.taux);
        $(".taeg", blockresulat).text(data.d.taeg);
        $(".assurance", blockresulat).text(data.d.assurance);
        //$(".frais", blockresulat).text(data.d.frais);

        // Met à jour les variables en fonction des choix confirmés par le service
        valProjet = selBesoin.val();
        valMontant = data.d.montant;
        valDuree = data.d.duree;

        // Actualisation des tooltips
        // 1 - Supprime les handlers existants
        $("img.help2, img.help2Plus, img.help3, img.help3Plus", blockresulat).unbind('mouseenter mouseleave');

        // 2 - Attache les nouvelles valeurs
        // (-) montant
        $("img.help2", blockresulat).easyTooltip({
            tooltipId: "tooltip2",
            content: "Je veux emprunter<br/><strong>MOINS</strong><br/>et rembourser<br/><strong>" + data.d.mensualite + "</strong>"
        });
        // (+) montant
        $("img.help2Plus", blockresulat).easyTooltip({
            tooltipId: "tooltip2",
            content: "Je veux emprunter<br/><strong>PLUS</strong><br/>et rembourser<br/><strong>" + data.d.mensualite + "</strong>"
        });
        // (-) mensualité
        $("img.help3", blockresulat).easyTooltip({
            tooltipId: "tooltip3",
            content: "Je veux emprunter<br /><strong>" + formateNombre(valMontant, ',', ' ') + " &euro;</strong><br />et rembourser<br/><strong>MOINS chaque mois</strong>"
        });
        // (+) mensualité
        $("img.help3Plus", blockresulat).easyTooltip({
            tooltipId: "tooltip3",
            content: "Je veux emprunter<br /><strong>" + formateNombre(valMontant, ',', ' ') + " &euro;</strong><br />et rembourser<br/><strong>PLUS chaque mois</strong>"
        });
    }

    selBesoin.change(function(evt) {
        var val = this.value;
        if (val == "-1") {
            // on efface le libellé montant
            lblMontant = lblMontant.text("");

            // on disable efface les autres champs du control
            txtMontant.attr("disabled", "disabled");
            selMois.val("-1");
            selMois.attr("disabled", "disabled");
            txtMensualite.val("");
            txtMensualite.attr("disabled", "disabled");

            // Réaffiche toutes les lignes du tableau et affecte la classe last au dernier élément
            $('.highlightTable tbody tr').show().removeClass('last').last().addClass('last');
        }
        else {

            // on recherche le montant minimum et le montant maximum pour le projet choisi
            // à l'aide d'une requête ajax
            ajaxPost('GetMinMaxMontantFromReglette', '{"reglette":"' + val + '"}',
                function(data) {
                    if (data.d) {
                        montantMin = data.d.montantMin;
                        montantMax = data.d.montantMax;
                    }
                    else {
                        montantMin = 0;
                        montantMax = 0;
                    }

                    // on affiche le min et max pour le projet choisi
                    lblMontant.text("(de " + formateNombre(montantMin, ',', ' ') + " à " + formateNombre(montantMax, ',', ' ') + " €)");

                    // on enable le champ suivant du control
                    txtMontant.removeAttr("disabled");
                    selMois.removeAttr("disabled");
                    selMois.change();

                    // Filtre la table en fonction du projet
                    $('.highlightTable tbody tr').hide().removeClass('last');
                    $('.highlightTable tr[data-code-projet=' + val + ']').show().last().addClass('last');
                },
                function() {
                    showErrorInput(this.id, 'Problème technique du serveur');
                    this.value = "-1";
                    $(this).change();
                }
            );
        }
    });

    txtMontant.blur(function(evt) {
        var val = this.value.replace(wsPattern, "");
        var projet = selBesoin.val();

        // Vide la sélection de la durée
        selMois.html('<option value="-1">-</option>');

        // on valide la saisie du montant
        if (!validerMontant(val)) {
            evt.preventDefault();
            return;
        }

        // Ajoute un message indiquant le chargement
        selMois.html('<option value="-1">Chargement</option>');

        // on recherche les bornes en fonction du montant
        // à l'aide d'une requête ajax
        ajaxPost('GetBornesFromRegletteMontant', '{"reglette":"' + projet + '", "montant":' + val + '}',
            function(data) {
                mensualiteMin = data.d.mensualiteMin;
                mensualiteMax = data.d.mensualiteMax;
                moisMin = data.d.moisMin;
                moisMax = data.d.moisMax;

                // Construction du select mois
                var options = '<option value="-1">-</option>';
                for (var i = moisMin; i <= moisMax; i+=12) {
                    options += '<option value="' + i + '">' + i + '</option>';
                }
                selMois.html(options);
            },
            function() {
                showErrorInput(this.id, 'Problème technique du serveur');
                this.value = "";
            }
        );
    });

    selMois.change(function(evt) {
        var val = this.value;
        if (val == "-1") {
            txtMensualite.removeAttr("disabled");
        }
        else {
            txtMensualite.val("");
            txtMensualite.attr("disabled", "disabled");
        }
    });

    btnSubmitSimul.click(function(evt) {
        var idSimulation = simulation.val();
        var projet = selBesoin.val();
        var montant = parseInt(txtMontant.val().replace(wsPattern, ""));
        var duree = parseInt(selMois.val());
        var mensualite = (duree == -1) ? parseInt(txtMensualite.val().replace(wsPattern)) : 0;

        evt.stopImmediatePropagation();
        evt.preventDefault();

        if (validerSaisieSimulator()) {
            step = (montant < 10000) ? 100 : 500;
            lancerSimulation(projet, montant, duree, mensualite, idSimulation);
        } else {
            $.modal.close();
        }
    });

    // Action (-) montant
    $("img.help2", simulateur).click(function(e) {
        var idSimulation = simulation.val();
        var projet = valProjet;
        var duree = valDuree;
        var montant = valMontant;

        e.preventDefault();

        if (montant <= montantMin)
            return;

        montant -= step;

        if (montant < montantMin) {
            montant = montantMin;
        }
        lancerSimulation(projet, montant, duree, 0, idSimulation);
    });

    // Action (+) montant
    $("img.help2Plus", simulateur).click(function(e) {
        var idSimulation = simulation.val();
        var projet = valProjet;
        var duree = valDuree;
        var montant = valMontant;

        e.preventDefault();

        if (montant >= montantMax)
            return;
            
        montant += step;
            
        if (montant > montantMax) {
            montant = montantMax;
        }
        lancerSimulation(projet, montant, duree, 0, idSimulation);
    });

    // Action (-) mensualité
    $("img.help3", simulateur).click(function(e) {
        var idSimulation = simulation.val();
        var projet = valProjet;
        var duree = valDuree;
        var montant = valMontant;
        ++duree;

        e.preventDefault();

        if (duree <= moisMax) {
            lancerSimulation(projet, montant, duree, 0, idSimulation);
        }
    });

    // Action (+) mensualité
    $("img.help3Plus", simulateur).click(function(e) {
        var idSimulation = simulation.val();
        var projet = valProjet;
        var duree = valDuree;
        var montant = valMontant;
        --duree;

        e.preventDefault();

        if (duree >= moisMin) {
            lancerSimulation(projet, montant, duree, 0, idSimulation);
        }
    });

    // Action retour aux paramètres
    lnkModify.click(function(e) {
        simulateur.removeClass("blockResult");
        $(".blockSaisie", simulateur).show();
        $("input[id$=showResultats]", simulateur).val("");
        $("input[id$=cachedResultats]", simulateur).val("");
        $(".blockResultat", simulateur).hide();
        e.preventDefault();
    });

    // Sauvegarde les valeurs pré-renseignées
    valMontant = txtMontant.val();
    valDuree = selMois.val();

    // Passage de l'ajax en sjax
    $.ajaxSetup({ async: false });
    showSpinnerModal();
    
    // Vide la sélection de la durée
    selMois.html('<option value="-1">-</option>');

    // Rejoue les saisies utilisateurs
    selBesoin.change();
    if (valMontant != "") {
        txtMontant.blur();
        selMois.val(valDuree);
        selMois.change();

        if ($("input[id$=cachedResultats]", simulateur).val() != "") {
            // Si des données ont été sauvegardées, on les réutilise
            var data = $.parseJSON($("input[id$=cachedResultats]", simulateur).val());
            $(".blockSaisie", simulateur).hide();
            simulateur.addClass('blockResult');
            actualiserResultats(data);
        } else if ($("input[id$=showResultats]", simulateur).val() != "") {
            // Sinon relance la requête
            if (simulation.val() != "") {
                var projet = selBesoin.val();
                var mensualite = txtMensualite.val().replace(wsPattern, "");
                if (mensualite == "") {
                    mensualite = "0";
                }
                lancerSimulation(projet, valMontant, nbMois.val(), parseInt(mensualite), simulation.val());
            } else {
                btnSubmitSimul.click();
            }
        } else {
            $.modal.close();
        }
    } else {
        $.modal.close();
    }

    // retour en asynchrone
    $.ajaxSetup({ async: true });
}

