/***************************************************************/
/* DECLARACIÓN DE VARIABLES A UTILIZAR PARA EL SCROLL DE CAPAS */
/* Se inicializan a null, se les dará valor en la              */
/* función 'inicializarScroll'                                 */
/***************************************************************/
var _scroll_intervalo = null			// Intervalo de tiempo para el scroll (ms)
var _scroll_salto = null;				// Salto en pixels en cada llamada
var _scroll_capa_contenedor = null;		// Para albergar el objeto de la 'capa contenedora' del scroll
var _scroll_capa_contenido = null;		// Para albergar el objeto de la 'capa contenido' del scroll
var _scroll_longitud_contenido = null;	// Longitud (en pixels) de la 'capa contenido'
var _scroll_pos_inicial = null;			// Posición vertical inicial de la 'capa contenido'
var _scroll_pos_actual = null;			// Posición vertical actual en cada momento de la 'capa contenido'
var _scroll_max_pos  = null;			// Máxima (en realidad MÍNIMA, porque se mueve hacia arriba) de la 'capa contenido'
var _scroll_id_temporizador = null;		// Identificador del temporizador 
var _scroll_pagina_cargada = null;		// Flag que indica si la página ha sido totalmente cargada, para iniciar el scroll
var _scroll_necesario = null;			// Flag que indica si es necesario hacer scroll (por el tamaño de la capa contenido)

var SCROLL_BAJAR = 0;					// Constante para indicar movimiento del scroll
var SCROLL_SUBIR = 1;					// Constante para indicar movimiento del scroll



/***************************************************************/
/* DECLARACIÓN DE FUNCIONES A UTILIZAR PARA EL SCROLL DE CAPAS */
/***************************************************************/

// Inicializa las variables a utilizar en el scroll
// Debe ser llamada dentro del evento 'onLoad' del elemento '<body>'
// Parámetros: - Id de la 'capa contenido' del scroll (Obligatorio)
//             - Id de la 'capa contenedora' del scroll (Obligatorio)
//             - Salto en pixels en cada llamada (opcional, por defecto 1 pixel)
//             - Intervalo de tiempo para el scroll (opcional, por defecto 15 ms)
// Valor de retorno: NADA
function inicializarScroll(id_contenido, id_contenedor, salto, intervalo)
{
	// Intervalo (por defecto 15ms) y salto (por defecto 1 pixel)
	_scroll_intervalo = (intervalo)?intervalo:15;
	_scroll_salto = (salto)?salto:1;

	// Se buscan los objetos de las capas contenedora y contenido
	_scroll_capa_contenedor	= document.getElementById(id_contenedor);
	_scroll_capa_contenido = document.getElementById(id_contenido);

	if(_scroll_capa_contenedor && _scroll_capa_contenido)
	{
		// Se calcula la longitud de la capa contenido
		_scroll_longitud_contenido = (_scroll_capa_contenido.offsetHeight)?_scroll_capa_contenido.offsetHeight:_scroll_capa_contenido.style.clip.height;
	
		// Se calcula la posición inicial y actual (la misma inicialmente) de la capa contenido
		_scroll_pos_inicial = _scroll_pos_actual = _scroll_capa_contenido.offsetTop; 
		// Se calcula la máxima posición vertical de la capa contenido
		_scroll_max_pos = _scroll_capa_contenedor.clientHeight - _scroll_longitud_contenido;
	
		// Se establece a true el flag que indica que la página está cargada
		_scroll_pagina_cargada = true;
		
		// Si el tamaño de la capa contenido no es mayor que el de la capa contenedora,
		// no hace falta hacer scroll
		_scroll_necesario = (_scroll_capa_contenedor.clientHeight < _scroll_longitud_contenido);
		
		// Si no es necesario hacer scroll, se ocultan las imágenes de las flechas
		if(_scroll_necesario == false)
		{
			if(document.getElementById('flecha_arriba'))
			{ document.getElementById('flecha_arriba').style.display='none'; }
			if(document.getElementById('flecha_abajo'))
			{ document.getElementById('flecha_abajo').style.display='none'; }
			if(document.getElementById('linea_scroll'))
			{ document.getElementById('linea_scroll').style.display='none';	}
		}
	}
}

// Inicia el movimiento de scroll de las capas
// En realidad, establece un temporizador que llama a la función que hace el movimiento
// Parámetros: - Dirección de movimiento (SCROLL_BAJAR / SCROLL_BAJAR)
// Valor de retorno: NADA
function iniciarScroll(direccion)
{
	if(_scroll_pagina_cargada == true && _scroll_necesario == true)
	{ _scroll_id_temporizador = setTimeout("realizarScroll(" + direccion + ")", _scroll_intervalo); }
}

// Detiene el movimiento de scroll de las capas
// En realidad, anula el temporizador que llama a la función que hace el movimiento
// Parámetros: NADA
// Valor de retorno: NADA
function pararScroll()
{
	if(_scroll_pagina_cargada == true)
	{ clearTimeout(_scroll_id_temporizador); }
}

// Realiza el movimiento de scroll de las capas
// Parámetros: - Dirección de movimiento (SCROLL_BAJAR / SCROLL_BAJAR)
// Valor de retorno: NADA
function realizarScroll(direccion)
{
	// Según la dirección del movimiento se calcula la nueva posición de la capa.
	// Se tiene en cuenta que, en caso de que la nueva posición sobrepasara el 
	// tope (superior o inferior), la nueva posición sería ese tope mismo.
	switch(direccion)
	{
		case SCROLL_SUBIR:
			_scroll_pos_actual = ( _scroll_pos_actual + _scroll_salto >= _scroll_pos_inicial )?_scroll_pos_inicial:_scroll_pos_actual+_scroll_salto;
			break;
		case SCROLL_BAJAR:
		default:
			_scroll_pos_actual = ( _scroll_pos_actual - _scroll_salto < _scroll_max_pos )?_scroll_max_pos:_scroll_pos_actual-_scroll_salto;
			break;
	}
	
	// Se efectúa el movimiento de la capa (se distingue la forma de hacerli según el soporte de los navegadores)
	if(_scroll_capa_contenido.moveTo)
	{ _scroll_capa_contenido.moveTo(_scroll_pos_actual,0); }
	else
	{ _scroll_capa_contenido.style.top = _scroll_pos_actual+"px"; }
	
	// Si no se ha alcanzado el tope superior o inferior, se vuelve a establecer el temporizador
	if(_scroll_pos_actual != _scroll_pos_inicial && _scroll_pos_actual != _scroll_max_pos)
	{ _scroll_id_temporizador = setTimeout("realizarScroll(" + direccion + ")", _scroll_intervalo); }
}
