//inicializo el mapa
var map;
var menuMarkers = new Array();
var infoMarkers = new Array();
var menuSearchMarkers = new Array();
var infoSearchMarkers = new Array();
var serviciosMarkers = new Array();
var changeCenter = false;
var chgLat = -31.410562313215592;
var chgLng = -64.21224474906921;
var itemMrk = new Array();
var newMarkPoint;
var urlSearch='';
var fichaMarker;

function initialize()
{	
	if(GBrowserIsCompatible())
	{
		map = new GMap2(document.getElementById("map_canvas"));
		//setCenter(GLatLng(latitud,longitud),zoom);
		map.setCenter(new GLatLng(chgLat, chgLng), 12);
		
		var customUI = map.getDefaultUI();
        customUI.maptypes = false;
        map.setUI(customUI);
		
		map.setMapType(G_NORMAL_MAP);
		map.disableScrollWheelZoom(true)
		map.enableContinuousZoom(true);
		
		map.addControl(new GCustomControl());
		
		var st = setTimeout('recoverySaveMarkers()',300);
		if(urlSearch){
			GSearchSearchCompany(urlSearch);
		}
		/*GEvent.addListener(map, "moveend", 
							function() {
							  var center = map.getCenter();
							  mapInfo.innerHTML = center.toString();
							  //codigoFuente('close');
							}
						   );*/		
	}
}

/**
  * cambia la apariencia del icono de 32x32
  * @ param name:string nombre de la imagen
  * @ param drag:boolean para hacer el icono arrastrable o no
  *
  */

function changeIcon(name,drag)
{
	
	var myIcon = new GIcon(G_DEFAULT_ICON);
	
	if(name)
	{
		//cambio la imagen del icono
		
		myIcon.image = 'webimg/category/mapa/'+name+'.png';
		myIcon.shadow = 'webimg/category/mapa/'+name+'_shadow.png';
		myIcon.iconSize = new GSize(32, 32);
		myIcon.shadowSize = new GSize(54, 32);
		myIcon.iconAnchor = new GPoint(16, 30);
		myIcon.infoWindowAnchor = new GPoint(16, 10);
	}
	
	return	{icon:myIcon,draggable:drag};
	
}

/**
  * cambia la apariencia del icono de 32x32 para las categorias
  * @ param name:string nombre de la imagen
  * @ param drag:boolean para hacer el icono arrastrable o no
  *
  */

function changeIconCategory(name,drag)
{
	
	var myIcon = new GIcon(G_DEFAULT_ICON);
	
	if(name)
	{
		//cambio la imagen del icono
		
		myIcon.image = 'webimg/category/mapa/'+name+'.png';
		myIcon.shadow = 'webimg/category/mapa/icon_shadow.png';
		myIcon.iconSize = new GSize(32, 32);
		myIcon.shadowSize = new GSize(54, 32);
		myIcon.iconAnchor = new GPoint(16, 30);
		myIcon.infoWindowAnchor = new GPoint(16, 10);
	}
	
	return	{icon:myIcon,draggable:drag};
	
}

/**
  * cambia la apariencia del icono de 16x16
  * @ param name:string nombre de la imagen
  * @ param drag:boolean para hacer el icono arrastrable o no
  *
  */

function changeIcon16(name,drag)
{
	
	var myIcon = new GIcon(G_DEFAULT_ICON);
	
	if(name)
	{
		//cambio la imagen, la sombra, la posicion, 
		//y la posición de la ventana de información del icono
		
		myIcon.image = 'webimg/category/mapa/'+name+'.png';
		myIcon.shadow = 'webimg/category/mapa/'+name+'_shadow.png';
		myIcon.iconSize = new GSize(16, 16);
		myIcon.shadowSize = new GSize(27, 16);
		myIcon.iconAnchor = new GPoint(8, 8);
		myIcon.infoWindowAnchor = new GPoint(16, 10);
		myIcon.autoPan = true;
	}
	
	return	{icon:myIcon,draggable:drag};
	
}

/**
  * buscador para el menu principal
  * @ param name:string nombre de la imagen
  * @ param drag:boolean para hacer el icono arrastrable o no
  *
  */
var searchFile;
var searchId;

function searchCompany(srchType,srchId,ficha)
{
	if(srchId == null) return false;
	searchFile = configURL(srchType,srchId);
	searchId = srchId;
	fromFicha = ficha;
	
	if(fichaMarker){
		//alert('remove fichaMarker' + fichaMarker);
		map.removeOverlay(menuMarkers[fichaMarker][0]);
		menuMarkers[fichaMarker] = new Array();
		infoMarkers[fichaMarker] = new Array();
		fichaMarker = null;
	}
	  
	if(fromFicha){
	  fichaMarker = srchId;
	}
	
	//alert(searchFile);
	GDownloadUrl(searchFile,function(data,responseCode)
	{			  
	  //obtengo los datos del xml
	  var xml = GXml.parse(data);
	  //obtengo los elementos del xml
	  var markers = xml.documentElement.getElementsByTagName('empresa');
	  
	  menuMarkers[srchId] = new Array();
	  infoMarkers[srchId] = new Array();
	  
	  var markersAmnt =  markers.length;
	  //proceso cada elemento
	  for (var i = 0; i < markersAmnt; i++)
	  {
		createMPfromXML(markers[i],markersAmnt);
	  }
	});
}
var searchSearchFile;
var searchSearchId;

function GSearchSearchCompany(srchOptions)
{
	if(map){
	map.clearOverlays();
	}
	if(srchOptions == null) return false;
	searchSearchFile = srchOptions;
	
	GDownloadUrl(searchSearchFile,function(data,responseCode)
	{
	  //obtengo los datos del xml
	  var xml = GXml.parse(data);
	  //obtengo los elementos del xml
	  var markers = xml.documentElement.getElementsByTagName('empresa');
	  menuSearchMarkers = new Array();
	  infoSearchMarkers = new Array();
	  
	  var markersAmnt =  markers.length;
	  //alert(markersAmnt);
	  //proceso cada elemento
	  for (var i = 0; i < markersAmnt; i++)
	  {
		createSearchMPfromXML(markers[i],markersAmnt);
	  }
	});
}

/**
  * resetea los estados de los botons del menu principal
  * @ param srchType:string menu / submenu
  * @ param srchId:string codigo de identificacion del menu
  *
  */

function resetSearchCompany(srchType,srchId)
{
	var info = '';
	if(menuMarkers[srchId])
	{
		//proceso cada elemento
		for (var i = 0; i < menuMarkers[srchId].length; i++)
		{
			map.removeOverlay(menuMarkers[srchId][i]);
		}
		menuMarkers[srchId] = new Array();
		infoMarkers[srchId] = new Array();
		//alert(srchId);
	}
	switch(srchType)
	{
		case 'menu':
			for (var k in menuMarkers)
			{
				//var ids = k.split('_');
				if(k == srchId)
				{
					for (var i = 0; i < menuMarkers[k].length; i++)
					{
						map.removeOverlay(menuMarkers[k][i]);
					}
					menuMarkers[k] = new Array();
					infoMarkers[k] = new Array();
					info += k + '\n';
				}
			}			
		break;
		case 'submenu':
			
		break;
	}
	//alert(info);
}

/**
  * crea un marcador con ventana de informacion
  * @ param mark:Object objeto xml de donde se toman los datos
  * @ param amount:integer cantidad de marcadores
  *
  */

function createMPfromXML(mark,amount)
{
	//alert(searchId);
	//obtengo la latitud y longitud
	var point = new GLatLng(parseFloat(mark.getAttribute("lat")),
							parseFloat(mark.getAttribute("lng")));
	
	//alert(mark.getAttribute("lat"));
	var markerOptions = changeIconCategory(mark.getAttribute("icon"),false);
	//alert(mark.getAttribute("lat")+','+mark.getAttribute("lng")+','+mark.getAttribute("icon"));
	
	var newMarker = new GMarker(point,markerOptions);
	//cargo el marcador en el array
	menuMarkers[searchId].push(newMarker);
	infoMarkers[searchId] = new Array();
	
	var dataMark = mark;
	
	//le aplico un evento al marcador
	
	GEvent.addListener(newMarker, "click", 
					  function() {
						var info = GXml.value(dataMark.getElementsByTagName('info')[0]);
						newMarker.openInfoWindowHtml(info);
						
						infoMarkers[searchId].push(info);
					  });
	
	map.addOverlay(newMarker);
	if(amount == 1) map.panTo(point);
}

function createSearchMPfromXML(mark,amount)
{
	//obtengo la latitud y longitud
	var point = new GLatLng(parseFloat(mark.getAttribute("lat")),
							parseFloat(mark.getAttribute("lng")));
	
	var markerOptions = changeIconCategory(mark.getAttribute("icon"),false);
	
	var newMarker = new GMarker(point,markerOptions);
	
	var info = GXml.value(mark.getElementsByTagName('info')[0]);
	
	//cargo el marcador en el array
	menuSearchMarkers[mark.getAttribute("id")] = newMarker;
	infoSearchMarkers[mark.getAttribute("id")]= info;
	//le aplico un evento al marcador
	
	GEvent.addListener(newMarker, "click", 
					  function() {						
						newMarker.openInfoWindowHtml(info);						
					  });
	
	map.addOverlay(newMarker);
	if(amount == 1) map.panTo(point);
}

/**
  * crea un marcador con ventana de informacion
  * @ param mark:Object objeto xml de donde se toman los datos
  * @ param amount:integer cantidad de marcadores
  *
  */
var markerFromObject = new Array();
var markerPrevId;
function createMPfromObject(mark)
{
			
	//obtengo la latitud y longitud
	var point = new GLatLng(parseFloat(mark.lat),
							parseFloat(mark.lng));
	
	//alert(mark.getAttribute("lat"));
	var markerOptions = changeIcon(mark.icon,false);
	
	var id = mark.id;
	
	markerFromObject[id] = new GMarker(point,markerOptions);
	infoMarkers[id] = new Array();
	
	var dataMark = mark;
	
	//le aplico un evento al marcador
	GEvent.addListener(markerFromObject[id], "click", 
					  function() {
						var info = '<table width="300" border="0" cellspacing="0" cellpadding="3"> <tr><td width="32"><img src="webimg/category/mapa/'+mark.icon+'.png" alt="icono" width="32" height="32" id="icono" /></td><td colspan="2"><strong>'+mark.nombre+'</strong><br /><a href="javascript:void(userDetails('+mark.usuario_id+'));">'+mark.usuario+'</a></td></tr><tr><td colspan="3">&nbsp;</td></tr><tr><td colspan="2"><a href="javascript:companyDetails('+mark.empresa_id+');"><strong>Ver ficha</strong></a></td><td width="85"><div style="float:left; background-image:url(webimg/puntuacion_off.png); width:85px; height:15px;"><div style="background-image:url(webimg/puntuacion.png); width:'+mark.votoWidth+'px; height:15px;"></div></div></td></tr></table>';
						markerFromObject[mark.id].openInfoWindowHtml(info);
						infoMarkers[id].push(info);
					  });	
	
}

function displayMarkerFromObject(id)
{
	if(markerPrevId){
		var pmfo = markerFromObject[markerPrevId];
		map.removeOverlay(pmfo);
	}
	var mfo = markerFromObject[id];
	map.addOverlay(mfo);
	map.panTo(mfo.getLatLng());
	markerPrevId = id;
}


function simpleMarkPoint(mark)
{
	//obtengo la latitud y longitud
	var point = new GLatLng(parseFloat(mark.lat),
							parseFloat(mark.lng));
	
	//alert(mark.getAttribute("lat"));
	var markerOptions = changeIcon(mark.icon,false);	
	
	var marker = new GMarker(point,markerOptions);
	
	map.addOverlay(marker);
	
}

/**
  * crea la url en donde buscar el contenido
  * @ param type:string para determinar que pagina se ejecutara
  * @ param id:string identificador(es) de los que seran buscados
  *
  */

function configURL(type,id)
{
	var uid = new Date();
	switch(type)
	{
		case 'empresas':
			option = 101;
		break;
		case 'empresa':
			option = '101&cant=1';
			window.location = '#mapa';
			map.closeInfoWindow();
			map.clearOverlays();
			resetMenu();
		break;
		case 'recovery_empresas':
			option = 102;
		break;
		case 'servicios':
			option = 1005;
			resetMenu();
			return 'index.php?option=' + option;
		break;
		case 'newmark':
			option = 115;
		break;
	}
	return 'index.php?option=' + option +'&id=' + encodeURIComponent(id) +'&uid=' + encodeURIComponent(uid);
}

/**
  * recupera los marcadores guardados en la cookie
  *
  */


function recoverySaveMarkers()
{
	if(!menustate) return false;
	var totalKeys = new Array();
	var stringKeys = '';
	var keys = menustate.getKeys().toString().split(',');
	var subkeys = submenustate.getKeys().toString().split(',');
	var info='';
	for(var k = 0; k < keys.length; k++)
	{
		totalKeys[k] = keys[k];
		var parts = keys[k].split('_');
		if(parts[0] == 1000){
			stringKeys += keys[k] + ',';
		}
	}
	for(var j = 0; j < subkeys.length; j++)
	{
		totalKeys[k+j] = subkeys[j];
		stringKeys += subkeys[j] + ',';
	}
	var searchFile = configURL('recovery_empresas',stringKeys);
	//alert(searchFile);
	
	GDownloadUrl(searchFile,function(data,responseCode)
	{			  
	  //obtengo los datos del xml
	  var xml = GXml.parse(data);
	  //obtengo los elementos del xml
	  var markers = xml.documentElement.getElementsByTagName('empresa');
	  var info = '';
	  //cantidad de nodos
	  var markersAmnt =  markers.length;
	  //proceso cada nodo
	  for (var i = 0; i < markersAmnt; i++)
	  {
		  //obtengo el id
		  searchId = markers[i].getAttribute('id');
		  //si no existe la matriz para el marcador lo creo
		  if(!menuMarkers[searchId]){
			  menuMarkers[searchId] = new Array();
			  infoMarkers[searchId] = new Array();
		  }
		  //obtengo el marcador
		  createMPfromXML(markers[i],markersAmnt);
	  }
	});
}


/**
  * traza una polilinea 
  * @ param xml:Object {file:String,firstChild:String} nombre del archivo y primer nodo del xml
  *
  */


function GPolylines(xml)
{
	var newXML = xml;
	var file = newXML.file;
	var uid = new Date();
	file = file + '&uid=' + uid;
	map.clearOverlays();
	resetMenu();
	GDownloadUrl(file, function(data, responseCode) {
				  //nombre del nodo a procesar
				  var node = newXML.firstChild;
				  //obtengo los datos del xml
				  var xml = GXml.parse(data);
				  //alert(data);
				  //obtengo los elementos del xml
				  var line = xml.documentElement.getElementsByTagName('point');
				  //proceso cada elemento
				  var points = new Array();
				  var newPolyline = new Array();
				  
				  for (var i = 0; i < line.length; i++)
				  {
				  	var lat = parseFloat(line[i].getAttribute("lat"));
					var lng = parseFloat(line[i].getAttribute("lng"));
					newPolyline[i] = new Array(lat,lng);
				  	points[i] = new GLatLng(lat,lng);
					if(i == 0){
						simpleMarkPoint({lat:lat,lng:lng,icon:'inicio'});
					}else if(i == line.length-1)
					{
						simpleMarkPoint({lat:lat,lng:lng,icon:'fin'});
					}
				  }
				  
				  var colour = xml.documentElement.getAttribute("colour");
				  var width = xml.documentElement.getAttribute("width");
				  var polyline = new GPolyline(points,
											   colour,
											   width);
				  
				  map.addOverlay(polyline);
				  if(newXML.closeBox)
				  	newXML.closeBox.innerHTML = '';
				  //setPointsPolyline(newPolyline);
				});	
}

function GMarkerGroups(searcher)
{
	searchFile = searcher.file;
	srchId = searcher.id;
	searchId = srchId;
	map.clearOverlays();
	resetMenu();
	//alert(searchFile);
	GDownloadUrl(searchFile,function(data,responseCode)
	{
	  //obtengo los datos del xml
	  var xml = GXml.parse(data);
	  //obtengo los elementos del xml
	  var markers = xml.documentElement.getElementsByTagName('servicio');
	  //alert(data);
	  menuMarkers[srchId] = new Array();
	  infoMarkers[srchId] = new Array();
	  
	  var markersAmnt =  markers.length;
	  //alert(markersAmnt);
	  //proceso cada elemento
	  for (var i = 0; i < markersAmnt; i++)
	  {
		createMPfromXML(markers[i],markersAmnt);
	  }
	  if(searcher.closeBox)
		searcher.closeBox.innerHTML = '';
	});
}

function GMapCenter(lat,lng,zoom)
{
	map.setCenter(new GLatLng(lat, lng), zoom);
}
function GSelectMarker(id,n)
{
	map.closeInfoWindow();
	var newWidth = parseInt(document.getElementById('map_canvas').style.width);
	var width = map.getSize().width;
	var bounds = map.getBounds();
	var point = menuMarkers[id][n].getLatLng();
	
	var leftLat = bounds.getSouthWest().lat();
	var rightLat = bounds.getNorthEast().lat();
	
	var difLat = leftLat - rightLat;
	
	var newDifLat = newWidth * difLat / width;
		
	var lat = point.lat();
	var lng = point.lng();
	
	lng = lng-newDifLat;
		
	map.panTo(new GLatLng(lat,lng));
}
function GSelectSearchMarker(id,n)
{
	map.closeInfoWindow();
	var newWidth = parseInt(document.getElementById('map_canvas').style.width);
	var width = map.getSize().width;
	var bounds = map.getBounds();
	
	var point = menuSearchMarkers[id].getLatLng();
	
	var leftLat = bounds.getSouthWest().lat();
	var rightLat = bounds.getNorthEast().lat();
	
	var difLat = leftLat - rightLat;
	
	var newDifLat = newWidth * difLat / width;
		
	var lat = point.lat();
	var lng = point.lng();
	
	lng = lng-newDifLat;
	
	
	map.panTo(new GLatLng(lat,lng));
	menuSearchMarkers[id].openInfoWindowHtml(infoSearchMarkers[id]);
}
var ds;
var de;
function GNewMark(){
	
	if(newMarkPoint)
	{
		map.removeOverlay(newMarkPoint);
	}
	
	var tutorialInfo = '<b>C&oacute;mo crear una Marca:</b><br />Primero arrastrame hasta el lugar que quer&eacute;s marcar.<br />Luego, haceme doble click para agregar los datos de este lugar.<br />Por ultimo, presion&aacute; el bot&oacute;n del formulario "Marcar Lugar".';
	
	var point = map.getCenter();
	
	var markerOptions = changeIcon('icono_0',true);	
	
	newMarkPoint = new GMarker(point,markerOptions);
	
	GEvent.addListener(newMarkPoint,'dblclick',GNewInfoWindow);
	
	ds = GEvent.addListener(newMarkPoint,'dragstart',function(){
														newMarkPoint.closeInfoWindow();														
														});
	de = GEvent.addListener(newMarkPoint,'dragend',function(){
														newMarkPoint.openInfoWindowHtml(tutorialInfo);																												
														});
	
	map.addOverlay(newMarkPoint);
	newMarkPoint.openInfoWindowHtml(tutorialInfo);
	
}
function GCloseNewMark(){
	map.removeOverlay(newMarkPoint);
}

function GNewInfoWindow(){
		var latLng = newMarkPoint.getLatLng();
		var searchFile = configURL('newmark',0)+'&lat='+latLng.lat()+'&lng='+latLng.lng();
		var info = '';
		var tmpData = '';
		GDownloadUrl(searchFile,function(data,responseCode)
		{
			newMarkPoint.openInfoWindowHtml(data);
			GEvent.removeListener(ds);
			GEvent.removeListener(de);
			ds = GEvent.addListener(newMarkPoint,'dragstart',function(){
															newMarkPoint.closeInfoWindow();												
															});
			de = GEvent.addListener(newMarkPoint,'dragend',GNewInfoWindow);
		});
}

function GOpenInfoWindow(id){
	map.closeInfoWindow();
}

function GSetCountry(country,lat,lat){
	var zoom = 12;
	if(country != 'AR'){
		zoom = 10;
	}
	var point = GLatLnt(lat,lng);
	map.setCenter(point,zoom);
}
