﻿var v = document.location.host.split(".");
var documentDomain = "";
for (var _i=1; _i<v.length; _i++) {
	documentDomain += ((_i>1)?'.':'') + v[_i];
}
if (documentDomain=="") documentDomain = document.location.host;
/* Namespace GRAFCAN */
var grafcan = {};
//
grafcan.prototypeGMap = function() {
	GMap2.prototype.lastPos = {center:null,zoom:0};
	GMap2.prototype.saveLastPos = function() {
		this.lastPos.center = this.getCenter();
		this.lastPos.zoom = this.getZoom();
	}
	GMap2.prototype.returnToLastPos = function() {
		if (this.lastPos.center && this.lastPos.zoom)
			this.setCenter(this.lastPos.center, this.lastPos.zoom);
	}
	GMap2.prototype.invalidZoomLevel = function(zoomlevel) {
		return this.getCurrentMapType().getMaximumResolution()<zoomlevel;
	}
	// overwrite setCenter() method
	var _setCenter = GMap2.prototype.setCenter;
	GMap2.prototype.setCenter = function() {
		this.saveLastPos();
		_setCenter.apply(this, arguments);
	}
}
//
grafcan.debug = {enabled:false,flag:false};
try{grafcan.uid = Math.round(Math.random()*Math.pow(10,8));}catch(e){grafcan.uid=0;};
/*
 * Objeto configuración
 */
grafcan.cfg = null;
/*
 * Varios
 */
grafcan.offsetLeft = 1;
 // modo sync y embutido
grafcan.enumSync = {none:0,synchronized:1,extended:2};
grafcan.syncMode = grafcan.enumSync.none; // 0 (ninguno), 1 (vista sincronizada), 2 (vista extendida)
grafcan.embedded = 2; // 0 (normal), 1 (panel lado izdo), 2 (panel lado dcho)
grafcan.minSize = 0; // 1: oculta header, title, ...
grafcan.activeMap = {id:1,name:'map1'};
grafcan.overMap = null;
grafcan.slaveEvent = {zoomend:null,drag:null};
var slaveMap = null;
grafcan.setActiveMap = function(idmap) {
	grafcan.endMeasure(2);
	grafcan.activeMap.id = idmap;
	switch (idmap) {
		case 1:
			map=map1;slaveMap=map2;
			grafcan.activeMap.name = map1.getContainer().id;
			break;
		case 2:
			map=map2;slaveMap=map1;
			grafcan.activeMap.name = map2.getContainer().id;
			map2.toolMode = map1.toolMode;
			break;
	}
	var mapType = map.getCurrentMapType();
	var layers = grafcan.getVisibleLayers(mapType);
	var nodoServicio = grafcan.tree.getNodeById(mapType.getName());
	if (!nodoServicio) {
		mapType = map.cfg.getDefaultService();
		layers = grafcan.getVisibleLayers(mapType);
		nodoServicio = grafcan.tree.getNodeById(mapType.name);
	}
	if (nodoServicio) nodoServicio.select();
}
grafcan.syncMap = function(idmap, center, zoom) {
	var smap = null
	var mmap = null;
	switch (idmap) {
		case 1:
			mmap = map2;
			smap = map1;
			break;
		case 2:
			mmap = map1;
			smap = map2;
			break;
	}
	mmap.locked = true;
	switch (grafcan.syncMode) {
		case grafcan.enumSync.synchronized:
			smap.setCenter(center, zoom);
			break;
		case grafcan.enumSync.extended:
			var bounds = mmap.getBounds();
			var bbox = bounds.getSouthWest().lng()+','+bounds.getSouthWest().lat()+','+bounds.getNorthEast().lng()+','+bounds.getNorthEast().lat();
			bbox = correccionLat(mmap,bbox);
			var boundsCenter = bounds.getCenter();
			var offset = bounds.toSpan().lng(); // toSpan() devuelve las dimensiones de la ventana en geográficas
			if (grafcan.embedded==1 || idmap==1) offset = -offset;
			var v = bbox.split(',');
			var spanH = (parseFloat(v[3])-parseFloat(v[1]))/2;
			var newCenter = new GLatLng(parseFloat(v[1])+spanH, boundsCenter.lng()+offset);
			smap.setCenter(newCenter, zoom);
			break;
	}
	mmap.locked = false;
}
grafcan.synchronizeMap2 = function(center, zoom) {
	if (grafcan.syncMode) {
		if (!center) center = map1.getCenter();
		if (!zoom) zoom = map1.getZoom();
		if (map2.getCurrentMapType().getMaximumResolution()>=zoom) {
			grafcan.syncMap(2, center, zoom);
			return true;
		} else
			return false;
	}
}
grafcan.synchronizeMap1 = function(center, zoom) {
	if (grafcan.syncMode) {
		if (!center) center = map2.getCenter();
		if (!zoom) zoom = map2.getZoom();
		if (map1.getCurrentMapType().getMaximumResolution()>=zoom) {
			grafcan.syncMap(1, center, zoom);
			return true;
		} else
			return false;
	}
}
function addSyncOpPanel() {
	if (!grafcan.menu2wPanel) {
		var menu = new Ext.menu.Menu({
			id:'menu2w',
			defaults:{hideOnClick:false},
			items:[{id:'syncMenu_w',text:_('Modo ventana'),
				    iconCls:'sincronizado',
					menu:{items:[{id:'syncMenu_sync',group:'modo',text:_('Sincronizado'),checked:true,
								  handler:function(event){
									  grafcan.syncMode=grafcan.enumSync.synchronized;grafcan.synchronizeMap2();
									  grafcan.menu2wPanel.items.first().menu.items.map['syncMenu_w'].setIconClass('sincronizado');
								  }},
								 {id:'syncMenu_ext',group:'modo',text:_('Extendido'),checked:false,
								  handler:function(event){
									  grafcan.syncMode=grafcan.enumSync.extended;grafcan.synchronizeMap2();
									  grafcan.menu2wPanel.items.first().menu.items.map['syncMenu_w'].setIconClass('extendido');
								 }}
								]}},
				   {id:'syncMenu_m',text:_('Mapa activo'),
				    iconCls:'mapaizda',
					menu:{items:[{id:'syncMenu_map1',group:'mapa',text:_('Izquierda'),checked:true,
								  handler:function(event){
									  grafcan.setActiveMap(1);
									  grafcan.menu2wPanel.items.first().menu.items.map['syncMenu_m'].setIconClass('mapaizda');
								 }},
								 {id:'syncMenu_map2',group:'mapa',text:_('Derecha'),checked:false,
								  handler:function(event){
									  grafcan.setActiveMap(2);
									  grafcan.menu2wPanel.items.first().menu.items.map['syncMenu_m'].setIconClass('mapadcha');
								 }}
								]}}
			]
		});
		grafcan.menu2wPanel = new Ext.Toolbar({style:'background:none'});
		grafcan.menu2wPanel.render('syncOp');
		grafcan.menu2wPanel.add({text:_('Opciones'),menu: menu});
		grafcan.menu2wPanel.doLayout();
	}
	return grafcan.menu2wPanel;
}
function showMenu2w(flag) {
	var oMenu = addSyncOpPanel();
	if (flag) {
		oMenu.show();
	} else {
		oMenu.hide();
		grafcan.menu2wPanel.items.first().menu.items.map['syncMenu_w'].setIconClass('sincronizado');
		grafcan.menu2wPanel.items.first().menu.items.map['syncMenu_m'].setIconClass('mapaizda');
		grafcan.menu2wPanel.items.first().menu.items.map['syncMenu_w'].menu.items.map['syncMenu_sync'].setChecked(true);
		grafcan.menu2wPanel.items.first().menu.items.map['syncMenu_m'].menu.items.map['syncMenu_map1'].setChecked(true);
	}
}
function configSync() {
	if (grafcan.syncMode) {
		grafcan.setActiveMap(1);
		//
		showMenu2w(false);
		grafcan.syncMode = grafcan.enumSync.none;		
		$id('objSync').src = 'img/toolbar/dividir_off.gif';
		$id('objSync').title = _('Ventana doble');
		//
		eventosSlave(false);
		slaveMap = null;
		with ($id('map1')) {
			style.width = '100%';
		}
		map=map1;
		map.checkResize();
		$id('map2').style.display = 'none';
		map.addControl(grafcan.overviewMapControl);
		grafcan.overviewMapControl.hide(true);
		handleResize();
		return;
	}
	//
	setToolMode(grafcan.defaultToolMode);
	showMenu2w(true);
	grafcan.syncMode = grafcan.enumSync.synchronized;
	$id('objSync').src = 'img/toolbar/unir_off.gif';
	$id('objSync').title = _('Ventana única');
	//
	with ($id('map1')) {
		style.width = '50%';
	}
	map.checkResize();
	with ($id('map2').style) {
		left = ($id('map1').offsetLeft+$id('map1').offsetWidth)+'px';
		width = $id('map1').offsetWidth+'px';
		height = $id('map1').offsetHeight+'px';
		display = 'block';
	}
	map2 = new GMap2($id('map2'), {logoPassive:true});
	map2.mapOverlay = new Object();
	map2.cfg = map1.cfg.clone();
	var mapType = map1.getCurrentMapType();
	map2.getMapTypes().length = 0;
	map2.addMapType(mapType);
	map2.setMapType(mapType);
	eventosSlave(true);
	addZoomBoxControl(map2);
	slaveMap = map2;
	map1.removeControl(grafcan.overviewMapControl);
	handleResize();
	grafcan.synchronizeMap2(map1.getCenter(), map1.getZoom());
}
function changeLang(id) {
	if (grafcan.lang==id) return;
	grafcan.lang=id;
	setCookie('IDECanarias_lang',grafcan.lang,365);
	document.location.reload();
}
function addFlagPanel() {
	var menu = new Ext.menu.Menu({
		id:'menuLang',
		defaults:{
			hideOnClick:true,
			handler:function(){
				if (grafcan.lang==this.id) return;
				grafcan.lang=this.id;
				Ext.getCmp('tbarLang').activeMenuBtn.setIconClass(this.iconCls);
				setCookie('IDECanarias_lang',grafcan.lang,365);
				document.location.reload();
			}
		},
		items:[{id:'es',text:'Español',iconCls:'flag-es'},
			   {id:'en',text:'English',iconCls:'flag-en'}]
	});
	grafcan.tbarLang = new Ext.Toolbar({id:'tbarLang',style:'background:none'});
	grafcan.tbarLang.render('div-lang');
	grafcan.tbarLang.add({iconCls:'flag-'+grafcan.lang,menu:menu});
	grafcan.tbarLang.doLayout();
}
grafcan.closeInfoWindow = function() {
	map1.closeInfoWindow();
	if (grafcan.syncMode) map2.closeInfoWindow();
}
/*
 * Personalizado
 */
grafcan.overlayRepository = false; // los overlays se añaden a un repositorio en una nueva pestaña
grafcan.cosas = []; // repositorio de overlays (si grafcan.overlayRepository es true)
grafcan.enableSetMarker = false; // si se permite colocar marcas de usuario
grafcan.enableMarkerTitling = true; // si se permite establecer una descripción de las marcas de usuario
grafcan.enableKMLExporting = false;
grafcan.enableLoadKML = false;
grafcan.useScaleAprox = true;
grafcan.tabBusquedas = true;
grafcan.toolRutas = true;
grafcan.tool3D = true;
grafcan.panoramio = false;
grafcan.wiki = false;
grafcan.toolSync = true;
grafcan.urlLoadKML = 'http://visortf.grafcan.es/KML/loadKML.php';
grafcan.urlTopoProxy = 'http://visor.grafcan.es/visorpru/pages/proxy_topo.php';
grafcan.urlBaseBusquedas = 'http://visor.grafcan.es/busquedas';
grafcan.urlFusiona = 'http://localhost/imageserver/gd/fusiona.php';
grafcan.urlPrintServer = 'http://visor.grafcan.es/printserver/visorpdf';
grafcan.urlRasterKML = 'http://visor.grafcan.es/imageserver/getimagekml/';
grafcan.urlPuntosPerfil = 'http://fotos.grafcan.es/mdt/getzl/';
grafcan.urlGraficaPerfil = 'http://fotos.grafcan.es/prueba/GraficaPerfiles.swf';
grafcan.logoToolBar = {enabled:true, href: 'http://www.grafcan.com', title: 'Cartográfica de Canarias, S.A.', url: 'img/logoGrafcan_peq.gif', border:''};
grafcan.colors = {hilight:'#f1f4f5',fade:'#ffffff'};
grafcan.EPSG_utm = '32628';
grafcan.refreshMap = 0;
grafcan.checkZTimer = 1500;
grafcan.clickS1=0;grafcan.clickS2=0; // semáforos para evitar info en doble clic
/*
 * Huso UTM
 */
grafcan.Huso = {Numero:28,Letra:'N'};
/*
 * Extent límite Canarias
 */
grafcan.swLimit = new GLatLng(24.73685348477069, -23.016357421875);
grafcan.neLimit = new GLatLng(31.765537409484374, -8.98681640625);
grafcan.LimitExtent = {left:180000.0,right:670000.0,bottom:3055000.0,top:3260000.0};
grafcan.boundsLimit = new GLatLngBounds(grafcan.swLimit, grafcan.neLimit);
grafcan.minOverviewZoomLevel = 11;
grafcan.visibility = {minResolution:7, maxResolution:19};
grafcan.visibleBounds = {minx:180000,miny:3055000,maxx:670000,maxy:3260000};
/*
 * Direcciones de origen y destino
 */
grafcan.direction = {source: '', target: '', color: '#ffff00', weight: 5, opacity: 0.8};
grafcan.routeData = {baseCountryCode: 'es',
                     administrativeAreaNameRE: 'islas canarias|canary islands|cn',
					 zoneNameRE: 'islas canarias|canary island',
					 countryNameRE: 'españa|spain',
					 zoneName: 'Islas Canarias',
					 countryName: 'España'};
/*
 * Centro y nivel de zoom iniciales
 */
grafcan.Ini_Zoom = 7;
grafcan.Ini_Lat = 28.3;
grafcan.Ini_Lon = -15.80;
/*
 * URL vista actual
 */
grafcan.hyplnk = document.location.href;
/*
 * Mantiene el último cursor habilitado
 */
grafcan.cursor = 'default';
/*
 * Servicio actual
 */
grafcan.curService = '';
/*
 * Overlay de medidas
 */
grafcan.measureOverlay = [];
grafcan.measureOverlayName = ['utm','polygon','polyline'];
grafcan.clearMeasureOverlay = function() {
	if (grafcan.measureOverlay.length) {
		// named overlays
		for (var i=0; i<grafcan.measureOverlayName.length; i++) {
			if (grafcan.measureOverlay[grafcan.measureOverlayName[i]]) {
				map.removeOverlay(grafcan.measureOverlay[grafcan.measureOverlayName[i]]);
				delete grafcan.measureOverlay[grafcan.measureOverlayName[i]];
			}
		}
		// markers
		for (var i=0; i<grafcan.measureOverlay.length; i++) {
			if (grafcan.measureOverlay[i]) {
				map.removeOverlay(grafcan.measureOverlay[i]);
				delete(grafcan.measureOverlay[i]);
			}
		}
		grafcan.measureOverlay.length = 0;
	}
}
/*
 * Overlays de singleTile
 */
grafcan.clearMapOverlay = function(gmap) {
	for (var s in gmap.mapOverlay) {
		gmap.removeOverlay(gmap.mapOverlay[s]);
		delete gmap.mapOverlay[s];
	}
}
grafcan.removeMapOverlay = function(gmap, name) {
	if (gmap.mapOverlay[name]) {
		gmap.removeOverlay(gmap.mapOverlay[name]);
		delete gmap.mapOverlay[name];
	}
}
/*
 * Overlay de busquedas
 */
grafcan.maxQueryZoomLevel = 17;
grafcan.queryOverlayURL = null;
grafcan.queryOverlay = null;
grafcan.clearQueryOverlay = function(forzar) {
	if (!grafcan.tabBusquedas) return;
	if (!grafcan.queryOverlay) return;
	if (forzar || ($id('busquedas-resultados-panel') && $id('busquedas-resultados-panel').style.display=='none') || grafcan.queryOverlay instanceof GMarker) {
		map1.removeOverlay(grafcan.queryOverlay);
		if (grafcan.queryOverlay2) map2.removeOverlay(grafcan.queryOverlay2);
		grafcan.queryOverlay = null;
		grafcan.queryOverlay2 = null;
		grafcan.queryOverlayURL = null;
		return true;
	}
	return false;
}
/*
 * Menú WMS
 */
grafcan.listWMSPanel = null;
grafcan.serviceToCustomize = '';
grafcan.customGroupName = 'grpOtros';
grafcan.customGroupDesc = _('OTROS SERVICIOS');
/*
 * Enumerado de tipos de herramientas
 */ 
grafcan.toolMode = {none:-1,zoomIn:1,zoomOut:2,zoomBox:3,zoomIni:4,measureLength:5,measureArea:6,info:7,route:8,goto3D:9,sync:10,panoramio:11,wiki:12,backToLast:13,perfil:14,linkToView:15,exportToKML:16,setMarker:17};
grafcan.defaultToolMode = grafcan.toolMode.info;
grafcan.toolModeDesc = function(toolMode) {
	if (!toolMode) toolMode = map.toolMode;
	switch (toolMode) {
		case grafcan.toolMode.none:
			return 'none';
			break;
		case grafcan.toolMode.zoomIn:
			return 'zoomIn';
			break;
		case grafcan.toolMode.zoomOut:
			return 'zoomOut';
			break;
		case grafcan.toolMode.zoomBox:
			return 'zoomBox';
			break;
		case grafcan.toolMode.zoomIni:
			return 'zoomIni';
			break;
		case grafcan.toolMode.measureLength:
			return 'measureLength';
			break;
		case grafcan.toolMode.measureArea:
			return 'measureArea';
			break;
		case grafcan.toolMode.perfil:
			return 'perfil';
			break;
		case grafcan.toolMode.info:
			return 'info';
			break;
		case grafcan.toolMode.route:
			return 'route';
			break;
		case grafcan.toolMode.goto3D:
			return 'goto3D';
			break;
		case grafcan.toolMode.backToLast:
			return 'lastView';
			break;
		case grafcan.toolMode.linkToView:
			return 'linkToView';
			break;
		case grafcan.toolMode.exportToKML:
			return 'exportToKML';
			break;
	}
}
/*
 * Función que devuelve verdadero si la herramienta que se le pasa
 * como parámetro se queda seleccionada al hacer clic en su botón correspondiente
 */
grafcan.isFixedToolMode = function(toolMode) {
	switch (toolMode) {
		case grafcan.toolMode.none:
		case grafcan.toolMode.zoomBox:
		case grafcan.toolMode.measureLength:
		case grafcan.toolMode.measureArea:
		case grafcan.toolMode.setMarker:
		case grafcan.toolMode.perfil:
		case grafcan.toolMode.info:
			return true;
			break;
		default:
			return false;
			break;
	}
}
/*
 * Función que devuelve verdadero si la herramienta que se le pasa
 * como parámetro se desactiva al hacer su función
 */
grafcan.isOneTimeToolMode = function(toolMode) {
	switch (toolMode) {
		case grafcan.toolMode.zoomIn:
		case grafcan.toolMode.zoomOut:		
		case grafcan.toolMode.goto3D:
		case grafcan.toolMode.backToLast:
		case grafcan.toolMode.linkToView:
		case grafcan.toolMode.exportToKML:
			return true;
			break;
		default:
			return false;
			break;
	}
}
grafcan.isZoomBoxUsable = function(toolMode) {
	switch (toolMode) {
		case grafcan.toolMode.measureLength:
		case grafcan.toolMode.measureArea:
		case grafcan.toolMode.setMarker:
			return false;
			break;
		default:
			return true;
			break;
	}
}
/*
 * Objeto GDirections (puede ser un array de)
 */
grafcan.gdir = null;
/*
 * Leyenda
 */
grafcan.showLegendVARIAS = function() {
	var curCfg = grafcan.currentMapCfg();
	if (curCfg.legend!='')
		var url = curCfg.legend;
	else
		var url = 'legends/none_'+grafcan.lang+'.htm';
	var param = 'layer=';
	var ini = url.indexOf(param);
	var s = '<legends>';
	if (ini!=-1) {
		ini+=param.length;
		var fin = url.indexOf('&',ini);
		if (fin==-1) fin = url.length-1;
		var pLayer = url.substring(ini,fin);
		var layer = pLayer.split(',');
		for (var l=0;l<layer.length;l++) {
			var uri = url.replace('layer='+pLayer,'layer='+layer[l]);
			s += '<legend url="'+uri.replace(/&/g,'&amp;')+'">'+layer[l]+'</legend>';
		}
	} else
		s += '<legend url="'+url+'"/>';
	s += '</legends>';
	var xmlDoc = GXml.parse(s);
	var req = GXmlHttp.create();
	req.open('GET', 'legends/varias.xsl', true); 
	req.onreadystatechange = function() {
		if (req.readyState == 4) {				
			var xslDoc = GXslt.create(req.responseXML);
			var res = xslDoc.transformToHtml(xmlDoc, $id('divLeyendas'));
		}
	}
	req.send();
	handleResize();
}
grafcan.showLegend = function() {
	var curCfg = grafcan.currentMapCfg();
	if (curCfg.legend!='')
		var url = curCfg.legend;
	else
		var url = 'legends/none_'+grafcan.lang+'.htm';
	var iframe = grafcan.tabviewSidebar.getItem('tabLeyenda').body.child('iframe').dom;
	if (iframe.src==url) return;
	var lm = new Ext.LoadMask('tabLeyenda', {msg:_('Cargando')+'...'});
	lm.show();	
	var iframeLoad = GEvent.addDomListener(iframe, "load", function(){
													   lm.hide();
													   GEvent.removeListener(iframeLoad);
	});
	iframe.src = url;
	handleResize();
}
/*
 * Control overview map
 */
grafcan.overviewMapControl = null;
/*
 * Medición de distancias y áreas
 */
grafcan.measurePanel = null; // panel de mediciones
grafcan.measureHandler = null; // handler para captar eventos de ratón en las mediciones
grafcan.clearLatLngs = function() {
	latlngs.length = 0;
}
grafcan.errorReporting = function() {
	var fn = function(buttonId, text, opt) {
		if (buttonId=='ok')
			setToolMode(grafcan.toolMode.setMarker);
	}
	Ext.MessageBox.buttonText.ok = _('Continuar');
	Ext.MessageBox.buttonText.cancel = _('Cancelar');
	Ext.Msg.show({
	   title:_('Información de errores - IDECanarias'),
	   msg: _('msgStreetReporting2'),
	   buttons: Ext.Msg.OKCANCEL,
	   fn: fn,
	   icon: Ext.MessageBox.QUESTION,
	   closable: false
	});
}
grafcan.beginMarker = function() {
	grafcan.clearLatLngs();
	grafcan.measureHandler = GEvent.addListener(map, "click", handleMapClick);
	//
	grafcan.cursor = getMapCursor();
	setMapCursor("crosshair");
}
grafcan.endMarker = function() {
	if (!grafcan.overlayRepository) {
		try{map.removeOverlay(grafcan.markerOverlay);}catch(e){};
		grafcan.markerOverlay = null;
	}
	GEvent.removeListener(grafcan.measureHandler);
	//
	setMapCursor(grafcan.cursor);
}
grafcan.makeMeasure = function(which, withPerfil) {
	/*
	 * which=1: longitudes/perfil (withPerfil=true)
	 * which=2: áreas
	 */
	grafcan.makePerfil = (withPerfil?withPerfil:false);
	grafcan.clearMeasureOverlay();
	grafcan.clearLatLngs();
	grafcan.measureHandler = GEvent.addListener(map, "click", handleMapClick);
	if (which==1) {
		if (withPerfil)
			renderPerfil();
		else
			renderLength();
	} else
		renderArea();
	grafcan.measureWin.setPagePosition(map.getSize().width-grafcan.measureWin.width,$id('toolbar').offsetTop+$id('toolbar').offsetHeight+9);
	grafcan.measureWin.show();
	//
	grafcan.cursor = getMapCursor();
	setMapCursor("crosshair");
}
grafcan.endMeasure = function(mode, withPerfil) {
	/*
	 * mode=0: borrar medidas
	 * mode=1: desactivar medición (los puntos y el panel de medición quedan en pantalla)
	 * mode=2: desactivar medición (se eliminan los puntos del mapa y se cierra el panel)
	 * mode=1: withPerfil=true: calcular perfil sin cerrar ventana
	 */
	if (mode==0 || mode==2) {
		grafcan.clearMeasureOverlay();
		try{grafcan.perfil.hide()}catch(e){}
		grafcan.clearLatLngs();
		if (mode==2) {
			try{grafcan.measureWin.destroy();}catch(e){}
			try{GEvent.removeListener(grafcan.measureHandler);}catch(e){}
		}
	} else if (mode==1) {
		if (withPerfil) {
			if (latlngs.length>1) {
				var url = 'pages/genProxy.php';
				var puntos = '';
				var sep = '';
				for (var i=0;i<latlngs.length;i++) {
					var utm = new geo2utm(latlngs[i]);
					puntos += sep+utm.x+','+utm.y;
					sep = ',';
				}
				var xmlPerfil = grafcan.urlPuntosPerfil+'[xy]/[resolucion]/';
				xmlPerfil = xmlPerfil.replace('[xy]', puntos);
				var resolucion = 50;
				xmlPerfil = xmlPerfil.replace('[resolucion]', resolucion);
				var params = 'target='+xmlPerfil;
				var width=600, height=400;
				grafcan.viewPerfilByUrl(grafcan.urlGraficaPerfil+'?cXml='+xmlPerfil, width, height);
			}
		} else {
			GEvent.removeListener(grafcan.measureHandler);
		}
	}
	//
	setMapCursor(grafcan.cursor);
}
grafcan.refreshPerfil = function(url, width, height) {
	var offW = 40, offH = 60;
	var w = (width?width:grafcan.perfil.getWidth())-offW,
	    h = (height?height:grafcan.perfil.getHeight())-offH;
	return new Ext.FlashComponent({
	  id: 'swfViewer',
	  url: (url?url:grafcan.perfil.getComponent(0).mediaCfg.url)+'&width='+(w-offW)+'&height='+(h-offH)+'&lng='+grafcan.lang
	});
}
grafcan.viewPerfilByUrl = function(url, width, height) {
	if (!grafcan.perfil) {
		grafcan.perfil = new Ext.Window({
			title: _('Perfil del terreno'),
			closeAction: 'hide',
			constrain:true,
			width: width,
			height: height,
			items: [grafcan.refreshPerfil(url, width, height)],
			listeners: {
				'resize': function(w, width, height) {
					var url = w.getComponent(0).url;
					w.remove(w.getComponent(0));
					w.add(grafcan.refreshPerfil(url, width, height));
					w.doLayout();
				}
			}
		});
	} else {
		grafcan.perfil.remove(grafcan.perfil.getComponent(0));
		grafcan.perfil.add(grafcan.refreshPerfil(url, grafcan.perfil.getWidth(), grafcan.perfil.getHeight()));
		grafcan.perfil.doLayout();
	}
	grafcan.perfil.show();
}
/*
 * Herramientas del mapa
 */
grafcan.zoomIn = function(point) {
	if (grafcan.getMapType(grafcan.curService).getMaximumResolution()>map.getZoom()) {
		var zoomLevel = map.getZoom()+1;
		if (point)
			map.setCenter(point, zoomLevel);
		else
			map.zoomIn();
	}
}
grafcan.zoomOut = function(point) {
	var zoomLevel = map.getZoom()-1;
	if (point)
		map.setCenter(point, zoomLevel);
	else
		map.zoomOut();
}
/*
 * Recupera un maptype por su nombre
 */
grafcan.getMapType = function(name) {
	var maptypes = map.getMapTypes();
	for (var i=0; i<maptypes.length; i++) {
		if (maptypes[i].getName()==name) return maptypes[i];
	}
	return null;
}
grafcan.getVisibleLayers = function(maptype) {
	var layers = {};
	for (var i=0;i<maptype.getTileLayers().length;i++) {
		layers[maptype.getTileLayers()[i].myLayers] = maptype.getTileLayers()[i].myLayers;
	}
	for (m in map.mapOverlay) {
		layers[m] = m;
	}
	var svc = map.cfg.getService(map.getCurrentMapType().getName());
	var vlayers = {};
	for (var s in svc.layers) {
		if (layers[svc.layers[s].name] || layers[svc.layers[s].layers])
			vlayers[svc.layers[s].desc] = svc.layers[s].desc;
	}
	return vlayers;
}
/*
 * Obtiene el maptype por defecto
 */
grafcan.getDefaultMapType = function() {
	return grafcan.getMapType(grafcan.cfg.getDefaultService().name);
}
/*
 * Configura la visibilidad de las capas en el arbol de contenidos del servicio según el zoomlevel
 */
grafcan.setupTreeView = function(serviceName, nextZoomLevel) {
	var svc = map.cfg.getService(serviceName);
	for (var s in svc.layers) {
		var svcNode = grafcan.tree.getNodeById(serviceName);
		if (svcNode) {
			var treeNode = svcNode.findRecursiveChild('name',s);
			if (treeNode) {
				if (!layerVisibleToNextZoomLevel(svc, s, nextZoomLevel)) {
					treeNode.disable();
				} else {
					treeNode.enable();
				}
			}
		}
	}
	svc = null;
}
/*
 * Rutina que cambia el servicio activo
 * El elemento HTML que dispare esta función, ha de tener como valor de su propiedad id
 * el nombre del servicio según esté configurado
 */
grafcan.changeService = function(event, serviceName) {
	grafcan.closeInfoWindow();
	if (!serviceName) serviceName = event.srcElement.id;
	grafcan.curService = serviceName;
	if (map.getCurrentMapType().getName()==serviceName) return;
	grafcan.setupTreeView(serviceName, map.getZoom());
	// configuramos un servicio a la vez
	grafcan.viewService(grafcan.cfg.getService(serviceName));
}
grafcan.refreshService = function() {
	map.setZoom(map.getZoom());
}
/*
 * Función que devuelve el mapa activo (su nombre)
 */
grafcan.nameOfCurrentMap = function(useOverMap) {
	// grafcan.overMap es el mapa GMap2 sobre el que está el cursor del ratón
	if (useOverMap)
		return grafcan.overMap.getCurrentMapType().getName();
	else
		return map.getCurrentMapType().getName();
}
/*
 * Función que devuelve el servicio del mapa activo
 */
grafcan.currentMapCfg = function(useOverMap) {
	return map.cfg.getService(grafcan.nameOfCurrentMap(useOverMap));
}
/*
 * Función que cambia la configuración de un MapType y reconfigura la variable GMap2
 */
grafcan.changeLayerState = function(servicio, capaDesc, isVisible) {
	var mapType;
	var mapLayers = new Array();
	var global = map.cfg.groups;
	// Establecemos la visibilidad de la capa del servicio
	var svc = map.cfg.getService(servicio);
	var lyr = svc.getLayerByDesc(capaDesc);
	if (lyr) {
		//if (lyr.visible==isVisible) return;
		lyr.visible = isVisible;
	}
	//
	if (lyr.singleTile) {
		if (isVisible) {
			showSingleTile({gmap:map,layerName:lyr.name,visible:true});
		} else {
			grafcan.removeMapOverlay(map,lyr.name);
		}
		return;
	}
	//
	for (var h in global) {
		for (var i in global[h].services) {
			if (global[h].services[i].name==servicio) {
				var googleLayer_count = 0;
				var vistas = new Array();
				//for (var j in global[h].services[i].layers) {
				for (var sorted_j=0;sorted_j<global[h].services[i].sorted_layers.length;sorted_j++) {
					var j = global[h].services[i].sorted_layers[sorted_j];
					if (global[h].services[i].layers[j].visible && !global[h].services[i].layers[j].singleTile) {
						var name = global[h].services[i].layers[j].name;
						var layers = global[h].services[i].layers[j].layers;
						var format = global[h].services[i].layers[j].format;
						var baseUrl = global[h].services[i].layers[j].baseUrl;
						var tileUrl = global[h].services[i].layers[j].tileFunction;						
						var getOpacity = global[h].services[i].layers[j].opacity;
						mapLayers[name] = new GTileLayer(new GCopyrightCollection(global[h].services[i].copyrightCollection),
														 global[h].services[i].layers[j].visibility.minResolution,
														 global[h].services[i].layers[j].visibility.maxResolution,
														 {opacity:getOpacity});
						mapLayers[name].myLayers = layers;
						mapLayers[name].myFormat = format;
						mapLayers[name].myBaseURL = baseUrl;
						if (tileUrl) {
							mapLayers[name].getTileUrl = eval(tileUrl);
						}
						var googleLayer = (global[h].services[i].layers[j].type)?true:false;
						if (googleLayer) {
							vistas.push(eval(global[h].services[i].layers[j].type));
							googleLayer_count++;
						} else
							vistas.push(mapLayers[global[h].services[i].layers[j].name]);
					}
				}
				var opciones;
				if (googleLayer_count>0) {
					opciones = G_SATELLITE_MAP;
				} else
					opciones = {maxResolution: global[h].services[i].visibility.maxResolution, minResolution: global[h].services[i].visibility.minResolution};
				mapType = new GMapType(vistas, G_SATELLITE_MAP.getProjection(), global[h].services[i].name, opciones);
			}
		}
	}
	vistas=null;
	mapLayers=null;
	//
	map.getMapTypes().length = 0;
	map.addMapType(mapType);
	// visibilidad capas por rango de zoom
	grafcan.setupTreeView(mapType.getName());
	//
	map.setMapType(mapType);
	mapType=null;
}

///////////////////////////////////////////////////////
/*
 * Variable Mapa (navegación)
 */
var map = null;
var map1 = null;
var map2 = null;
/*
 * Variable Mapa (impresión)
 */
var opacidad = 0.1;

function showEscala() {	
	if (!grafcan.useScaleAprox) return;
	//var escala = EscalaAproximada(map);	
	//$set_innerText("spanScale", formatNumber(escala, 0));
	//$set_innerText("spanScale", formatNumber(escala, 0));
	var level2scale = {20:'500',19:'1.000',18:'2.000',17:'4.000',16:'8.000',15:'16.000',14:'32.000',13:'64.000',12:'125.000',11:'250.000',10:'500.000',9:'1.000.000',8:'2.000.000',7:'4.000.000'};
	var zoomLevel = map.getZoom();
	if (zoomLevel<7 || zoomLevel>20) {
		$id("scale").style.display = "none";
		$id("scale_").style.display = "none";
	} else {
		var escala = level2scale[zoomLevel];
		$set_innerText("spanScale", escala);
		$id("scale").style.display = "block";
		$id("scale_").style.display = "block";
	}
}
// Establece tool mode
function setToolMode(mode) {
	grafcan.lastToolMode = grafcan.toolMode.none;
	//if (!mode) mode = grafcan.defaultToolMode;
	//
	if (!grafcan.isOneTimeToolMode(mode) && map.toolMode) {
		switch (map.toolMode) {
			case grafcan.toolMode.zoomBox:
				if (grafcan.isFixedToolMode(mode))
					map.zoomBoxControl.resetDragZoom_();
				break;
			case grafcan.toolMode.measureLength:
			case grafcan.toolMode.measureArea:
			case grafcan.toolMode.perfil:
				grafcan.endMeasure(2);
				break;
			case grafcan.toolMode.setMarker:
				grafcan.endMarker();
				break;
		}
	}
	//
	if (grafcan.isFixedToolMode(mode)) {
		map.toolMode = mode;
		if (grafcan.syncMode!=grafcan.enumSync.none) map2.toolMode = mode;
	}
	//
	switch (mode) {
		case grafcan.toolMode.zoomIn:
			grafcan.zoomIn();
			break;
		case grafcan.toolMode.zoomOut:
			grafcan.zoomOut();
			break;
		case grafcan.toolMode.zoomBox:
			map1.zoomBoxControl.doClick();
			if (grafcan.syncMode!=grafcan.enumSync.none) map2.zoomBoxControl.doClick();
			break;
		case grafcan.toolMode.zoomIni:
			map.setCenter(new GLatLng(grafcan.Ini_Lat, grafcan.Ini_Lon), iniZoomLevel());
			break;
		case grafcan.toolMode.backToLast:
			//map.returnToSavedPosition();
			map.returnToLastPos();
			break;
		case grafcan.toolMode.linkToView:
			showCurrentViewURL();
			break;
		case grafcan.toolMode.exportToKML:
			//export2KML();
			cosas2KML();
			break;
		case grafcan.toolMode.measureLength:
			grafcan.makeMeasure(1);
			break;
		case grafcan.toolMode.measureArea:
			grafcan.makeMeasure(2);
			break;
		case grafcan.toolMode.setMarker:
			grafcan.beginMarker();
			break;
		case grafcan.toolMode.perfil:
			grafcan.makeMeasure(1, true);
			break;
		case grafcan.toolMode.info:
			setMapCursor("pointer");
			toolbarDisableAll(); // info es la herramienta por defecto y sin botón en la barra de herramientas
			break;
		case grafcan.toolMode.route:
			activateResultados(true);
			break;
		case grafcan.toolMode.none:
			setMapCursor("auto");
			toolbarDisableAll();
			break;
		case grafcan.toolMode.goto3D:
			goto3D();
			break;
		case grafcan.toolMode.panoramio:
			if (grafcan.panoramioOverlay) {
				map.removeOverlay(grafcan.panoramioOverlay);
				grafcan.panoramioOverlay = null;
			} else {
				grafcan.panoramioOverlay = new GLayer("com.panoramio.all");
				map.addOverlay(grafcan.panoramioOverlay);
			}
			break;
		case grafcan.toolMode.wiki:
			if (grafcan.wikiOverlay) {
				map.removeOverlay(grafcan.wikiOverlay);
				grafcan.wikiOverlay = null;
			} else {
				grafcan.wikiOverlay = new GLayer("org.wikipedia.es")
				map.addOverlay(grafcan.wikiOverlay);
			}
			break;
		case grafcan.toolMode.sync:
			configSync();
			break;
	}
}
//

function map_maptypechanged() {
	grafcan.clearMapOverlay(map1);
	getSingleTiles(map1);
	var curCfg = grafcan.currentMapCfg();
	// servicio 3D
	if (grafcan.tool3D) {
		if (curCfg.baseUrl3D && curCfg.baseUrl3D!='') {
			$id('goto3D').style.display = 'inline';
		} else {
			$id('goto3D').style.display = 'none';
		}
	}
}
function map2_maptypechanged() {
	grafcan.clearMapOverlay(map2);
	getSingleTiles(map2);
}
function map_click(overlay, point) {
	grafcan.clickS1++;
	setTimeout(function() {
		if (grafcan.clickS1%2==0) return;
		grafcan.clickS1--;
		//
		switch (map.toolMode) {
			case grafcan.toolMode.info:
				var curCfg = grafcan.currentMapCfg(true);
				if (curCfg.query.queryUrl==''||curCfg.query.queryLayers=='') {
					alert(_("El servicio activo no dispone de capa informativa"));
				} else {
					if (overlay) return;
					getInfo(point, curCfg);
				}
				break;
		}
		if (grafcan.isOneTimeToolMode(map.toolMode)) {
			setToolMode(grafcan.defaultToolMode);
		}
	}, 500);
}
function map2_click(overlay, point) {
	grafcan.clickS2++;
	setTimeout(function() {
		if (grafcan.clickS2%2==0) return;
		grafcan.clickS2--;
		//
		switch (map.toolMode) {
			case grafcan.toolMode.info:
				var curCfg = grafcan.currentMapCfg(true);
				if (curCfg.query.queryUrl==''||curCfg.query.queryLayers=='') {
					alert(_("El servicio activo no dispone de capa informativa"));
				} else {
					if (overlay) return;
					getInfo(point, curCfg);
				}
				break;
		}
		if (grafcan.isOneTimeToolMode(map.toolMode)) {
			setToolMode(grafcan.defaultToolMode);
		}
	}, 500);
}
function map_dblclick(overlay, latlng) {
	if (grafcan.clickS1%2!=0) grafcan.clickS1--;
}
function map2_dblclick(overlay, latlng) {
	if (grafcan.clickS2%2!=0) grafcan.clickS2--;
}
function checkZ() {
	try {
		if (!grafcan.lastMouseLatLng || !grafcan.lastMouseLatLng.equals(grafcan.mouseLatLng)) {
			var point = map.fromLatLngToContainerPixel(grafcan.mouseLatLng);
			var utm = new geo2utm(map.fromContainerPixelToLatLng(point));
			var url = 'http://visor.grafcan.es/mdt/getz/'+parseInt(utm.x)+'/'+parseInt(utm.y)+'/';
			GDownloadUrl(url, function(data, responseCode) {
								   if (responseCode==200) {
									   var z = data.substring(data.indexOf('<z>')+3,data.indexOf('</z>'));
									   $id('altitud').className = 'activo';
									   $set_innerText("altitud", 'z: '+formatNumber(z,2)+' m.');
								   }
							}
			);
		}
		grafcan.lastMouseLatLng=grafcan.mouseLatLng;
	} catch(e) {}
}
function map_mousemove(point) {
	$id('altitud').className = 'inactivo';
	grafcan.overMap = map1;
	// coordenadas ratón
	grafcan.mouseLatLng = point;
	// Coordenadas UTM
	var coord = new geo2utm(point);
	var lat = new DegreesFormat(point.lat(), true, 2).formatted;
	var lon = new DegreesFormat(point.lng(), false, 2).formatted;
	var x = formatNumber(coord.x, 2);
	var y = formatNumber(coord.y, 2);
	coord=null;
	$set_innerText("coordLat", lat);
	$set_innerText("coordLon", lon);
	$set_innerText("coordX", x);
	$set_innerText("coordY", y);
	$id("coords").style.display = "block";
	$id("coords_").style.display = "block";
	// Para mantener en cada momento el cursor de la herramienta seleccionada
	switch (map.toolMode) {
		case grafcan.toolMode.measureLength:
		case grafcan.toolMode.measureArea:
			setMapCursor("crosshair");
			break;
		case grafcan.toolMode.info:
			setMapCursor("pointer");
			break;
	}
}
function map2_mousemove(point) {
	grafcan.overMap = map2;
	// coordenadas ratón
	grafcan.mouseLatLng = point;
}
function map_keydown(e) {
	var keyCode = $keyCode(e);
	if (keyCode==16 && grafcan.overMap.toolMode!=grafcan.toolMode.zoomBox && grafcan.isZoomBoxUsable(grafcan.overMap.toolMode)) { // init zoomBox
		grafcan.lastToolMode = grafcan.overMap.toolMode;
		grafcan.overMap.zoomBoxControl.doClick();
		grafcan.overMap.toolMode = grafcan.toolMode.zoomBox;
	}
	else if (keyCode==27 && grafcan.overMap.toolMode==grafcan.toolMode.zoomBox) { // cancel zoomBox
		//grafcan.overMap.toolMode = grafcan.defaultToolMode;
		grafcan.overMap.toolMode = grafcan.lastToolMode;
		grafcan.overMap.zoomBoxControl.cancelZoomBox();
	}
	return true;
}
function map_keyup(e) {
	var keyCode = $keyCode(e);
	if (keyCode==16 && grafcan.overMap.toolMode==grafcan.toolMode.zoomBox) { // cancel zoomBox
		//grafcan.overMap.toolMode = grafcan.defaultToolMode;
		grafcan.overMap.toolMode = grafcan.lastToolMode;
		grafcan.overMap.zoomBoxControl.cancelZoomBox();
	}
	return true;
}
function map_zoomstart(direction, pivot, recentering) {
	//map.savePosition();
	map.saveLastPos();
	//
	if (map==map1) grafcan.setupTreeView(map.getCurrentMapType().getName(), map.getZoom()+direction);
	//
	if (grafcan.debug.enabled) {		
		$set_innerText("lastZoomLevel", map.getZoom());
		$set_innerText("currentZoomLevel", map.getZoom()+direction);
	}
}
function map2_zoomstart(direction, pivot, recentering) {
	map2.saveLastPos();
	//
	if (map==map2) grafcan.setupTreeView(map2.getCurrentMapType().getName(), map2.getZoom()+direction);
}
function map_zoomend(oldlevel, newlevel) {
	if (grafcan.syncMode && map2.invalidZoomLevel(newlevel)) {
		map.returnToLastPos();
		return;
	}
	//map.saveLastPos();
	if (map==map1) grafcan.setupTreeView(map.getCurrentMapType().getName(), newlevel);
	//
	grafcan.clearQueryOverlay();
	if (newlevel<grafcan.minOverviewZoomLevel)
		grafcan.overviewMapControl.hide(true);
	//
	if (grafcan.debug.enabled) grafcan.debug.flag = false;
	// Escala aproximada
	showEscala();
}
function map2_zoomend(oldlevel, newlevel) {
	if (grafcan.syncMode && map1.invalidZoomLevel(newlevel)) {
		map2.returnToLastPos();
		return;
	}
	//map2.saveLastPos();
	if (map==map2) grafcan.setupTreeView(map2.getCurrentMapType().getName(), newlevel);
}
function map_movestart() {
	//map.savePosition();
	map.saveLastPos();
	grafcan.clearQueryOverlay();
	if (!grafcan.overlayRepository) {
		try{
			map.removeOverlay(grafcan.overlay);
			grafcan.overlay = null;
		}catch(e){}
	}
}
function map_move() {
	// Perform the check and return if OK
	var C = map.getCenter();
	var X = C.lng();
	var Y = C.lat();
	var Z = map.getZoom();
	if (grafcan.boundsLimit.contains(C)) return;
	// Nos reposicionamos
	var AmaxX = grafcan.boundsLimit.getNorthEast().lng();
	var AmaxY = grafcan.boundsLimit.getNorthEast().lat();
	var AminX = grafcan.boundsLimit.getSouthWest().lng();
	var AminY = grafcan.boundsLimit.getSouthWest().lat();
	if (X < AminX) {X = AminX;}
	if (X > AmaxX) {X = AmaxX;}
	if (Y < AminY) {Y = AminY;}
	if (Y > AmaxY) {Y = AmaxY;}
	map.setCenter(new GLatLng(Y,X));
}
function map_moveend() {	
	getSingleTiles(map1);
	if (grafcan.syncMode) {
		//if (!map2.invalidZoomLevel(map1.getZoom())) map1.saveLastPos();
		if (!map2.locked) grafcan.synchronizeMap2(map1.getCenter(), map1.getZoom());
	}
}
function map2_moveend() {
	getSingleTiles(map2);
	if (grafcan.syncMode) {
		//if (!map1.invalidZoomLevel(map2.getZoom())) map2.saveLastPos();
		if (!map1.locked) grafcan.synchronizeMap1(map2.getCenter(), map2.getZoom());
	}
}
function map_drag() {
	if (grafcan.syncMode && !map2.locked) grafcan.synchronizeMap2(map1.getCenter(), map1.getZoom());
}
function map2_drag() {
	if (grafcan.syncMode && !map1.locked) grafcan.synchronizeMap1(map2.getCenter(), map2.getZoom());
}
function map_addoverlay(overlay) {
	//alert('Se ha agregado un nuevo overlay al mapa');
}
function document_keydown(event) {
	if (event.ctrlKey && event.altKey && String.fromCharCode(event.keyCode).toUpperCase()=='D') {
		// Enlazar con la vista actual
		showCurrentViewURL();
	}
}
// Fin listeners

// Herramientas y controles
function imgOver(img) {
	if (img.tagName!="IMG") return;
	var src = img.src;
	img.src = src.replace("_off.", "_on.");
}
function imgOut(img) {
	if (img.tagName!="IMG") return;
	var src = img.src;
	img.src = src.replace("_on.", "_off.");
}
function toolbarOver(obj) {
	if (obj.toolMode && obj.toolMode==map.toolMode) return;
	if (obj.childNodes[0].tagName!="IMG") return;
	var src = obj.childNodes[0].src;
	obj.childNodes[0].src = src.replace("_off.", "_on.");
}
function toolbarOut(obj, forzar) {
	if (obj.toolMode && obj.toolMode==map.toolMode && !forzar) return;
	if (obj.childNodes[0].tagName!="IMG") return;
	var src = obj.childNodes[0].src;
	obj.childNodes[0].src = src.replace("_on.", "_off.");
}
function toolbarClick(obj) {
	if (map.toolMode==obj.toolMode) {
		setToolMode(grafcan.defaultToolMode);
		return;
	}
	//
	setToolMode(obj.toolMode);
	//
	var toolBar = $id("toolbar");
	var a = toolBar.getElementsByTagName("A");
	for (var i=0; i<a.length; i++) {
		if (obj.id==a[i].id && (grafcan.isFixedToolMode(obj.toolMode) || grafcan.isOneTimeToolMode(obj.toolMode)))
			toolbarOver(a[i]);
		else
			toolbarOut(a[i]);
	}
}
function toolbarDisableAll() {
	var toolBar = $id("toolbar");
	var a = toolBar.getElementsByTagName("A");
	for (var i=0; i<a.length; i++)
		toolbarOut(a[i], true);
}
function addToolBar() {
	var opacHtml = '<span style="display:none">&nbsp;'+_('Opacidad')+'&nbsp;<a href="#" id="opac_mas" style="font-size:10px;font-family:Verdana">+</a>'
				 + '<a href="#" id="opac_menos" style="font-size:10px;font-family:Verdana">-</a></span>';
	var html = '<a href="#" id="zoombox" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/ventana_off.gif" BORDER="0" NAME="objZoomBox" title="'+_("Zoom ventana")+'"/></a>'
  	   + '<a href="#" id="zoomin" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/acercar_off.gif" BORDER="0" NAME="objZoomIn" title="'+_("Acercar")+'"/></a>'
	   + '<a href="#" id="zoomout" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/alejar_off.gif" BORDER="0" NAME="objZoomOut" title="'+_("Alejar")+'"/></a>'
	   + '<a href="#" id="zoomini" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/extension_off.gif" BORDER="0" NAME="objZoomIni" title="'+_("Vista inicial")+'"/></a>'
	   + '<a href="#" id="backToLast" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/back_off.gif" BORDER="0" NAME="objBackToLast" title="'+_("Vista anterior")+'"/></a>'
	   + '<a href="#" id="linkToView" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/link_off.gif" BORDER="0" NAME="objLinkToView" title="'+_("Enlace a la vista actual")+'"/></a>'
	   + '<a href="#" id="exportToKML" style="display:none" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/export2KML_off.gif" BORDER="0" NAME="objExportToKML" title="'+_('Exportar a KML')+'"/></a>'
	   + '<a href="#" id="measureLength" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/medir_off.gif" BORDER="0" NAME="objMeasureLength" title="'+_('Medir longitudes')+'"/></a>'
	   + '<a href="#" id="measureArea" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/superficie_off.gif" BORDER="0" NAME="objMeasureArea" title="'+_('Medir áreas')+'"/></a>'
	   /*+ (grafcan.enableSetMarker?'<a href="#" id="setMarker" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/marker_off.gif" BORDER="0" NAME="objSetMarker" title="'+_('Establecer marcador')+'"/></a>':'')*/
	   + '<a href="#" id="perfil" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/perfil_off.gif" BORDER="0" NAME="objPerfil" title="'+_('Calcular perfil')+'"/></a>'
	   + '<a href="#" id="print" onclick="printMap2()" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/imprimir_off.gif" BORDER="0" NAME="objPrint" title="'+_('Imprimir')+'"/></a>'
	   /*+ '<a href="#" id="info" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/informacion_off.gif" BORDER="0" NAME="objInfo" title="Informaci&oacute;n"/></a>'*/
	   + (grafcan.toolRutas?'<a href="#" id="route" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/recorrido_off.gif" BORDER="0" NAME="objRoute" title="'+_('Cálculo de rutas')+'"/></a>':'')
	   + '<a href="#" onclick="WMS_function(\'menu\', event)" id="customize" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/capas_off.gif" BORDER="0" NAME="objCustomize" title="'+_('Personalizar contenidos')+'"/></a>'
	   + (grafcan.panoramio?'<a href="#" id="panoramio" toolMode="-1" onclick="toolbarClick(this);return false" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/panoramio_off.gif" BORDER="0" NAME="objPanoramio" title="Panoramio"/></a>':'')
	   + (grafcan.wiki?'<a href="#" id="wiki" toolMode="-1" onclick="toolbarClick(this);return false" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/wiki_off.gif" BORDER="0" NAME="objWikipedia" title="Wikipedia"/></a>':'')
	   + (grafcan.tool3D?'<a href="#" id="goto3D" toolMode="-1" onclick="toolbarClick(this);return false" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/3D_off.gif" BORDER="0" NAME="obj3D" title="'+_('Ver en 3D')+'"/></a>':'')
	   + (grafcan.toolSync?'<a href="#" id="sync" toolMode="-1" onclick="toolbarClick(this)" onmouseover="toolbarOver(this)" onmouseout="toolbarOut(this)"><IMG SRC="img/toolbar/dividir_off.gif" BORDER="0" NAME="objSync" id="objSync" title="'+_('Ventana doble')+'"/></a>'
	   + '<div id="syncOp"></div>':'')
	   + opacHtml
	   + '<ul id="sidebar-controls">'
	   + (grafcan.logoToolBar['enabled']?'<li><a href="'+grafcan.logoToolBar['href']+'" target="_blank" title="'+grafcan.logoToolBar['title']+'"><img src="'+grafcan.logoToolBar['url']+'"'+((grafcan.logoToolBar['border']!='')?' style="'+grafcan.logoToolBar['border']+'"':' border="0"')+'/></a></li>':'')
	   + '</ul>';
	$id('toolbar').innerHTML = html;
	$id('zoomin').toolMode = grafcan.toolMode.zoomIn;
	$id('zoomout').toolMode = grafcan.toolMode.zoomOut;
	$id('zoombox').toolMode = grafcan.toolMode.zoomBox;
	$id('zoomini').toolMode = grafcan.toolMode.zoomIni;
	$id('backToLast').toolMode = grafcan.toolMode.backToLast;
	$id('linkToView').toolMode = grafcan.toolMode.linkToView;
	$id('exportToKML').toolMode = grafcan.toolMode.exportToKML;
	$id('measureLength').toolMode = grafcan.toolMode.measureLength;
	$id('measureArea').toolMode = grafcan.toolMode.measureArea;
	/*if (grafcan.enableSetMarker) $id('setMarker').toolMode = grafcan.toolMode.setMarker;*/
	$id('perfil').toolMode = grafcan.toolMode.perfil;
	if (grafcan.toolRutas) $id('route').toolMode = grafcan.toolMode.route;
	//$id('info').toolMode = grafcan.toolMode.info;
	if (grafcan.tool3D) $id('goto3D').toolMode = grafcan.toolMode.goto3D;
	if (grafcan.panoramio) $id('panoramio').toolMode = grafcan.toolMode.panoramio;
	if (grafcan.wiki) $id('wiki').toolMode = grafcan.toolMode.wiki;
	if (grafcan.toolSync) $id('sync').toolMode = grafcan.toolMode.sync;
	
	/*$id('opac_mas').onclick = function () {opacidad += 0.15;var cm = map.getCurrentMapType();map.setMapType(map.services["Ortofotos"]); map.setMapType(cm);};
	$id('opac_menos').onclick = function () {opacidad -= 0.15;var cm = map.getCurrentMapType();map.setMapType(map.services["Ortofotos"]); map.setMapType(cm);};*/
}
function renderPerfil() {
    grafcan.measurePanel = new Ext.FormPanel({
		border:false,
		bodyStyle:'padding:10px;',
		defaultType:'textfield',
		items:[{id:'length-data',
			    fieldLabel:_('Distancia'),
				labelStyle:'font-weight:bold',
			 	labelSeparator:'',
			 	readOnly:true,
				width:120}
		],
        bbar: new Ext.Toolbar({
            defaultText: '',
            statusAlign: 'right',
            items: [{id:'medicionPerfil',text:_('Crear perfil'),listeners:{'click':function(b,e){grafcan.endMeasure(1,true)}}},
					'-',
					{id:'medicionBorrar',text:_('Borrar perfil'),listeners:{'click':function(b,e){b.ownerCt.ownerCt.getForm().reset();grafcan.endMeasure(0)}}}]
        })
    });
	grafcan.measureWin = new Ext.Window({
		title:_('Perfil del terreno'),
		resizable:false,
		constrain:true,
		width:260,autoHeight:true,
		items:[grafcan.measurePanel],
		listeners: {
			'close': function(b,e){setToolMode(grafcan.defaultToolMode)}
		}
	});
}
function renderArea() {
    grafcan.measurePanel = new Ext.FormPanel({
		border:false,
		bodyStyle:'padding:10px;',
		defaultType:'textfield',
		items:[{id:'length-data',
			    fieldLabel:_('Distancia'),
				labelStyle:'font-weight:bold',
			 	labelSeparator:'',
			 	readOnly:true,
				width:120},
			   {id:'area-data',
			    fieldLabel:_('Área'),
				labelStyle:'font-weight:bold',
			 	labelSeparator:'',
			 	readOnly:true,
				width:120}
		],
        bbar: new Ext.Toolbar({
            defaultText: '',
            statusAlign: 'right',
            items: [{id:'medicionBorrar',text:_('Borrar'),listeners:{'click':function(b,e){b.ownerCt.ownerCt.getForm().reset();grafcan.endMeasure(0)}}},
				    {id:'medicionExportar',text:_('Exportar a KML'),listeners:{'click':export2KML}}]
        })
    });
	grafcan.measureWin = new Ext.Window({
		title:_('Medición de área'),
		resizable:false,
		constrain:true,
		width:260,autoHeight:true,
		items:[grafcan.measurePanel],
		listeners: {
			'close': function(b,e){setToolMode(grafcan.defaultToolMode)}
		}
	});
}
function renderLength() {
    grafcan.measurePanel = new Ext.FormPanel({
		border:false,
		bodyStyle:'padding:10px;',
		defaultType:'textfield',
		items:[{id:'length-data',
			    fieldLabel:_('Distancia'),
				labelStyle:'font-weight:bold',
			 	labelSeparator:'',
			 	readOnly:true,
				width:120}
		],
        bbar: new Ext.Toolbar({
            defaultText: '',
            statusAlign: 'right',
            items: [{id:'medicionBorrar',text:_('Borrar'),listeners:{'click':function(b,e){b.ownerCt.ownerCt.getForm().reset();grafcan.endMeasure(0)}}},
   				    {id:'medicionExportar',text:_('Exportar a KML'),listeners:{'click':export2KML}}]

        })
    });
	grafcan.measureWin = new Ext.Window({
		title:_('Medición de longitud'),
		resizable:false,
		constrain:true,
		width:260,autoHeight:true,
		items:[grafcan.measurePanel],
		listeners: {
			'close': function(b,e){setToolMode(grafcan.defaultToolMode)}
		}
	});
}
function addCustomWMSPanel() {
	if (grafcan.enableLoadKML) {
		var items = [
			{id:'wms_add',text:_('Agregar servicio'),handler:function(event){WMS_function('new',event)}},
			{id:'wms_edit',text:_('Editar servicio'),disabled:true,handler:function(event){WMS_function('edit',event)}},
			{id:'wms_del',text:_('Eliminar servicio'),disabled:true,handler:function(event){WMS_function('del',event)}},
			'-',
			{id:'wms_loadKML',text:_('Cargar KML'),handler:function(event){WMS_function('loadKML',event)}},
			{id:'wms_unloadKML',text:_('Eliminar KML'),handler:function(event){WMS_function('unloadKML',event)},disabled:(grafcan.kmlUser?false:true)},
			'-',
			{id:'wms_save',text:_('Guardar servicios'),disabled:true,handler:function(event){WMS_function('save',event)}},
			{id:'wms_load',text:_('Cargar servicio'),handler:function(event){WMS_function('load',event)}}
		];
	} else {
		var items = [
			{id:'wms_add',text:_('Agregar servicio'),handler:function(event){WMS_function('new',event)}},
			{id:'wms_edit',text:_('Editar servicio'),disabled:true,handler:function(event){WMS_function('edit',event)}},
			{id:'wms_del',text:_('Eliminar servicio'),disabled:true,handler:function(event){WMS_function('del',event)}},
			'-',
			{id:'wms_save',text:_('Guardar servicios'),disabled:true,handler:function(event){WMS_function('save',event)}},
			{id:'wms_load',text:_('Cargar servicio'),handler:function(event){WMS_function('load',event)}}
		];
	}
	grafcan.customMenu = new Ext.menu.Menu({id:'customMenu', items:items});
	grafcan.customMenu.on('itemClick', function(baseItem, e) {grafcan.customMenu.hide()});
}
function addZoomBoxControl(mmap) {
	var styleOpts = {};
	var otherOpts = {};
	styleOpts.opacity = 0.0;
	styleOpts.border = '2px solid yellow';
	styleOpts.fillColor = '#000000';
	otherOpts.buttonZoomingHTML = '';
	otherOpts.buttonStyle = {visibility:'hidden'};
	otherOpts.stickyZoomEnabled = false;
	otherOpts.overlayRemoveTime = 3000;
	//zcontrol = new DragZoomControl(styleOpts, otherOpts, {dragend:toolbarDisableAll});
	//var zcontrol = new DragZoomControl(styleOpts, otherOpts, {dragend:function(){setToolMode(grafcan.defaultToolMode);}});
	var zcontrol = new DragZoomControl(styleOpts, otherOpts,
									   {dragend:function(){
											if (grafcan.lastToolMode!=grafcan.toolMode.none)
												// recuperamos el modo anterior
												grafcan.overMap.toolMode = grafcan.lastToolMode;
											else
												setToolMode(grafcan.defaultToolMode);}
											});
	mmap.addControl(zcontrol);
	mmap.zoomBoxControl = zcontrol;
}
function addContentPanel() {
	// Panel lateral (contenidos, búsquedas, ...)
	var html = '';
	// Búsquedas	
	if (grafcan.tabBusquedas) {
		// Toponimia
		html += '<table width="95%" border="0" cellspacing="0" cellpadding="2" style="margin:5px 5px 0 5px">'
			 + '<tr><th colspan="2" align="left">'+_('Búsquedas')+'</th></tr>'
			 + '<tr><td height="5" colspan="2"></td></tr>'
			 + '<tr>'
			 + '<td width="72%"><input type="text" id="toponimo" name="toponimo" size="35" class="input" maxlength="100" onFocus="this.select()" onkeypress="if(event.keyCode==13){Ext.getCmp(\'cmdToponimia\').fireEvent(\'click\');}" title="'+_('Cadena de búsqueda')+'"/></td>'
			 + '<td align="left"><div id="div-cmdToponimia"></div></td>'
			 + '</tr>'
			 + '<tr><td height="3" colspan="2"></td></tr>'
			 + '<tr><td colspan="2" height="20"><input id="filtrarZona" type="checkbox" title="'+_('Restringe la búsqueda a la zona visualizada actualmente en el mapa')+'"/>&nbsp;<font size="-2">'+_('Limitar la b&uacute;squeda a la extensi&oacute;n actual')+'</font>'
			 + '<br/><a id="hrefAyuda" href="#" onclick="activateAyudaBusquedas()">'+_('Ayuda')+'</a>'
			 + '<div id="divAyuda" style="display:none"><p style="text-align:justify;font-size:10px">'+_('topoAyuda1')+'</p>'
			 + '<p style="text-align:justify;font-size:10px">'+_('topoAyuda2')+'</p>'
			 + '<p style="text-align:justify;font-size:10px">'+_('topoAyuda3')+'</p>'
			 + '<p style="font-size:10px">'+_('topoAyuda4')+':'
			 + '<p style="padding-left:30px;font-size:10px;font-style:italic;line-height:25px">'+_('topoAyuda5')+'</p></p></div>'
			 + '</td></tr></table>'
			 + '<center><img id="imgBusquedas" src="img/inProcess.gif" vspace="1" style="visibility:hidden;margin-top:4px;border:solid 1px #003366" border="1"/></center>'
			 + '<div id="busquedas-resultados-panel">'
			 + '	<p style="font-size:10px;text-align:right">'
			 + '		<a href="#" id="button-busquedas-close" onclick="activateBusquedas(false)"><img src="img/close12_1.gif" border="0"/></a>'
			 + '	</p>'
			 + '	<div style="font-family:Verdana;font-size:11px;font-weight:bold;margin-top:-23px;color:#003366">'+_('topoAyuda6')+'</div>'
			 + '	<div id="busquedas-resultados-div"></div>'
			 + '</div>'
	 		 + '<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td style="border-top:solid 1px #003366">&nbsp;</td></tr></table>';
	}
	// Coordenadas
	html += '<table id="tblCoordenadas" width="95%" border="0" cellspacing="0" cellpadding="0" style="margin:0 5px 0 5px">'
		 + '<tr><th colspan="2" align="left">'+_('Localización por coordenadas')+'</th></tr>'
		 + '<tr><td height="5" colspan="2"></td></tr>'
		 + '<tr><td valign="bottom" align="left" width="72%"><label><input type="radio" name="optCoord" value="1" checked="checked" onclick="if(this.checked){$id(\'searchUTM\').style.display=\'block\';$id(\'searchLatLon\').style.display=\'none\';}"/>UTM</label>'
		 + '&nbsp;&nbsp;<label><input type="radio" name="optCoord" value="2" onclick="if(this.checked){$id(\'searchLatLon\').style.display=\'block\';$id(\'searchUTM\').style.display=\'none\';}"/>'+_('Geogr&aacute;ficas')+'</label></td>'
		 + '<td align="left"><div id="div-cmdIrA"></div></td>'
		 + '</tr>'
		 + '<tr>'
		 + '<td align="left" valign="bottom" colspan="4">'
		 + '<div id="searchUTM" style="margin-left:13px;margin-top:5px;margin-bottom:2px;"><table class="sInfoTecnica" cellspacing="0" cellpadding="0">'
		 + '<tr><td valign="bottom">X</td>'
		 + '<td width="10"></td>'
		 + '<td valign="bottom">Y</td></tr>'
		 + '<tr><td valign="top">'
		 + '		<input id="utmX" type="text" class="input" value="" size=16 maxsize="6" onFocus="this.select()" onKeyPress="return numeros(event)" title="'+_('Coordenada')+' X"/>'
		 + '	</td>'
		 + '	<td width="10"></td>'
		 + '	<td valign="top">'
		 + '		<input id="utmY" class="input" value="" size=17 maxsize="7" onFocus="this.select()" onKeyPress="return numeros(event)" title="'+_('Coordenada')+' Y"/>'
		 + '	</td></tr>'
		 + '</table></div>'
		 + '<div id="searchLatLon" style="display:none;margin-left:13px;margin-top:5px;margin-bottom:2px;"><table class="sInfoTecnica" cellspacing="0" cellpadding="0">'
		 + '<tr><td>'+_('Latitud')+'&nbsp;</td><td valign="top">'
		 + '		<input id="searchLat_deg" type="text" class="input" value="0" size=2 maxsize=2 onFocus="this.select()" onKeyPress="return numeros(event,true)" title="'+_('Latitud')+' ('+_('grados')+')"/><font size="+1">°</font>'
		 + '        <input id="searchLat_min" type="text" class="input" value="0" size=2 maxsize=2 onFocus="this.select()" onKeyPress="return numeros(event,true)" title="'+_('Latitud')+' ('+_('minutos')+')"/><font size="+1">\'</font>'
		 + '        <input id="searchLat_sec" type="text" class="input" value="0" size=5 maxsize=5 onFocus="this.select()" onKeyPress="return numeros(event,true)" title="'+_('Latitud')+' ('+_('segundos')+')"/><font size="+1">\'\'</font>'
		 + '        &nbsp;N<button id="searchLat_ns" style="display:none;width:20px" onclick="($get_innerText(this)==\'N\')?$set_innerText(this,\'S\'):$set_innerText(this,\'N\')" title="'+_('Latitud')+' ('+_('Norte')+' - '+_('Sur')+')"/>N</button>'
		 + '	</td></tr>'
		 + '<tr><td>'+_('Longitud')+'&nbsp;</td><td valign="top">'
		 + '		<input id="searchLon_deg" type="text" class="input" value="0" size=2 maxsize=2 onFocus="this.select()" onKeyPress="return numeros(event,true)" title="'+_('Longitud')+' ('+_('grados')+')"/><font size="+1">°</font>'
		 + '        <input id="searchLon_min" type="text" class="input" value="0" size=2 maxsize=2 onFocus="this.select()" onKeyPress="return numeros(event,true)" title="'+_('Longitud')+' ('+_('minutos')+')"/><font size="+1">\'</font>'
		 + '        <input id="searchLon_sec" type="text" class="input" value="0" size=5 maxsize=5 onFocus="this.select()" onKeyPress="return numeros(event,true)" title="'+_('Longitud')+' ('+_('segundos')+')"/><font size="+1">\'\'</font>'
		 + '        &nbsp;O<button id="searchLon_ew" style="display:none;width:20px" onclick="($get_innerText(this)==\'O\')?$set_innerText(this,\'E\'):$set_innerText(this,\'O\')" title="'+_('Longitud')+' ('+_('Este')+' - '+_('Oeste')+')"/>O</button>'
		 + '	</td></tr>'
		 + '</table></div>'
		 + '</td>'
		 + '</tr>'
		 + '</table>';
    grafcan.tabviewSidebar = new Ext.TabPanel({
        renderTo:'sidebar-panel',
		resizeTabs:true,
        activeTab:0,
		border:false,
        items:[
            {id:'tabContent',contentEl:'content-panel',title:_('Contenidos'),autoHeight:true},
            {id:'tabBusquedas',contentEl:'busquedas-panel',title:_('Búsquedas'),html:html,listeners:{activate:function(){$id('toponimo').focus()}}},
			/*{id:'tabLeyenda',autoHeight:true,contentEl:'leyenda-panel',title:_('Leyenda'),listeners:{activate:grafcan.showLegend},bodyStyle:'background-color:transparent',html:'<div id="divLeyendas" style="width:100%"/>'}*/
			{id:'tabLeyenda',autoHeight:true,contentEl:'leyenda-panel',title:_('Leyenda'),listeners:{activate:grafcan.showLegend},bodyStyle:'background-color:transparent',html:'<div id="divLeyendas" style="width:100%;height:300px"/><iframe id="leyenda" allowtransparency="true" style="background-color:transparent" src="legends/none_'+grafcan.lang+'.htm" frameborder="0" width="100%" height="100%" scrolling="auto"></iframe>'}
        ],
		listeners: {
			tabchange: function(tabPanel,tab) {
					if (tab.id=='tabBusquedas') {
						try{Ext.getCmp('cmdToponimia').destroy()}catch(e){}
						var btnToponimia = new Ext.Button({id:'cmdToponimia',text:_('Buscar'),width:50,tooltip:_('Realizar la búsqueda'),tooltipType:'title'});
						btnToponimia.render('div-cmdToponimia');
						btnToponimia.addListener('click',function(){buscarToponimia(null, null, $id('filtrarZona').checked)});
						try{Ext.getCmp('cmdIrA').destroy()}catch(e){}
						var btnIrA = new Ext.Button({id:'cmdIrA',text:_('Ir a')+'...',tooltip:_('Ir a las coordenadas especificadas'),tooltipType:'title',width:50});
						btnIrA.render('div-cmdIrA');
						btnIrA.addListener('click',function(){situarCoordenadas()});
					}
				}
		}
    });
	// colapso sidebar
	grafcan.sidebarCollapse = new Ext.Toolbar({style:'background:none;z-index:101',width:25,height:25,hidden:true});
	grafcan.sidebarCollapse.render('sidebar-collapse');
	grafcan.sidebarCollapse.add({
		iconCls:'collapse',
		tooltip:_('Ocultar panel'),
		tooltipType:'title',
		handler:function(e){
			if (document.body.className.match('nosidebar')) {
				this.setTooltip(_('Ocultar panel'));
				this.setIconClass('collapse');
				changeBodyClass('nosidebar','sidebar-right');
			} else {
				this.setTooltip(_('Mostrar panel'));
				this.setIconClass('expand');				
				changeBodyClass('sidebar-right','nosidebar');
			}
		}
	});
	grafcan.sidebarCollapse.doLayout();
}
function addBrowsePanel() {
	grafcan.tree = new Ext.tree.TreePanel({
		renderTo:'content-panel',
		bodyBorder:false,
		bodyStyle:'background-color:#ffffff',
		border:false,
		autoWidth:false,
		width:$id('sidebar').offsetWidth,
		autoScroll:true,
		rootVisible:false,
		root:new Ext.tree.AsyncTreeNode({id:'myRootNode'}),
		loader:new Ext.app.ServiceLoader({dataUrl:'config/services.xml'}),
		listeners: {
			'load': function(tp) {
				if (!grafcan.mapInitialized) initMap();
				if (tp.attributes.tagName=='service' && tp.id == grafcan.curService) {
					tp.select();
					tp.expand(); 
				}
			},
			'render': function(tp){
				tp.getSelectionModel().on('beforeselect', function(tree, newNode, oldNode){
					if (newNode.hrefClicked) {
						newNode.hrefClicked = false;
						return false;
					}
					switch(newNode.attributes.tagName) {
						case 'service':
							if (oldNode) {
								oldNode.configureSelect(false);
							}
							newNode.configureSelect(true);
							return true;
							break;
						default:
							return false;
							break;
					}
				});
				tp.getSelectionModel().on('selectionchange', function(tree, node){
				    if (node) {
						if (node.attributes.tagName=='service') {
							grafcan.changeService(null, node.attributes.name);
							// informe de incidencias
							$id('tdErrReport0').style.display = (node.attributes.forError?($ie()?'block':'table-cell'):'none');
							$id('tdErrReport1').style.display = $id('tdErrReport0').style.display;
						}
				    }
				});
			}
		}
	});
}
function controles() {	
	// Toolbar
	addToolBar();
	// Zoom box
	addZoomBoxControl(map1);
	// Escala
	grafcan.scaleControl = new GScaleControl();
	map.addControl(grafcan.scaleControl);
	// Overview
	grafcan.overviewMapControl = new GOverviewMapControl();
	map.addControl(grafcan.overviewMapControl);
	setTimeout("grafcan.overviewMapControl.hide(true)",1000);
	// Panel de menú WMS
	addCustomWMSPanel();
	addContentPanel();
	addBrowsePanel();
}
// Fin de Herramientas y controles

function eventos() {
	//
	GEvent.addListener(map, 'click', map_click);
	GEvent.addListener(map, 'dblclick', map_dblclick);
	GEvent.addListener(map, 'mousemove', map_mousemove);
	GEvent.addListener(map, 'zoomstart', map_zoomstart);
	GEvent.addListener(map, 'zoomend', map_zoomend);
	GEvent.addListener(map, 'movestart', map_movestart);
	GEvent.addListener(map, 'move', map_move);
	GEvent.addListener(map, 'moveend', map_moveend);
	//GEvent.addListener(map, 'addoverlay', map_addoverlay);
	GEvent.addListener(map, 'drag', map_drag);
	// mouse wheel
	GEvent.addDomListener(map.getContainer(), "DOMMouseScroll", wheelZoom);
	GEvent.addDomListener(map.getContainer(), "mousewheel", wheelZoom);
	//
	GEvent.addDomListener(document, "keydown", map_keydown);
	GEvent.addDomListener(document, "keyup", map_keyup);
	GEvent.addDomListener(document, 'keydown', document_keydown);
	//
	GEvent.addListener(map, 'maptypechanged', map_maptypechanged);
}
function eventosSlave(activar) {
	if (activar) {
		//
		grafcan.slaveEvent.click = GEvent.addListener(map2, 'click', map2_click);
		grafcan.slaveEvent.dblclick = GEvent.addListener(map2, 'dblclick', map2_dblclick);
		grafcan.slaveEvent.mousemove = GEvent.addListener(map2, 'mousemove', map2_mousemove);
		grafcan.slaveEvent.zoomstart = GEvent.addListener(map2, 'zoomstart', map2_zoomstart);
		grafcan.slaveEvent.zoomend = GEvent.addListener(map2, 'zoomend', map2_zoomend);
		//grafcan.slaveEvent.movestart = GEvent.addListener(map2, 'movestart', map2_movestart);
		//GEvent.addListener(map2, 'move', map_move);
		grafcan.slaveEvent.moveend = GEvent.addListener(map2, 'moveend', map2_moveend);
		//GEvent.addListener(map2, 'addoverlay', map_addoverlay);
		grafcan.slaveEvent.drag = GEvent.addListener(map2, 'drag', map2_drag);
		// mouse wheel
		grafcan.slaveEvent.DOMMouseScroll = GEvent.addDomListener(map2.getContainer(), "DOMMouseScroll", wheelZoom);
		grafcan.slaveEvent.mousewheel = GEvent.addDomListener(map2.getContainer(), "mousewheel", wheelZoom);
		//
		grafcan.slaveEvent.maptypechanged = GEvent.addListener(map2, 'maptypechanged', map2_maptypechanged);
	} else {
		GEvent.removeListener(grafcan.slaveEvent.click);
		GEvent.removeListener(grafcan.slaveEvent.dblclick);
		GEvent.removeListener(grafcan.slaveEvent.mousemove);
		GEvent.removeListener(grafcan.slaveEvent.zoomstart);
		GEvent.removeListener(grafcan.slaveEvent.zoomend);
		GEvent.removeListener(grafcan.slaveEvent.moveend);
		GEvent.removeListener(grafcan.slaveEvent.drag);
		GEvent.removeListener(grafcan.slaveEvent.DOMMouseScroll);
		GEvent.removeListener(grafcan.slaveEvent.mousewheel);
		GEvent.removeListener(grafcan.slaveEvent.maptypechanged);
	}
}
function wheelZoom(event) {
	if (grafcan.wheelZooming) {
		return;
	}
	grafcan.wheelZooming = true;
	//
	var baseIcon = new GIcon();
	baseIcon.iconSize=new GSize(80,55);
	baseIcon.iconAnchor=new GPoint(40,27);
	var rectIcon = new GIcon(baseIcon, "img/zoomrect.png", null);
	grafcan.zoomRect = new GMarker(grafcan.mouseLatLng,{icon:rectIcon});
	grafcan.overMap.addOverlay(grafcan.zoomRect);
	//
	if (event.cancelable) event.preventDefault();
	grafcan.overMap.closeInfoWindow(); 
	if((event.detail || -event.wheelDelta) < 0) {
		window.setTimeout(function(){
			map1.removeOverlay(grafcan.zoomRect);
			try{map2.removeOverlay(grafcan.zoomRect);}catch(e){}
			grafcan.overMap.zoomIn(grafcan.mouseLatLng,true,true);
			grafcan.wheelZooming = false;
		},300);
	} else {
		window.setTimeout(function(){
			map1.removeOverlay(grafcan.zoomRect);
			try{map2.removeOverlay(grafcan.zoomRect);}catch(e){}
			grafcan.overMap.zoomOut(grafcan.mouseLatLng,true);
			grafcan.wheelZooming = false;
		},300);
	}
	return false; 
}

/*
 * Rutinas de configuración de mapas
 */
grafcan.addService2Tree = function(svc, oldServiceName) {
	var grpNode = grafcan.tree.getNodeById(grafcan.customGroupName);
	if (oldServiceName) {
		var svcNode = grpNode.findChild('id',oldServiceName);
		if (svcNode) grpNode.removeChild(svcNode);
	}
	var svcNode = new Ext.tree.TreeNode({id:svc.name,cls:'treeNode',expanded:true,iconCls:'Service_1',text:svc.desc});
	svcNode.attributes['tagName'] = 'service';
	svcNode.attributes['default'] = false;
	svcNode.attributes['desc'] = svc.desc;
	svcNode.attributes['name'] = svc.name;
	svcNode.attributes['forBrowse'] = true;
	svcNode.attributes['forError'] = svc.forError;
	svcNode.attributes['shortName'] = svc.shortName;
	svcNode.on('click', serviceClick);
	for (var i=0;i<svc.sorted_layers.length;i++) {
		var lyr = svc.layers[svc.sorted_layers[i]];
		if (lyr.name!='ghost') {
			var lyrNode = new Ext.tree.TreeNode({id:lyr.name,cls:'treeNode',iconCls:'Layer_1',text:lyr.desc,leaf:true});
			lyrNode.attributes['tagName'] = 'layer';
			lyrNode.attributes['desc'] = lyr.desc;
			lyrNode.attributes['name'] = lyr.name;
			lyrNode.attributes['fixed'] = false;
			lyrNode.on('click', layerClick);
			svcNode.insertBefore(lyrNode, svcNode.childNodes[0]);
		}
	}
	grpNode.appendChild(svcNode);	
}
grafcan.configureLayer = function(params) {
	var mapLayer = new GTileLayer(new GCopyrightCollection(params.copyrightCollection),
								  params.minResolution,
								  params.maxResolution,
								  {opacity:params.opacity});
	mapLayer.myLayers = params.layers;
	mapLayer.myFormat = params.format;
	mapLayer.myBaseURL = params.baseUrl;
	//
	/*mapLayer.minZoom = params.minResolution;
	mapLayer.maxZoom = params.maxResolution;*/
	//
	if (params.tileFunction) {
		mapLayer.getTileUrl = eval(params.tileFunction);
	}
	return mapLayer;
}
grafcan.viewService = function(svc) {
	var mapType = grafcan.configureService(svc);
	map.getMapTypes().length = 0;
	map.addMapType(mapType);
	map.setMapType(mapType);
	return mapType;
}
grafcan.configureService = function(service) {
	// configura las capas
	var mapLayers = new Array();
	//for (var s in service.layers) {
	for (var i=0;i<service.sorted_layers.length;i++) {
		var s = service.sorted_layers[i];
		if (!service.layers[s].singleTile)
			mapLayers[service.layers[s].name] = grafcan.configureLayer(
				{copyrightCollection:service.copyrightCollection,
				minResolution:service.layers[s].visibility.minResolution,
				maxResolution:service.layers[s].visibility.maxResolution,
				opacity:service.layers[s].opacity,
				layers:service.layers[s].layers,
				format:service.layers[s].format,
				baseUrl:service.layers[s].baseUrl,
				tileFunction:service.layers[s].tileFunction});
	}
	var vistas = new Array();
	var googleLayer = false;
	var googleLayer_count = 0;
	//for (var s in service.layers) {
	for (var i=0;i<service.sorted_layers.length;i++) {
		var s = service.sorted_layers[i];
		if (!service.layers[s].singleTile && service.layers[s].visible) {
			// si tiene definido el elemento <type>, es una capa Google
			googleLayer = (service.layers[s].type)?true:false;
			if (googleLayer) {
				vistas.push(eval(service.layers[s].type));
				googleLayer_count++;
			} else
				vistas.push(mapLayers[service.layers[s].name]);
		}
	}
	var opciones;
	if (googleLayer_count>0) {
		opciones = G_SATELLITE_MAP;
		opciones.maxResolution = service.visibility.maxResolution;
		opciones.minResolution = service.visibility.minResolution;
		opciones.shortName = service.shortName;
		//opciones.textColor = "#ffffff";
	} else
		opciones = {
			shortName: service.shortName,
			minResolution: service.visibility.minResolution,
			maxResolution: service.visibility.maxResolution/*,
			textColor: "#ffffff"*/
		};
	var mapService = new GMapType(vistas,
								  G_SATELLITE_MAP.getProjection(),
								  service.name,
								  opciones);
	mapLayers=vistas=null;
	return mapService;
}
function setupApp(doc) {
/*
 * Configura los servicios
 * Crea una propiedad services en el objeto map (utils.loadConf())
 */
	grafcan.cfg = new wmsConfig();
	// array de TileLayers
	grupos = doc.getElementsByTagName("group");
	var groupName = '';
	for (var h=0; h<grupos.length; h++) {
		if ($isElementNode(grupos[h])) {
			var servicios = grupos[h].childNodes;
			// creamos el grupo
			groupName = $attrValue(grupos[h].attributes, "name");
			grafcan.cfg.createGroup(groupName, $attrValue(grupos[h].attributes, "desc"));
			if (!loadServices(null, groupName, servicios, false)) delete grafcan.cfg.groups[groupName];
		}
	}
	doc=null;
	
	// Objeto mapa
	grafcan.prototypeGMap();
	map1 = new GMap2($id("map1"), {logoPassive:true});
	map1.mapOverlay = new Object();
	map1.cfg = grafcan.cfg;
	map = map1;
	// Servicio inicial
	if (grafcan.params) {
		// servicio
		grafcan.viewService(grafcan.cfg.getService(grafcan.params["servicio"]));
		map.setCenter(new GLatLng(grafcan.params["lat"], grafcan.params["lng"]), grafcan.params["zoom"]);
	} else {
		grafcan.viewService(grafcan.cfg.getDefaultService());
		map.setCenter(new GLatLng(grafcan.Ini_Lat, grafcan.Ini_Lon), iniZoomLevel());		
	}
	map.enableContinuousZoom();

	/*
	 * Configura los controles
	 */	
	Ext.BLANK_IMAGE_URL = '/ext-3.0.0/resources/images/default/s.gif';
	Ext.onReady(controles);

	/*
	 * Configura los eventos
	 */
	eventos();

	/*
	 * Inicializa el mapa
	 */
	//initMap();
	// ahora se inicializa cuando el árbol de contenidos ha terminado su carga
	
	if (grafcan.debug.enabled) $id("zoomlevel").style.display="block";
	
}

function initMap() {
	opacidad = 1.0;

	getSingleTiles(map);

	// parámetros de inicio
	if (grafcan.params) {
		// servicio
		var nodoServicio = grafcan.tree.getNodeById(grafcan.params["servicio"]);
		if (nodoServicio) nodoServicio.select();
		if (params["mkurl"]) {
			grafcan.overlay = new GGeoXml(grafcan.params["mkurl"]);
			addCosa('KML', grafcan.overlay, grafcan.params["mkurl"]);
		} else if (grafcan.params["mklat"] && grafcan.params["mklng"]) {
			grafcan.overlay = new GMarker(new GLatLng(grafcan.params["mklat"], grafcan.params["mklng"]), {title:grafcan.params["mktip"]});
			addCosa('Marcador '+grafcan.overlay.getPoint(), grafcan.overlay);
		}
		if (grafcan.overlay) map.addOverlay(grafcan.overlay);
	}
	
	if (grafcan.minSize>0) {
		$id('header').style.display = 'none';
		$id('titulo').style.display = 'none';
		$id('toolbar').style.margin = 0;
	}
	if (grafcan.embedded>0) {
		grafcan.offsetLeft = (grafcan.embedded==1)?$id('sidebar').offsetWidth:1;
		$id('coords_').style.left = grafcan.offsetLeft+1;
		$id('coords').style.left = grafcan.offsetLeft+1;
		if (grafcan.embedded==1) {
			$id('sidebar').style.left = 0;
			$id('map-wrapper').style.left = grafcan.offsetLeft;
		}
	}
	handleResize();
	
	// Herramienta inicial
	map.toolMode = grafcan.defaultToolMode;
	
	// 3D
	if (!grafcan.currentMapCfg().baseUrl3D || grafcan.currentMapCfg().baseUrl3D=='') {
		try {$id('goto3D').style.visibility = 'hidden';} catch(ex){}
	}
	
	showEscala();
	
	if (grafcan.refreshMap>0) setInterval('grafcan.refreshService()', grafcan.refreshMap);
	
//	if (grafcan.minSize>0) {
//		$id('header').style.display = 'none';
//		$id('titulo').style.display = 'none';
//		$id('toolbar').style.margin = 0;
//	}
//	if (grafcan.embedded>0) {
//		grafcan.offsetLeft = (grafcan.embedded==1)?$id('sidebar').offsetWidth:1;
//		$id('coords_').style.left = grafcan.offsetLeft+1;
//		$id('coords').style.left = grafcan.offsetLeft+1;
//		if (grafcan.embedded==1) {
//			$id('sidebar').style.left = 0;
//			$id('map-wrapper').style.left = grafcan.offsetLeft;
//		}
//	}
	
	if (!$ie()) setTimeout('handleResize()', 2000); // soluciona tamaño en mozilla
	
	grafcan.intervalZ = setInterval("checkZ()",grafcan.checkZTimer);
	
	//addFlagPanel();
	
	grafcan.mapInitialized = true;
	
}

function _init(params) {
	
	// parámetros de inicio
	grafcan.params = null;
	if (params) {
		if (params["servicio"]) {
			grafcan.params = [];
			grafcan.params["servicio"] = params["servicio"];
			grafcan.params["lat"] = params["lat"];
			grafcan.params["lng"] = params["lng"];
			grafcan.params["zoom"] = params["zoom"];
			grafcan.params["mklat"] = params["mklat"];
			grafcan.params["mklng"] = params["mklng"];
			grafcan.params["mktip"] = params["mktip"];
			grafcan.params["mkurl"] = params["mkurl"];
		}
	}
	//
		
	if (!GBrowserIsCompatible()) {
		alert(_("Navegador incompatible"));
		return;
	}
	
	handleResize();
	
	$loadXML("config/services.xml", setupApp);
}