/*Inicializacion del objeto que va a manejar todo lo que tenga que ver con los mapas.*/

var oMapa = new GlobalMap();
var addMapFunction;
var cancelMapFunction;

function GlobalMap(){
	this.map = 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 = 13;
	this.TOWN_ZOOM = 11;
	this.STATE_ZOOM = 9;
	this.COUNTRY_ZOOM = 6;
	this.geoCodeUrl= "";
	this.false_X = 0.0006;
	this.false_Y = -0.0004;
	this.search = new Object();
	this.search.lastUrl = "";
	this.search.searchBounds = null;
	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";};
};

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;
	
	if ((selectedLoc == null || selectedLoc == "") && (mandatory == "true" || mandatory))
	{
		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;
	
	this.geoCodeUrl = geoCodeURL;
	this.displayPostingMap();
};

GlobalMap.prototype.loadMappedData = function(oXml, oParam){
	  var oNodos = oXml.getElementsByTagName("Item");
	  var x=0;
	  var oNodo;
	  var omap = oParam.mapa;
	  oParam.mapa.mappedGeoInformation = new Object()
	  oParam.mapa.mappedGeoInfo = new Array(); 
	  var exactMatch = false;
	  var i=0;
	  for(x = 0; x<oNodos.length; x++ )
	  {
	    oNodo = oNodos[x];

	    switch(oNodo.getAttribute("type"))
	    {
	     case "address":
		   	var addr = new Object();
		   	addr.name = oNodo.getAttribute("externalName");
		   	addr.lat = parseFloat(oNodo.getAttribute("lat")) + oParam.mapa.false_X ; //viene desfasado
		   	addr.lon = parseFloat(oNodo.getAttribute("lon")) + oParam.mapa.false_Y ;
		   	omap.mappedGeoInformation.addr = addr;
		   	exactMatch = true;
		   	break;	    
	     default: /* temporal hasta que empiese a andar */
	    	var dato = new Object();
	     	dato.name = oNodo.getAttribute("externalName");
	    	dato.lat = parseFloat(oNodo.getAttribute("lat"));
	    	dato.lon = parseFloat(oNodo.getAttribute("lon"));
	    	dato.zoom = parseFloat(oNodo.getAttribute("zoom"));
	    	omap.mappedGeoInfo[i++] = dato;
	    	break;
	    }
	  }

	  if(!exactMatch){
		  //Retry geocoding
		  /*Armo la direccion*/
		  var address = oParam.mapa.formatAddress();

		  /*Invoco al geocoder para generar la direccion.*/
		  /*Solo para colombia*/
		  oParam.mapa.geocoder.setBaseCountryCode("ar");
		  oParam.mapa.geocoder.getLocations(address, oParam.mapa.addAddressToMap);
	  } else {
		  oParam.mapa.addAddressToMap();
	  }
}

GlobalMap.prototype.displayPostingMap = function(){
	  /*Compatibility check.*/
	  if (GBrowserIsCompatible()) {    
		this.initializePostingMap();
		
		
	    
//	    //Si ya tenia datos los muestro.
//	    if($('location.coordinatesLatitude').value!=""){
//	      point = new GLatLng(parseFloat($('location.coordinatesLatitude').value) + this.false_X,parseFloat($('location.coordinatesLongitude').value) + this.false_Y);
//	      this.showPoint(point, this.DEFAULT_ZOOM, true);
//	      return;
//	    }

	    //Geocoding.
	    //tengo que pasar this por parametro.. el this adentro de esa funcion es HTMLHttpRequest.
		var oXml = new HTMLHttpRequest(this.loadMappedData,{mapa : this});
		var sParam = 'locationChannelId=' + this.userInformation.locationChannelId;
		sParam += '&street' + '=' + escape(this.userInformation.street);
		sParam += '&streetNumber' + '=' + escape(this.userInformation.streetNumber);		
		
		var sURL = this.geoCodeUrl + '?' + sParam;
		oXml.loadXML(sURL);
	  }
	  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_HYBRID_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); 
	    	});
	    }
	}


GlobalMap.prototype.addAddressToMap= function(response){

	    var point;
	    var zoomLevel = oMapa.DEFAULT_ZOOM;
	    var mapGeo = oMapa.mappedGeoInformation;
	    var mapNeo = oMapa.mappedGeoInfo;
		oMapa.map.clearOverlays();
	    /*Muestro el punto con la precision que entrego el geocoding.*/
		if(mapGeo && mapGeo.addr && mapGeo.addr.lat && mapGeo.addr.lat !=""){
	    	  point = new GLatLng(mapGeo.addr.lat, mapGeo.addr.lon);
	    	  zoomLevel = oMapa.DEFAULT_ZOOM;
	    }
		else
		{
			if( response && response.Status.code==200){
				place = response.Placemark[0];  //toma el primero.
				point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
			    zoomLevel = oMapa.DEFAULT_ZOOM;
			} else {
				//No hay direccion exacta, va por el barrio
				for (var x = 0 ; x < mapNeo.length ; x ++  )  {
					var mapObject = mapNeo[x]; 
					if (mapObject.lat != null && mapObject.lat != "" ) {
						point = new GLatLng(mapObject.lat, mapObject.lon);
						zoomLevel = oMapa.zoomLevel[mapObject.zoom];
						break;
					}
				}
			}
	    } 	    
		//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_HYBRID_MAP);  /* por default: hibrido */
		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);
		  var point = new GLatLng(parseFloat(lat) , parseFloat(lon) );
	      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.initializeVIBGigMap = function(lat,lon){
		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);
	    
		this.bigMap.setMapType(G_HYBRID_MAP);

		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 mapapop';
	$('mapabig').style.display = 'block';
	transparentDiv();
	
	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);
	    }
	}
}

function updateMarker(marker){
	$('tempLat').value = marker.getLatLng().lat() - oMapa.false_X;
	$('tempLon').value = marker.getLatLng().lng() - oMapa.false_Y;
}

/* Geocoding + show map location*/
function showMap(sURL, addFunction, cancelFunction){
	oMapa.postingGeocodeAndMap(sURL);
	
	this.addMapFunction = addFunction;
	this.cancelMapFunction = cancelFunction;
	if($('showMap')) $('showMap').value = 'false';
}  

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 ) ) {
		calle + ' ' + altura;
	}
	
	for ( var i = 0 ;  i < this.mappedGeoInfo.length; i ++ )  {
		if ( sDireccion.length > 0 ) { 
			sDireccion += ', ';	
		}
		sDireccion += this.mappedGeoInfo[i].name;  
	}  
	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_HYBRID_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)
		{
	    	  this.initializeSearchMap();
	    	  this.searchMap.setCenter(point,this.DEFAULT_ZOOM);
	    	  this.searchMap.addControl(new GOverviewMapControl());
	    	  marker = new GMarker(point);
	    	  this.searchMap.addOverlay(marker);
	    	  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){		
		
	if(sURL) {
	   //nuevos filtros
	   this.search.lastUrl = sURL;
	   
	   //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;

  //ya tengo el resultado.. no lo voy a buscar 
  var currentBounds =oMapa.searchMap.getBounds();
  if ( this.search.searchBounds && this.search.searchBounds.containsBounds(currentBounds))
  {
    //no busco, pero deberia reordenar los puntos agrupados
    return;  
  }

  sURL = this.reFormatURL(sURL);
  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);
	oMapa.searchMap.addOverlay(marker);	
}

function parseSearchXmlResult(oResult){
	//POSTS
	oMapa.searchMap.clearOverlays();
	
	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");
	  oPost.zoom = oItem.getAttribute("zoom");
	  addPostMarker(oPost);
	}
	
	//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;
}

