//clase que permite gestionar rutas en el mapa
GestorRutas = function(datosGestor)
{
	var gestor = this;
		
	gestor.gestorMapa = datosGestor.gestorMapa;
	gestor.contenedorDatosRuta = jQuery('#'+datosGestor.contenedorDatosRuta);
	
	gestor.instanciaMapa = gestor.gestorMapa.getInstanciaMapa();
	gestor.contenedorForm = jQuery('#'+datosGestor.contenedorForm);

	gestor.indiceRutas = {};//propiedad que guardara un indice de rutas en forma de literal {'nombreruta':true/false}
	gestor.indiceNumRutas = [];//propiedad que guardara un indice de rutas en forma de array numérico [idnumericoruta:'nombre']
	gestor.datosRutas = {};//propiedad que guardara los datos de cada ruta
	gestor.marcadoresRutas = {};//propiedad que guardara los marcadores de cada ruta en forma de literal
	gestor.indiceMarcadoresRutas = {};//propiedad que guardara un índice con el orden de los marcadores de cada ruta
	gestor.indiceMarcadoresRutasEtapas = {};//propiedad que guardara un índice con el orden de los marcadores de cada ruta clasificados por etapas
	gestor.trazadosRutas = {};//propiedad que guardara los trazados(polilineas) de cada ruta
	gestor.numEtapas = 0;//propiedad que almacena el número de etapas entre el origen y el fin
	
	gestor.nombreRutaActual = "";//propiedad que almacena la ruta con la que estamos trabajando
	
	//las rutas pueden ser a pie o andando (en bici, aún en los EEUU)
	//tomamos este valor del select correspondiente si existe
	var contOpcionesRuta = "";
	gestor.modoRuta = "";
	
	if (contOpcionesRuta) {
		contOpcionesRuta = jQuery(contOpcionesRuta);
		gestor.modoRuta = contOpcionesRuta.val();
		
		//añadimos al select el evento 'change', para tomar el valor de la opción seleccionada
		contOpcionesRuta.change(function()
		{
			gestor.modoRuta = contOpcionesRuta.val();
		})
	}
	else
	{
		//valor por defecto para las rutas ,en coche
		gestor.modoRuta = "DRIVING";
	}
		
	//objeto que se encarga de gestionar el cálculo de la ruta
	var gestorDirecciones = new google.maps.DirectionsService();
	
	//objeto que se encarga de repesentar la ruta en pantalla
	var rendererOptions = {
		draggable: true
	};

	var trazador = new google.maps.DirectionsRenderer(rendererOptions);
		
	//el objeto trazador necesita una instancia de mapa para representar la ruta
	//en este caso, será la misma que muestra el mapa con la localización original 
	trazador.setMap(gestor.instanciaMapa);
	trazador.markerOptions = {draggable:true};
	
	//metodo para crear una nueva ruta, almacenando su nombre
	gestor.crearRuta = function(nombreRuta)
	{
		//si no existe la ruta
		if(!gestor.indiceRutas[nombreRuta])
		{
			gestor.indiceRutas[nombreRuta] = true;
			gestor.datosRutas[nombreRuta] = {nombre:nombreRuta,etapas:[]};
			
			//una vez creada la ruta, lanzamos el evento que servirá para establecer el interfaz
			jQuery(gestor).trigger('nueva_ruta_creada',[nombreRuta]);
		}
		//si ya existe
		else 
		{
			alert('El nombre elegido ya existe. Seleccione otro, por favor');
			return false;
		}
	}
	
	//metodo para eliminar los datos, marcadores y polilineas de la ruta
	gestor.resetearRuta = function(nombreRuta)
	{
	  //borramos los marcadores del mapa
	  for (var indice in gestor.indiceMarcadoresRutas[nombreRuta])
	  {
		  var idMarcador = gestor.indiceMarcadoresRutas[nombreRuta][indice];
		  gestor.gestorMapa.borrarMarcadores(idMarcador);
	  }
	  
	  if (gestor.trazadosRutas[nombreRuta])
	  {
	  	gestor.borrarPolilinea(nombreRuta);
	  }
	  gestor.indiceMarcadoresRutas[nombreRuta] = [];
	  gestor.marcadoresRutas[nombreRuta] = {};
			
	}
	
	//metodo que recoge el id correspondiente al input de un marcador desplazado en el mapa y establece el valor
	//de la nueva dirección o de la nueva posición
	//con la dirección obtenida, se rellena el input correspondiente a este punto de la ruta
	//si no se pasa idEtapa se creará un input nuevo
	//la función devuelve el identificador de la etapa que se está modificando
	gestor.actualizarDatosInput = function(nuevaDireccion,indiceEtapa)
	{
		var nuevaDireccion = nuevaDireccion;
		var indiceEtapa = indiceEtapa || "nuevaEtapa";
	    var indiceNuevaEtapaRuta = gestor.numEtapas + 1;
		var idInput = "";
		
		switch(indiceEtapa)
		{
			case 'origen':
			idInput = 'ruta_etapa_origen';
			break;
			
			case 'fin':
			idInput = 'ruta_etapa_fin';
			break;
			
			case 'nuevaEtapa':  
			idInput = 'ruta_etapa_'+indiceNuevaEtapaRuta;
			    jQuery('#cont_etapas_ruta').append('<input type="text" class="ruta_etapas" id="'+idInput+'" /><input type="checkbox" />');
				gestor.numEtapas++;
			break;
			
			default:
			idInput = 'ruta_etapa_'+indiceEtapa;
			break;
		}
		
		
		jQuery('#'+idInput).val(nuevaDireccion);
		gestor.procesarFormularioRuta();
		
		return (idInput);
		

	}//actualizardatosinput
	
	//metodo que recibe un objeto LatLng y lo geocodifica inversamente para ver si existe una dirección
	//si hay dirección la devuelve, y sino, devuelve las coordenadas
	gestor.obtenerDireccion = function(direccion)
	{
		geocoder = new google.maps.Geocoder();
		
		geocoder.geocode({'latLng': nuevaPosicion}, function(results, status) 
		{
		  if (status == google.maps.GeocoderStatus.OK)
		  {
			if (results[0]) 
			{
			
		  	  gestor.procesarFormularioRuta();
			}; 
		  } else 
		  {
			alert("Geocoder failed due to: " + status);
		  }
		});
	}
	
	//metodo que recibe un objeto LatLng y lo geocodifica inversamente para ver si existe una dirección
	//si hay dirección la devuelve, y sino, devuelve las coo.0rdenadas
	gestor.obtenerDireccionPunto = function(puntoLatLng)
	{
		var resultadoPunto = {};
		var geocoder = new google.maps.Geocoder();		
		
		var procesarResultado = function(results)
		{
			//los tipos de resultado son los siguientes
			//['street_address']
			//['route']
			//['locality','political']
			//['postal_code']
			//['administrative_area_local_2','political']
			//['administrative_area_local_1','political']
			//['country','political']
			//se podría ofrecer esta información para que el usuario elija
			//simplemente comprobaremos si es de tipo street_address para devolver la direccion
			//y sino, comprobamos si es una carretera y devolveremos las coordenadas
			var resultado = {};
			var direccionResultado = results[0].formatted_address;
			var puntoResultado = results[0].geometry.location;
			var tipoResultado = results[0].types;
			
			var tipoResultadoCadena = "";
			
			if (tipoResultado.length > 1)
			{
				for (var indice in tipoResultado)
				{
					tipoResultadoCadena = tipoResultadoCadena + tipoResultado[indice];
					if (indice < tipoResultado.length-1)
					{
						tipoResultadoCadena = tipoResultadoCadena + '_';
					}//if
				}//for
			}//if
			else 
			{
				tipoResultadoCadena = tipoResultado[0];
			}
			
			switch(tipoResultadoCadena)
			{
				case 'street_address':
				resultado = {modo:'direccion',punto:puntoResultado,direccion:direccionResultado}
				break;
				
				case 'route':
				resultado = {modo:'direccion',punto:puntoResultado,direccion:direccionResultado}
				break;
				
				default:
				break;
			}
			
			return resultado;
			
		}//procesarresultado
		
		
		//la geocodificacion se realiza de manerea asíncrona, así que las funciones a las que llamemos
		//tienen que incluirse en la condicion de OK que se ejecuta tras la llamada
		geocoder.geocode({'latLng': puntoLatLng}, function(results, status) 
		{
		  if (status == google.maps.GeocoderStatus.OK)
		  {
			  
				resultadoPunto = procesarResultado(results);
				
				//llamamos al metodo que actualiza los datos del input con la nueva dirección
				//y recogemos el valor del id de dicho input, del tipo 'ruta_etapa_X'
				//extraeremos el indice correspondiente a la X para identificar al marcador
				var idInput = gestor.actualizarDatosInput(resultadoPunto.direccion);
				var posSufijo = idMarcador.lastIndexOf('_')+1;
				var idEtapa = idMarcador.substr(posSufijo);
						
	
				datosNuevoMarcador = 
				{
					id:gestor.nombreRutaActual+'_'+idEtapa,
					coordenadas:puntoLatLng,
					desplazable:true
				};
			
				gestor.indiceMarcadoresRutas[gestor.nombreRutaActual].push(datosNuevoMarcador.id);
				gestor.marcadoresRutas[gestor.nombreRutaActual][datosNuevoMarcador.id] = datosNuevoMarcador ;
				
				
		  } 
		  else 
		  {
			//{modo:'direccion',punto:puntoResultado,direccion:direccionResultado}
			//resultadoPunto.modo = 'ERROR';  
			//resultadoPunto.punto = '';
			//resultadoPunto.direccion = 'No ha sido posible establecer una dirección para el punto seleccionado';
			//return resultadoPunto;
			alert('error')
		  }

		  
		});
		
	}//obtenerdireccionpunto
	
	//metodo que procesa las direcciones del formulario y almacena los datos para generar la ruta
	gestor.procesarFormularioRuta = function(modo)
	{
		switch(modo)
		{
			case 'crear':
				var nombreRuta = jQuery('#nombreRuta').val();
				//al crear una nueva ruta se accede a la interfaz para editar la ruta
				//por tanto, actualizamos la ruta actual
				gestor.crearRuta(nombreRuta);
			break;
			
			case 'edicion':
			    //tomaremos los valores de cada etapa que compone la ruta
				jQuery('.cont_etapa_ruta').each(function(i)
				{
					var origen = jQuery('#etapa_'+i+'_origen').val();
					var destino = jQuery('#etapa_'+i+'_destino').val();
					var pasosEtapa = [];
					if (!!jQuery('.ruta_paso'))
					{
						jQuery('.ruta_paso').each(function(i)
						{
							pasosEtapa[i] = {location:jQuery(this).val(),stopover:true};
						});
					}
					
					var datosEtapa = {origenEtapa:origen,destinoEtapa:destino,pasosEtapa:pasosEtapa};
					gestor.datosRutas[gestor.nombreRutaActual].etapas.push(datosEtapa);					
				});
					
			break;
			
		}//switch
	
		gestor.calcularRuta();

	}//procesarformularioruta
	
	
	gestor.crearPolilinea = function(nombreRuta,datosPolilinea)
	{
		var polilinea = new google.maps.Polyline(datosPolilinea);
		gestor.trazadosRutas[nombreRuta] = polilinea;
	}//gestor.crearPolilinea
	
	gestor.borrarPolilinea = function(nombreRuta)
	{
		gestor.trazadosRutas[nombreRuta].setMap(null);
	}//gestor.borrarPolilinea
	
	gestor.almacenarRuta = function() 
    { 
		var nombreRuta = gestor.nombreRutaActual;
	
		//inicializamos los objetos que contendran los marcadores
		gestor.indiceMarcadoresRutas[nombreRuta] = [];
		gestor.indiceMarcadoresRutasEtapas[nombreRuta] = [];
		gestor.marcadoresRutas[nombreRuta] = {};
		var indiceMarcadoresRuta = gestor.indiceMarcadoresRutas[nombreRuta];
		
		//para cada etapa
		for (var idEtapa in gestor.datosRutas[nombreRuta].etapas)
		{
			gestor.indiceMarcadoresRutasEtapas[nombreRuta][idEtapa] = [];
			
			var etapa = gestor.datosRutas[nombreRuta].etapas[idEtapa];
			var pasosRuta = etapa.respuestaGoogle.routes[0].legs || []; 
			var numPasosRuta = pasosRuta.length;
			var puntosTrazadoRuta = etapa.respuestaGoogle.routes[0].overview_path;
					
			var puntoInicioRuta = "";
			var puntoFinRuta = "";
			var datosMarcadorInicioRuta = {};
			var datosMarcadorFinRuta = {};
			
			//datos de inicio de ruta
			puntoInicioRuta = pasosRuta[0].start_location;
					
			datosMarcadorInicioRuta = 
			{
			  id:nombreRuta+'_'+idEtapa+'_origen',
			  coordenadas:puntoInicioRuta,
			  desplazable:true
			};
			
			gestor.indiceMarcadoresRutas[nombreRuta].push(datosMarcadorInicioRuta.id);
			gestor.indiceMarcadoresRutasEtapas[nombreRuta][idEtapa].push(datosMarcadorInicioRuta.id);
			gestor.marcadoresRutas[nombreRuta][datosMarcadorInicioRuta.id] = datosMarcadorInicioRuta;
	
		
			//si hay más de 1 paso, cada punto que formará la ruta será el punto inicial de cada paso
			if (numPasosRuta > 1)
			{
			  for (var i = 1; i < numPasosRuta; i++) 
			  {
				  var datosMarcador = 
				  {
					id:nombreRuta+'_'+idEtapa+'_'+i,
					coordenadas:pasosRuta[i].start_location,
					desplazable:true
				  };
				  
				  gestor.indiceMarcadoresRutas[nombreRuta].push(datosMarcador.id);
				  gestor.indiceMarcadoresRutasEtapas[nombreRuta][idEtapa].push(datosMarcador.id);
				  gestor.marcadoresRutas[nombreRuta][datosMarcador.id] = datosMarcador;
			  
			  }//for	
			  
			}//if
		
			//datos de fin de ruta
			puntoFinRuta = pasosRuta[numPasosRuta-1].end_location;
			
			datosMarcadorFinRuta = 
			{
			  id:nombreRuta+'_'+idEtapa+'_destino',
			  coordenadas:puntoFinRuta,
			  desplazable:true
			};
			
			gestor.indiceMarcadoresRutas[nombreRuta].push(datosMarcadorFinRuta.id);
			gestor.indiceMarcadoresRutasEtapas[nombreRuta][idEtapa].push(datosMarcadorFinRuta.id);
			gestor.marcadoresRutas[nombreRuta][datosMarcadorFinRuta.id] = datosMarcadorFinRuta;
			
			
			//valores para definir la polilinea
			var opcionesTrazado = {
				path: puntosTrazadoRuta,
				strokeColor: '#aa00bb',
				opacity: 0.3,
				map: gestor.instanciaMapa
			}
			
			gestor.crearPolilinea(nombreRuta,opcionesTrazado);
		
		}//for etapa
		
		//creamos los marcadores de la ruta 
		for (var indice in gestor.indiceMarcadoresRutas[nombreRuta])
		{
		  var idMarcador = indiceMarcadoresRuta[indice];
		  var datosMarcador = gestor.marcadoresRutas[nombreRuta][idMarcador];
		  gestor.gestorMapa.crearMarcadores(datosMarcador)
		  
		  //y enlazamos el evento para detectar si un marcador se desplaza y cambia de posición
		  jQuery(gestor.gestorMapa.marcadores[idMarcador]).bind('marcador_cambio_posicion',
			{id:idMarcador},
			function(event,params)
			{
			  //los marcadores tienen un id compuesto del nombre de la ruta, la etapa y un sufijo
			  //p.e. 'ruta1_0_origen' o 'ruta1_1_0';
			  //para identificar a los marcadores dentro de la ruta, usamos solo el sufijo
			  var idMarcador = event.data.id;	
			  var posSufijo = idMarcador.lastIndexOf('_')+1;
			  var idPaso = idMarcador.substr(posSufijo);
			  var nuevaPosicion = params;
			  
			  //cuando se termine de desplazar un marcador, se actualizará el valor en el input
			  gestor.actualizarDatosInput(nuevaPosicion,idEtapa);	
			});
			
		}//for marcador
		  
	}//mostrar ruta 
	
	
    //método de la clase que calculará la ruta, analizando las etapas si se han incluido como parámetro
	gestor.calcularRuta = function() 
	{
	  //para cada etapa dentro de la ruta
	  for (idEtapa in gestor.datosRutas[gestor.nombreRutaActual].etapas)
	  {
		  var etapa = gestor.datosRutas[gestor.nombreRutaActual].etapas[idEtapa];
		  var origenEtapa = etapa.origenEtapa;
		  var destinoEtapa = etapa.destinoEtapa;
		  var pasosEtapa = etapa.pasosEtapa;
	  
		  //objeto con los parámetros necesarios para el cálculo de la ruta
		  var request = {
			  origin: origenEtapa, 
			  destination: destinoEtapa,
			  waypoints: pasosEtapa,
			  travelMode: google.maps.DirectionsTravelMode[gestor.modoRuta]
		  };
		  
		  //metodo del objeto gestor para calcular la ruta y gestionar los posibles errores
		  gestorDirecciones.route(request, function(response, status) 
		  {
			//si obtenemos respuesta correcta para las direcciones enviadas
			if (status == google.maps.DirectionsStatus.OK) 
			{
			  //el trazador standard de google permite trazar las rutas en el mapa de forma automatica
			  //mediante el metodo setdirections, al que se pasa la respuesta del gestor de direcciones
			  //trazador.setDirections(response);
			  //la respuesta incluye las indicaciones del recorrido, que pueden insertarse en un div
			  //mediante el metodo setPanel
			  //trazador.setPanel(jQuery('#indicaciones_etapa_'+idEtapa+'').get(0));
			  
			  //en nuestro caso, tomaremos los datos de la respuesta y los guardaremos
			  //para representarlos posterioremnete mediante una polilinea
			  etapa.respuestaGoogle = response;
			}
			else if (status == google.maps.DirectionsStatus.ZERO_RESULTS || status == NOT_FOUND) 
			{
				var confirm = confirm('No se ha podido establecer una ruta circulatoria entre los puntos indicados. Haga click en cancelar y verifique que la dirección es correcta. Si lo desea, haga click en aceptar para generar una ruta uniendo las coordenadas.');
				if (confirm == true) gestor.mostrarPasos(nombreRuta,response);
				else return false;
			}
			
			//como las peticiones se realizan de forma asíncrona, lanzaremos un evento cuando
			//se haya completado la última petición para todas las etapas
			if(idEtapa == gestor.datosRutas[gestor.nombreRutaActual].etapas.length-1)
			{
			 jQuery(gestor).trigger('calculo_direcciones_etapas_completo');
			}
				
		  });//route
	  
	  }
	  
		  
	}//calcularruta
	
	 //método de la clase que calculará la ruta, mediante el trazador automático de google
	gestor.calcularRutaAutomatica = function() 
	{
	  //para cada etapa dentro de la ruta
	  for (idEtapa in gestor.datosRutas[gestor.nombreRutaActual].etapas)
	  {
		  var etapa = gestor.datosRutas[gestor.nombreRutaActual].etapas[idEtapa];
		  var origenEtapa = etapa.origenEtapa;
		  var destinoEtapa = etapa.destinoEtapa;
		  var pasosEtapa = etapa.pasosEtapa;
	  
		  //objeto con los parámetros necesarios para el cálculo de la ruta
		  var request = {
			  origin: origenEtapa, 
			  destination: destinoEtapa,
			  waypoints: pasosEtapa,
			  travelMode: google.maps.DirectionsTravelMode[gestor.modoRuta]
		  };
		  
		  //metodo del objeto gestor para calcular la ruta y gestionar los posibles errores
		  gestorDirecciones.route(request, function(response, status) 
		  {
			//si obtenemos respuesta correcta para las direcciones enviadas
			if (status == google.maps.DirectionsStatus.OK) 
			{
			  //el trazador standard de google permite trazar las rutas en el mapa de forma automatica
			  //mediante el metodo setdirections, al que se pasa la respuesta del gestor de direcciones
			  trazador.setDirections(response);
			  //la respuesta incluye las indicaciones del recorrido, que pueden insertarse en un div
			  //mediante el metodo setPanel
			  trazador.setPanel(jQuery('#indicacionesComoLlegar').show().get(0));
			  
			}
			else if (status == google.maps.DirectionsStatus.ZERO_RESULTS || status == NOT_FOUND) 
			{
				var confirm = confirm('No se ha podido establecer una ruta circulatoria entre los puntos indicados. Haga click en cancelar y verifique que la dirección es correcta. Si lo desea, haga click en aceptar para generar una ruta uniendo las coordenadas.');
				if (confirm == true) gestor.mostrarPasos(nombreRuta,response);
				else return false;
			}
			
			
		  });//route
	  
	  }
	  
		  
	}//calcularruta
	
	//metodo para cambiar el cursor
	gestor.cambiaCursor = function(modo)
	{
		
		var claseCursor = modo;
		
        jQuery('.cont_margenes').mouseout(function()
	    {
               jQuery('#custom_cursor').remove();
			   jQuery('.cont_margenes').attr('id','');
        });
        
		jQuery('.cont_margenes').mouseover(function(e)
		{
               jQuery('.cont_margenes').append('<div id="custom_cursor"></div>');
			   //jQuery('#custom_cursor').addClass(claseCursor);
			   jQuery('.cont_margenes').attr('id',claseCursor);
        });
        
		jQuery('.cont_margenes').mousemove(function(e)
		{
               jQuery('#custom_cursor').css('left', e.clientX - 20).css('top', e.clientY + 7);
        });
	
	};//cambiaCursor

	//añadimos al objeto mapa el escuchador del evento click derecho para crear un marcador
    google.maps.event.addListener(gestor.instanciaMapa, 'rightclick', function(event) 
	{
	    //el evento nos devuelve las coordenadas del punto
		var puntoClick = event.latLng;
		alert('click')

		//procesaremos las coordenadas para comprobar si es una dirección georeferenciada
		//o es un punto que no tiene direccion
		//el metodo disparará un evento 'geoloader_cargado' cuando se procese la llamada asíncrona
		gestor.obtenerDireccionPunto(puntoClick);

		//la variable direccion punto será un objeto con los atributos
		//{modo:'direccion',punto:puntoResultado,direccion:direccionResultado}
		//con este valor actualizaremos el input correspondiente
    });
	
	var crearInterfaz = function(tipo) 
	{
		//htmls comunes de cada zona del interfaz
		var menuGestionRutas = '<div id="cont_menu_rutas"><input id="form_crear_ruta" type="submit" value="Crear nueva ruta" /><input id="form_ver_listado" type="submit" value="Listado rutas" /></div>';
	
		switch(tipo)
		{
			case 'inicio':
				var formCrearRuta = '<div id="cont_form_rutas"><form id="form_rutas"><div><label for="nombreRuta">Nombre de la ruta</label><input type="text" id="nombreRuta" /><input id="form_guardar_ruta" type="submit" value="Guardar ruta" /></div></form></div>';
			
				gestor.contenedorDatosRuta.html(menuGestionRutas+formCrearRuta);
				
				jQuery('#form_guardar_ruta').click(function(e)
				{
					e.preventDefault();
					var nombreRuta = jQuery('#nombreRuta').val();
					gestor.crearRuta(nombreRuta);
				});
			break;
			
			case 'listado':
				gestor.contenedorDatosRuta.html('');
			break;
			
			case 'edicion':
			
			    var etapas = gestor.datosRutas[gestor.nombreRutaActual].etapas;
				var numEtapasRuta = etapas.length;
				var indiceEtapa = 0;
				var formEditarRuta = "<form id='form_rutas_editar'>";
                
				
				for (indiceEtapa = 0; indiceEtapa < numEtapasRuta+1; indiceEtapa++)
				{
					var campoOrigen = '<div id="cont_etapa_'+indiceEtapa+'_origen"><label for="etapa_'+indiceEtapa+'_origen">Origen de la etapa</label><input type="text" id="etapa_'+indiceEtapa+'_origen" /></div>';
					var campoIndicaciones = '<div id="indicaciones_etapa_'+indiceEtapa+'"></div>';
					var campoFin = '<div id="cont_etapa_'+indiceEtapa+'_destino"><label for="etapa_'+indiceEtapa+'_destino">Destino de la ruta</label><input type="text" id="etapa_'+indiceEtapa+'_destino" /></div>';
					formEditarRuta = formEditarRuta + '<div id="cont_etapa_'+indiceEtapa+'" class="cont_etapa_ruta">'+campoOrigen+campoIndicaciones+campoFin+'</div>';
				}
				
				var campoEnviar = '<div id="cont_opciones_ruta"><input id="form_rutas_enviar" type="submit" value="Calcular" /><input id="form_rutas_crear_etapa" type="submit" value="Crear etapa" /></div>';
				formEditarRuta = formEditarRuta + campoEnviar + '</form>';
				
				gestor.contenedorDatosRuta.html(menuGestionRutas + formEditarRuta);
			
				jQuery('#form_rutas_enviar').click(function(e)
				{
					e.preventDefault();
					gestor.procesarFormularioRuta('edicion');
				});
				
				jQuery('#form_rutas_crear_etapa').click(function(e)
				{
					e.preventDefault();
					var indiceEtapa = gestor.numEtapas++;
					jQuery('#cont_etapas_ruta').append('<input type="text" class="ruta_etapas" id="ruta_etapa'+indiceEtapa+'" /><input type="checkbox" />')

				});
				
				//evento click en el boton de crear marcador
				jQuery('#form_rutas_crear_marcador').click(function(e)
				{
					e.preventDefault();
					//gestor.cambiaCursor('crear_marcador');
				});
			
			break;
		}//switch
		

	}
	
	//************************************************************ eventos propios de la clase *****************************************************************/
	
	//evento que se dispara cuando se crea una nueva ruta
	//se establecerá el nombre de la ruta actual y se mostrará el interfaz para editar la ruta
	jQuery(gestor).bind('nueva_ruta_creada',function(e,nombreRuta)
	{
		//establecemos el nombre de la ruta con la que vamos a trabajar
		gestor.nombreRutaActual = nombreRuta;
		crearInterfaz('edicion');		
	});
	
	//evento que se dispara cuando se ha terminado de procesar una ruta
	//realizando peticiones al gestor de direcciones de google
	jQuery(gestor).bind('calculo_direcciones_etapas_completo',function()
	{
		//establecemos el nombre de la ruta con la que vamos a trabajar
		gestor.almacenarRuta();
	});
	
	var inicializar = function()
    {
		crearInterfaz('inicio');	
    }
		
	inicializar();
	
}//gestorrutas
