﻿var noScroll=0;

function addScrollEvent(event,eventFunction)
{
    this[event] = eventFunction;
	if(isNS4==1)
	    this.captureEvents(Event[event.substr(2,event.length).toUpperCase()]);
}

function removeScrollEvent(event)
{
    this[event] = null;
	if(isNS4==1)
        this.releaseEvents(Event[event.substr(2,event.length).toUpperCase()]);
}

document.addScrollEvent = addScrollEvent;
document.removeScrollEvent = removeScrollEvent;

function getXMouse(e)
{
    if(isIE==1)
        return event.clientX;
    else
        return e.pageX;
}
function getYMouse(e)
{
    if(isIE==1)
        return event.clientY;
    else
        return e.pageY;
}

function getElement(name,nest){
	var dom = eval(docObj + name + noStyle);
	
	dom.css = eval(docObj + name + styleObj);
	dom.getTop = function(){return parseInt( dom.css.top);};
	dom.setTop = function(x){dom.css.top = isNS4 ? x: x+"px"};
	dom.getLeft = function(){return parseInt( dom.css.left);};
	dom.setLeft = function(x){dom.css.left = isNS4 ? x: x+"px"};
	dom.getWidth = function(){return parseInt(dom.css.width)};
	dom.getHeight = function(){return parseInt(dom.css.height)};
    dom.getClipWidth = function(){return parseInt(dom.css.width)};
	dom.hideVis = function(){dom.css.visibility="hidden"};
	dom.addScrollEvent = addScrollEvent;
	dom.removeScrollEvent = removeScrollEvent;
	return dom;
}

// ||||||||||||||||||||||||||||||||||||||||||||||||||
// Scroller Class
ScrollObj = function(speed, dragWidth, trackWidth, trackObj, upObj, downObj, dragObj, contentMaskObj, contentObj,isHorizontal, getJSHeight)
{
    this.isHorizontal=isHorizontal;
    this.speed = speed;
	this.dragWidth = dragWidth;
	this.trackWidth = trackWidth;
	this.trackObj = getElement(trackObj);
	this.upObj = getElement(upObj);
	this.downObj = getElement(downObj);
	this.dragObj = getElement(dragObj);
	this.contentMaskObj = getElement(contentMaskObj);
	this.contentObj = getElement(contentObj,contentMaskObj);
	this.obj = contentObj+"Object";
	eval(this.obj+"=this");
	
	this.trackLeft= this.dragObj.getLeft();
	this.trackLength = this.trackWidth+this.dragWidth;
	this.trackRight = this.trackLeft+this.trackLength;
	this.contentMaskWidth = this.contentMaskObj.getClipWidth();
	this.contentWidth = this.contentObj.getWidth();
	this.contentLength = this.contentWidth-this.contentMaskWidth;
	this.scrollLength = this.trackLength/this.contentLength;
	
	this.trackTop= this.dragObj.getTop();
	this.trackTall = this.trackWidth+this.dragWidth;
	this.trackBottom = this.trackTop+this.trackTall;
	this.contentMaskHeight = this.contentMaskObj.getHeight();
	if(getJSHeight==1)
	    this.contentHeight = getElemHight(contentObj)
	else	
	    this.contentHeight = this.contentObj.getHeight();
	    
	this.contentTall = this.contentHeight-this.contentMaskHeight;
	this.scrollTall = this.trackTall/this.contentTall;
	
	this.scrollTimer = null;
	
	if(isHorizontal)
	{
	    if(this.contentWidth <= this.contentMaskWidth)
	    {
	        this.dragObj.hideVis();
		    noScroll = true;
	    }
        else
        {
            var self = this;
		    this.trackObj.addScrollEvent("onmousedown", function(e){self.scrollJump(e);return false});
    		
		    this.upObj.addScrollEvent("onmousedown", function(){self.scroll(self.speed);return false});
		    this.upObj.addScrollEvent("onmouseup", function(){self.stopScroll()});
		    this.upObj.addScrollEvent("onmouseout", function(){self.stopScroll()});
    		
		    this.downObj.addScrollEvent("onmousedown", function(){self.scroll(-self.speed);return false});
		    this.downObj.addScrollEvent("onmouseup", function(){self.stopScroll()});
		    this.downObj.addScrollEvent("onmouseout", function(){self.stopScroll()});
    		
		    this.dragObj.addScrollEvent("onmousedown", function(e){self.startDrag(e);return false});
		    if(isIE==1) 
		        this.dragObj.addScrollEvent("ondragstart", function(){return false});
        }
    }
    else
    {
        if(this.contentHeight <= this.contentTall)
        {
            this.dragObj.hideVis();
	        noScroll = true;
        }
        else
        {
            var self = this;
	        this.trackObj.addScrollEvent("onmousedown", function(e){self.scrollJump(e);return false});
    		
	        this.upObj.addScrollEvent("onmousedown", function(){self.scroll(self.speed);return false});
	        this.upObj.addScrollEvent("onmouseup", function(){self.stopScroll()});
	        this.upObj.addScrollEvent("onmouseout", function(){self.stopScroll()});
    		
	        this.downObj.addScrollEvent("onmousedown", function(){self.scroll(-self.speed);return false});
	        this.downObj.addScrollEvent("onmouseup", function(){self.stopScroll()});
	        this.downObj.addScrollEvent("onmouseout", function(){self.stopScroll()});
    		
	        this.dragObj.addScrollEvent("onmousedown", function(e){self.startDrag(e);return false});
	        if(isIE==1) 
	            this.dragObj.addScrollEvent("ondragstart", function(){return false});
        }
    
    }
}

ScrollObj.prototype.startDrag = function(e)
{	
	if(this.isHorizontal)
	{
	    this.dragStartMouse = getXMouse(e);
	    this.dragStartOffset = this.dragObj.getLeft();
	}
	else
	{
	    this.dragStartMouse = getYMouse(e);
    	this.dragStartOffset = this.dragObj.getTop();
    }
	    
	var self = this;
	document.addScrollEvent("onmousemove", function(e){self.drag(e)});
	document.addScrollEvent("onmouseup", function(){self.stopDrag()});
}
ScrollObj.prototype.stopDrag = function()
{
	document.removeScrollEvent("onmousemove");
	document.removeScrollEvent("onmouseup");
}
ScrollObj.prototype.drag = function(e)
{
    if(this.isHorizontal)
    {
	    var currentMouse = getXMouse(e);
	    var mouseDifference = currentMouse-this.dragStartMouse;
	    var dragDistance = this.dragStartOffset+mouseDifference;
	    var dragMovement = (dragDistance<this.trackLeft) ? this.trackLeft : (dragDistance>this.trackRight) ? this.trackRight : dragDistance;
	    this.dragObj.setLeft(dragMovement);
	    var contentMovement = -1*(dragMovement-this.trackLeft)*(1/this.scrollLength);
	    this.contentObj.setLeft(contentMovement);
	}
	else
	{
	    var currentMouse = getYMouse(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 = -1*(dragMovement-this.trackTop)*(1/this.scrollTall);
	    this.contentObj.setTop(contentMovement);

	}
}

ScrollObj.prototype.scroll = function(speed)
{
    if(this.isHorizontal)
    {
	    var contentMovement = this.contentObj.getLeft()+speed;
	    var dragMovement = this.trackLeft-Math.round(this.contentObj.getLeft()*(this.trackLength/this.contentLength));

	    if(contentMovement > 0)
	    {
		    contentMovement = 0;
	    }
	    else if(contentMovement < -this.contentLength)
	    {
		    contentMovement = -this.contentLength;
	    }
	    if(dragMovement < this.trackLeft)
	    {
		    dragMovement = this.trackLeft;
	    }
	    else if(dragMovement > this.trackRight)
	    {
		    dragMovement = this.trackRight;
	    }
    		
	    this.contentObj.setLeft(contentMovement);

	    this.dragObj.setLeft(dragMovement);
	}
	else
	{
	    var contentMovement = this.contentObj.getTop()+speed;
	    var dragMovement = this.trackTop-Math.round(this.contentObj.getTop()*(this.trackTall/(this.contentHeight-this.contentMaskHeight)));
	    var contentHeightTemp=(this.contentHeight-this.contentMaskHeight);

	    if(contentMovement > 0)
	    {
		    contentMovement = 0;
	    }
	    else if(contentMovement < -contentHeightTemp)
	    {
		    contentMovement = -contentHeightTemp;
	    }
	    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);

}
ScrollObj.prototype.stopScroll = function()
{
	if(this.scrollTimer)
	{
		window.clearTimeout(this.scrollTimer);
		this.scrollTimer = null;
	}
}
ScrollObj.prototype.scrollJump = function(e)
{
    if(this.isHorizontal)
    {
	    var currentMouse = getXMouse(e);
	    var dragDistance = currentMouse-(this.dragWidth/2);
	    var dragMovement = (dragDistance<this.trackLeft) ? this.trackLeft : (dragDistance>this.trackRight) ? this.trackRight : dragDistance;
	    this.dragObj.setLeft(dragMovement);
	    var contentMovement = -(dragMovement-this.trackLeft)*(1/this.scrollLength);
	    this.contentObj.setLeft(contentMovement);
	}
}

ScrollObj.prototype.setTextPos=function(Pos)
{
Pos*=-1;
    if(this.isHorizontal)
    {
	    var contentMovement = Pos;

	    if(contentMovement > 0)
	    {
		    contentMovement = 0;
	    }
	    else if(contentMovement < -this.contentLength)
	    {
		    contentMovement = -this.contentLength;
	    }
    		
	    this.contentObj.setLeft(contentMovement);
	    
	    var dragMovement = this.trackLeft-Math.round(this.contentObj.getLeft()*(this.trackLength/this.contentLength));
	    if(dragMovement < this.trackLeft)
	    {
		    dragMovement = this.trackLeft;
	    }
	    else if(dragMovement > this.trackRight)
	    {
		    dragMovement = this.trackRight;
	    }

	    this.dragObj.setLeft(dragMovement);
	}
	else
	{
	    var contentMovement = Pos;

	    if(contentMovement > 0)
	    {
		    contentMovement = 0;
	    }
	    else if(contentMovement < -contentHeightTemp)
	    {
		    contentMovement = -contentHeightTemp;
	    }
	    
	    this.contentObj.setTop(contentMovement);
	    
	    var dragMovement = this.trackTop-Math.round(this.contentObj.getTop()*(this.trackTall/(this.contentHeight-this.contentMaskHeight)));
	    var contentHeightTemp=(this.contentHeight-this.contentMaskHeight);
	    if(dragMovement < this.trackTop)
	    {
		    dragMovement = this.trackTop;
	    }
	    else if(dragMovement > this.trackBottom)
	    {
		    dragMovement = this.trackBottom;
	    }
	    
	    this.dragObj.setTop(dragMovement);	

	}
}