////////// Direto no HTML //////////
startScroll = function(){
	myScroll = new xScroll(5,80,440,"track","up","down","drag","mask","content");
};
////////////////////////////////////

//////// Arquivo xscreen.js ////////
if(typeof(xScreen) == "undefined") xScreen = {};

xScreen.getWidth = function(){
	return window.screen ? window.screen.availWidth : 0;
};
xScreen.getHeight = function(){
	return window.screen ? window.screen.availHeight : 0;
};
////////////////////////////////////

//////// Arquivo xscroll.js ////////
// Requires: xelement.js, xelementobject.js, xwindow.js
//if(typeof(xElement) == "undefined") alert("xElement Required");
//if(typeof(xElementObject) == "undefined") alert("xElementObject Required");
//if(typeof(xWindow) == "undefined") alert("xWindow Required");

// ||||||||||||||||||||||||||||||||||||||||||||||||||

xScroll = function(speed, dragHeight, trackHeight, trackDiv, upDiv, downDiv, dragDiv, maskDiv, contentDiv){
	this.speed = speed;
	this.dragHeight = dragHeight;
	this.trackHeight = trackHeight;
	this.trackObj = new xElementObject(trackDiv);
	this.upObj = new xElementObject(upDiv);
	this.downObj = new xElementObject(downDiv);
	this.dragObj = new xElementObject(dragDiv);
	this.maskObj = new xElementObject(maskDiv);
	this.contentObj = new xElementObject(contentDiv);
	this.obj = "xScrollObject"+contentDiv;
	eval(this.obj+"=this");
	this.trackTop = this.dragObj.getTop();
	this.trackLength = this.trackHeight-this.dragHeight;
	this.trackBottom = this.trackTop+this.trackLength;
	this.maskHeight = this.maskObj.getClipHeight();
	this.contentHeight = this.contentObj.getHeight();
	this.contentLength = this.contentHeight-this.maskHeight;
	this.scrollLength = this.trackLength/this.contentLength;
	this.scrollTimer = null;
	if(this.contentHeight <= this.maskHeight){
		this.trackObj.hideVis();
		this.upObj.hideVis();
		this.downObj.hideVis();
		this.dragObj.hideVis();
	}else{
		var _this = this;
		this.trackObj.addEvent("mousedown", function(e){_this.scrollJump(e);return false});
		this.upObj.addEvent("mousedown", function(){_this.scroll(_this.speed);return false});
		this.upObj.addEvent("mouseup", function(){_this.stopScroll()});
		this.upObj.addEvent("mouseout", function(){_this.stopScroll()});
		this.downObj.addEvent("mousedown", function(){_this.scroll(-_this.speed);return false});
		this.downObj.addEvent("mouseup", function(){_this.stopScroll()});
		this.downObj.addEvent("mouseout", function(){_this.stopScroll()});
		this.dragObj.addEvent("mousedown", function(e){_this.startDrag(e);return false});
		if(document.all) this.dragObj.addEvent("dragstart", function(){return false});
		document.addEvent = function(event,method){xElement.addEvent(document,event,method)};
		document.removeEvent = function(event){xElement.removeEvent(document,event)};
	}
};
xScroll.prototype.startDrag = function(e){
	this.dragStartMouse = xWindow.getMouseTop(e);
	this.dragStartOffset = this.dragObj.getTop();
	var _this = this;
	document.addEvent("mousemove", function(e){_this.drag(e)});
	document.addEvent("mouseup", function(){_this.stopDrag()});
};
xScroll.prototype.stopDrag = function(){
	document.removeEvent("mousemove");
	document.removeEvent("mouseup");
};
xScroll.prototype.drag = function(e){
	var currentMouse = xWindow.getMouseTop(e);
	var mouseDifference = currentMouse-this.dragStartMouse;
	var dragDistance = this.dragStartOffset+mouseDifference;
	var dragMovement = (dragDistance<this.trackTop) ? this.trackTop : (dragDistance>this.trackBottom) ? this.trackBottom : dragDistance;
	this.dragObj.setTop(dragMovement);
	var contentMovement = -(dragMovement-this.trackTop)*(1/this.scrollLength);
	this.contentObj.setTop(contentMovement);
};
xScroll.prototype.scroll = function(speed){
	var contentMovement = this.contentObj.getTop()+speed;
	var dragMovement = this.trackTop-Math.round(this.contentObj.getTop()*(this.trackLength/this.contentLength));
	if(contentMovement > 0){
		contentMovement = 0;
	}else if(contentMovement < -this.contentLength){
		contentMovement = -this.contentLength;
	}
	if(dragMovement < this.trackTop){
		dragMovement = this.trackTop;
	}else if(dragMovement > this.trackBottom){
		dragMovement = this.trackBottom;
	}
	this.contentObj.setTop(contentMovement);
	this.dragObj.setTop(dragMovement);
	this.scrollTimer = window.setTimeout(this.obj+".scroll("+speed+")",25);
};
xScroll.prototype.stopScroll = function(){
	if(this.scrollTimer){
		window.clearTimeout(this.scrollTimer);
		this.scrollTimer = null;
	}
};
xScroll.prototype.scrollJump = function(e){
	var currentMouse = xWindow.getMouseTop(e);
	var dragDistance = currentMouse-(this.dragHeight/2);
	var dragMovement = (dragDistance<this.trackTop) ? this.trackTop : (dragDistance>this.trackBottom) ? this.trackBottom : dragDistance;
	this.dragObj.setTop(dragMovement);
	var contentMovement = -(dragMovement-this.trackTop)*(1/this.scrollLength);
	this.contentObj.setTop(contentMovement);
};
xScroll.prototype.scrollTo = function(pct) {
	var dragMovement = pct * (this.trackBottom - this.trackTop) / 100 + this.trackTop;
	this.dragObj.setTop(dragMovement);
	
	var contentMovement = -(dragMovement-this.trackTop)*(1/this.scrollLength);
	this.contentObj.setTop(contentMovement);	
};
///////////////////////////////////

//////// Arquivo xwindow.js ////////
if(typeof(xWindow) == "undefined") xWindow = {};

// ||||||||||||||||||||||||||||||||||||||||||||||||||

xWindow.getWidth = function(){
	var w = 0;
	if(document.documentElement && document.documentElement.clientWidth){// Explorer 6 strict
		w = document.documentElement.clientWidth;
	}else if (document.body && document.body.clientWidth){// Explorer, Gecko
		w = document.body.clientWidth;
	}else{// Netscape 4
		w = window.innerWidth;
    	if(document.height > window.innerHeight) w -= 16;
    }
    return w;
};
xWindow.getHeight = function(){
	var h = 0;
	if(document.documentElement && document.documentElement.clientHeight){// Explorer 6 strict
		h = document.documentElement.clientHeight;
	}else if (document.body && document.body.clientHeight){// Explorer, Gecko
		h = document.body.clientHeight;
	}else{// Netscape 4
		h = window.innerHeight;
    	if(document.width > window.innerWidth) h -= 16;
    }
    return h;
};

// ||||||||||||||||||||||||||||||||||||||||||||||||||

xWindow.getScrollLeft = function(){
	var x = 0;
	if(window.pageXOffset){// Netscape, Gecko
		x = window.pageXOffset;
	}else if(document.documentElement && document.documentElement.scrollLeft){// Explorer 6 strict
		x = document.documentElement.scrollLeft;
	}else if(document.body && document.body.scrollLeft){// Explorer quirks
		x = document.body.scrollLeft;
	}
	return x;
};
xWindow.getScrollTop = function(){
	var y = 0;
	if(window.pageYOffset){// Netscape, Gecko
		y = window.pageYOffset;
	}else if(document.documentElement && document.documentElement.scrollTop){// Explorer 6 strict
		y = document.documentElement.scrollTop;
	}else if(document.body && document.body.scrollTop){// Explorer quirks
		y = document.body.scrollTop;
	}
	return y;
};

// ||||||||||||||||||||||||||||||||||||||||||||||||||

xWindow.getMouseLeft = function(evt){
	var x = 0;
	if(window.event){// Explorer
		x = window.event.clientX + this.getScrollLeft();
	}else{// Netscape, Gecko
		x = evt.pageX;
	}
	return x;
};
xWindow.getMouseTop = function(evt){
	var y = 0;
	if(window.event){// Explorer
		y = window.event.clientY + this.getScrollTop();
	}else{// Netscape, Gecko
		y = evt.pageY;
	}
	return y;
};
///////////////////////////////////

/////// Arquivo xelement.js ///////
if(typeof(xElement) == "undefined") xElement = {};

xElement.getObject = function(name){
	if(document.getElementById) var el = document.getElementById(name);
	else if(document.all) var el = document.all[name];
	else if(document.layers) var el = this.findLayer(name);
	return el;
};
xElement.getStyle = function(name){
	var el = this.getObject(name);
	return document.layers ? el : el.style;
};
xElement.findLayer = function(name, root){// Private
	var i, layer, found = null;
	if(!root) root = window;
	for(i = 0; i < root.document.layers.length; i++){
		layer = root.document.layers[i];
		if(layer.id == name) return layer;
		if(layer.document.layers.length) found = this.findLayer(name,layer);
		if(found) return found;
	}
	return null;
};
xElement.addEvent = function(el,event,method){
	el["on"+event] = method;
	if(document.layers) el.captureEvents(Event[event.toUpperCase()]);
};
xElement.removeEvent = function(el,event){
	el["on"+event] = null;
	if(document.layers) el.releaseEvents(Event[event.toUpperCase()]);
};
///////////////////////////////////

//// Arquivo xelementobject.js ////
// Requires: xelement.js
if(typeof(xElement) == "undefined") alert("xElement Required");

// ||||||||||||||||||||||||||||||||||||||||||||||||||

xElementObject = function(name){
	this.el = xElement.getObject(name);
	this.css = xElement.getStyle(name);
	this.obj = "xElementObject"+name;
	eval(this.obj+"=this");
	return this;
};
xElementObject.prototype.getLeft = function(){
	return parseInt(this.css.left) || 0;
};
xElementObject.prototype.getTop = function(){
	return parseInt(this.css.top) || 0;
};
xElementObject.prototype.setLeft = function(x){
	this.css.left = document.layers ? x : x+"px";
};
xElementObject.prototype.setTop = function(y){
	this.css.top = document.layers ? y : y+"px";
};
xElementObject.prototype.moveTo = function(x,y){
	this.setLeft(x);
	this.setTop(y);
};
xElementObject.prototype.moveBy = function(x,y){
	this.setLeft(this.getLeft()+x);
	this.setTop(this.getTop()+y);
};
xElementObject.prototype.getWidth = function(){
	return document.layers ? this.el.document.width : this.el.offsetWidth;
};
xElementObject.prototype.getHeight = function(){
	return document.layers ? this.el.document.height : this.el.offsetHeight;
};
xElementObject.prototype.setWidth = function(w){
	this.css.width = w+"px";
};
xElementObject.prototype.setHeight = function(h){
	this.css.height = h+"px";
};
xElementObject.prototype.getClipWidth = function(){
	// if(document.layers) return this.el.clip.width || 0;
	var clip = this.getClipObject();
	return clip.right - clip.left || this.getWidth();
};
xElementObject.prototype.getClipHeight = function(){
	// if(document.layers) return this.el.clip.height || 0;
	var clip = this.getClipObject();
	return clip.bottom - clip.top || this.getHeight();
};
xElementObject.prototype.clipTo = function(t,r,b,l){
	if(document.layers){
		this.el.clip.top = t; this.el.clip.right = r; this.el.clip.bottom = b; this.el.clip.left = l;
	}else{
		this.css.clip = "rect("+t+"px "+r+"px "+b+"px "+l+"px)";
	}
};
xElementObject.prototype.clipBy = function(t,r,b,l){
	var clip = this.getClipObject();
	this.clipTo(clip.top+t, clip.right+r, clip.bottom+b, clip.left+l);
};
xElementObject.prototype.getClipObject = function(){
	if(document.layers){
		return {top:this.el.clip.top, right:this.el.clip.right, bottom:this.el.clip.bottom, left:this.el.clip.left};
	}else{
		var c = this.css.clip;
		c = c.slice(5, c.length-1);
		c = c.split(" ");
		for(var i=0; i<4; i++){
			c[i] = parseInt(c[i]);
		}
		return {top:c[0],right:c[1],bottom:c[2],left:c[3]};
	}
};
xElementObject.prototype.hideVis = function(){
	this.css.visibility = "hidden";
};
xElementObject.prototype.showVis = function(){
	this.css.visibility = "visible";
};
xElementObject.prototype.setBgColor = function(color){
	if(document.layers){
		this.el.bgColor = color;
	}else{
		this.css.backgroundColor = color;
	}
};
xElementObject.prototype.setBgImage = function(img){
	if(document.layers){
		this.el.background.src = img;
	}else{
		this.css.backgroundImage = "url("+img+")";
	}
};
xElementObject.prototype.setHTML = function(html){
	if(document.layers){
		this.el.document.open("text/html");
		this.el.document.write(html);
		this.el.document.close();
	}else{
		this.el.innerHTML = html;
	}
};
xElementObject.prototype.addEvent = function(event,method){
	xElement.addEvent(this.el,event,method);
};
xElementObject.prototype.removeEvent = function(event){
	xElement.removeEvent(this.el,event);
};
///////////////////////////////////