/*Inicializacion del objeto que va a manejar todo lo que tenga que ver con los mapas.*/
var oMapa = new GlobalMap();
var addMapFunction;
var cancelMapFunction;
var bounds = new GLatLngBounds(new GLatLng(-56.443063,-77.167969),new GLatLng(5.12596,-25.664062)); 

function GlobalMap(){
	this.map = null;
	this.mapTab = null;
	this.bigMap = null;	
	this.geocoder = new GClientGeocoder();  
	this.mappedGeoInformation = new Object();
	this.mappedGeoInfo = new Object();
	this.userInformation = new Object();
	this.DEFAULT_ZOOM = 16;
	this.NEIGHBORHOOD_ZOOM = 14;
	this.TOWN_ZOOM = 11;
	this.STATE_ZOOM = 9;
	this.COUNTRY_ZOOM = 6;
	this.geoCodeMapFormatterUrl= "";
	this.false_X = 0; //0.0006;
	this.false_Y = 0; //-0.0004;
	this.search = new Object();
	this.search.lastUrl = "";
	this.search.searchBounds = null;
	this.search.resultItems = [];
	this.onLoadAware = false;

	this.zoomLevel = new Array (this.DEFAULT_ZOOM, this.COUNTRY_ZOOM, this.STATE_ZOOM, this.STATE_ZOOM, this.NEIGHBORHOOD_ZOOM, this.STATE_ZOOM,  this.TOWN_ZOOM, this.NEIGHBORHOOD_ZOOM, this.STATE_ZOOM );
    G_SATELLITE_MAP.getName = function() {return "Satélite";};
    G_SATELLITE_MAP.getAlt = function() {return "Mostrar imágenes por satélite";};
    G_HYBRID_MAP.getName = function() {return "Híbrido";};
    G_HYBRID_MAP.getAlt = function() {return "Mostrar imágenes por satélite y calles";};
    G_SATELLITE_3D_MAP.getName = function() {return "Mapa 3D";};
    G_SATELLITE_3D_MAP.getAlt = function() {return "Mostrar imágenes por satélite en 3D (Requiere plug-in)";};    
};

function config(obj) { 
	return obj == null || obj.value == true || obj.value == 'true';
}

GlobalMap.prototype.setUserInformation = function() {
	this.userInformation.locationChannelId = $('location.locationChannelId').value;
	if ( config($('config.street')) ) {
		this.userInformation.street = $('location.street').value;	
	}else {
		this.userInformation.street = null;
	}
	if ( config($('config.number')) ) {
		this.userInformation.streetNumber = $('location.number').value;
	} else{ 
		this.userInformation.streetNumber = null;
	}
}

GlobalMap.prototype.validateField = function(field, text){
	if(field=='' || field=='0'){showNormalizeError(text);centerDiv($('normalizeError')); return false;}
	return true;
};

GlobalMap.prototype.validateLocationChannel = function(){
	i = 0;
	lastIndex = 0;
	var optionsLoc = null;
	while (document.getElementById("posting_sel_" + i) != null &&
		   document.getElementById("posting_filaA_" + i).style.display != null &&
		   document.getElementById("posting_filaA_" + i).style.display != "none")
	{
		lastIndex = i;
		i++;
	}
	
	var mandatory = document.getElementById("posting_sel_" + lastIndex).getAttribute("mandatory");
	var selectedLoc = document.getElementById("posting_sel_" + lastIndex).options[document.getElementById("posting_sel_" + lastIndex).selectedIndex].value;
		
	var isMandatory = (mandatory==='true')|| (mandatory == true);
	
	if ((selectedLoc == null || selectedLoc == "") && (isMandatory))
	{
		showNormalizeError(document.getElementById("posting_sel_" + lastIndex).getAttribute('label'));centerDiv($('normalizeError'));
		return false;
	}
	
	return true;
};

GlobalMap.prototype.checkDataInput = function(){
	return (this.validateLocationChannel() &&
			this.validateField(this.userInformation.street,'calle') &&
			this.validateField(this.userInformation.streetNumber,'altura'));	
}

GlobalMap.prototype.postingGeocodeAndMap= function(geoCodeURL){
	this.setUserInformation();
	if(!oMapa.checkDataInput()) return false;
	
	this.geoCodeMapFormatterUrl = geoCodeURL;
	this.displayPostingMap()
	return true;
};

GlobalMap.prototype.loadMappedData = function(oXml, oParam){
	  var oNodos = oXml.getElementsByTagName("Item");
	  var x=0;
	  var omap = oParam.mapa;
	  
	  var addr = new Object();
	  for(x = 0; x<oNodos.length; x++ )
	  {
	    var oNodo = oNodos[x];
	    switch(oNodo.getAttribute("type"))
	    {
	      case "providerMapping":		   		
			   	addr.providerName = oNodo.getAttribute("value");
	    	    break;
	      case "proximityCoordinate":
			   	addr.approxLat = parseFloat(oNodo.getAttribute("lat").replace(',','.')); 
			   	addr.approxLon = parseFloat(oNodo.getAttribute("lon").replace(',','.'));
			   	addr.approxAccuracy = parseInt(oNodo.getAttribute("accuracy"));    	  
	    	  break;
	      case "customBound":
			   	var boundSWlat = parseFloat(oNodo.getAttribute("swLat").replace(',','.'));
			   	var boundSWlon = parseFloat(oNodo.getAttribute("swLon").replace(',','.'));
			   	var boundNElat= parseFloat(oNodo.getAttribute("neLat").replace(',','.'));
			   	var boundNElon= parseFloat(oNodo.getAttribute("neLon").replace(',','.'));
			   	bounds = new GLatLngBounds(new GLatLng(boundSWlat,boundSWlon),new GLatLng(boundNElat,boundNElon));
	    	  break;
	    }	    
	  }      
	  	  
	  omap.mappedGeoInformation.providerData = addr;
	  /*geocoding*/
	  /*Armo la direccion*/
	  var address = oParam.mapa.formatAddress();
	  oParam.mapa.geocoder.setBaseCountryCode("ar");	  
	  oParam.mapa.geocoder.setViewport(bounds)
	  oParam.mapa.geocoder.getLocations(address, oParam.mapa.addAddressToMap);
}

GlobalMap.prototype.displayPostingMap = function(){
	  /*Compatibility check.*/
	  if (GBrowserIsCompatible()) {  
		this.initializePostingMap();
	    //Geocoding (primero mapeo el canal propio al del map provider)
	    //tengo que pasar this por parametro.. el this adentro de esa funcion es un HTMLHttpRequest.
		
		//solo regenero coordenadas si es necesario
		if ($('location.coordinatesLatitude').value==''){
			var oXml = new HTMLHttpRequest(this.loadMappedData,{mapa : this});
			var sParam = 'locationChannelId=' + this.userInformation.locationChannelId;
			
			var sURL = this.geoCodeMapFormatterUrl + '?' + sParam;
			oXml.loadXML(sURL);
		}
		else
		{
			//pongo el punto que tenia antes
			var point = new GLatLng($('location.coordinatesLatitude').value, $('location.coordinatesLongitude').value);
			this.showPoint(point,this.DEFAULT_ZOOM,true);
			
		}
	  }
	  else{
		alert('El navegador que está utilizando no es compatible con el servicio de mapas.');
	  }
	}


function fixCopyright(mapa){
	//Hack porque la é viene rota...
	for(var i=0;i < mapa.childNodes.length; i++)		
	{
		if (mapa.childNodes[i].innerHTML.search(/T..?rminos de uso/) >=0){
			mapa.childNodes[i].innerHTML = mapa.childNodes[i].innerHTML.replace(/T..?rminos de uso/, 'Términos de uso');
			return;
		}
	}	
}
GlobalMap.prototype.loadCustomLayers = function(mapa){
	
	var copyright = new GCopyright(100, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0,"Cartograf&iacute;a provista por dmapas");
	var copyrightCollection= new GCopyrightCollection("zonaprop.com");
 	copyrightCollection.addCopyright(copyright);
    //Mapa hibrido - override al getTileUrl
    var tile1= G_HYBRID_MAP.getTileLayers()[1];          
    tile1.getTileUrl=function(a,b,c) { return customUrl('gtt',a,b);}; 
    //Mapa de calles
    var tile2= new GTileLayer(copyrightCollection,1,18);
    tile2.getTileUrl=function(a,b,c) { return customUrl('gt',a,b);};
    
    
    var layer1=[G_SATELLITE_MAP.getTileLayers()[0],tile1];
    var custommap1 = new GMapType(layer1, G_SATELLITE_MAP.getProjection(),  "Hibrido", G_SATELLITE_MAP);
    custommap1.getMaximumResolution = function(){return 18};
    
    var layer2=[tile2]; 
    var custommap2 = new GMapType(layer2, G_SATELLITE_MAP.getProjection(), "Mapa");

    mapa.getMapTypes().length = 0;

    mapa.addMapType(custommap1); // hibrido
    mapa.addMapType(custommap2); //mapa
    mapa.addMapType(G_SATELLITE_MAP);  //satelital
    mapa.setMapType(custommap1);  /* por default: Mapa */
   
}

GlobalMap.prototype.onPreLoadPostingMap = function() {
	  this.onLoadAware = true;
	  //document.getElementById('loading').style.display = 'block';
	  var oMapCanvas = document.getElementById('map_canvas');
	  if ( oMapCanvas != null ) { 
		  oMapCanvas.style.visibility = 'hidden';
	  }
}

GlobalMap.prototype.onLoadPostingMap = function() { 
	if ( this.onLoadAware ) {
		this.onLoadAware = false;
		//document.getElementById('loading').style.display = 'none';
		var oMapCanvas = document.getElementById('map_canvas');
		if ( oMapCanvas != null ) { 
		  oMapCanvas.style.visibility = 'visible';
		}
	}
}

GlobalMap.prototype.initializePostingMap = function(){	  
//	  var oCont = $('normalize');
//	  oCont.style.width ='600px';
//	  
//	  displayModalPopup('normalize','transparent','transparentiFrame');
//	  $('normalize').style.position ='absolute';
//	  centerDiv($('normalize'));		

	  if(this.map ==null){
		this.map = new GMap2(document.getElementById('map_canvas'))

		this.map.addMapType(G_NORMAL_MAP);  
		this.map.addMapType(G_SATELLITE_MAP);
		this.map.addMapType(G_HYBRID_MAP);

		this.map.setMapType(G_NORMAL_MAP);  /* por default: hibrido */
		
		this.map.addControl(new GSmallMapControl());	 /*Control de navegacion + zoom */
		this.map.addControl(new GMapTypeControl());   /*control de tipo de mapa*/
		this.map.getContainer().style.overflow="hidden"; /*Para que no rompa el copyright si el mapa es chico*/    
	    
	    if (window.addEventListener){
	    	window.addEventListener("unload", GUnload, false);
	    }
	    else{
	    	if (window.attachEvent){
	    		window.attachEvent("onunload", GUnload);
	    	}
	    }
	    
	    GEvent.addListener(this.map, 'moveend', function () { oMapa.onLoadPostingMap(); });
	  }	

	  this.onPreLoadPostingMap();
	  this.map.clearOverlays();
	  // Corrección para IE6 cuando se cambia por otra nueva dirección
	  this.map.checkResize();
}

function customUrl(maptype,tile,zoom){
  var x,y;
  x= tile.x;
  y =tile.y;
  return "http://mapa.zonaprop.com.ar/cgi-bin/tilecache.cgi/1.0.0/"+ maptype+ "/" + zoom + "/" + x +"/"+y+".png?type=google";	    
}

GlobalMap.prototype.showPoint = function(point,zoom,draggable){
		this.map.checkResize();
	    this.map.setCenter(point,zoom);
	    fixCopyright(this.map.getContainer());
	    if ( this.overviewMapControl == null) {
	    	this.overviewMapControl =  new GOverviewMapControl();
	    	this.map.addControl(this.overviewMapControl);   /*mapa mas chico en la esquina*/
	    }
	    marker = new GMarker(point,{draggable: draggable});
	    this.map.addOverlay(marker);
	    updateMarker(marker);
	    if(draggable){
	    	GEvent.addListener(marker, "dragend", function() {
	    		updateMarker(marker); 
	    	});
	    }
	}


function findClosestPoint(points, reference){
	var closest = null;
	var minDistance= null;
	var distance = null;
        for(i=0;i<points.length;i++){
        	var point = new GLatLng(points[i].Point.coordinates[0],points[i].Point.coordinates[1]);
        	if(minDistance==null){
        		minDistance = reference.distanceFrom(point);
        		closest = points[i];
		}
        	else{
			distance= reference.distanceFrom(point);
			if(distance<minDistance){
				closest = points[i];
				minDistance =distance;
			}
		}        
	}
	
	return closest==null?points[0]:closest;
	 
}

GlobalMap.prototype.addAddressToMap= function(response){

	    var point=null;
	    var accuracy=-1;
	    var zoomLevel = oMapa.DEFAULT_ZOOM;
	    var mapGeo = oMapa.mappedGeoInformation;
	    var mapNeo = oMapa.mappedGeoInfo;
		oMapa.map.clearOverlays();
		
		if( response && response.Status.code==200){
			//place = response.Placemark[0];  //toma el primero.
			place = findClosestPoint(response.Placemark, new GLatLng(mapGeo.providerData.approxLat, mapGeo.providerData.approxLon))
			if(place){
				point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
				accuracy= place.AddressDetails.Accuracy;
			}
		}

		//Decido cual usar.Por default, provider interno.
		var bUseProvider=false;
		if(accuracy==-1){  //proveedor no tiene nada
			var iAc = mapGeo.providerData.approxAccuracy
			switch(iAc){
			case 1:
				zoomLevel = oMapa.NEIGHBORHOOD_ZOOM;break;				
			case 2:
				zoomLevel = oMapa.TOWN_ZOOM; break;
			default:
				zoomLevel = oMapa.STATE_ZOOM;break;
			}
			
		}
		else{ //proveedor tiene algo
			if(accuracy >= 6){ //nivel street o mayor			
				//externo
				bUseProvider=true;
				zoomLevel = oMapa.DEFAULT_ZOOM;
			} 
			else
			{
				var iAc = mapGeo.providerData.approxAccuracy
				//comparo los accuracy a ver cual es mas preciso
				if(iAc == 1) //Buena precision interna
				{  						
					zoomLevel = oMapa.NEIGHBORHOOD_ZOOM; 
				}
				else{ //Mediana/mala precision interna
					  zoomLevel = oMapa.STATE_ZOOM;				
					  if(accuracy >=3){
					    //externa
						 bUseProvider=true;
						 zoomLevel = oMapa.NEIGHBORHOOD_ZOOM;
				  	  }
				}			    
			}
		}
		
		if(!bUseProvider || !bounds.contains(point)){
			//interno
			point = new GLatLng(mapGeo.providerData.approxLat, mapGeo.providerData.approxLon);
		}
		
	    /*Muestro el punto con la precision que entrego el geocoding.*/
		//Listo. Muestro el punto con el zoom
	    oMapa.showPoint(point,zoomLevel,true);
	}

GlobalMap.prototype.initializeVISmallMap = function(){	  
		this.map = new GMap2(document.getElementById('contentMapa'))
		/*satelite / mapa / hibrido */  
		this.map.addMapType(G_NORMAL_MAP); 
		this.map.addMapType(G_SATELLITE_MAP);
		this.map.addMapType(G_HYBRID_MAP);
		
		this.map.disableDoubleClickZoom();

		this.map.setMapType(G_NORMAL_MAP);  /* por default: hibrido */ /*25/01/2010 aobara: se cambia para Paises el default a normal*/
		this.map.addControl(new GMapTypeControl())
		this.map.getContainer().style.overflow="hidden"; /*Para que no rompa el copyright si el mapa es chico*/    
		    
		if (window.addEventListener){
		   	window.addEventListener("unload", GUnload, false);
		}
		else{
		   	if (window.attachEvent){
		   		window.attachEvent("onunload", GUnload);
		   	}
		}
	    this.map.clearOverlays();
	    this.map.checkResize();
	}

GlobalMap.prototype.showSmallMapVI= function(lat,lon){
		//Mostrar/ocultar divs correspondientes.

//		$('anchormap').className='mapa on';
//	    displayBlock('mapsvi');
//	    remove('photosvi');
//	    remove('videovi');
//
//	    if ( document.getElementById('anchorphoto') != null ) { 
//	    	document.getElementById('anchorphoto').className = 'fotos';
//	    }
//	    
//	    if ( document.getElementById('anchorvideo') != null ) { 
//	    	document.getElementById('anchorvideo').className = 'video';
//	    }
	    
	    if (GBrowserIsCompatible()) {
    	  var point = new GLatLng(parseFloat(lat) + this.false_X, parseFloat(lon) + this.false_Y);
	      if(this.map ==null){
	    	  this.initializeVISmallMap();
	    	  this.map.setCenter(point,this.DEFAULT_ZOOM);
	    	  marker = new GMarker(point);
	    	  this.map.addOverlay(marker);
	    	  fixCopyright(this.map.getContainer());
	      } else { //re-center
	    	  this.map.checkResize();
	    	  this.map.setCenter(point,this.DEFAULT_ZOOM);
	      }
	    }   
	}    

GlobalMap.prototype.initializeVISmallMapPrint = function(){	  
	this.map = new GMap2(document.getElementById('contentMapaPrint'))
	
	this.map.disableDoubleClickZoom();

	this.map.setMapType(G_NORMAL_MAP);  /* por default: hibrido */ /*25/01/2010 aobara: se cambia para Paises el default a normal*/
	this.map.getContainer().style.overflow="hidden"; /*Para que no rompa el copyright si el mapa es chico*/    
	    
	if (window.addEventListener){
	   	window.addEventListener("unload", GUnload, false);
	}
	else{
	   	if (window.attachEvent){
	   		window.attachEvent("onunload", GUnload);
	   	}
	}
    this.map.clearOverlays();
    this.map.checkResize();
}

GlobalMap.prototype.showSmallMapVIPrint= function(lat,lon){
	//Mostrar/ocultar divs correspondientes.
    
    if (GBrowserIsCompatible()) {
	  var point = new GLatLng(parseFloat(lat) + this.false_X, parseFloat(lon) + this.false_Y);
      if(this.map ==null){
    	  this.initializeVISmallMapPrint();
    	  this.map.setCenter(point,this.DEFAULT_ZOOM);
    	  marker = new GMarker(point);
    	  this.map.addOverlay(marker);
    	  fixCopyright(this.map.getContainer());
      } else { //re-center
    	  this.map.checkResize();
    	  this.map.setCenter(point,this.DEFAULT_ZOOM);
      }
    }   
}

GlobalMap.prototype.initializeVIBGigMap = function(lat,lon){
	
	

    	var oDiv = document.getElementById('frameBig');
		if (oDiv){
			oDiv.style.fontSize= '12px';
		}
		this.bigMap = new GMap2(document.getElementById('frameBig'))
		
		/*satelite / mapa / hibrido */  
		this.bigMap.addMapType(G_NORMAL_MAP); 
		this.bigMap.addMapType(G_SATELLITE_MAP);
		this.bigMap.addMapType(G_HYBRID_MAP);

		//Only for IE. FF is still buggy
		var isExplorer = (navigator.userAgent.indexOf('MSIE')>=0)?true:false;
		//if (isExplorer){
		  this.bigMap.addMapType(G_SATELLITE_3D_MAP);
		//}
		this.bigMap.setMapType(G_NORMAL_MAP); /*25/01/2010 aobara: se cambia para Paises el default a normal*/

		this.bigMap.addControl(new GLargeMapControl());	 /*Control de navegacion + zoom */
		this.bigMap.addControl(new GMapTypeControl());   /*control de tipo de mapa*/
		this.bigMap.getContainer().style.overflow="hidden"; /*Para que no rompa el copyright si el mapa es chico*/    

		if (window.addEventListener){
		   	window.addEventListener("unload", GUnload, false);
		}
		else{
		   	if (window.attachEvent){
		   		window.attachEvent("onunload", GUnload);
		   	}
		}
	    this.bigMap.clearOverlays();
	    this.bigMap.checkResize();
	}



GlobalMap.prototype.showBigMapVI = function(lat,lon){
	$('mapabig').className = 'popup mapabig';
	$('mapabig').style.display = 'block';
	transparentDivMap();
	centerDiv($('mapabig'));

	if (GBrowserIsCompatible()) {
		var point = new GLatLng(parseFloat(lat) + this.false_X,parseFloat(lon) + this.false_Y);
		if(this.bigMap ==null){
	    	  this.initializeVIBGigMap();
	    	  this.bigMap.setCenter(point,this.DEFAULT_ZOOM);
	    	  this.bigMap.addControl(new GOverviewMapControl());
	    	  marker = new GMarker(point);
	    	  this.bigMap.addOverlay(marker);
	    	  fixCopyright(this.bigMap.getContainer());
	    }
	    else{ //re-center
	    	this.bigMap.checkResize();
	    	this.bigMap.setCenter(point,this.DEFAULT_ZOOM);
	    }
	}
}

GlobalMap.prototype.showBigMapVIOverlay = function(lat,lon){
	$('mapabig').style.display = 'inline-block';

	if (GBrowserIsCompatible()) {
		var point = new GLatLng(parseFloat(lat) + this.false_X,parseFloat(lon) + this.false_Y);
		if(this.bigMap ==null){
	    	  this.initializeVIBGigMap();
	    	  this.bigMap.setCenter(point,this.DEFAULT_ZOOM);
	    	  this.bigMap.addControl(new GOverviewMapControl());
	    	  marker = new GMarker(point);
	    	  this.bigMap.addOverlay(marker);
	    	  fixCopyright(this.bigMap.getContainer());
	    }
	    else{ //re-center
	    	this.bigMap.checkResize();
	    	this.bigMap.setCenter(point,this.DEFAULT_ZOOM);
	    }
	}
}

GlobalMap.prototype.showBigMapList = function(lat,lon){
	$('mapabig').className = 'popup mapabig';
	$('mapabig').style.display = 'block';
	transparentDivMap();
	centerDiv($('mapabig'));

	if (GBrowserIsCompatible()) {
		var point = new GLatLng(parseFloat(lat) + this.false_X,parseFloat(lon) + this.false_Y);
    	this.initializeVIBGigMap();
    	this.bigMap.setCenter(point,this.DEFAULT_ZOOM);
    	this.bigMap.addControl(new GOverviewMapControl());
    	marker = new GMarker(point);
    	this.bigMap.addOverlay(marker);
    	fixCopyright(this.bigMap.getContainer());
	}
}

function updateMarker(marker){
	
	var lat = marker.getLatLng().lat();
	if (lat != null && lat != "" && ! isNaN(lat) ) {
		$('tempLat').value = lat;
	}
	var lng = marker.getLatLng().lng()
	if (lng != null && lng != "" && ! isNaN(lng) ) {
		$('tempLon').value = lng;
	}
}

/* Geocoding + show map location*/
function showMap(sURL, addFunction, cancelFunction){
	showMap(sURL, addFunction, cancelFunction, null);
}

/* Geocoding + show map location*/
function showMap(sURL, addFunction, cancelFunction, initializeFunction){
	if ( initializeFunction != null ) {
		initializeFunction();
	}
	var res = oMapa.postingGeocodeAndMap(sURL);
	this.addMapFunction = addFunction;
	this.cancelMapFunction = cancelFunction;
	return res;
}  


GlobalMap.prototype.formatAddress= function(){
	/*La direccion es:*/
	/*Calle + altura + barrio + provincia*/
	var calle = this.userInformation.street;
	var altura = this.userInformation.streetNumber;
	//Estos son valores del provider. por eso no lo puedo sacar del userInformation
	var sDireccion = ''; 
		
	if (calle != null && altura != null) {
		sDireccion = calle + ' ' + altura;
	}
	if(this.mappedGeoInformation.providerData && this.mappedGeoInformation.providerData.providerName){		
		sDireccion+= ',' +  this.mappedGeoInformation.providerData.providerName;
	}
	if (sDireccion=='') {sDireccion='Argentina';}
	
	return sDireccion;
}


/******* SEARCH MAP - TO BE REVISED *********/

GlobalMap.prototype.initializeSearchMap = function(lat,lon){
	this.searchMap = new GMap2(document.getElementById('mapa'))
	/*satelite / mapa / hibrido */  
	this.searchMap.addMapType(G_NORMAL_MAP); 
	this.searchMap.addMapType(G_SATELLITE_MAP);
	this.searchMap.addMapType(G_HYBRID_MAP);
	this.searchMap.setMapType(G_NORMAL_MAP);
	this.searchMap.addControl(new GLargeMapControl());	 /*Control de navegacion + zoom */
	this.searchMap.addControl(new GMapTypeControl());   /*control de tipo de mapa*/
	this.searchMap.getContainer().style.overflow="hidden"; /*Para que no rompa el copyright si el mapa es chico*/    

	if (window.addEventListener){
	   	window.addEventListener("unload", GUnload, false);
	}
	else{
	   	if (window.attachEvent){
	   		window.attachEvent("onunload", GUnload);
	   	}
	}
    this.searchMap.clearOverlays();
    this.searchMap.checkResize();
    
    GEvent.addListener(oMapa.searchMap, "zoomend", function(oldLevel, newLevel) {
    	//zoom
    	 oMapa.refreshMarkerSearch(); 	     	 
    });
    
    GEvent.addListener(oMapa.searchMap, "moveend", function() {
    	//drag end
    	oMapa.refreshMarkerSearch();
    });
    
}

GlobalMap.prototype.showSearchMap = function(lat,lon){
				
	if (GBrowserIsCompatible()) {		
		var point = new GLatLng(parseFloat(lat) + this.false_X,parseFloat(lon) + this.false_Y);
		if(this.searchMap ==null)
		{
			  //no hay mapa aun. inicializo todo.
	    	  this.initializeSearchMap();
	    	  this.searchMap.setCenter(point,this.DEFAULT_ZOOM);
	    	  this.searchMap.addControl(new GOverviewMapControl());
	    	  fixCopyright(this.searchMap.getContainer());
	    }
	    else
	    { //re-center
	    	this.searchMap.checkResize();
	    	this.searchMap.setCenter(point,this.DEFAULT_ZOOM);
	    }
	}
}

GlobalMap.prototype.reFormatURL = function(sURL){

   if (this.search.searchBounds ==null){
    this.search.searchBounds =  new GLatLngBounds(oMapa.searchMap.getBounds().getSouthWest(),oMapa.searchMap.getBounds().getNorthEast());
   }
   this.search.searchBounds.extend(oMapa.searchMap.getBounds().getNorthEast());
   this.search.searchBounds.extend(oMapa.searchMap.getBounds().getSouthWest());

   var minLat = this.search.searchBounds.getNorthEast().lat();
   var maxLat = this.search.searchBounds.getSouthWest().lat();
   var minLon = this.search.searchBounds.getSouthWest().lng();
   var maxLon = this.search.searchBounds.getNorthEast().lng();
       
   return sURL + '&lat=' + minLat + '+' + maxLat + '&lon=' + maxLon + '+' + minLon;
}

GlobalMap.prototype.refreshMarkerSearch = function(sURL){		
	
	var bForceQuery = false;
	if(sURL) {
	   //cambio la busqueda. DEBO ir al servidor
	   this.search.lastUrl = sURL;
	   bForceQuery = true;
	   //this.search.searchBounds  = (vista actual)
	} else {
 	  //misma busqueda. + zoom / drag
	  //this.search.searchBounds  = (ver optimizacion) habria que sacar la funcion de reFormatURL
	  
	  sURL = this.search.lastUrl;
	}
	if(sURL == null || sURL===undefined || sURL == "") return;

    var currentBounds =oMapa.searchMap.getBounds();
    
    //Si ya tengo el resultado (por ej. si hice zoom in o un drag corto)
    if (!bForceQuery && this.search.searchBounds && this.search.searchBounds.containsBounds(currentBounds))
    {
    	//no busco, pero deberia redibujar los puntos
    	refreshMarkers();
    	return;  
    }
    this.search.resultItems = [];
    //Le agrega las coordenadas de la nueva busqueda.
    sURL = this.reFormatURL(sURL);
	//busco de nuevo.
    var oXml = new HTMLHttpRequest(parseSearchXmlResult);
	oXml.loadXML(sURL);
}

function addPostMarker(post){
	  var point = new GLatLng(parseFloat(post.lat) + oMapa.false_X,parseFloat(post.lon) + oMapa.false_Y);      
	  var marker = new GMarker(point);
	  marker.bindInfoWindowHtml('<div id="GmapBalloon">' + post.id + '</div>');
	  oMapa.searchMap.addOverlay(marker);
	  
	
}

function getDirections(idDirectionsDiv, mapa, sFrom, sTo){
	
	directionsPanel = document.getElementById(idDirectionsDiv);
	directions = new GDirections(mapa, directionsPanel);
	directions.load("from: " + sFrom + " to: "  + sTo  );
	
}

function refreshMarkers(){
	//clustering
	var mrks = {};
	var t = [];
	var icons = {};
	for (i=0; i < oMapa.search.resultItems.length; i++) t.push(oMapa.search.resultItems[i]);

	var zoomlevels = { 1: 100000, 2: 75000, 3: 50000, 4: 30000, 5: 20000, 6: 13000, 7: 9000, 8: 6000, 9: 4000, 10: 2500, 11 : 1500, 12 : 1000, 13: 600, 14 : 300, 15 : 200, 16 : 100 , 17 : 50};	
	var actRange = zoomlevels[oMapa.searchMap.getZoom()];	
	var latPerMetre = 0.00899655 / 1000;
	var lngPerMetre = 0.01221188 / 1000;	
	var latSpan = latPerMetre * actRange;
	var lngSpan = lngPerMetre * actRange;
	var defIcon = new GIcon(G_DEFAULT_ICON);
	defIcon.image = "http://case-appartamenti.ebay.it/images_front/ico/gmap_point-b.png";
	defIcon.shadow = "http://case-appartamenti.ebay.it/images_front/ico/gmap_point-sha-b.png";
	defIcon.iconSize = new GSize(48, 48);
	defIcon.shadowSize = new GSize(48, 48);
	defIcon.iconAnchor = new GPoint(16, 44);
	defIcon.infoWindowAnchor = new GPoint(30, 5);
	defIcon.imageMap = [0,0, 25,0, 25,40, 0,40];

	/*test*/
	 var bound = oMapa.searchMap.getBounds();
	 var sw = bound.getSouthWest();
	 var ne = bound.getNorthEast();
	 var lats = sw.lat();
	 var late = ne.lat();
	 var lngs = sw.lng();
	 var lnge = ne.lng();
	 
	 var latSpan = (late - lats) * 0.1;
	 var lngSpan = (lnge - lngs) * 0.1;
	 
	
	for (i=0; i < t.length; i++) {
		if (t[i].id == 0) continue;
		for (j=0; j < t.length; j++) {	
			if (t[j].id == 0) continue;
			if (t[j].lat > t[i].lat - latSpan && t[j].lat < t[i].lat + latSpan && t[j].lon > t[i].lon - lngSpan && t[j].lon < t[i].lon + lngSpan) {
				 if (!mrks[i]) mrks[i] = [];
				 mrks[i].push(t[j].id);
				 t[j].id = 0; // borra
			}			
		}
	}
	//oMapa.searchMap.clearOverlays();	
	for (var d in mrks) {
		var numImmobili = mrks[d].length;
		var hg = (numImmobili == 1) ? 85 : 130;
		var addclass = (numImmobili == 1) ? '' : ' Multi';
		var iconGroup = numImmobili;
		if (iconGroup >= 3000) { iconGroup = 3000; }
		else if (iconGroup >= 2000) { iconGroup = 2000; }
		else if (iconGroup >= 1000) { iconGroup = 1000; }
		if (!icons[iconGroup]) {
			icons[iconGroup] = new GIcon(defIcon);
			icons[iconGroup].image = 'http://case-appartamenti.ebay.it/images_front/ico_gmap/'+iconGroup+'.png';
		}
		
		var mark = new GMarker(new GLatLng(oMapa.search.resultItems[d].lat, oMapa.search.resultItems[d].lon), { icon: icons[iconGroup], title: mrks[d].length+' propiedad' + (mrks[d].length > 1 ? '' :'es')});
		mark.bindInfoWindowHtml('<div id="GmapBalloon">foto + precio + datos<br>' + mrks[d].join(',') + '</div>');
		oMapa.searchMap.addOverlay(mark);
	}
	
}
function parseSearchXmlResult(oResult){
	//POSTS	
	
	var oItems = oResult.getElementsByTagName("item");
	for(x = 0; x<oItems.length; x++ )
	{
	  var oItem = oItems[x];
	  var oPost = new Object();
	  oPost.id = oItem.getAttribute("id");
	  oPost.lat = oItem.getAttribute("lat");
	  oPost.lon = oItem.getAttribute("lon");
	  oMapa.search.resultItems.push(oPost);
	  addPostMarker(oPost);
	}

	refreshMarkers();
	
	//SELECTED
	var oItems = oResult.getElementsByTagName("selectedFacets");
	document.getElementById("selectedFacets").innerHTML = oItems[0].firstChild.nodeValue;
	
	//Facets (facets)
	var oFacet = oResult.getElementsByTagName("facets");
	document.getElementById("facets").innerHTML = oFacet[0].firstChild.nodeValue;
}

GlobalMap.prototype.refreshPostingSmallMap = function(){
	var point = new GLatLng($('tempLat').value, $('tempLon').value);
	this.map.clearOverlays();
	this.map.setCenter(point,this.DEFAULT_ZOOM);
	this.showPoint(point,this.DEFAULT_ZOOM,true);
}

GlobalMap.prototype.displayPostingBigMap = function(){
	if (GBrowserIsCompatible()) {  
		this.initializePostingBigMap();
		var point = new GLatLng($('tempLat').value, $('tempLon').value);
		this.bigMap.setCenter(point,this.DEFAULT_ZOOM);
		this.showBigMapPoint(point,this.DEFAULT_ZOOM,true);
	}
	else{
		alert('El navegador que está utilizando no es compatible con el servicio de mapas.');
	}
}

GlobalMap.prototype.initializePostingBigMap = function(){	  
	$('big_map_canvas').style.display = 'block';  

	this.bigMap = new GMap2(document.getElementById('big_map_canvas'));

	this.bigMap.addMapType(G_NORMAL_MAP);  
	this.bigMap.addMapType(G_SATELLITE_MAP);
	this.bigMap.addMapType(G_HYBRID_MAP);

	this.bigMap.setMapType(G_NORMAL_MAP);  /* por default: hibrido */
	
	this.bigMap.addControl(new GSmallMapControl());	 /*Control de navegacion + zoom */
	this.bigMap.addControl(new GMapTypeControl());   /*control de tipo de mapa*/
	this.bigMap.getContainer().style.overflow="hidden"; /*Para que no rompa el copyright si el mapa es chico*/    
    
    if (window.addEventListener){
    	window.addEventListener("unload", GUnload, false);
    }
    else{
    	if (window.attachEvent){
    		window.attachEvent("onunload", GUnload);
    	}
    }
    
    GEvent.addListener(this.bigMap, 'moveend', function () { oMapa.onLoadPostingBigMap(); });	

    this.onPreLoadPostingBigMap();
    this.bigMap.clearOverlays();
    //Corrección para IE6 cuando se cambia por otra nueva dirección
    //this.bigMap.checkResize();
}

GlobalMap.prototype.onPreLoadPostingBigMap = function() {
	  this.onLoadAware = true;
	  //document.getElementById('loading').style.display = 'block';
	  var oMapCanvas = document.getElementById('big_map_canvas');
	  if ( oMapCanvas != null ) { 
		  oMapCanvas.style.visibility = 'hidden';
	  }
}

GlobalMap.prototype.onLoadPostingBigMap = function() { 
	if ( this.onLoadAware ) {
		this.onLoadAware = false;
		//document.getElementById('loading').style.display = 'none';
		var oMapCanvas = document.getElementById('big_map_canvas');
		if ( oMapCanvas != null ) { 
		  oMapCanvas.style.visibility = 'visible';
		}
	}
}

GlobalMap.prototype.showBigMapPoint = function(point,zoom,draggable){
	//this.bigMap.checkResize();
    this.bigMap.setCenter(point,zoom);
    fixCopyright(this.bigMap.getContainer());
    if ( this.overviewMapControl == null) {
    	this.overviewMapControl =  new GOverviewMapControl();
    	this.bigMap.addControl(this.overviewMapControl);   /*mapa mas chico en la esquina*/
    }
    marker = new GMarker(point,{draggable: draggable});
    this.bigMap.addOverlay(marker);
    updateMarker(marker);
    if(draggable){
    	GEvent.addListener(marker, "dragend", function() {
    		updateMarker(marker); 
    	});
    }
}

GlobalMap.prototype.initializeMapTabVI = function(container, point){	  
	this.mapTab = new GMap2(document.getElementById(container),{ size:new GSize(450,380)})
	this.mapTab.setCenter(point,this.DEFAULT_ZOOM);
	/*satelite / mapa / hibrido */  
	this.mapTab.addMapType(G_NORMAL_MAP); 
	this.mapTab.addMapType(G_SATELLITE_MAP);
	this.mapTab.addMapType(G_HYBRID_MAP);
	
	this.mapTab.disableDoubleClickZoom();

	this.mapTab.setMapType(G_NORMAL_MAP);  /* por default: hibrido */ /*25/01/2010 aobara: se cambia para Paises el default a normal*/
	this.mapTab.addControl(new GMapTypeControl());
	this.mapTab.addControl(new GLargeMapControl());
	this.mapTab.getContainer().style.overflow="hidden"; /*Para que no rompa el copyright si el mapa es chico*/
	    
	if (window.addEventListener){
	   	window.addEventListener("unload", GUnload, false);
	}
	else{
	   	if (window.attachEvent){
	   		window.attachEvent("onunload", GUnload);
	   	}
	}
    this.mapTab.clearOverlays();
    this.mapTab.checkResize();
}

GlobalMap.prototype.showMapTabVI= function(lat,lon, container){   
    if (GBrowserIsCompatible()) {
	  var point = new GLatLng(parseFloat(lat) + this.false_X, parseFloat(lon) + this.false_Y);

   	  this.initializeMapTabVI(container, point);    	  

   	  marker = new GMarker(point);
   	  this.mapTab.addOverlay(marker);
   	  this.mapTab.checkResize();
    }   
}

GlobalMap.prototype.clearMap=function(){
	if(this.map!=null){
		this.map = null;
	}
}

