
/* =================== == == == = =   =    =
 * Legado de Kain - Alfonso Ruzafa
 * ------------------- -- -- -- - -   -    -  
 * Script de capas.
 * ------------------- -- -- -- - -   -    -  
 */
 
var CAP_OPACIDAD_MAXIMA      = 0.99; // opacidad máxima de una capa visible
var CAP_OPACIDAD_AL_OCULTAR  = 0.75; // opacidad con la que se inicia el degradado
var CAP_INCREMENTO_DEGRADADO = 0.15; // el degradado se decrementa
var CAP_VELOCIDAD_DEGRADADO  = 10;   // velocidad de degradado en ms 

var CAP_ENCIMA = 1;
var CAP_TECHO  = 2;
var CAP_MITAD  = 4;
var CAP_SUELO  = 8;
var CAP_DEBAJO = 16;

var CAP_IZQUIERDA        = 32;
var CAP_PEGADO_IZQUIERDA = 64;
var CAP_CENTRO           = 128;
var CAP_PEGADO_DERECHA   = 256;
var CAP_DERECHA          = 512;

var timer_degradado = null;
var indice_z = 100;



function posicion_dimension (objeto) {

	if ( objeto.getBoundingClientRect ) { // IE
	
		return posicion_dimension_IE( objeto );
		
	}
	
   
	var pd = null;
	
	if ( !es_nulo (objeto) ) {
	
		ancho = objeto.offsetWidth;
		alto = objeto.offsetHeight;
		
		x = 0;
		y = 0;
		
		do {
		
			x += objeto.offsetLeft;
			y += objeto.offsetTop;
				
			objeto = objeto.offsetParent;
			
		}

		while ( objeto != null );
		
		pd = { x: x, y: y, ancho: ancho, alto: alto };
		
	}
	
	return pd;

}


function posicion_dimension_IE( objeto ) {

	box = objeto.getBoundingClientRect();

	var doc = document;
	
/*
	if ( !self.isAncestor( document.documentElement, objeto ) && parent.document != document ) { // might be in a frame, need to get its scroll
	
		doc = parent.document;
	
		alert( objeto );

		if ( self.isAncestor( doc.documentElement, objeto ) ) {
	
			return { x: 0, y: 0, ancho: 0, alto: 0 };
	
		}
	
	}
	*/
	
	var scrollTop  = Math.max( doc.documentElement.scrollTop, doc.body.scrollTop );
	var scrollLeft = Math.max( doc.documentElement.scrollLeft, doc.body.scrollLeft );
	
	return { x: box.left + scrollLeft, y: box.top + scrollTop, ancho: objeto.offsetWidth, alto: objeto.offsetHeight };

}



// -- [ Posiciona un objeto dado un punto y una relación horizontal y vertical ] --

function posicionar_punto(objeto, x, y, relativo, offset_x, offset_y) {
	
	if ( es_nulo (objeto) ) {
	
		throw "Se ha intentado posicionar un objeto nulo.";
		
	}
		
	relacion_x = parseInt(relativo & 0x01f);
	relacion_y = parseInt(relativo & 0x3e0);
	offset_x	 = es_nulo (offset_x) ? 0 : offset_x;
	offset_x   = es_nulo (offset_x) ? 0 : offset_x;
	
	pd_objeto = new posicion_dimension(objeto);
	
	var x2 = 0, y2 = 0;
	
	switch (offset_x) {
		
		case CAP_IZQUIERDA:
		case CAP_PEGADO_DERECHA:

			x -= pd_objeto.ancho;

		break;
			
		case CAP_CENTRO:

			x -= pd_objeto.ancho / 2;

		break;
			
		case CAP_PEGADO_IZQUIERDA:
		case CAP_DERECHA:

//			x = x;

		break;

	}
	
	switch (offset_x) {

		case CAP_ENCIMA:
		case CAP_SUELO:
		
			y -= pd_objeto.alto;
			
		break;
			
		case CAP_MITAD:
		
			y -= pd_objeto.ancho/2;
		
		break;
	
		case CAP_TECHO:
		case CAP_DEBAJO:
		
//			y = y;
		
		break;
			
	}
	
	objeto.style.left = x + offset_x + 'px';
	objeto.style.top = y + offset_y + 'px';
	
	return true;
	
}


function posicionar_objeto(objeto, objeto_padre, relativo, offset_x, offset_y) {
	
	
	
	if ( es_nulo( objeto ) ) {
		
		throw "Se ha intentado posicionar un objeto nulo.";
		
	}
		
	else if ( es_nulo( objeto_padre ) ) {
		
		throw "Se ha intentado posicionar un objeto con respecto a un objeto nulo.";
		
	}
	
	relativo_y = parseInt(relativo & 0x01f);
	relativo_x = parseInt(relativo & 0x3e0);
	offset_x   = ( es_nulo (offset_x) ) ? 0 : offset_x;
	offset_y   = ( es_nulo (offset_y) ) ? 0 : offset_y;
	
	pd_objeto       = posicion_dimension (objeto);
	
	pd_objeto_padre = posicion_dimension (objeto_padre);
	
	var x2 = pd_objeto_padre.x, y2 = pd_objeto_padre.y;
	
	switch (relativo_x) {
		
		case CAP_IZQUIERDA:
		
			x2 = pd_objeto_padre.x - pd_objeto.ancho;
		
		break;
	
		case CAP_PEGADO_IZQUIERDA:
		
			x2 = pd_objeto_padre.x;
		
		break;
			
		case CAP_CENTRO:
		
			x2 = pd_objeto_padre.x + (pd_objeto_padre.ancho - pd_objeto.ancho) / 2 ;
		
		break;
	
		case CAP_PEGADO_DERECHA:
		
			x2 = pd_objeto_padre.x + pd_objeto_padre.ancho - pd_objeto.ancho ;
		
		break;
	
		case CAP_DERECHA:
		
			x2 = pd_objeto_padre.x + pd_objeto_padre.ancho ;
		
		break;
			
	}
	
	switch (relativo_y) {
		
		case CAP_ENCIMA:
		
			y2 = pd_objeto_padre.y - pd_objeto.alto ;
		
		break;
	
		case CAP_TECHO:
		
			y2 = pd_objeto_padre.y ;
		
		break;
			
		case CAP_MITAD:
		
			y2 = pd_objeto_padre.y + (pd_objeto_padre.alto - pd_objeto.alto) / 2 ;
		
		break;
	
		case CAP_SUELO:
		
			y2 = pd_objeto_padre.y + pd_objeto_padre.alto - pd_objeto.alto ;
		
		break;
	
		case CAP_DEBAJO:
		
			y2 = pd_objeto_padre.y + pd_objeto_padre.alto ;
		
		break;
			
	}
	
	objeto.style.left = x2 + offset_x + "px";
	objeto.style.top  = y2 + offset_y + "px";
	
	return true;
		
}


function posicionar_porcentaje(objeto, objeto_padre, x, y, relativo, offset_x, offset_y) {
	
	if ( es_nulo (objeto) ) {
		
		throw "Se ha intentado posicionar un objeto nulo.";
		
	}
		
	else if ( es_nulo (objeto_padre)) {
		
		throw "Se ha intentado posicionar un objeto con respecto a un objeto nulo.";
		
	}
	
	pd_objeto_padre = posicion_dimension (objeto_padre);

	x = pd_objeto_padre.x + parseInt(x * pd_objeto_padre.ancho / 100);
	y = pd_objeto_padre.y + parseInt(y * pd_objeto_padre.alto  / 100);
	
	if ( /MSIE 6.0/.test( navigator.userAgent ) ) {
	
		x -= document.getElementById("base").offsetLeft;
		y -= document.getElementById("base").offsetTop;
		
	}

	posicionar_punto(objeto, x, y, relativo, offset_x, offset_y);
	
	return true;
		
}



var capas = null;


if ( window.addEventListener ) {

	window.addEventListener( "load", capas_inicio, false );
	
}

else if ( window.attachEvent ) {
	
	window.attachEvent( "onload", capas_inicio_IE );
	
}


function capas_inicio( e ) {
	
	var id = 0;
	
	var anclaje = document.getElementById("anclaje-" + id);
	
	while (anclaje != null) {
	
		anclaje.addEventListener( "mouseover", mostrar_capa, false );
		anclaje.addEventListener( "mouseout", ocultar_capa, false );
		
		if ( info_capas[id].mantener ) {
			
			var capa = document.getElementById( "capa-" + id );
			
			capa.addEventListener( "mouseover", mostrar_capa, true );
			capa.addEventListener( "mouseout", ocultar_capa, true );

		}

		id++;
		
		anclaje = document.getElementById("anclaje-" + id);
		
	}
	
}


function capas_inicio_IE( e ) {
	
	var id = 0;
	
	var anclaje = document.getElementById("anclaje-" + id);
	
	while (anclaje != null) {
	
		anclaje.attachEvent( "onmouseover", mostrar_capa );
		anclaje.attachEvent( "onmouseout", ocultar_capa );
		
		if ( info_capas[id].mantener ) {

			var capa = document.getElementById("capa-" + id);
			
			capa.attachEvent( "onmouseover", mostrar_capa );
			capa.attachEvent( "onmouseout", ocultar_capa );

		}
		
		id++;
		
		anclaje = document.getElementById("anclaje-" + id);
		
	}

}



function mostrar_capa( e ) {
	
	var c = null;
	
	if ( e.currentTarget ) {
		
		c = e.currentTarget.id.match( "(anclaje|capa)-([0-9]+)" );
		
	}
	
	else if ( e.srcElement ) {
		
		var srcElement = e.srcElement;
		
		do {
			
			c = srcElement.id.match( "(anclaje|capa)-([0-9]+)" );
			
			srcElement = srcElement.offsetParent;
			
		}		
		while ( ( srcElement != null ) && ( c == null ) );
			
	}
	
	

	if ( c != null ) {
		
		var o = c[1];
		var id = c[2];
		
		indice_z++;
		
		switch ( o ) {
			
			case "capa":
			
				while ( id != null ) {
					
					var capa = document.getElementById( "capa-" + id );
					
					info_capas[id].degradando = false;
					
					capa.style.position = "absolute";
					capa.style.visibility = "visible";
					capa.style.opacity = 1;
					capa.style.zIndex = indice_z;
					
					id = info_capas[id].padre_id;
					
				}
				
			break;
			
	
			case "anclaje":
	
				var capa = document.getElementById( "capa-" + id );
				
				var anclaje_real = document.getElementById( "anclaje-real-" + id );
				
				var anclaje = anclaje_real == null ? document.getElementById( "anclaje-" + id ) : anclaje_real;
				
				if (capa != null) {
				
					posicionar_objeto ( capa, anclaje, info_capas[id].relativo, 0, 0 );
					
					info_capas[id].degradando = false;
					
					capa.style.position = "absolute";
					capa.style.visibility = "visible";
					capa.style.opacity = 1;
					capa.style.zIndex = indice_z;
					
				}
				
			break;
		
		}
		
	}
	

	return true;

}



function ocultar_capa( e ) {
	
	var c = null;
	
	if ( e.currentTarget ) {
		
		c = e.currentTarget.id.match( "(anclaje|capa)-([0-9]+)" );
		
	}
	
	else if ( e.srcElement ) {
		
		var srcElement = e.srcElement;
		
		do {
			
			c = srcElement.id.match( "(anclaje|capa)-([0-9]+)" );
			
			srcElement = srcElement.offsetParent;
			
		}		
		while ( ( srcElement != null ) && ( c == null ) );
			
	}

	
		
	if (c != null) {
		
		var id = c[2];
		var o = c[1];
		
		switch ( o ) {
			
			case "capa":
		
				while ( id != null ) {
				
					info_capas[id].opacidad = 1;

					info_capas[id].degradando = true;
					
					id = info_capas[id].padre_id;
					
				}
				
			break;
			
			
			case "anclaje":
			
				info_capas[id].opacidad = 1;
			
				info_capas[id].degradando = true;
				
			break;
			
		}


		if ( timer_degradado == null) {
		
			degradar();
			
		}
		
	}
	
}



function degradar() {
	
	var seguir_degradando = false;
	
	for ( var i = 0; i < info_capas.length; i++ ) {
		
		if ( info_capas[i].degradando ) {
			
			info_capas[i].opacidad = parseFloat(Math.max( 0, info_capas[i].opacidad - 0.1 ));
		
			capa = document.getElementById( "capa-" + i );
			
			if ( capa != null ) {
				
				if ( info_capas[i].opacidad == 0 ) {
					
					capa.style.visibility = "hidden";
					
				}
					
				else {
			
					capa.style.opacity = info_capas[i].opacidad;
					
				}
				
			}
		
			seguir_degradando = seguir_degradando || ( info_capas[i].opacidad > 0 );
			
		}
		
	}
	
	timer_degradado = seguir_degradando ? setTimeout( "degradar()", 50 ) : null;
	
	return true;

}

