var IE = (document.all) ? true : false;
var iebody = null;
var AUTOSIZEBUTTON = false;

var Scroller = {
	build: function(ido, idt, ids, idb, idl, idr, sped) {
		/* - - - tengo q sacar la altura q tiene por si es un recálculo (ie bug) - - - */

		/* Se pone a 0 el scroll */
		//document.getElementById(ido).scrollLeft = 0;
		//document.getElementById(idb).style.marginLeft = "0px";
		var btn_left = document.getElementById(idl);
		var btn_right = document.getElementById(idr);

		document.onmousemove = Mouse.FindMousePosition;
		if (!IE) document.captureEvents(Event.MOUSEMOVE);
		if (!IE) document.captureEvents(Event.MOUSEUP);

		iebody = document.getElementsByTagName("body")[0];
		var _barMaxWidth = document.getElementById(ids).offsetWidth - parseInt(Element.getStyle(ids, "padding-left")) - parseInt(Element.getStyle(ids, "padding-right"));

		
		var _textContainerWidth = document.getElementById(ido).offsetWidth;
		var _textWidth = document.getElementById(idt).offsetWidth;
		var _barWidth = (_textWidth > _textContainerWidth) ? (_textContainerWidth * _barMaxWidth / _textWidth) : _barMaxWidth;
		if (AUTOSIZEBUTTON){		
			_barWidth = (isNaN(_barWidth) || _barWidth < 0) ? 0 : _barWidth;
		}else { _barWidth = document.getElementById(idb).offsetWidth }
		
		var _maxOffsetLeft = _textWidth - _textContainerWidth;
		var _maxBarLeft = _barMaxWidth - _barWidth;

		document.getElementById(idb).style.position = "relative";
		if(parseInt(document.getElementById(idb).style.marginLeft) > _maxBarLeft) {
			document.getElementById(idb).style.marginLeft = _maxBarLeft + "px";
			document.getElementById(ido).scrollLeft = _maxOffsetLeft;
		}
			
		document.getElementById(idb).style.width =  Math.round(_barWidth) + "px";
		var btn_bar = document.getElementById(idb);

		btn_bar.onmousedown = function() {
			var _barContainerLeft = Scroller._findPos(document.getElementById(ids)).x + Math.abs(Mouse.x - Scroller._findPos(document.getElementById(idb)).x);
			/*var _barContainerLeft = document.getElementById(ids).offsetLeft + Math.abs(Mouse.x - document.getElementById(idb).offsetLeft);*/
			document.onmousemove = function(e) {
				Mouse.FindMousePosition(e);
				Scroller._clearDocumentSelection();

				var _dX = Mouse.x - _barContainerLeft;
				_dX += IE ? iebody.scrollLeft : 0;

				if (_dX > _maxBarLeft) _dX = _maxBarLeft;
				if (_dX < 0) _dX = 0;

				var _x = _dX * _maxOffsetLeft / _maxBarLeft;
				_x = (_x > 0) ? _x : 0;

				document.getElementById(ido).scrollLeft = Math.round(_x);
				document.getElementById(idb).style.marginLeft = Math.round(_dX) + "px";
				return true;
			};

			document.onmouseup = function() {
				document.onmousemove = Mouse.FindMousePosition;
				document.onmouseup = function() { return true; };
				return true;
			};
		};

		btn_bar.onmouseup = function() {
			document.onmousemove = Mouse.FindMousePosition;
			document.onmouseup = function() { return true; };
			return true;
		};

		var btn_left = document.getElementById(idl);
		var btn_right = document.getElementById(idr);
		var friccion = 4;

		if (btn_left) {
			btn_left.onmousedown = function() {
				var scrl = document.getElementById(ido).scrollLeft;
				var pag = scrl / sped;
				var eof = (scrl - sped) < 0 ? 0 : (scrl - sped);
				
				var test = eof / sped;
				if (test%1 != 0){
					eof = Math.floor(test) * sped;
				}

				var antval = 0;
				var antvalrep = 0;
				
				var f = function() {
					Scroller._clearDocumentSelection();
					
					var distance = eof - scrl;

					var _x = scrl + Math.floor(distance/friccion);
					_x = (_x > 0) ? _x : 0;
					
					var _dX = _x * _maxBarLeft / _maxOffsetLeft;
					_dX = (_dX > _maxBarLeft) ? _maxBarLeft : _dX;
					_dX = (_dX < 0) ? 0 : _dX;

					document.getElementById(ido).scrollLeft = Math.floor(_x);
					document.getElementById(idb).style.marginLeft = Math.floor(_dX) + "px";
					scrl = document.getElementById(ido).scrollLeft;

					if (Math.floor(_x) == eof || (Math.floor(_x) != scrl)) {
						clearInterval(btn_left.timer);
						btn_left.scrolling = false;
					}

					return true;
				};

				if (!btn_left.scrolling) {
					btn_left.timer = setInterval(f, 100);
					btn_left.scrolling = true;
				}
			};
		}

		if (btn_right) {
			btn_right.onmousedown = function() {
				var scrl = document.getElementById(ido).scrollLeft;
				/* Se lleva el documento a una posicion entera del offset sped*/
				var pag = document.getElementById(ido).scrollLeft / sped;
				var eof = scrl + sped;
				
				var test = eof / sped;
				if (test%1 != 0){
					eof = Math.floor(test) * sped;
				}

				var f = function() {
					Scroller._clearDocumentSelection();
					var distance = eof - scrl;

					var _x = scrl + Math.ceil(distance / friccion);
					_x = (_x > 0) ? _x : 0;
					
					var _dX = _x * _maxBarLeft / _maxOffsetLeft;
					_dX = (_dX > _maxBarLeft) ? _maxBarLeft : _dX;
					_dX = (_dX < 0) ? 0 : _dX;

					document.getElementById(ido).scrollLeft = Math.round(_x);
					document.getElementById(idb).style.marginLeft = Math.round(_dX) + "px";
					scrl = document.getElementById(ido).scrollLeft;
					
					if (Math.floor(_x) == eof || Math.floor(_x) != scrl) {
						clearInterval(btn_right.timer);
						btn_right.scrolling = false;
					}
					
					return true;
				};
				
				if (!btn_right.scrolling) {
					btn_right.timer = setInterval(f, 100);
					btn_right.scrolling = true;
				}
			};			
		}

		/* ini: actualizo la barra */		
		var _x = document.getElementById(ido).scrollLeft;
		var _dX = _x * _maxBarLeft / _maxOffsetLeft;
		_dX = (_dX > _maxBarLeft) ? _maxBarLeft : _dX;
		_dX = (_dX < 0) ? 0 : _dX;
		_dX = _dX ? _dX : 0;

		document.getElementById(idb).style.marginLeft = Math.floor(_dX) + "px";
		/* fin: actualizo la barra */
	},
	
	/* <MouseAbsolutePosition> */ 
	_mouse: new Object(),
	_getMouseXY: function(e) {
		if (IE) {
			e = e ? e : event;
			Mouse.x = e.clientX + iebody.scrollLeft;
			Mouse.y = e.clientY + iebody.scrollTop;
		} else {
			Mouse.x = e.pageX;
			Mouse.y = e.pageY;
		} 

		if (Mouse.x < 0) Mouse.x = 0;
		if (Mouse.y < 0) Mouse.y = 0;

		return true;
	},
	/* </MouseAbsolutePosition> */ 

	/* <ClearSelections> */ 
	_clearDocumentSelection: function() {
		if (document.selection)	{
			if (document.selection.clear) document.selection.clear();
			else if (document.selection.empty) document.selection.empty();
		} else {
			if (window.getSelection) {
				try{
					window.getSelection().collapse();
					window.getSelection().removeAllRanges();
				} catch(e) { };
			}
		}
	},
	/* </ClearSelections> */ 

	/* <AbsolutePosition> */ 
	_findPos: function (obj) {
		var rv = new Object();
			rv.x = rv.y = 0;

		if (obj.offsetParent) {

			rv.x = obj.offsetLeft;
			rv.y = obj.offsetTop;
			
			while (obj = obj.offsetParent){
				if (obj.nodeType == 1){
				rv.x += obj.offsetLeft;
				rv.y += obj.offsetTop;
				}
			}
		}
		return rv;
	}
	/* </AbsolutePosition> */ 
}
