var listeBiens = new Array();
var displayedBiens = new Array();
var markersBiens = new Array();
var infoWindowsBien = new Array();

/**
 * Fonction qui recupère les critères du formulaire de recherche et les stock dans un tableau
 * Paramètres :
 * idForm -> est l'id du formulaire qui contient les critères de recherche
 */
function getCriteres(idForm) {
	var i,y,flag;
	var champs =$(idForm + " :input");
	var criteres = new Array();
	for(i = 0; i<champs.length; i++) {
		if(champs[i].type == "checkbox" && champs[i].checked == true) {
			flag = false;
			for(y = 0; y<criteres.length; y++) {
				if(criteres[y].in_array(champs[i].name)) {
					criteres[y][1].push(champs[i].value);
					flag = true;
				}
			}
			if(!flag) {
				criteres.push(new Array(champs[i].name,new Array(champs[i].value)));
			}
		}else if(champs[i].type == "radio" && champs[i].checked == true) {
				criteres.push(new Array(champs[i].name,champs[i].value));
		}else if(champs[i].type != "checkbox" && champs[i].type != "radio") {
			criteres.push(new Array(champs[i].name,champs[i].value));
		}
	}
	return criteres;
}

/**
 * Fonction qui, en ajax, va afficher la liste des mini-fiches de résultat correspondant aux critères entrés dans le moteur de recherche de biens
 * Paramètres :
 * idForm -> est l'id du formulaire contenant les criteres à utiliser pour interroger la base
 * divResult -> est l'id de la div dans laquelle on affiche la liste des mini-fiches correspondant à la requete
 * type -> est un parametre qui indique si l'on interroge la table des transactions, location etc ...
 */
function search(idForm,divResult,type,lang){
	if (lang == undefined) {
		lang='fr';
	}
	var criteres = getCriteres(idForm);
	switch(type) {
		case"transac":
			var url = "/" + lang + "/ggMaps_ajax/listeTransaction";
		break;
		case"loc":
			var url = "/" + lang + "/ggMaps_ajax/listeLocation";
		break;
	}
	$.ajax({
		type: "POST",
		url: url,
		data: "criteres=" + criteres.to_json(),
		success: function(retour){
			$(divResult).html(retour);
		}
	});
}

/**
 * Fonction qui va créer les marqueurs de bien en fonction du type ou de la categorie de bien choisi
 * Version Multidiffusion
 * Parametres :
 * typeBien -> est un tableau qui contien les types de biens qui ont été cochés dans le moteur de recherche
 * typeSearch -> est un parametre permettant d'indiquer si on recherche sur la base de transactions, location etc ...
 * flagTypeCat -> lorsqu'il est a true ce flag indique au controleur interroger que le recherche ne se fait pas exclusivement sur le champ type de bien mais aussi sur le champ categorie (exemple : bien neuf ou villa pied dans l'eau)
 */
function initBiens(typeBien,typeSearch,flagTypeCat,callback,lang) {
  if (lang == undefined) {
  	lang='fr';
  }
  // Fermeture des infobulles actuellement ouvertes
  if(typeof(clusterInfoWindows) != 'undefined'){
    clusterInfoWindows.close();
  }

  $("#loading").fadeIn("fast");// Apparition du loader
  switch(typeSearch) {
		case"transac":
			var url = "/"+lang+"/ggMaps_ajax/listeTransactionMap";
		break;
		case"loc":
			var url = "/"+lang+"/ggMaps_ajax/listeLocationMap";
		break;
	}
  markersBiens = [];
	$.ajax({
		type: "POST",
		url: url,
		data: "criteres=" + typeBien.to_json() + "&flagTypeCat=" + flagTypeCat,
		success: function(retour){
			deleteMarkers();
			retour = eval ( '(' + retour + ')' );
			listeBiens = new Array();

			for(var i=0; i<retour.length; i++) {
				if(retour[i].lat != null && retour[i].lat > 0 && retour[i].lon != null && retour[i].lon > 0) {
					var bien = new Array();// Création du tableau contenant les infos d'un bien

          /* Nom de champs commun a toutes les versions */
          bien.code_societe = retour[i].code_societe;
					bien.code_site = retour[i].code_site;
					bien.no_asp = retour[i].no_asp;
					bien.type = retour[i].type_offre;
					bien.categorie = retour[i].categorie;
					bien.nbPieces = retour[i].nb_pieces;
					bien.lat = retour[i].lat;
					bien.lon = retour[i].lon;
					bien.exclu = retour[i].exclu;

					bien.ville = retour[i].ville_bien;

					if(typeSearch == "transac" || typeSearch == "viager") {
						bien.prix = retour[i].prix_vente;
					}else if(typeSearch == "loc") {
						bien.prix = retour[i].loyer_cc;
					}

					if (bien.nbPieces > 1){
						title_bien = bien.categorie + ' ' + bien.nbPieces + ' pièces à ' + bien.ville + ' : ' + bien.prix + ' €';
					}else if (bien.nbPieces == 1){
						title_bien = bien.categorie + ' ' + bien.nbPieces + ' pièce à ' + bien.ville + ' : ' + bien.prix + ' €';
					}else{
						title_bien = bien.categorie + ' à ' + bien.ville + ' : ' + bien.prix + ' €';
					}

          if(typeSearch == "transac") {
						bien.prix = retour[i].prix_vente;
					}else if(typeSearch == "loc") {
						bien.prix = retour[i].loyer_cc;
					}
					var markBien = createMarker(bien.lat,bien.lon,bien.code_societe+"-"+bien.code_site+"-"+bien.no_asp);//Création du marqueur du bien
          markersBiens.push(markBien);// On stock le marqueur du bien dans un tableau
					listeBiens.push(bien);// On stock les infos des biens dans un tableau
				}
			}
			displayBiens(typeSearch);// Lancement de la fonction d'affichage/masquage des biens avec en parametre le tableau de toutes les infos des biens
		  if(typeof(callback) != 'undefined'){
        callback();
      }
    }
	});
}

/**
 * Fonction d'affichage ou de masquage des biens sur la map en fonction des critères du moteur de recherche
 * Paramètres :
 * typeSearch -> defini sur quel type de bien la recherche doit s'executer (transac, loc etc ...)
 */
function displayBiens(typeSearch,lang) {
  if (lang == undefined) {
  	var lang='fr';
  }
	switch(typeSearch) {
		case"transac":
			var crit = getCriteres("#form_tr");
		break;
		case"loc":
			var crit = getCriteres("#form_lo");
		break;
		case"viager":
			var crit = getCriteres("#form_vi");
		break;
	}
	var criteres = new Array();

	var i=0;
	var y=0;
	var l=0;
	var k,j,flag,flagGlobal,mapBien;

	displayedBiens = [];

	for(i; i<crit.length; i++) {
		criteres[crit[i][0]] = crit[i][1];// On créer un tableau contenant les critères de recherche du type "tableau[nom_critere] = val_critere"
	}

	for(y; y<listeBiens.length; y++) { // Pour chaque biens retourné par initBiens
		flag = new Array(); // Initialisation d'un tableau de flag

    /**
     * On vérifie la ville
     * Si le critère ville est présent et correspond a celui du bien le flag ville passe a true sinon il passe a false
     */
		if(criteres.ville != null && criteres.ville != ""){
			if(listeBiens[y].ville == criteres.ville) {
				flag.ville = true;
			}else {
				flag.ville = false;
			}
		}else {
			flag.ville = true;
		}

    /**
     * On vérifie la categorie
     * Si le critère categorie est présent et correspond a celui du bien le flag categorie passe a true sinon il passe a false
     */
 		if(criteres.categorie != null && criteres.categorie != "") {
			if(listeBiens[y].categorie == criteres.categorie) {
				flag.categorie = true;
			}else {
				flag.categorie = false;
			}
		}else {
			flag.categorie = true;
		}

    /**
     * On vérifie le type de bien
     * Si le critère type est présent et correspond a celui du bien le flag type passe a true sinon il passe a false
     */
		if(criteres.type_bien != null && criteres.type_bien.length > 0) {
			if(criteres.type_bien.in_array(listeBiens[y].type)) {
				flag.type_bien = true;
			}else {
				flag.type_bien = false;
			}
		}else {
			flag.type_bien = true;
		}

    /**
     * On vérifie le budget minimum
     * Si le critère budget_min est présent et est inférieur ou égal au prix de vente du bien le flag budget_min passe a true sinon il passe a false
     */
		if(criteres.budget_min != null && criteres.budget_min != "") {
			if(parseFloat(listeBiens[y].prix) >= parseFloat(criteres.budget_min)) {
				flag.budget_min = true;
			}else {
				flag.budget_min = false;
			}
		}else {
			flag.budget_min = true;
		}

    /**
     * On vérifie le budget maximum
     * Si le critère budget_max est présent et est supérieur ou égal au prix de vente du bien le flag budget_max passe a true sinon il passe a false
     */
		if(criteres.budget_max != null && criteres.budget_max != "") {
			if(parseFloat(listeBiens[y].prix) <= parseFloat(criteres.budget_max)) {
				flag.budget_max = true;

			}else {
				flag.budget_max = false;
			}
		}else {
			flag.budget_max = true;
		}

    /**
     * On vérifie le nombre de pieces
     * Uniquement si le bien n'est pas un terrain ou un garage
     */
 		if(listeBiens[y].type != 3 || listeBiens[y].type != 4) {
      /**
       * On vérifie le nombre de pieces minimum
       * Si le critère pieces_min est présent et est supérieur ou égal au prix de vente du bien le flag pieces_min passe a true sinon il passe a false
       */
 			if(criteres.pieces_min != null && criteres.pieces_min != "") {
				if(parseInt(listeBiens[y].nbPieces) >= parseInt(criteres.pieces_min)) {
					flag.pieces_min = true;
				}else {
					flag.pieces_min = false;
				}
			}else {
				flag.pieces_min = true;
			}
      /**
       * On vérifie le nombre de pieces maximum
       * Si le critère pieces_max est présent et est supérieur ou égal au prix de vente du bien le flag pieces_max passe a true sinon il passe a false
       */
 			if(criteres.pieces_max != null && criteres.pieces_max != "") {
				if(parseInt(listeBiens[y].nbPieces) <= parseInt(criteres.pieces_max)) {
					flag.pieces_max = true;
				}else {
					flag.pieces_max = false;
				}
			}else {
				flag.pieces_max = true;
			}
		}

   /**
    * On vérifie la présence du bien a l'intérieur du polygone correspondant a la zone étendue des secteurs selectionnés
    * Si le bien est présent dans au moins un des secteurs selectionnés le flag secteur passe a true sinon il passe a false
    */
		var inSecteur = new Array();
		for (k in listExtendedPoly) {
			if(listExtendedPoly[k] != null && typeof listExtendedPoly[k] != "function") {
				var markPos = markersBiens[y].getPosition();
				if(!listExtendedPoly[k].contains(markPos)) {
					inSecteur.push(false);
				}else {
					inSecteur.push(true);
				}
			}
		}

		flag.secteurs = false;
		if(inSecteur.length > 0) {
			for(l; l<inSecteur.length; l++) {
				if(inSecteur[l]) {
					flag.secteurs = true;
				}
			}
		}else {
			flag.secteurs = true;
		}
		l = 0;

  	/************************************************************/
		// On ajoutera ici les vérifications supplementaire en fonction des instructions du cahier des charges concernant le moteur de recherche
		/*************************************************************/

		/**
		 * On vérifie tous les flag définis précédement
		 * Si tous les flag sont a true le flag global du bien passe a true sinon il passe a false
     */
		flagGlobal = true;
		for(j in flag){
			if(!flag[j]){
				flagGlobal = false;
			}
		}

		// En fonction de l'etat actuel du bien est du flag golbal on affiche ou on cache le bien
		if(markersBiens[y].getMap() == null && flagGlobal) {
			markersBiens[y].setMap(map);
		}else if(markersBiens[y].getMap() != null && !flagGlobal) {
			markersBiens[y].setMap(null);
		}

		if(markersBiens[y].getMap() != null) {
      displayedBiens.push(markersBiens[y]);// On stock les marqueurs correspondant aux biens affichés dans un tableau
		}
  }

  /**
   * Gestion des clusters
   */
  markerCluster.clearMarkers();// on vide les clusters
  markerCluster.setStyles(styles.transac);// Définition du style pour les clusters
  markerCluster.addMarkers(displayedBiens);// On envoi aux clusters les marqueurs des biens à afficher sur la carte

  // Gestion des évènement au clic sur les cluster
  google.maps.event.clearListeners(markerCluster,'clusterclick');
  if(typeSearch == "transac"){
    google.maps.event.addDomListener(markerCluster,'clusterclick',function(e){
      infosCluster(e,"tr",lang);
    });
  } else if(typeSearch == "loc") {
    google.maps.event.addDomListener(markerCluster,'clusterclick',function(e){
      infosCluster(e,"lo",lang);
    });
  }

  $("#loading").fadeOut("fast");// Disparition du loader

}

/**
 * Fonction qui va centrer et régler le niveau de zoom de la map afin que tout les biens affiche soient visible
 * Paramètres :
 * typeInfo -> Ce paramètre permet de définir sur quoi le carte sera centrée. Avec la valeur a "ville" la carte se centre sur une ville de la base de donnée,
 * avec la valeur a "secteur" la carte va ce centrer et zoomer ou dézoomer afin que tout les biens affichés soient visiblent sur la map
 * value -> dans le cas d'un centrage sur la ville ce paramètre contien le nom de la ville sur laquelle se centre la map
 */
function positionneMap(typeInfo,value){
  var maxZoom = 12;
  switch(typeInfo){
    // Centrage de la map sur la ville choisie dans le menu déroulant des villes
    case"ville":
      $.ajax({
  		  type: "POST",
  		  async: false,
  		  url: "site/getLatLngVille",
  		  data: "centre=" + value,
  		  success: function(retour){
  		    retour = eval( '(' + retour + ')');
  		    map.panTo(new google.maps.LatLng(retour.LAT,retour.LON));
          map.setZoom(maxZoom);
        }
      });
    break;
    // Centrage de la map pour que tous les biens affichés soient visibles sur la map
    case"secteur":
      if(displayedBiens.length > 0) {
        var latMax,latMin,lngMax,lngMin;
        latMax = latMin = lngMax = lngMin = 0;
        for(var i = 0; i < displayedBiens.length; i++){
          if(latMax < displayedBiens[i].position.lat()){

            latMax = displayedBiens[i].position.lat();
          }
          if(latMin > displayedBiens[i].position.lat() || i == 0){
            latMin = displayedBiens[i].position.lat();
          }
          if(lngMax < displayedBiens[i].position.lng()){
            lngMax = displayedBiens[i].position.lng();
          }
          if(lngMin > displayedBiens[i].position.lng() || i == 0){
            lngMin = displayedBiens[i].position.lng();
          }
        }
        var sw = new google.maps.LatLng(latMin,lngMin);
        var ne = new google.maps.LatLng(latMax,lngMax);
        var bounds = new google.maps.LatLngBounds(sw,ne);
        map.panTo(bounds.getCenter());
        map.fitBounds(bounds);
      }
    break;
  }
}
