/*
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
   Navegación de anclas
   Namespace es.aquataller.ui
   version:  d04-m04-a07
//  -- -- -- -- -- -- -- -- --
//  Mauricio F. Tolezano (www.acuataller.com)
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
// 
//
*/


es.aquataller.ui.NavAnclas = function( idNavAnclas, idSeleccionInicial ) 
{
	this.idNavAnclas	= (typeof idNavAnclas=='string')? [idNavAnclas] : idNavAnclas;
	this.u				= false;
	
	// Navegacion y ancla activa.
	this.seleccion		= { navAnclas				: false,
							ancla					: false, 
							destino					: false,
							anterior				: {	ancla	: false, 
														destino	: false
												  	   }
					  	  };	
	this.opciones 		= { banderaDOM 				: 'dom',
							corregirScroll 			: {aplicar:true, retardo:50, posicion:'0,0'},
							estiloActivo 			: ['activo'],
							seleccionarPadresAncla 	: ['li'],
							estiloAPadresAncla		: ['activo'],
							vista					: {
														vistaSeleccionar : false,
														scope			 : false
													  }	
						  };
							
						
	this.iniciar(idNavAnclas, idSeleccionInicial);
}



es.aquataller.ui.NavAnclas.prototype.iniciar = function(idNavAnclas, idSeleccionInicial) 
{		 
	if(!document.getElementsByTagName || !document.getElementById) return false;
	
	this.u = new es.aquataller.utiles.Utiles();
	// Bandera para actiar estilos necesarios junto con la ejecucion Javascript
	this.u.setClaseBandera(this.opciones.banderaDOM);  
	
	
	this.asignarEventos(idNavAnclas);
	this.seleccionInicial(idSeleccionInicial);
}


es.aquataller.ui.NavAnclas.prototype.seleccionInicial = function(id) 
{	
	if( this.seleccionarAnclaPorURL() ){
		// Selección por URL (en el if)
		if(this.opciones.corregirScroll.aplicar)
			setTimeout("window.scrollTo("+this.opciones.corregirScroll.posicion+")", this.opciones.corregirScroll.retardo);
	}
	else if( id && this.seleccionarAnclaPorId(id) ){
		// Selección enviada al constructor.	
	}else if(id!=false) {
		// Por defecto la primera.
		this.seleccionarPrimerAncla();
	}	
}


es.aquataller.ui.NavAnclas.prototype.seleccionarAnclaPorURL = function() 
{
	var aURL =  this.getAnclaPorURL( window.location.toString() );
	
	// Comprobando que el ancla de la URL exista en la pagina.
	if( aURL 
	   && 
	   document.getElementById(aURL) 
	   && 
	   this.seleccionarAnclaPorId(aURL)
	   )
	{
		return true;
	};
	return false;
}


es.aquataller.ui.NavAnclas.prototype.seleccionarAnclaPorId = function(id) 
{
	for(var i=0; a=this.getEnlaces()[i]; i++) {
		if( this.getAnclaPorURL(a.href)==id ) 
		{
			this.seleccionar(a);	
			return true;
		}
	}	
	return false;
}


es.aquataller.ui.NavAnclas.prototype.getAnclaPorURL = function(url) 
{
	if( url.indexOf("#") != -1 ){		
		return url.substring( url.indexOf("#") + 1, url.length);				
	}
	return false;
}



es.aquataller.ui.NavAnclas.prototype.seleccionarPrimerAncla = function() 
{	
	this.seleccionar( this.getEnlaces()[0] );
}



es.aquataller.ui.NavAnclas.prototype.seleccionar = function( a ) 
{		
	// Selecionar navegacion de anclas que lo contiene.
	this.seleccionarNavAnclasContenedor(a, true);
	
	// Seleccion anterior.
	this.seleccion.anterior.ancla 	= this.seleccion.ancla;
	this.seleccion.anterior.destino = this.seleccion.destino;
	
	// Nueva Seleccion.
	this.seleccion.ancla 			= a;
	this.seleccion.destino 			= document.getElementById( this.getAnclaPorURL(a.href) );
	
	this.vistaSeleccionar()
}


es.aquataller.ui.NavAnclas.prototype.deseleccionar = function() 
{		
	// Selecionar navegacion de anclas que lo contiene.
	this.seleccionarNavAnclasContenedor(this.seleccion.ancla, false);
	
	// Seleccion anterior.
	this.seleccion.anterior.ancla 	= this.seleccion.ancla;
	this.seleccion.anterior.destino = this.seleccion.destino;
	
	// Nueva Seleccion.
	this.seleccion.ancla 			= false;
	this.seleccion.destino 			= false;
	
	this.vistaSeleccionar()
}


es.aquataller.ui.NavAnclas.prototype.vistaSeleccionar = function() 
{			
	// Eliminando elemento seleccionado anteriormente.	
	this.vistaSeleccionarElementoYPadres( 	this.seleccion.anterior.ancla, 	
										 	this.opciones.estiloActivo, 
											false, 
											this.opciones.seleccionarPadresAncla,
											this.opciones.estiloAPadresAncla);	
	
	this.vistaSeleccionarElementoYPadres( 	this.seleccion.anterior.destino, 	
										 	this.opciones.estiloActivo, 
											false );

	
	// Nuevo elemento seleccionado.	
	if(this.seleccion.ancla)
		this.vistaSeleccionarElementoYPadres( this.seleccion.ancla, 			
										 	this.opciones.estiloActivo, 
											true,
											this.opciones.seleccionarPadresAncla,
											this.opciones.estiloAPadresAncla);	
	if(this.seleccion.destino)
		this.vistaSeleccionarElementoYPadres( this.seleccion.destino, 			
										 	this.opciones.estiloActivo, 
											true );

	
	if(this.opciones.vista.vistaSeleccionar) 
		this.opciones.vista.vistaSeleccionar.call(this.opciones.vista.scope);
}


es.aquataller.ui.NavAnclas.prototype.vistaSeleccionarElementoYPadres = function(	elemento, estiloElemento, seleccionar, seleccionarPadres, estiloAPadres) 
{		
	if(elemento) {
		this.asignarEstilo( elemento, estiloElemento, seleccionar);
		
		if(seleccionarPadres && estiloAPadres)
		{
			var padre = elemento;
			for (i=0; seleccionarPadre=seleccionarPadres[i]; i++) 
			{
				padre = padre.parentNode;
				if(padre.nodeName==seleccionarPadre.toUpperCase())
				{
					this.asignarEstilo(padre, estiloAPadres[i], seleccionar);
				}
				else{
					return;
				}
			}
		}
	}
}



es.aquataller.ui.NavAnclas.prototype.asignarEstilo = function(elemento, estilo, asignar) 
{		
	if(asignar){
		this.u.asignarEstilo ( elemento, estilo );
	}else{
		this.u.eliminarEstilo( elemento, estilo );
	}
}


// Selecciona (o deselecciona) la navegacion de anclas activa.
es.aquataller.ui.NavAnclas.prototype.seleccionarNavAnclasContenedor = function(a ,seleccionar) 
{		
	var navContenedor = this.getNavAnclasContenedor(a);

	if(navContenedor)
		this.asignarEstilo( navContenedor, this.opciones.estiloActivo, seleccionar);
}



// Retorna el menu contenedor de un elemento.
es.aquataller.ui.NavAnclas.prototype.getNavAnclasContenedor = function(a) 
{		
	if(this.idNavAnclas.length==1 && this.seleccion.navAnclas)
	{
		return this.seleccion.navAnclas;
	}
	else
	{	do
		{	a = a.parentNode;
			if(a.id && this.idNavAnclas.inArray(a.id))
				return document.getElementById(a.id);			
		}
		while(a.parentNode)
	}
}


es.aquataller.ui.NavAnclas.prototype.getEnlaces = function() 
{		
	var navAnclas = [];
	
	for (i=0; idNav=this.idNavAnclas[i]; i++) {
		for (j=0; a=document.getElementById(idNav).getElementsByTagName('a')[j]; j++) {
			navAnclas.push(a);
		}
	}
	return navAnclas;
}


es.aquataller.ui.NavAnclas.prototype.asignarEventos = function(idNavAnclas) 
{	
	var _this = this;	
	for (i=0; idNav=this.idNavAnclas[i]; i++)
	{			
		for (j=0; a=document.getElementById(idNav).getElementsByTagName('a')[j]; j++)
		{
			var ancla = this.getAnclaPorURL(a.href);
			if( ancla && document.getElementById(ancla) )
			{			
				a.onmousedown=function() {
					_this.seleccionar(this);					
				}	
				a.onclick=function() {
					return false;					
				}
				a.onfocus=function() {
					_this.seleccionar(this);
					return false;	
				}
			}
		}
	}
}




