/*
 © 2007 - Arcadio Carballares Martín
 http://www.carballares.es/arcadio
*/
// S C R O L L
function aqua_scroll(bar,con,scrll) {
	var barra = document.getElementById(bar);
	var contenido = document.getElementById(con);
	var scroll_barra = document.getElementById(scrll);
	var alto = contenido.offsetHeight;
	var alto_real = contenido.scrollHeight;
	var alto_oculto = alto_real-alto;
	var desplazamiento_vertical = 20;
	var desplazamiento_contenido =0;
	var posicion_inicial = barra.offsetTop;
	var pos_top = posicion_inicial;
	var relacion_avance=alto_oculto/(alto-alto_barra);
	var alto_barra =0;
	var barra_top = barra.offsetTop;
	barra.style.top=pos_top+"px";
	this.calcular_barra = calcular_barra;
	// Calcular tamano de la barra
	function calcular_barra() {
		alto_real = contenido.scrollHeight;
		alto_oculto = alto_real-alto;
		pos_top = posicion_inicial;
		if (alto_real>alto) {
			scroll_barra.style.display="inline";
			alto_barra = ((alto/alto_real)*alto);
			barra.style.height=alto_barra+"px";
			relacion_avance=alto_oculto/(alto-alto_barra);
			desplazamiento_contenido =relacion_avance*desplazamiento_vertical;	
			// Asociar los eventos necesarios
			contenido.onmousewheel = ie_wheel;
			if (window.addEventListener) {
				// DOMMouseScroll is for mozilla.
				contenido.addEventListener('DOMMouseScroll', mozilla_wheel, false);
			}		
		} else {
			barra.style.height="0px";
			barra.style.top=posicion_inicial+"px";
			contenido.scrollTop=0;
			scroll_barra.style.display="none";
			// Quitar los eventos asociados
			contenido.onmousewheel = null;
			if (window.addEventListener) {
				// DOMMouseScroll is for mozilla.
				contenido.removeEventListener('DOMMouseScroll', mozilla_wheel, false) 
			}
		}
	}
	// --
	barra.onmousedown= function arrastrar (e) {
		var zona_clic;
		if (window.Event) {
			zona_clic=e.pageY-this.offsetTop;
		} else {
			zona_clic=event.clientY-this.offsetTop;
		}
		relacion_avance=alto_oculto/(alto-alto_barra);
		document.body.style.cursor="hand";
		if(window.Event) {
			document.captureEvents(Event.MOUSEMOVE);
		}		
		// Capturar movimiento del raton
		document.onmousemove = function arrastrar (e) {
			// -- Comprobar si se sale de la zona de scroll
			if (window.Event) { // Mozilla
				if (e.pageY+alto_barra-zona_clic>posicion_inicial+alto) {
					return;
				}
				if (e.pageY-zona_clic<posicion_inicial) {
					return;
				}
			} else { // IE
				if (event.clientY+alto_barra-zona_clic>posicion_inicial+alto) {
					return;
				}
				if (event.clientY-zona_clic<posicion_inicial) {
					return;
				}
			}
			// --
			if (window.Event) { // Mozilla
				barra.style.top=(e.pageY-zona_clic)+"px";
				contenido.scrollTop=(barra.offsetTop-barra_top)*relacion_avance;
			} else { // IE
				barra.style.top=(event.clientY-zona_clic)+"px";
				contenido.scrollTop=(barra.offsetTop-barra_top)*relacion_avance;
			}
		}
	};
	function parar () {
		document.body.style.cursor="default";
		document.onmousemove=null;
	};
	function ie_wheel() {
		if(event.wheelDelta<0) {
			// Scroll abajo
			if (this.scrollTop+desplazamiento_contenido>=alto_oculto) {
				barra.style.top=(alto-alto_barra+pos_top)+"px";
				this.scrollTop=alto_oculto;
			} else {
				barra.style.top=(parseInt(barra.style.top)+desplazamiento_vertical)+"px";
				this.scrollTop=this.scrollTop+desplazamiento_contenido;
			}
		} else {
			// Scroll arriba
			if (this.scrollTop-desplazamiento_contenido<=pos_top) {
				barra.style.top=pos_top+"px";
				this.scrollTop=0;
			} else {
				barra.style.top=(parseInt(barra.style.top)-desplazamiento_vertical)+"px";
				this.scrollTop=this.scrollTop-desplazamiento_contenido;
			}
		}
	}
	function mozilla_wheel(event){
		if (event.detail > 0) {
			// Scroll abajo
			if (this.scrollTop+desplazamiento_contenido>=alto_oculto) {
				barra.style.top=(alto-alto_barra+pos_top)+"px";
				this.scrollTop=alto_oculto;
			} else {
				barra.style.top=(parseInt(barra.style.top)+desplazamiento_vertical)+"px";
				this.scrollTop=this.scrollTop+desplazamiento_contenido;
			}
		} else {
			// Scroll arriba
			if (this.scrollTop-desplazamiento_contenido<=pos_top) {
				barra.style.top=pos_top+"px";
				this.scrollTop=0;
			} else {
				barra.style.top=(parseInt(barra.style.top)-desplazamiento_vertical)+"px";
				this.scrollTop=this.scrollTop-desplazamiento_contenido;
			}
		}
	}
	// Inicializaciones
	//barra.onmouseup=parar; 
	document.onmouseup=parar;
	// Siempre que se haga click en 'contenido' se recalcula el scroll
	contenido.onclick=calcular_barra;
	this.calcular_barra();
}
// --------------------------------------------------------------------------------
// Inicializacion -----------------------------------------------------------------
// --------------------------------------------------------------------------------
function iniciar_scroll () {
	var hola = new aqua_scroll('mi_barra','mi_contenido','mi_scroll');
}
// Iniciar al cargar la pagina
if (document.getElementById && document.getElementsByTagName) {
	if (window.addEventListener) {
		window.addEventListener('load', iniciar_scroll, false);
	} else if (window.attachEvent) {
		window.attachEvent('onload', iniciar_scroll);
	}
}