﻿var QueryBuilder = {

    unSpiner: null,
    nbResult: 0,

    rechercheClick: function(rechercheTextuelle) {
        var param = { rechercheTextuelle: rechercheTextuelle };
        requete["createRechercheTextuelle"] = rechercheTextuelle;

        page = 1;
        sort = "";

        /* Paramétrage du JqGrid */
        sortname = "Comparer";
        sortorder = "ASC";

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "/Services/QueryService.asmx/InitRecherche",
            data: JSON.stringify(param),

            success: function(data) {
                QueryBuilder.refreshAnnonceCount("rechercher");
            },
            error: function(jqXHR, textStatus, errorThrown) {
                //alert(jqXHR.responseText);
            }
        });
    },

    init: function() {
        this.unSpiner = new Image();
        this.unSpiner.src = "/images/spinner.gif";

        $("#divCheckboxMarques").mCustomScrollbar("vertical", 300, "easeOutCirc", 1.05, "auto", "yes", "yes", 15);
        $("#divMarques").css({ "display": "none" });

        $(".spnQbBtnGris").hover(
            function() {
                $(this).css({ "background": "#CC0033 url(/images/btn_degrade_gd.jpg) repeat-y" });
            },
            function() {
                $(this).css({ "background": "#777777 none" });
            }
        );

        $("#divModeles").hide();

        if ($(".txtRechercheTextuelle").val() == "") {
            $(".txtRechercheTextuelle").val(strDataQb["QueryBuilderMessageRechercheTextuelle"]);
        }

        if ($(".txtRechercheTextuelle").val() == strDataQb["QueryBuilderMessageRechercheTextuelle"]) {
            $(".txtRechercheTextuelle").addClass("txtRechercheExemple");
        }

        if ($(".txtLieu").val() == "") {
            $(".txtLieu").val(strDataQb["QueryBuilderMessageLieuRecherche"]);
        }

        if ($(".txtLieu").val() == strDataQb["QueryBuilderMessageLieuRecherche"]) {
            $(".txtLieu").addClass("txtRechercheExemple");
        }

        $(".txtRechercheTextuelle").change(function() {
            var recherche = $(".txtRechercheTextuelle").val();
            recherche = recherche.replace(/\s+/g, " ");
            recherche = $.trim(recherche);

            $(".txtRechercheTextuelle").val(recherche);

            QueryBuilder.refreshAnnonceCount();
        });

        $("#divCheckboxMarques label").css({
            "display": "inline-block",
            "width": "120px"
        });

        $(document).click(function() {
            $("#divMarques").fadeOut("slow");
            $("#divModeles").fadeOut("slow");
            $("#divEnergies").fadeOut("slow");
            $("#divBoiteVitesse").fadeOut("slow");
            $("#divCouleur").fadeOut("slow");
            $("#divCarrosserie").fadeOut("slow");
            $("#divOptions").fadeOut("slow");
        });

        $("#divMarques").click(function(event) { event.stopPropagation(); });
        $("#divModeles").click(function(event) { event.stopPropagation(); });
        $("#divEnergies").click(function(event) { event.stopPropagation(); });
        $("#divBoiteVitesse").click(function(event) { event.stopPropagation(); });
        $("#divCouleur").click(function(event) { event.stopPropagation(); });
        $("#divCarrosserie").click(function(event) { event.stopPropagation(); });
        $("#divOptions").click(function(event) { event.stopPropagation(); });
    },

    rechercheTextuelleFocus: function(objet) {
        if (objet.value == strDataQb["QueryBuilderMessageRechercheTextuelle"]) {
            objet.value = "";
            $(objet).removeClass("txtRechercheExemple");
        }
    },

    rechercheTextuelleBlur: function(objet) {
        if (objet.value == "") {
            objet.value = strDataQb["QueryBuilderMessageRechercheTextuelle"];
            $(objet).addClass("txtRechercheExemple");
        }
    },

    rechercheLieuFocus: function(objet) {
        if (objet.value == strDataQb["QueryBuilderMessageLieuRecherche"]) {
            objet.value = "";
            $(objet).removeClass("txtRechercheExemple");
        }
    },

    rechercheLieuBlur: function(objet) {
        if (objet.value == "") {
            objet.value = strDataQb["QueryBuilderMessageLieuRecherche"];
            $(objet).addClass("txtRechercheExemple");
        }
    },

    createBudgetSlider: function(min, max, minChoice, maxChoice) {
        $("#divBudgetSlider").slider({
            range: true,
            values: [minChoice, maxChoice],
            min: min,
            max: max,
            step: 1000,
            slide: function(event, ui) {
                QueryBuilder.calculBudget(ui.values, min, max);
            },
            stop: function(event, ui) {
                QueryBuilder.refreshAnnonceCount();
            }
        });

        QueryBuilder.calculBudget($("#divBudgetSlider").slider("option", "values"), min, max);
    },

    calculBudget: function(values, min, max) {

        var choix = "";

        if (values[0] == min) {
            choix += "de -" + values[0] + " € ";
        } else {
            choix += "de " + values[0] + " € ";
        }

        if (values[1] == max) {
            choix += "à +" + values[1] + " €";
        } else {
            choix += "à " + values[1] + " €";
        }

        $("#spnBudgetSliderChoix").html(choix);
    },

    createKilometrageSlider: function(min, max, minChoice, maxChoice) {
        $("#divKilometrageSlider").slider({
            range: true,
            values: [minChoice, maxChoice],
            min: min,
            max: max,
            step: 5000,
            slide: function(event, ui) {
                QueryBuilder.calculKilometrage(ui.values, min, max);
            },
            stop: function(event, ui) {
                QueryBuilder.refreshAnnonceCount();
            }
        });

        QueryBuilder.calculKilometrage($("#divKilometrageSlider").slider("option", "values"), min, max);
    },

    calculKilometrage: function(values, min, max) {
        var choix = "de " + values[0] + " km ";

        if (values[1] == max) {
            choix += "à +" + values[1] + " km";
        } else {
            choix += "à " + values[1] + " km";
        }

        $("#spnKilometrageSliderChoix").html(choix);
    },

    createAgeSlider: function(min, max, choice) {
        $("#divAgeSlider").slider({
            value: choice,
            min: min,
            max: max,
            step: 1,
            slide: function(event, ui) {
                QueryBuilder.calculAge(ui.value, min, max);
            },
            stop: function(event, ui) {
                QueryBuilder.refreshAnnonceCount();
            }
        });

        QueryBuilder.calculAge($("#divAgeSlider").slider("option", "value"), min, max);
    },

    calculAge: function(value, min, max) {
        var choix = "jusqu'à " + value + " an(s)";

        if (value == min) {
            choix = "- de 6 mois";
        } else if (value == max) {
            choix = "+ de " + value + " an(s)";
        } else {
            choix = "jusqu'à " + value + " an(s)";
        }

        $("#spnAgeSliderChoix").html(choix);
    },

    clickCheckbox: function(obj, parentClientId, val, entityType) {
        var element = requete[entityType];

        $.each($("#" + parentClientId + " input"), function(index, objet) {
            if (objet == obj) {
                if (obj.checked) {
                    element.push(val);
                    QueryBuilder.refreshAnnonceCount();
                } else {

                    for (var i = 0; i < element.length; i++) {
                        if (element[i] == val) {
                            element.splice(i, 1);

                            // Permet de supprimer les modèles sélectionnées
                            // lors de la désélection d'une marque
                            if (entityType == "marques") {
                                var marqueASupprimer = { query: { marques: val} };
                                QueryBuilder.getModeles(marqueASupprimer, "QueryBuilder.supprimerCheckboxModeles");
                            } else if (entityType == "modeles") {
                                var modeleASupprimer = { query: { modeles: val} };
                                QueryBuilder.getCarrosseries(modeleASupprimer, "QueryBuilder.supprimerCheckboxCarrosseries");
                            } else {
                                QueryBuilder.refreshAnnonceCount();
                            }
                        }
                    }
                }
            }
        });
    },

    supprimerCheckboxModeles: function(desModeles) {
        var modelesValues = "";
        var incr = 0;

        for (var i = 0; i < desModeles.length; i++) {
            for (var j = 0; j < requete["modeles"].length; j++) {
                if (desModeles[i].ModelId == requete["modeles"][j]) {
                    modelesValues += incr == 0 ? "" : ",";
                    modelesValues += requete["modeles"][j];
                    requete["modeles"].splice(j, 1);
                    incr++;
                }
            }
        }

        var modeleASupprimer = { query: {
            modeles: modelesValues
        }
        };

        QueryBuilder.getCarrosseries(modeleASupprimer, "QueryBuilder.supprimerCheckboxCarrosseries");
    },

    supprimerCheckboxCarrosseries: function(desCarrosseries) {
        for (var i = 0; i < desCarrosseries.length; i++) {
            for (var j = 0; j < requete["carrosseries"].length; j++) {
                if (desCarrosseries[i].CarrosserieId == requete["carrosseries"][j]) {
                    requete["carrosseries"].splice(j, 1);
                }
            }
        }

        QueryBuilder.getCheckboxCarrosseries();
        QueryBuilder.refreshAnnonceCount();
    },

    refreshAnnonceCount: function(reloadListeAnnonce) {
        var sparams = QueryBuilder.prepareParameters();

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "/Services/QueryService.asmx/QueryObjectCount",
            data: sparams,
            beforeSend: function() {
                //$("#spnCompteur").html(QueryBuilder.unSpiner);
            },
            success: function(data) {
                QueryBuilder.nbResult = data.d.AnnoncesActuellesCount;

                $("#spnCompteur").html(QueryBuilder.nbResult);
                $("#spnMarqueLabel").html(data.d.MarqueLabel);
                $("#spnModeleLabel").html(data.d.ModeleLabel);

                if (reloadListeAnnonce == "rechercher") {
                    if ($("#list_annonce").length == 0) {
                        document.location = "/rechercher-un-vehicule.aspx";
                    } else {
                        $("#list_annonce")
                            .jqGrid("setGridParam", { sortname: "Comparer" })
                            .jqGrid("setGridParam", { sortorder: "ASC" })
                            .jqGrid().trigger("reloadGrid");

                        $(".s-ico").css({ "display": "none" });
                        Listing.getPager(QueryBuilder.nbResult);
                    }
                }

                if (reloadListeAnnonce == "pageLoad" && $("#list_annonce").length > 0) {
                    Listing.getPager(QueryBuilder.nbResult);
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                //alert(jqXHR.responseText);
            }
        });
    },

    getModeles: function(marqueIds, functionToReturn) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "/Services/QueryService.asmx/GetModels",
            data: JSON.stringify(marqueIds),
            success: function(data) {
                eval(functionToReturn + "(data.d);");
            },
            error: function(jqXHR, textStatus, errorThrown) {
                //alert(jqXHR.responseText);
            }
        });
    },

    getSelectedMarqueIds: function() {
        var marquesValues = "";

        for (var i = 0; i < requete["marques"].length; i++) {
            marquesValues += i == 0 ? "" : ",";
            marquesValues += requete["marques"][i];
        }

        var params = { query: {
            marques: marquesValues
        }
        };

        return params;
    },

    getSelectedModeleIds: function() {
        var modelesValues = "";

        for (var i = 0; i < requete["modeles"].length; i++) {
            modelesValues += i == 0 ? "" : ",";
            modelesValues += requete["modeles"][i];
        }

        var params = { query: {
            modeles: modelesValues
        }
        };

        return params;
    },

    getCheckBox: function(nom, valeur) {
        var checkbox = document.createElement("input");
        checkbox.type = "checkbox";
        checkbox.id = nom;
        checkbox.name = nom;
        checkbox.value = valeur;

        return checkbox;
    },

    getLabel: function(htmlFor, html) {
        var label = document.createElement("label");
        label.htmlFor = htmlFor;
        label.innerHTML = html;

        return label;
    },

    getCheckboxModeles: function(desModeles) {
        if (desModeles == undefined) {
            var marqueIds = this.getSelectedMarqueIds();
            QueryBuilder.getModeles(marqueIds, "QueryBuilder.getCheckboxModeles");
        } else {
            $("#divContentModeles").html("");

            if (desModeles.length > 0) {
                var unSpan = QueryBuilder.getCheckboxIndifferent();
                $("#divContentModeles").append(unSpan);
            }

            for (var i = 0; i < desModeles.length; i++) {
                var checkbox = QueryBuilder.getCheckBox("chkModele" + i, desModeles[i].ModelId);

                for (var j = 0; j < requete["modeles"].length; j++) {
                    if (requete["modeles"][j] == desModeles[i].ModelId) {
                        checkbox.defaultChecked = true;
                    }
                }

                $(checkbox).click(function() {
                    $("#chkModeleIndifferent").get(0).checked = false;
                    QueryBuilder.clickCheckbox(this, "divModeles", this.value, "modeles");
                    QueryBuilder.getCheckboxCarrosseries();
                });

                var label = QueryBuilder.getLabel("chkModele" + i, desModeles[i].Label);

                var unSpan = document.createElement("span");
                $(unSpan).css({
                    "display": "inline-block",
                    "width": "150px",
                    "white-space": "nowrap",
                    "overflow": "hidden"
                });

                unSpan.appendChild(checkbox);
                unSpan.appendChild(label);

                $("#divContentModeles").append(unSpan);
            }

            $("#divModeles").show();
            $("#divCheckboxModeles").mCustomScrollbar("vertical", 300, "easeOutCirc", 1.05, "auto", "yes", "yes", 15);
            $("#divModeles").hide();

            if ($("#divContentModeles").html() == "") {
                $("#divContentModeles").html(strDataQb["QueryBuilderMessageModele"]);
            }
        }
    },

    getCheckboxIndifferent: function() {
        var checkbox = QueryBuilder.getCheckBox("chkModeleIndifferent", "0");

        if (requete["modeles"].length == 0) {
            checkbox.defaultChecked = true;
        }

        $(checkbox).click(function() {
            $.each($("#divContentModeles input[type=checkbox]"), function(index, objet) {
                if (objet != checkbox) {
                    $(objet).removeAttr("checked");
                    QueryBuilder.clickCheckbox(objet, "divModeles", objet.value, "modeles");
                }
            });
        });

        var label = QueryBuilder.getLabel("chkModeleIndifferent", "Indifférent");
        var unSpan = document.createElement("span");
        unSpan.style.display = "block";
        unSpan.style.width = "100%";
        unSpan.style.borderBottom = "1px solid #CCCCCC";

        unSpan.appendChild(checkbox);
        unSpan.appendChild(label);

        return unSpan;
    },

    getCarrosseries: function(modeleIds, functionToReturn) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "/Services/QueryService.asmx/GetCarrosseries",
            data: JSON.stringify(modeleIds),
            success: function(data) {
                eval(functionToReturn + "(data.d);");
            },
            error: function(jqXHR, textStatus, errorThrown) {
                //alert(jqXHR.responseText);
            }
        });
    },

    getCheckboxCarrosseries: function(desCarrosseries) {
        if (desCarrosseries == undefined) {
            var modeleIds = this.getSelectedModeleIds();

            QueryBuilder.getCarrosseries(modeleIds, "QueryBuilder.getCheckboxCarrosseries");
        } else {
            $("#divCheckboxCarrosserie").html("");

            for (var i = 0; i < desCarrosseries.length; i++) {
                var checkbox = QueryBuilder.getCheckBox("chkCarrosserie" + i, desCarrosseries[i].CarrosserieId);

                for (var j = 0; j < requete["carrosseries"].length; j++) {
                    if (requete["carrosseries"][j] == desCarrosseries[i].CarrosserieId) {
                        checkbox.defaultChecked = true;
                    }
                }

                $(checkbox).click(function() {
                    QueryBuilder.clickCheckbox(this, "divCarrosserie", this.value, "carrosseries");
                });

                var label = QueryBuilder.getLabel("chkCarrosserie" + i, desCarrosseries[i].LabelCarrosserie);

                var unSpan = document.createElement("span");
                unSpan.style.display = "inline-block";
                unSpan.style.width = "150px";

                unSpan.appendChild(checkbox);
                unSpan.appendChild(label);

                $("#divCheckboxCarrosserie").append(unSpan);
            }

            if ($("#divCheckboxCarrosserie").html() == "") {
                $("#divCheckboxCarrosserie").html(strDataQb["QueryBuilderMessageCarrosserie"]);
            }
        }
    },

    prepareParameters: function(entityType) {
        var marquesValues = "";
        var modelesValues = "";
        var energiesValues = "";
        var budgetValues = "";
        var kilometrageValues = "";
        var ageValue = "";
        var boiteValues = "";
        var couleursValues = "";
        var carrosseriesValues = "";
        var otpionsValues = "";

        for (var i = 0; i < requete["marques"].length; i++) {
            marquesValues += i == 0 ? "" : ",";
            marquesValues += requete["marques"][i];
        }

        for (var i = 0; i < requete["modeles"].length; i++) {
            modelesValues += i == 0 ? "" : ",";
            modelesValues += requete["modeles"][i];
        }

        for (var i = 0; i < requete["energies"].length; i++) {
            energiesValues += i == 0 ? "" : ",";
            energiesValues += requete["energies"][i];
        }

        var budget = $("#divBudgetSlider").slider("option", "values");
        budgetValues = budget[0] + "," + budget[1];

        var kilometrage = $("#divKilometrageSlider").slider("option", "values");
        kilometrageValues = kilometrage[0] + "," + kilometrage[1];

        for (var i = 0; i < requete["boites"].length; i++) {
            boiteValues += i == 0 ? "" : ",";
            boiteValues += requete["boites"][i];
        }

        ageValue = $("#divAgeSlider").slider("option", "value");

        for (var i = 0; i < requete["couleurs"].length; i++) {
            couleursValues += i == 0 ? "" : ",";
            couleursValues += requete["couleurs"][i];
        }

        for (var i = 0; i < requete["carrosseries"].length; i++) {
            carrosseriesValues += i == 0 ? "" : ",";
            carrosseriesValues += requete["carrosseries"][i];
        }

        for (var i = 0; i < requete["options"].length; i++) {
            otpionsValues += i == 0 ? "" : ",";
            otpionsValues += requete["options"][i];
        }

        var unRegExp = new RegExp(" ", "g");
        var rechercheTextuelleValues = $(".txtRechercheTextuelle").val().replace(unRegExp, ",");

        var params = { query: {
            marques: marquesValues,
            modeles: modelesValues,
            energies: energiesValues,
            budget: budgetValues,
            kilometrage: kilometrageValues,
            age: ageValue,
            lieu: $(".txtLieu").val(),
            boites: boiteValues,
            couleurs: couleursValues,
            carrosseries: carrosseriesValues,
            options: otpionsValues,
            rechercheTextuelle: rechercheTextuelleValues,
            createRechercheTextuelle: requete["createRechercheTextuelle"],
            distributeurId: qbDistributeurId
        }
        };

        return JSON.stringify(params);
    },

    clickMenu: function(menu, event, objet) {
        if ($.browser.msie) {
            event.cancelBubble = true;
        } else {
            event.stopPropagation();
        }

        if (objet != undefined) {

            var position = $(objet).offset();

            $("#" + menu).css({
                "top": position.top + $(objet).height() + "px",
                "left": position.left + "px"
            });

            if (menu != "divMarques") $("#divMarques").fadeOut("fast", "linear");
            if (menu != "divModeles") $("#divModeles").fadeOut("fast", "linear");
            if (menu != "divEnergies") $("#divEnergies").fadeOut("fast", "linear");
            if (menu != "divBoiteVitesse") $("#divBoiteVitesse").fadeOut("fast", "linear");
            if (menu != "divCouleur") $("#divCouleur").fadeOut("fast", "linear");
            if (menu != "divCarrosserie") $("#divCarrosserie").fadeOut("fast", "linear");
            if (menu != "divOptions") $("#divOptions").fadeOut("fast", "linear");
        }

        $("#" + menu).fadeToggle("fast", "linear");
    },

    clickRechercheAvancee: function(objet) {
        if ($("#divRechercheAvancee").get(0).style.display == "block") {
            objet.innerHTML = "RECHERCHE AVANCEE&nbsp;&nbsp;&nbsp;>";
        } else {
            objet.innerHTML = "RECHERCHE AVANCEE&nbsp;&nbsp;&nbsp;V";
        }

        $("#divRechercheAvancee").slideToggle("fast", "linear");
    }
}
