/*
 * Este archivo contiene las funciones necesarias para toda la funcionalidad del mapa en la pagina de resultados.
 * @author diego.clerici
 */
 	
var ID_FORM_MAP = "#mailFormMap";

var emailFormMapCallback = function(o){
	var response = eval("("+o+")");
	//refresco el captcha
	var captchaHidden = $(ID_FORM_MAP).find("input.captchaHidden");
	var captchaImage = $(ID_FORM_MAP).find("img.herramientasSecImage");
	refreshCaptchaImage(captchaHidden,captchaImage);
	displayEmailResponseMsg(response.responseStatus, response.id);
}
function validateEmailFormMapAndSubmit(form, emailFormMapCallback) {
	var advId = $("#mailFormMapAdvertiseId").val();
	var name_adv_element = $(".advertiseBlock").find('#advertiseBlock-map-' + advId + ' h2.advertise-name')
    	var name_adv = '';
    	if(name_adv_element.length > 0){
    	    name_adv = name_adv_element.text();
    	}
	return validateEmailFormAndSubmit(form,emailFormMapCallback,advId, name_adv);
}

/*
 * Muestra el formulario en el tooltip del mapa
 * @param index: indice del aviso en cuestion.
 * @return
 */
function displayEmailFormInMap(index){
	if (index){
		markers[index].openInfoWindowHtml($("#mail-form").html());
	}
	else{
		// este caso se ejecuta cuando se llama sin parámetros. 
		// se obtiene el id del aviso del formulario
		var idAdv = $("#mailFormMapAdvertiseId").val();
		var markerExists = null != advertisesById[idAdv];
		if (markerExists){
			 markers[advertisesById[idAdv]].openInfoWindowHtml($("#mail-form").html());
		}else{
			 map.openInfoWindowHtml(map.getCenter(), $('#mail-form').html());
		}
	}
}

//Para avisos sin marker en el mapa (no tienen puntos geograficos)
function displayEmailFormInWithoutMap(id){
	map.openInfoWindowHtml(map.getCenter(), $("#mail-form").html());
}

/*
 * Agrega los mails al select del mail-form
 * @param emails
 * @return
 */
function appendEmails(emails){
	$("#mailTomap").html("");
	$("#mailTomap").append("<option value=\"\"></option>");
	for(i=0; i < emails.length; i++)
	{		
		$("#mailTomap").append("<option value=\""+emails[i].address+"\">"+emails[i].label+"</option>");
	}
	
}

/*
 * Hace un request Ajax para obtener los mails del anunciante
 * @param id
 * @return
 */
 function setEmailsInFormMap(id){
		//Oculto el mensaje de error del captcha
		$(ID_FORM_MAP).find(".captcha-message-error.captcha-message-error-show").removeClass("captcha-message-error-show").addClass("captcha-message-error-hide");
		//Refresco el captcha
		var captchaHidden = $(ID_FORM_MAP).find("input.captchaHidden");
		var captchaImage = $(ID_FORM_MAP).find("img.herramientasSecImage");
		refreshCaptchaImage(captchaHidden,captchaImage);
		
		var index = advertisesById[id]; 
		displayLoadingSymbol(id);
		jQuery.get(GLOBAL_BASE_PATH + 'mail.do' + "?id="+id+"&ignoreAction=true");
		$.get(GLOBAL_BASE_PATH+'json.getEmails.action?idAdvertisement='+id,
				function(o){
					var response = eval("("+o+")");
					appendEmails(response.emails);
					// se guarda el id del aviso en el formulario
					$("#mailFormMapAdvertiseId").val(id);
					displayLoadingSymbol(id);
					if (index == null){
						displayEmailFormInWithoutMap(id);
					}else {
						displayEmailFormInMap(index);
					}
				}
		);
	}

/* pinta de azul el ícono del índice */
function turnBlue(index){
 	//El viejo del mapa vuelve a azul
 	if (index != null && markers[index] != null){
 		markers[index].setImage(url+"/"+advertises[index].icon_id+'_azules.png');
 	}
 	// el del listado se torna azul
 	if ($(".icon-red")){
 		$(".icon-red").attr("class","icon-blue");
 	}
}

function toggleIcon(index){
 	turnBlue(prev_index); // se cambian a azul los íconos seleccionados previamente
 	toggleListIcon(index);//Se cambia el icono en la lista
 	toggleMapIcon(markers[index], index); //Se cambia el ícono en mapa
}

/*
 * Cambia el icono del aviso en la lista.
 * @param i: indice del aviso en la lista
 * @return
 */
function toggleListIcon(i){
	$("#icon-"+advertises[i].id).attr("class","icon-red");
}

/*
 * Cambia de icono en el mapa.
 * @param marker: del aviso seleccionado
 * @param i indice del aviso seleccionado
 * @return
 */
function toggleMapIcon(marker,i){
	//El nuevo cambia a rojo
	marker.setImage(url+"/"+advertises[i].icon_id+'_rojos.png');
}
/*
 * Setea el centro y zoom del mapa, de acuerdo a los markers mostrados
 * @return
 */
function setCenterAndZoom(){
	var latlngbounds = new GLatLngBounds();
	
	if (centerLocationNear != null){
		latlngbounds.extend(centerLocationNear);
	}
	
	for (i=0; i < markers.length; i++ )
	{	
	    latlngbounds.extend(markers[i].getLatLng());
	}
	  var clat = (latlngbounds.getNorthEast().lat() + latlngbounds.getSouthWest().lat()) /2;
	  var clng = (latlngbounds.getNorthEast().lng() + latlngbounds.getSouthWest().lng()) /2;
	  map.setCenter(new GLatLng(clat,clng),map.getBoundsZoomLevel(latlngbounds)-1);
}

//variable para registrar cuales ids ya fueron pedidos 
var loadedStreetAndPhones = [];

/*
 * Obtiene la dirección y el teléfono para el tooltip del aviso
 * en la vista de mapa
 */
function loadStreetAndPhone(advId){
	YSTATS.push(ST_ACCION_CAJON,ST_LINK_CAJON_DIRECCION_TELEFONO,SEARCH_FOR_YSTATS,advId);
 	// chequear si no está cargado	
 	if (!loadedStreetAndPhones[advId]){
 		// registrar que se carga
 		loadedStreetAndPhones[advId] = true;
 		$.ajax({
 			url: GLOBAL_BASE_PATH+'json.advStreet.action?idAdvertisement='+advId, 
 			success: function(data){
 				var response = eval("("+data+")");
 				var street = response.street;
 				var phone = response.phone;
 				$(".loadStreet-"+advId).html(street);
 				$(".loadPhone-"+advId).html(phone);
 			},
 			error: function(){
 				loadedStreetAndPhones[advId] = false;
 			},
 			async: false
 		});
 	}
// 	$('#advertiseBlock-map-'+advertises[index].id)
}

function showGMapsDecoration(){
	$("img[src$='iws3.png']").css("display", "block");
	$("img[src$='iw3.png']:eq(2)").css("display","block");
}

var firstCallWithoutMap=true;
function hideGMapsDecoration(){
	// Corrección para el delay que tiene GMaps al traer las imágenes
	if (firstCallWithoutMap){
		firstCallWithoutMap = false;
		window.setTimeout(function() {
			hideGMapsDecoration();
        }, 500);
	}
	$("img[src$='iws3.png']").css("display", "none");
	$("img[src$='iw3.png']:eq(2)").css("display","none");
}

/*
 * Crea el tooltip para un aviso particular en el mapa
 * @param marker: el marker que se hizo clic
 * @param index: Indice del aviso que se selecciona
 */
function loadAdvertise(marker,index){
		$("#message").hide(); //Se esconde el tooltip
		toggleIcon(index); //Se cambia el icono
		loadStreetAndPhone(advertises[index].id); //Se carga la calle y el teléfono antes de mostrar el tooltip
		$("#message").html($('#advertiseBlock-map-'+advertises[index].id).html()); //Se cambia la info del tooltip

		var opts = {
			onOpenFn: showGMapsDecoration
		}
		showGMapsDecoration();
		marker.openInfoWindowHtml($("#message").html(), opts); //Se vuelve a abrir el tooltip con la nueva info
		map.setCenter(marker.getLatLng(),15);//Se ubica la vista del mapa sobre el aviso seleccionado
		//Se actualiza el ultimo indice seleccionado
		prev_index=index;
		addIframeConversionTrakingMapGlobo();
}

function loadAdvertiseWithoutMap(idAdv){
 	$("#message").hide(); //Se esconde el tooltip
 	turnBlue(prev_index); // Se pintan de azul los íconos previamente seleccionados 
 	loadStreetAndPhone(idAdv); //Se carga la calle y el teléfono antes de mostrar el tooltip
 	$("#message").html($('#advertiseBlock-map-'+idAdv).html()); //Se cambia la info del tooltip
 	var opts = {
 		onOpenFn: hideGMapsDecoration,
 		pixelOffset: new GSize(0, -50)
 	}
 	
 	map.openInfoWindowHtml(map.getCenter(), $("#message").html(), opts); //Se vuelve a abrir el tooltip con la nueva info
 	//Se actualiza el ultimo indice seleccionado
	prev_index=null;
}

/*
 * Oculta la lista de avisos a la izquierda del mapa
 */
 function hideList(){
 		//Oculta el bloque general
 		$("#advertise-list-map-block").toggle("slow");
 		//Oculta muestra el boton
 		$(".button-toggler-opener").toggle("slow");
 		$(".button-toggler-closer").toggle("slow");
 		//Oculta el bloque con scroll
 		$("#advertise-list-map-toggled-block").toggle();
 		if($("#advertise-list-map-toggled-block").css('display') == "none"){
 			$("#map").addClass("mapExpanded");
 		}else{
 			$("#map").removeClass("mapExpanded");
 		}
 }
 
 /*
  * Muestra el ultimo aviso seleccionado
  * @return
  */ 
 function displayLastAdvertise(){
	 var id = $("#mailFormMapAdvertiseId").val();
	 var index = advertisesById[id];
	 if (index){
		 loadAdvertise(markers[index],index);
	 }else{
		 loadAdvertiseWithoutMap(id);
	 }
 }
 
 /*
  * Muestra un mensaje de acuerdo a lo que devuelve el servicio de mail 
  * @param status
  * @return
  */
 function displayEmailResponseMsg(status, idAdv){
	 $("#message").hide(); //Se esconde el tooltip
	 var markerExists = null != advertisesById[idAdv];
	 if (status == 1){
		 if (markerExists){
			 markers[advertisesById[idAdv]].openInfoWindowHtml($('#messageEmailOk').html()); //Se vuelve a abrir el tooltip con la nueva info
			 addIframeConversionTraking();
		 }else{
			 map.openInfoWindowHtml(map.getCenter(), $('#messageEmailOk').html()); //Se vuelve a abrir el tooltip con la nueva info
		 }
	 }
	 else if (status == 2){
		 var id_form = ID_FORM_MAP;
		 $(id_form).find(".captcha-message-error").removeClass("captcha-message-error-hide").addClass("captcha-message-error-show");
		 $(id_form).show();
	 }
	 else{
		 if (markerExists){
			 markers[advertisesById[idAdv]].openInfoWindowHtml($('#messageEmailError').html()); //Se vuelve a abrir el tooltip con la nueva info
		 }else{
			 map.openInfoWindowHtml(map.getCenter(), $('#messageEmailError').html()); //Se vuelve a abrir el tooltip con la nueva info
		 }
	 }
		 
 } 
  
function drawMap(){
	
	//Si existe el div contenedor del mapa
	var div_map=document.getElementById("map");

	if (div_map)
	{ 
			// map es una variable global
			if (map == null) map = new GMap2(div_map);

			// si hay búsqueda por cercanía entonces asignar el centro al mapa
			if (RESULT.isBusquedaPorCercania) {
				centerLocationNear = new GLatLng(RESULT.cercania.center.lat, RESULT.cercania.center.lng);
				var marker = new GMarker(centerLocationNear);
				map.addOverlay(marker);
				marker.setImage(RESULT.cercania.center.img);
			}
		
			//Si hay avisos con Lat,Long
			if (advertises.length > 0)
		    {				
		    	//Para cada aviso, se crea un marker en el mapa
		    	for (i=0; i < advertises.length;i++){
		    		var point = new GLatLng(advertises[i].lat,advertises[i].lng);
		    		var marker = new GMarker(point);
		    		map.addOverlay(marker);
		    		markers[i]=marker;
		    	}
		    	//Se setea el centro y zoom en el mapa
		    	setCenterAndZoom();
		    	//Para cada marker
		    	$(markers).each(function(i,marker){
		    	//Seteando icono en el mapa
				marker.setImage(url+"/"+advertises[i].icon_id+'_azules.png');
				//Al item en la lista se le engancha el mismo evento que al GMap
				//Para que tenga el mismo comportamiento
				$("#item-"+advertises[i].id)
					.click(function(){
							actual_index=i;
							loadAdvertise(marker,i);
						}
					);
				//Se engancha al click del GMap
				GEvent.addListener(marker, "click", function() {
					_gaq.push(['_trackEvent', 'vistaMapa/elementos', 'clicked']);
					actual_index=i;
					loadAdvertise(marker,i);

				});
		  	 });
		  } //Advertises > 0
		  else if (centerLocationNear != null){
			  setCenterAndZoom();
		  }
		  else
		  { 
			  //si no hay avisos con latitud y longitud, se centra en BSAS 
			  var BSAS = new GLatLng(-39.2713,-67.1945);
			  map.setCenter(BSAS, 4);
		  }
		  //Configuracion por defecto
		  map.setUIToDefault();
		  map.disableScrollWheelZoom();

		  // configurar los items sin mapa:
		  $("[id^='item-nomap-']").click(function(){
			  _gaq.push(['_trackEvent', 'vistaMapa/elementos', 'clicked']);
				loadAdvertiseWithoutMap($(this).attr("id").replace("item-nomap-", ""));
		  });
	}/*div map != null*/
}

$(document).ready(function(){
	if (RESULT.isBusquedaPorCercania) {
		drawMap();
	}
});
		
function backgroundOver(ident){
	$('#advertiseBlock-map-'+ident.id+' .item-list-map-info div').css('background-color','#e9d48b');
}
function backgroundOut(ident){
	$('#advertiseBlock-map-'+ident.id+' .item-list-map-info div').css('background-color','');
}

