// Script (c) Hugo J Castro 2004 (hugojcastro@hotmail.com)

// Código registrado como propiedad intelectual. Cualquier repetición, copia o uso
// sin consentimiento del autor será perseguido y penado por la ley.

// Importante: Cada bloque a desplazar debe formarse por dos "divs" anidados:
// El primero, con el nombre que quieras (ejemplo: "contenedor")
// El de dentro, debe llamarse como el anterior, más "contenido" (ejemplo: "contenedorcontenido")
// De igual forma, las imágenes para desplazar se llamarán uniendo el nombre del contenedor que
// desplazan, y el nombre del control de la imagen (ejemplo: "contenedorscrollup" )
// Ejemplo: Una barra de desplazamiento vertical sería:
// <IMG ID="contenedorscrollup" SRC=..>
// <IMG ID="contenedorscrolldown" SRC=..>
// <IMG ID="contenedorvthumb" SRC=..>
// El contenedor y contenido serían:
// <DIV id="contenedor">
//  <DIV id="contenedorcontenido">
// ...
//  </DIV>
// </DIV>

// *******************************************
// Inicio de la parte configurable
// Si copias esto en tu página web ANTES de la llamada al script,
// podrás mostrar distintos aspectos con el mismo código de scroll,
// al cambiar las imágenes

if ( typeof MINSTEP == "undefined" )		var MINSTEP			= 1;					// Desplazamiento normal de las barras, en pixels
if ( typeof BIGSTEP == "undefined" )		var BIGSTEP			= 5;					// Aumento de desplazamiento de las barras, en pixels
if ( typeof namecontenido == "undefined" )	var namecontenido	= "contenido";			// Sufijo dado al "div" dentro del contenedor en el HTML
if ( typeof namevthumb == "undefined" )		var namevthumb		= "vthumb";				// Sufijo dado al boton de desplazamiento vertical en el HTML
if ( typeof namescrlup == "undefined" )		var namescrlup		= "scrollup";			// Sufijo dado al botón de scroll arriba en el HTML
if ( typeof namescrldown == "undefined" )	var namescrldown	= "scrolldown";			// Sufijo dado al botón de scroll abajo en el HTML

if ( typeof ruta == "undefined" )			var ruta			= "imagenes/";			// Ruta a imágenes de los botones
if ( typeof filescrlupon == "undefined" )	var filescrlupon	= "scroll_arriba_over.gif";		// Imagen boton scroll arriba al pasar sobre
if ( typeof filescrlupof == "undefined" )	var filescrlupof	= "scroll_abajo_over.gif";	// Imagen boton scroll arriba estado normal
if ( typeof filescrlupdn == "undefined" )	var filescrlupdn	= "scrollupdown.gif";	// Imagen boton scroll arriba estado pulsado
if ( typeof filescrldownon == "undefined" )	var filescrldownon	= "scrolldownon.gif";	// Imagen boton scroll abajo al pasar sobre
if ( typeof filescrldownof == "undefined" )	var filescrldownof	= "scrolldownoff.gif";	// Imagen boton scroll abajo estado normal
if ( typeof filescrldowndn == "undefined" )	var filescrldowndn	= "scrolldowndown.gif";	// Imagen boton scroll abajo estado pulsado
if ( typeof filevthumbon == "undefined" )	var filevthumbon	= "vthumbon.gif";		// Imagen boton desplazamiento vertical al pasar sobre
if ( typeof filevthumbof == "undefined" )	var filevthumbof	= "scroll_centro.gif";		// Imagen boton desplazamiento vertical estado normal
if ( typeof filevthumbdn == "undefined" )	var filevthumbdn	= "vthumbdown.gif";		// Imagen boton desplazamiento vertical estado pulsado

// Fin de la parte configurable
// *******************************************

// Funcion para tomar información del navegador
function navegador() {
	this.nom = navigator.appName;
	this.ver = navigator.appVersion;
	this.dom = document.getElementById ? 1 : 0;
	this.ie4 = ( document.all && !this.dom ) ? 1 : 0;
	this.ie5 = ( this.ver.indexOf( "MSIE 5" ) > -1 && this.dom ) ? 1 : 0;
	this.ns4 = ( document.layers && !this.dom ) ? 1 : 0;
	this.ns5 = ( this.dom && parseInt( this.ver ) >= 5 ) ? 1 : 0;
	this.op  = ( navigator.appName.indexOf( "Opera" ) > -1 );
	this.ok  = ( this.ie5 || this.ie4 || this.ns4 || this.ns5 || !this.op );
	return this;
}

// Variables globales
var nav = new navegador();
var scrollbars = new Array();
// Variables para desplazamientos
var elscrol = null;
var draggin = false;
var vt = 0;
var ht = 0;
// Precarga de las imágenes
var img1 = new Image(); img1.src = ruta + filescrlupof;
var img4 = new Image(); img4.src = ruta + filescrldownof;
var imgd = new Image(); imgd.src = ruta + filevthumbof;
var img0 = new Image(); img0.src = ruta + filescrlupon;
var img3 = new Image(); img3.src = ruta + filescrldownon;
var imgc = new Image(); imgc.src = ruta + filevthumbon;
var img2 = new Image(); img2.src = ruta + filescrlupdn;
var img5 = new Image(); img5.src = ruta + filescrldowndn;
var imge = new Image(); imge.src = ruta + filevthumbdn;

// Funcion que devuelve el scrollbar correspondiente al nombre dado como parámetro
function getScrollbar( name ) {
	for( var i = 0; i < scrollbars.length; i++ ) {
		if ( scrollbars[ i ].name == name ) { return scrollbars[ i ]; }
	}
	return null;
}

// Objeto para desplazar contenido de un div: Toma como parámetros el nombre del contenedor,
// un indice idenficativo, ancho y alto de recorte y el modo del scroll (clásico o nuevo).
// Contiene referencia al contenedor y contenido, a estos valores, y a las funciones para
// hacer el desplazamiento en el div
function scrollbar( frm, idx, clipwidth, clipheight, classic, proporcional ) {
	// Variables generales: Cadenas y valores
	var cont	= frm + namecontenido;
	var vthmb	= frm + namevthumb;
	var scrlup	= frm + namescrlup;
	var scrldn	= frm + namescrldown;
    var tmp		= 0;

	// Propiedades del objeto: Identificadores
	this.name	= frm;
	this.idx	= idx;

	// Enlaces con objetos HTML y CSS
    this.contenedor		= nav.op ? eval( frm ) : nav.dom ? document.getElementById( frm ) : nav.ie4 ? document.all[ frm ] : nav.ns4 ? eval( 'document.' + frm ) : 0;
    this.contenido		= nav.op ? eval( cont ) : nav.dom ? document.getElementById( cont ) : nav.ie4 ? document.all[ cont ] : nav.ns4 ? eval( frm + '.document.' + cont ) : 0;
	this.vthumb			= nav.op ? eval( vthmb ) : nav.dom ? document.getElementById( vthmb ) : nav.ie4 ? document.all[ vthmb ] : nav.ns4 ? eval( 'document.' + vthmb ) : 0;
	this.scrollup		= nav.op ? eval( scrlup ) : nav.dom ? document.getElementById( scrlup ) : nav.ie4 ? document.all[ scrlup ] : nav.ns4 ? eval( 'document.' + scrlup ) : 0;
	this.scrolldown		= nav.op ? eval( scrldn ) : nav.dom ? document.getElementById( scrldn ) : nav.ie4 ? document.all[ scrldn ] : nav.ns4 ? eval( 'document.' + scrldn ) : 0;
    this.csscontenedor	= nav.op ? eval( frm ).style : nav.dom ? document.getElementById( frm ).style : nav.ie4 ? document.all[ frm ].style : nav.ns4 ? eval( 'document.' + frm ) : 0;
    this.csscontenido	= nav.op ? eval( cont ).style : nav.dom ? document.getElementById( cont ).style : nav.ie4 ? document.all[ cont ].style : nav.ns4 ? eval( frm + '.document.' + cont ) : 0;
    this.cssvthumb		= nav.op ? eval( vthmb ).style : nav.dom ? document.getElementById( vthmb ).style : nav.ie4 ? document.all[ vthmb ].style : nav.ns4 ? eval( 'document.' + vthmb ) : 0;
    this.cssscrollup	= nav.op ? eval( scrlup ).style : nav.dom ? document.getElementById( scrlup ).style : nav.ie4 ? document.all[ scrlup ].style : nav.ns4 ? eval( 'document.' + scrlup ) : 0;
	this.cssscrolldown	= nav.op ? eval( scrldn ).style : nav.dom ? document.getElementById( scrldn ).style : nav.ie4 ? document.all[ scrldn ].style : nav.ns4 ? eval( 'document.' + scrldn ) : 0;

	// Medidas para scroll
    if ( nav.ns5 ) { while ( tmp < 1000000 ) { tmp++; } }
    this.clipHeight		= clipheight;
    this.clipWidth		= clipwidth;
    this.scrollHeight	= nav.ns4 ? this.csscontenedor.document.height : this.contenido.offsetHeight;
    this.scrollWidth	= nav.ns4 ? this.csscontenedor.document.width : this.contenido.offsetWidth;
	this.minheight		= Math.min( 0.0000000000000000001, this.clipHeight - this.scrollHeight );
	this.minwidth		= Math.min( 0.0000000000000000001, this.clipWidth - this.scrollWidth );

	if ( proporcional ) {
		this.vthumb.height	= Math.max( this.vthumb.height, ( parseInt( this.cssscrolldown.top ) - this.scrollup.height - parseInt( this.cssscrollup.top ) )* clipheight / this.contenido.scrollHeight );
	}

    var altovthumb      = this.vthumb.height;
    var altovbutton     = this.scrollup.height;
	// Factores para scroll
	this.deltax			= 0;
	this.deltay			= 0;
	var tup = parseInt( this.cssscrollup.pixelTop );
	var tdn = parseInt( this.cssscrolldown.pixelTop );
	var lup = parseInt( this.cssscrollup.pixelLeft );
	var ldn = parseInt( this.cssscrolldown.pixelLeft );
	var tga = ( tdn == tup ) ? 0 : ( ldn - lup ) / ( tdn - tup );
	this.factorvx		= lup + this.scrollup.height * tga;
	this.factorvy		= tup + this.scrollup.height;
	this.dragvi			= this.factorvx - ldn + this.vthumb.height*tga;
	this.dragvj			= this.factorvy - tdn + this.vthumb.height;
	this.dragvD			= this.dragvi*this.dragvi + this.dragvj*this.dragvj;

	// Métodos del objeto: Temporizadores y desplazamientos
	this.timer			= null;
	this.vscroll		= dovscroll;
	this.vstop			= vscrollstop;
	this.moveTo			= moverA;
	this.vscrollTo		= vscrollA;

	// Asignamos los eventos a los objetos HTML que sirven de barra de desplazamiento, segun modo
	
	// Desactivamos el doble click
	this.scrollup.ondblclick			= null;
	this.scrolldown.ondblclick			= null;
	this.vthumb.ondblclick				= null;
	this.scrollup.onclick				= null;
	this.scrolldown.onclick				= null;
	this.vthumb.onclick					= null;
	
	if ( classic ) {
	    // Pasar sobre botones de desplazamiento
		this.scrollup.onmouseover		= oldmouseoverscrollup;
		this.scrolldown.onmouseover		= oldmouseoverscrolldown;
	    // Salir de botones de desplazamiento
		this.scrollup.onmouseout		= oldmouseoutscrollup;
		this.scrolldown.onmouseout		= oldmouseoutscrolldown;
	    // Pulsar en botones de desplazamiento
		this.scrollup.onmousedown		= oldmousedownscrollup;
		this.scrolldown.onmousedown		= oldmousedownscrolldown;
	    // Arrastrar barras de desplazamiento, si el navegador lo acepta
		if ( nav.ie4 || nav.ie5 ) {
			this.scrollup.ondragstart		= oldmousedownscrollup;
			this.scrolldown.ondragstart		= oldmousedownscrolldown;
		}
	    // Soltar en botones de desplazamiento
		this.scrollup.onmouseup			= oldmouseupscrollup;
		this.scrolldown.onmouseup		= oldmouseupscrolldown;
	} else {
	    // Pasar sobre botones de desplazamiento
		this.scrollup.onmouseover		= newmouseoverscrollup;
		this.scrolldown.onmouseover		= newmouseoverscrolldown;
	    // Salir de botones de desplazamiento
		this.scrollup.onmouseout		= newmouseoutscrollup;
		this.scrolldown.onmouseout		= newmouseoutscrolldown;
	    // Pulsar en botones de desplazamiento
		this.scrollup.onmousedown		= newmousedownscrollup;
		this.scrolldown.onmousedown		= newmousedownscrolldown;
	}

	// Pasar sobre las barras de desplazamiento
	this.vthumb.onmouseover			= mouseovervthumb;
	// Salir de las barras de desplazamiento
	this.vthumb.onmouseout			= mouseoutvthumb;
	// Pulsar barras de desplazamiento
	this.vthumb.onmousedown			= mousedownvthumb;
	// Arrastrar barras de desplazamiento, si el navegador lo acepta
	if ( nav.ie4 || nav.ie5 ) {
		this.vthumb.ondragstart		= mousedownvthumb;
	}
	// Se acabo: Posicionamos los botones de desplazamiento
	this.cssvthumb.top     = this.factorvy;
	this.cssvthumb.left    = this.factorvx;
	this.csscontenido.top  = 0;
	this.csscontenido.left = 0;
	return this;
}

// Funcion al pasar sobre boton de scroll arriba
function oldmouseoverscrollup() {
	var frame = this.id.substr(0, this.id.indexOf( namescrlup ) );
	var scrlbar = getScrollbar( frame );
	if ( parseInt( scrlbar.csscontenido.top ) < 0 ) {
		if ( !draggin ) { scrlbar.scrollup.src = ruta + filescrlupon; }
	}
}
// Funcion al pasar sobre boton de scroll abajo
function oldmouseoverscrolldown() {
	var frame = this.id.substr(0, this.id.indexOf( namescrldown ) );
	var scrlbar = getScrollbar( frame );
	if ( parseInt( scrlbar.csscontenido.top ) > scrlbar.minheight ) {
		if ( !draggin ) { scrlbar.scrolldown.src = ruta + filescrldownon; }
	}
}

// Funcion al salir del boton de scroll arriba
function oldmouseoutscrollup() {
	var frame = this.id.substr(0, this.id.indexOf( namescrlup ) );
	var scrlbar = getScrollbar( frame );
	if ( !draggin ) { scrlbar.scrollup.src = ruta + filescrlupof; }
}
// Funcion al salir del boton de scroll abajo
function oldmouseoutscrolldown() {
	var frame = this.id.substr(0, this.id.indexOf( namescrldown ) );
	var scrlbar = getScrollbar( frame );
	if ( !draggin ) { scrlbar.scrolldown.src = ruta + filescrldownof; }
}

// Funcion al pulsar el boton de scroll arriba
function oldmousedownscrollup() {
   var si = ( ( ( navigator.appName == 'Netscape' ) && ( e.which == 3 ) ) || ( ( navigator.appName == 'Microsoft Internet Explorer' ) && ( event.button == 2 ) ) );
   if ( si ) { return false; }
   var frame = this.id.substr(0, this.id.indexOf( namescrlup ) );
	elscrol = getScrollbar( frame );
	if ( parseInt( elscrol.csscontenido.top ) < 0 ) {
		elscrol.scrollup.src = ruta + filescrlupdn;
		if ( nav.ns4 || nav.op ) window.document.captureEvents( Event.MOUSEMOVE | Event.MOUSEUP );
		window.document.onmouseup = oldmouseupscrollup;
		window.document.onmousemove = function() {
			if ( !draggin ) { draggin = true; elscrol.scrollup.src = ruta + filescrlupdn; }
			return false;
		}
		elscrol.deltay = -MINSTEP;
		elscrol.vscroll();
	}
	return true;
}
// Funcion al pulsar el boton de scroll abajo
function oldmousedownscrolldown() {
   var si = ( ( ( navigator.appName == 'Netscape' ) && ( e.which == 3 ) ) || ( ( navigator.appName == 'Microsoft Internet Explorer' ) && ( event.button == 2 ) ) );
   if ( si ) { return false; }
   var frame = this.id.substr(0, this.id.indexOf( namescrldown ) );
	elscrol = getScrollbar( frame );
	if ( parseInt( elscrol.csscontenido.top ) > elscrol.minheight ) {
		elscrol.scrolldown.src = ruta + filescrldowndn;
		if ( nav.ns4  || nav.op ) window.document.captureEvents( Event.MOUSEMOVE | Event.MOUSEUP );
		window.document.onmouseup = oldmouseupscrolldown;
		window.document.onmousemove = function() {
			if ( !draggin ) { draggin = true; elscrol.scrolldown.src = ruta + filescrldowndn; }
			return false;
		}
		elscrol.deltay = MINSTEP;
		elscrol.vscroll();
	}
	return true;
}

// Funcion al soltar el boton de scroll abajo
function oldmouseupscrolldown(e) {
	if ( elscrol == null ) return;
	if ( !e ) { e = window.event; }
	var ey = e.pageY ? e.pageY : ( e.y ) ? e.y : e.offsetY;
	var ex = e.pageX ? e.pageX : ( e.x ) ? e.x : e.offsetX;
	if ( nav.ns4 || nav.op ) window.document.releaseEvents( Event.MOUSEMOVE | Event.MOUSEUP );
	window.document.onmouseup   = null;
	window.document.onmousemove = null;
	if ( elscrol.timer != null ) { clearTimeout( elscrol.timer ); elscrol.timer = null; }
	var dentro = ( ( ey >= parseInt( elscrol.cssscrolldown.top ) ) && ( ey <= parseInt( elscrol.cssscrolldown.top ) + elscrol.scrolldown.height ) ) &&
	( ( ex >= parseInt( elscrol.cssscrolldown.left ) ) && ( ex <= parseInt( elscrol.cssscrolldown.left ) + elscrol.scrolldown.width ) );
	elscrol.scrolldown.src = ruta + ( ( dentro ) ? ( elscrol.deltay > 0 ) ? filescrldownon : filescrldownof : filescrldownof );
	elscrol.deltay = 0;
	elscrol = null;
	draggin = false;
}
// Funcion al soltar el boton de scroll arriba
function oldmouseupscrollup(e) {
	if ( elscrol == null ) return;
	if ( !e ) { e = window.event; }
	var ey = e.pageY ? e.pageY : ( e.y ) ? e.y : e.offsetY;
	var ex = e.pageX ? e.pageX : ( e.x ) ? e.x : e.offsetX;
	if ( nav.ns4 || nav.op ) window.document.releaseEvents( Event.MOUSEMOVE | Event.MOUSEUP );
	window.document.onmouseup   = null;
	window.document.onmousemove = null;
	if ( elscrol.timer != null ) { clearTimeout( elscrol.timer ); elscrol.timer = null; }
	var dentro = ( ( ey >= parseInt( elscrol.cssscrollup.top ) ) && ( ey <= parseInt( elscrol.cssscrollup.top ) + elscrol.scrollup.height ) ) &&
	( ( ex >= parseInt( elscrol.cssscrollup.left ) ) && ( ex <= parseInt( elscrol.cssscrollup.left ) + elscrol.scrollup.width ) );
	elscrol.scrollup.src = ruta + ( ( dentro ) ? ( elscrol.deltay < 0 ) ? filescrlupon : filescrlupof : filescrlupof );
	elscrol.deltay = 0;
	elscrol = null;
	draggin = false;
}

// Funcion para mover el contenido a una posición:
// Actualiza la posición del botón de desplazamiento
function moverA( px, py ) {
	var modo = 2*( px != parseInt( this.csscontenido.left ) ) + 1*( py != parseInt( this.csscontenido.top ) );
	var t;
	switch( modo ) {
		case 0 : break;
		case 1 : // Vertical
			t = Math.min( 1, Math.max( 0, ( py / this.minheight ) ) );
			this.cssvthumb.top  = this.factorvy - this.dragvj*t;
			this.cssvthumb.left = this.factorvx - this.dragvi*t;
			this.csscontenido.top  = Math.max( Math.min( 0, py ), this.minheight );
			break;
		case 2 : // Horizontal
			this.csscontenido.left = Math.max( Math.min( 0, px ), this.minwidth );
			break;
		case 3 : // Ambos
			t = Math.min( 1, Math.max( 0, ( py / this.minheight ) ) );
			this.cssvthumb.top  = this.factorvy - this.dragvj*t;
			this.cssvthumb.left = this.factorvx - this.dragvi*t;
			this.csscontenido.top  = Math.max( Math.min( 0, py ), this.minheight );
			this.csscontenido.left = Math.max( Math.min( 0, px ), this.minwidth );
			break;
	}
}
// Función para mover el botón de desplazamiento vertical: Actualiza la posición del contenido
function vscrollA( px, py ) {
	var XNP = this.factorvx - px;
	var YNP = this.factorvy - py;
	var t = Math.min( 1, Math.max( 0, ( ( this.dragvi*XNP + this.dragvj*YNP ) / this.dragvD ) - vt ) );
	// Movemos boton
	this.cssvthumb.top  = this.factorvy - this.dragvj*t;
	this.cssvthumb.left = this.factorvx - this.dragvi*t;
	// Movemos contenido
	this.csscontenido.top  = Math.max( Math.min( 0, this.minheight*t ), this.minheight );
}

// Funcion al pasar sobre boton de scroll arriba
function newmouseoverscrollup() {
	var frame = this.id.substr(0, this.id.indexOf( namescrlup ) );
	var scrlbar = getScrollbar( frame );
	if ( parseInt( scrlbar.csscontenido.top ) < 0 ) {
		scrlbar.scrollup.src = ruta + filescrlupon;
		scrlbar.deltay = -MINSTEP;
		scrlbar.vscroll();
	}
}
// Funcion al pasar sobre boton de scroll abajo
function newmouseoverscrolldown() {
	var frame = this.id.substr(0, this.id.indexOf( namescrldown ) );
	var scrlbar = getScrollbar( frame );
	if ( parseInt( scrlbar.csscontenido.top ) > scrlbar.minheight ) {
		scrlbar.scrolldown.src = ruta + filescrldownon;
		scrlbar.deltay = MINSTEP;
		scrlbar.vscroll();
	}
}

// Funcion al salir del boton de scroll arriba
function newmouseoutscrollup() {
	var frame = this.id.substr(0, this.id.indexOf( namescrlup ) );
	var scrlbar = getScrollbar( frame );
	scrlbar.scrollup.src = ruta + filescrlupof;
	scrlbar.vstop();
}
// Funcion al salir del boton de scroll abajo
function newmouseoutscrolldown() {
	var frame = this.id.substr(0, this.id.indexOf( namescrldown ) );
	var scrlbar = getScrollbar( frame );
	scrlbar.scrolldown.src = ruta + filescrldownof;
	scrlbar.vstop();
}

// Funcion al pulsar el boton de scroll arriba
function newmousedownscrollup() {
   var si = ( ( ( navigator.appName == 'Netscape' ) && ( e.which == 3 ) ) || ( ( navigator.appName == 'Microsoft Internet Explorer' ) && ( event.button == 2 ) ) );
   if ( si ) { return false; }
	var frame = this.id.substr(0, this.id.indexOf( namescrlup ) );
	var scrlbar = getScrollbar( frame );
	scrlbar.deltay -= BIGSTEP;
}
// Funcion al pulsar el boton de scroll arriba
function newmousedownscrolldown() {
   var si = ( ( ( navigator.appName == 'Netscape' ) && ( e.which == 3 ) ) || ( ( navigator.appName == 'Microsoft Internet Explorer' ) && ( event.button == 2 ) ) );
   if ( si ) { return false; }
   var frame = this.id.substr(0, this.id.indexOf( namescrldown ) );
	var scrlbar = getScrollbar( frame );
	scrlbar.deltay += BIGSTEP;
}


// Funcion al pasar sobre el boton de desplazamiento vertical
function mouseovervthumb() {
	var frame = this.id.substr(0, this.id.indexOf( namevthumb ) );
	var scrlbar = getScrollbar( frame );
	if ( !draggin ) { scrlbar.vthumb.src = ruta + filevthumbon; }
	return false;
}
// Funcion al salir del boton de desplazamiento vertical
function mouseoutvthumb() {
	var frame = this.id.substr(0, this.id.indexOf( namevthumb ) );
	var scrlbar = getScrollbar( frame );
	if( ! draggin ) { scrlbar.vthumb.src = ruta + filevthumbof; }
}
// Funcion al pulsar y arrastrar el boton de desplazamiento vertical
function mousedownvthumb(e) {
   var si = ( ( ( navigator.appName == 'Netscape' ) && ( e.which == 3 ) ) || ( ( navigator.appName == 'Microsoft Internet Explorer' ) && ( event.button == 2 ) ) );
   if ( si ) { return false; }
   var frame = this.id.substr(0, this.id.indexOf( namevthumb ) );
	elscrol = getScrollbar( frame );
	if ( elscrol.minheight < 0 ) {
		elscrol.vthumb.src = ruta + filevthumbdn;
		if ( !e ) { e = window.event; }
		var ey = e.pageY ? e.pageY : ( e.y ) ? e.y : e.offsetY;
		var ex = e.pageX ? e.pageX : ( e.x ) ? e.x : e.offsetX;
		var XNP = elscrol.factorvx - ex;
		var YNP = elscrol.factorvy - ey;
		vt = ( ( elscrol.dragvi*XNP + elscrol.dragvj*YNP ) / elscrol.dragvD );
		if ( nav.ns4 || nav.op ) window.document.captureEvents( Event.MOUSEMOVE | Event.MOUSEUP );
		window.document.onmousemove = dovDrag;
		window.document.onmouseup = stopvDrag;
	} else { elscrol = null; }
	return false;
}
// Función para hacer arrastre vertical con botón de desplazamiento: Toma posición del cursor y hace scroll
function dovDrag(e) {
	if ( !draggin ) { draggin = true; elscrol.vthumb.src = ruta + filevthumbdn; }
	// Tomamos posición del cursor y hacemos scroll
	if ( !e ) { e = window.event; }
	var ey = e.pageY ? e.pageY : ( e.y ) ? e.y : e.offsetY;
	var ex = e.pageX ? e.pageX : ( e.x ) ? e.x : e.offsetX;
	var XNP = elscrol.factorvx - ex;
	var YNP = elscrol.factorvy - ey;
	var tt = ( ( elscrol.dragvi*XNP + elscrol.dragvj*YNP ) / elscrol.dragvD );
	var dt =  tt - vt;
	vt = tt;
	var XNP = elscrol.factorvx - parseInt( elscrol.cssvthumb.left );
	var YNP = elscrol.factorvy - parseInt( elscrol.cssvthumb.top );
 	tt = Math.min( 1, Math.max( 0, ( ( elscrol.dragvi*XNP + elscrol.dragvj*YNP ) / elscrol.dragvD ) + dt ) );
	// Movemos boton
	elscrol.cssvthumb.top  = elscrol.factorvy - elscrol.dragvj*tt;
	elscrol.cssvthumb.left = elscrol.factorvx - elscrol.dragvi*tt;
	// Movemos contenido
	elscrol.csscontenido.top  = Math.max( Math.min( 0, elscrol.minheight*tt ), elscrol.minheight );
	return false;
}
// Función para parar el desplazamiento vertical: desasigna eventos y restaura botón de desplazamiento
function stopvDrag(e) {
	if ( !e ) { e = window.event; }
	var ey = e.pageY ? e.pageY : ( e.y ) ? e.y : e.offsetY;
	var ex = e.pageX ? e.pageX : ( e.x ) ? e.x : e.offsetX;
	if ( nav.ns4 || nav.op ) window.document.releaseEvents( Event.MOUSEMOVE | Event.MOUSEUP );
	window.document.onmousemove = null;
	window.document.onmouseup   = null;
	var dentro = ( ( ey >= parseInt( elscrol.cssvthumb.top ) ) && ( ey <= parseInt( elscrol.cssvthumb.top ) + elscrol.vthumb.height ) ) &&
	( ( ex >= parseInt( elscrol.cssvthumb.left ) ) && ( ex <= parseInt( elscrol.cssvthumb.left ) + elscrol.vthumb.width ) );
	elscrol.vthumb.src = ruta + ( ( dentro ) ? filevthumbon : filevthumbof );
	elscrol = null;
	draggin = false;
	vt = 0;
}

// Funcion para desplazar un contenedor verticalmente
function dovscroll() {
	var px = parseInt( this.csscontenido.left );
	var py = parseInt( this.csscontenido.top ) - this.deltay;
	// Comprobamos timers
	if ( this.deltay == 0 ) {
		if ( this.timer != null ) { clearTimeout( this.timer ); this.timer = null; }
	} else {
		if ( py < this.minheight ) {
			this.csscontenido.top = this.minheight;
			this.scrolldown.src = ruta + filescrldownof;
			this.deltay = 0;
		} else if ( py > 0 ) {
			this.csscontenido.top = 0;
			this.scrollup.src = ruta + filescrlupof;
			this.deltay = 0;
		}
	}

	// Desplazamos
	this.moveTo( px, py );

	// Si sigo desplazando, lanzo temporizacion
	if ( this.deltay != 0 ) {
		this.timer = window.setTimeout( "scrollbars[" + this.idx + "].vscroll()", 10 );
	} else {
		this.vstop();
	}
}

// Funcion para parar desplazamiento vertical en un un contenedor
function vscrollstop() {
	this.deltay = 0;
	vt = 0;
	if ( this.timer != null ) { clearTimeout( this.timer ); this.timer = null; }
	return;
}

// Función para poder ir a un punto de un contenedor. Es como un enlace, pero indicando el contenedor
// y el ID del objeto. Uso: En vez de <a href="#link" name="link"> se usa:
// <a href="javascript:irA('contenedor','link')" id="link">
// Consejo: En el enlace, usa: onmouseover="window.status='';return true;"
function irA( frame, elid ) {
	var scrolbar = getScrollbar( frame );
	var objeto = nav.dom ? document.getElementById( elid ) : nav.ie4 ? document.all[ elid ] : nav.ns4 ? eval( 'document.' + elid ) : 0;
	scrolbar.moveTo( -objeto.offsetLeft, -objeto.offsetTop );
}

// Función que crea barras de desplazamiento. Se pasan como parámetro los nombres de los contenedores a gestionar,
// el ancho y alto de la región visible (así se mejoran problemas de gestión), el modo de funcionamiento y
// si se quiere que las barras de desplazamiento sean proporcionales a las región desplazada. Se pueden crear
// varias barras a la vez.
// Uso: crearScrollbars( "div1",100,100,true,true,"div2",400,400,false,true,"div3",200,200,false,false);
function crearScrollbars() {
	var args = crearScrollbars.arguments;
	var barras = Math.floor( args.length / 5 );
	var idx = 0, i, eldiv, ancho, alto, modo, proporcional;
	for ( var i = 0; i < barras; i++ ) {
		eldiv = args[ idx++ ];
		ancho = args[ idx++ ];
		alto = args[ idx++ ];
		modo = args[ idx++ ];
		proporcional = args[ idx++ ];
		scrollbars[ i ] = new scrollbar( eldiv, i, ancho, alto, modo, proporcional );
	}
}

// Función que crea un grupo de barras de desplazamiento, con los parámetros dados
// (nombre del div, indice, ancho, alto y modo). Si ya había más, las añade a las existentes.
// Uso: crearScrollbar("div1",300,300,true);
function crearScrollbar( eldiv, ancho, alto, modo, proporcional ) {
	// Si no se pasa el parámetro de barras proporcionales, lo definimos
	if ( typeof proporcional == "undefined" )var proporcional = false;
	var i = scrollbars.length;
	scrollbars[ i ] = new scrollbar( eldiv, i, ancho, alto, modo, proporcional );
}

function nones( e ) {
	var si = true;
	if ( ( ( navigator.appName == 'Netscape' ) && ( e.which == 3 ) ) || ( ( navigator.appName == 'Microsoft Internet Explorer' ) && ( event.button == 2 ) ) ) { si = false; }
	if ( !si ) {
//  		alert( 'Script (c)2004 Hugo J Castro\n\nRegistrado como propiedad intelectual' );
	}
	return si;
}

function recarga() { location.reload(); }

// Capturamos eventos de raton
if ( nav.ns4 || nav.op ) {
  window.captureEvents( Event.MOUSEDOWN | Event.RESIZE );
  document.captureEvents( Event.MOUSEDOWN );
}
document.onmousedown = nones;
window.onmousedown = nones;
document.onselectstart = nones;

// Evitamos bug al redimensionar, por el que queda fijo el "DIV" :)
window.onresize=recarga;