﻿var rechercheMapping =[];
var currentSearch = {};
var searchMethod = 'post';
$(function() {

	$.extend({

		/* ENTITY : Get carAd */
		// carAdId : id carAd
		GetCarAd: function(carAdId, success, failure) {
			$.AjaxCall("services/AjaxService.asmx/GetCarAd",
				"{'carAdId': " + carAdId + "}",
				false,
				function(response) { if (success) success(response.d); },
				function() { if (failure) failure(); }
			);
		},

		/* ENTITY : User has free carAd */
		// currentSearch : jsonCarAd
		SetCarAd: function(currentSearch, success, failure) {
			$.AjaxCall("services/AjaxService.asmx/SetCarAd",
				"{'carAd': " + JSON.stringify(currentSearch) + "}",
				false,
				function(response) { if (success) success(response.d); },
				function() { if (failure) failure(); }
			);
		},

		/* ENTITY : GetAdsByRequestSearchCriteriaPageTri */
		// criteria : Dictionary<string, string>
		// Page : numéro de page
		// EltPerPage : nombre d'éléments par pages
		// tri : tableau de tri
		GetAdsByRequestSearchCriteriaPageTri: function(criteria, Page, EltPerPage, tri, success, failure) {
			$.AjaxCall("services/AjaxService.asmx/GetAdsByRequestSearchCriteriaPageTri",
				"{'criteres': '" + criteria + "', 'Page': " + Page + ", 'EltPerPage': " + EltPerPage + ", 'tri': " + tri + "}",
				false,
				function(response) { if (success) success(response.d); },
				function() { if (failure) failure(); }
			);
		},

		/* ENTITY : GetNbAdsByRequestSearchCriteriaPageTri */
		// criteria : Dictionary<string, string>
		// max : nombre maximum d'élement
		GetNbAdsByRequestSearchCriteriaPageTri: function(criteria, max, success, failure) {
			$.AjaxCall("services/AjaxService.asmx/GetNbAdsByRequestSearchCriteria",
				"{'criteres': '" + criteria + "', 'max':" + max + "}",
				false,
				function(response) { if (success) success(response.d); },
				function() { if (failure) failure(); }
			);
		},

		/* FORM : remplissage */
		// annonces : liste d'annonces
		FillAnnonceData: function(annonces) {
			var annoncesData = {};
			//annoncesData = [{"annonceId":358110,"marqueModele":"Renault Clio","version":"AIR 1.5 DCI 70","marqueModeleVersion":"Renault Clio AIR 1.5 DCI 70","prix":"3 800 €","garantie":"","energie":"Diesel","km":"128 800 km","annee":"2006","departement":"33","photo":"/AutoContact.AutoCote.Web/img/photo-indisponible.gif","url":"/AutoContact.AutoCote.Web/fiche-vehicule.aspx?annonceid=358110"}
			//,{"annonceId":328162,"marqueModele":"Renault Clio","version":"AIR 1.5 DCI 65","marqueModeleVersion":"Renault Clio AIR 1.5 DCI 65","prix":"4 000 €","garantie":"","energie":"Diesel","km":"80 900 km","annee":"2005","departement":"33","photo":"/AutoContact.AutoCote.Web/img/photo-indisponible.gif","url":"/AutoContact.AutoCote.Web/fiche-vehicule.aspx?annonceid=328162"}
			//];

			for (var i = 0; i < annonces.length; i++) {
				var a = annonces[i];
				var vers = $.VehiculeScreenVersion(a);
				//var currentCote = { dateMec: $.ToIsoDate(a.DateMec), mileAge: a.Kilometrage, makeId: a.Marque.Identifiant, modelId: a.Modele.Identifiant, versionId: a.GUIDVersion, colorId: a.Couleur.Identifiant, power: a.PuissanceFiscale, bodyTypesId: a.Carrosserie.Identifiant, gearBoxTypesId: a.Boite.Identifiant, fuelTypesId: a.Energie.Identifiant, doorsNumbersId: a.NbPorte, status: 0 };
				var currentCote = { dateMec: a.DateMec, mileAge: a.Kilometrage, makeId: a.Marque.Identifiant, modelId: a.Modele.Identifiant, versionId: a.GUIDVersion, colorId: a.Couleur.Identifiant, status: 0 };
				var annonce = { annonceId: a.CarAdId,
					marqueModele: a.Marque.Libelle + " " + a.Modele.Libelle,
					version: (vers.length > 34 ? vers.substring(0, 34) + '...' : vers),
					marqueModeleVersion: $.TitreFicheVehicule(a),
					prix: $().number_format(a.PrixVente, { numberOfDecimals: 0, decimalSeparator: ',', thousandSeparator: ' ' }) + ' &euro;',
					garantie: a.Garantie,
					energie: a.Energie.Libelle,
					boite: (a.Boite.Libelle == "Automatique" ? "Auto" : a.Boite.Libelle),
					km: (a.Kilometrage > 0 ? $().number_format(a.Kilometrage, { numberOfDecimals: 0, decimalSeparator: ',', thousandSeparator: ' ' }) + " km" : ""),
					couleur: a.Couleur.Libelle,
					annee: a.AnneeModele,
					departement: a.Departement,
					photo: (a.PhotoFirst == "" ? 'img/photo-indisponible.gif' : a.PhotoFirst),
					url: $.UrlFicheVehiculeByAnnonce(a),
					coteparam: JSON.stringify(currentCote)
				};
				annoncesData[i] = annonce;
			}
			return annoncesData;
		},

		/* FORM : Construction de la page */
		// max : nombre maximum d'élement
		GetNbAds: function(max) {
			var criteria = JSON.stringify(currentSearch);
			var nbLignes = 0;
			$.GetNbAdsByRequestSearchCriteriaPageTri(criteria,
				max,
				function(response) {
					switch (response.Key) {
						case -1:
							$('#CarAdMsg').html("Aucune annonce ne correspond à votre recherche.<br/>" +
										"Merci de modifier vos critères.");
							$.SetAnnoncesDuMoment();
							$('#NoCarAdList').show();
							break;
						case -2:
							break;
						case 1:
							nbLignes = response.Value;
							break;
					}
					$.HideLoading();
				},
				function() { $.HideLoading(); }
			);
			return nbLignes;
		},

		/* FORM : Nombre d'annonces */
		// Page : numéro de page
		// EltPerPage : nombre d'éléments par pages
		// tri : tableau de tri
		GetAdList: function(Page, EltPerPage, tri) {
			var criteria = JSON.stringify(currentSearch);
			var annoncesData = {};
			$.GetAdsByRequestSearchCriteriaPageTri(criteria,
				Page,
				EltPerPage,
				JSON.stringify(tri),
				function(response) {
					switch (response.Key) {
						case -1:
							$('#CarAdMsg').html("Aucune annonce ne correspond à votre recherche.<br/>" +
								"Merci de modifier vos critères.");
							$.SetAnnoncesDuMoment();
							$('#NoCarAdList').show();
							break;
						case -2:
							break;
						case 1:
							annonces = response.Value;
							if (annonces.length > 0) {
								annoncesData = $.FillAnnonceData(annonces);
							}
							break;
					}
					$.HideLoading();
				},
				function() { $.HideLoading(); $.ModalAlert("La liste n'a pas pu être crée."); }
			);
			return annoncesData;
		},

		/* JSON : Sauvegarde */
		// currentSearch : jsonCarAd
		MapAnnonce: function(currentSearch) {
			if ($("#txtAdBudgetMin").exists()) { currentSearch.budgetMin = $.GetIntValue($("#txtAdBudgetMin").val()); }
			if ($("#txtAdBudgetMax").exists()) { currentSearch.budgetMax = $.GetIntValue($("#txtAdBudgetMax").val()); }
			if ($("#selectAdLocalisation").exists()) { currentSearch.localisationId = $.GetIntValue($("#selectAdLocalisation").val()); }
			if ($("#selectAdMakes").exists()) { currentSearch.makeId = $.GetIntValue($("#selectAdMakes").val()); }
			if ($("#selectAdModels").exists()) { currentSearch.modelId = $.GetIntValue($("#selectAdModels").val()); }
		},

		/* JSON : Get int value */
		// value : value
		GetIntValue: function(value) {
			if (value == "")
				value = 0;
			return parseInt(value);
		},

		/* FORM : Initialisation formulaire */
		InitAdForm: function() {
			// init slider
			$("#slider-range").doubleInputSlider($("#txtAdBudgetMin"), $("#txtAdBudgetMax"));
			// fill and disable selectAdMakes
			// TODO del : $.ShowLoading();
			// TODO del : $.GetListAd("Makes", "", true, null, "Marque...", $.HideLoading, $.HideLoading);
			// disable selectAdModels
			$.ShowLoading();
			$("#selectAdModels").disableAndEmpty();
			$("#RechercheVoiture").autoSize();
			$.HideLoading();
		},

		/* FORM : Reset du formulaire */
		ClearAdForm: function() {
			currentSearch = {};
			$.FormHelper.Clear(rechercheMapping);
			$.InitAdForm();
		},

		/* FORM : Post */
		// currentSearch : jsonCarAd
		PostAnnonce: function(currentSearch) {
			location.href = ResolveUrl("~/annonce-voiture-occasion.aspx") + "?" + $.FormHelper.GetQueryString(rechercheMapping, { "AddEmptyValues": false });
		},

		/* FORM : Post */
		// carAdId : id carAd
		// page : id page - 1 result - 2 identification
		/// remarks : save annonce before post
		PostAnnonceId: function(page, carAdId, marque, modele, version) {
			if (page == 1) {
				location.href = $.UrlFicheVehicule(CarAdId, marque, modele, version);
			} else if (page == 2) {
				location.href = "utilisateur-identification.aspx?carAdId=" + carAdId;
			}
		},

		/* ACTION : onChange selectAdMakes */
		SelectAdMakesTextChangeCallback: function() {
			$.ShowLoading();
			if ($("#selectAdMakes").val() != "") {
				// fill and enable selectAdModels
				$.GetListAd("Models", "'makeId': " + $("#selectAdMakes").val(), true, null, "Mod&egrave;le...", $.HideLoading, $.HideLoading);
				$("#selectAdModels").enableAndEmpty();
			}
			else {
				//disable selectAdModels
				$("#selectAdModels").disableAndEmpty();
			}
			// trigger change selectAdModels
			$("#selectAdModels").trigger("change");
			$.HideLoading();
		},

		/* ACTION : onSubmit form */
		ValidateAnnonce: function() {
			var validation = $.FormHelper.Validate(rechercheMapping);
			if (validation.isValid()) {
				$.PostAnnonce(currentSearch);
			}
			else {
				var options = { "showHighLights": true, "showInputErrorMessage": false };
				$.FormError("Annonce", "AnnonceError", validation.getMessages("; "), validation.getErrorFields(), options);
			}
		}

	});
	$.fn.extend({
		doubleInputSlider: function(inputMin, inputMax, options) {
			var thisSelector = $(this);
			var settings = {
				range: true,
				min: 0,
				max: 100000,
				step: 1500,
				values: [0, 100000],
				slide: function(event, ui) {
					inputMin.val(ui.values[0]);
					inputMax.val(ui.values[1]);
					inputMin.next('span').html(inputMin.val());
					inputMax.next('span').html(inputMax.val());
					var thisHandle = jQuery(ui.handle);
					thisHandle.attr("title", ui.value);
				}
			};
			settings = $.extend(settings, options)
			thisSelector.slider(settings);
			inputMin.val(thisSelector.slider("values", 0));
			inputMin.css('display', 'none').after($('<span id="' + inputMin.selector + 'span"></span>').html(inputMin.val()));
			inputMax.val(thisSelector.slider("values", 1));
			inputMax.css('display', 'none').after($('<span id="' + inputMax.selector + 'span"></span>').html(inputMax.val()));

			/* budget min */
			inputMin.bind("change", function(event) {
				var value = parseInt($(this).val());
				var step = parseInt(thisSelector.slider("option", "step"));
				var min = parseInt(thisSelector.slider("option", "min"));
				var max = parseInt(thisSelector.slider("option", "max"));
				if (value < min) value = min;
				if (value > max) value = max;
				if (value % step != 0) value = value - (value % step);
				$(this).val(value);
				$(this).next('span').html(value);
				thisSelector.slider("values", 0, value);
			});

			/* budget max */
			inputMax.bind("change", function(event) {
				var value = parseInt($(this).val());
				var step = parseInt(thisSelector.slider("option", "step"));
				var min = parseInt(thisSelector.slider("option", "min"));
				var max = parseInt(thisSelector.slider("option", "max"));
				if (value < min) value = min;
				if (value > max) value = max;
				if (value % step != 0) value = (value - (value % step)) + step;
				$(this).val(value);
				$(this).next('span').html(value);
				thisSelector.slider("values", 1, value);
			});
		}
	});
});
