// JavaScript Scrollbar
// Based on original code by Travis Beckham
// http://www.squidfingers.com | http://www.podlob.com
//
// Modifications (c) Matthias Grosser 2005
// http://www.medien-labor-potsdam.de/
// version date: 2005-09-20

// Cross-Browser Functions

var dom = document.getElementById;
var iex = document.all;
var ns4 = document.layers;

function addEvent(event,method){
        this[event] = method;
        if(ns4) this.captureEvents(Event[event.substr(2,event.length).toUpperCase()]);
}
function removeEvent(event){
        this[event] = null;
        if(ns4) this.releaseEvents(Event[event.substr(2,event.length).toUpperCase()]);
}
function getElement(name,nest){
        nest = nest ? "document."+nest+"." : "";
        var el = dom ? document.getElementById(name) : iex ? document.all[name] : ns4 ? eval(nest+"document."+name) : false;
        el.css = ns4 ? el : el.style;
        el.getTop = function(){return parseInt(el.css.top) || 0};
        el.setTop = function(y){el.css.top = ns4 ? y: y+"px"};
        el.getHeight = function(){return ns4 ? el.document.height : el.offsetHeight};
        el.getClipHeight = function(){return ns4 ? el.clip.height : el.offsetHeight};
        el.hideVis = function(){el.css.visibility="hidden"};
        el.addEvent = addEvent;
        el.removeEvent = removeEvent;
        return el;
}
function getYMouse(e){
        return iex ? event.clientY : e.pageY;
}

document.addEvent = addEvent;
document.removeEvent = removeEvent;

// Scroller Class

ScrollObj = function(speed, dragHeight, trackHeight, trackObj, upObj, downObj, dragObj, contentMaskObj, contentObj){
        this.speed = speed;
        this.dragHeight = dragHeight;
        this.trackHeight = trackHeight;
        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.trackTop = this.dragObj.getTop();
        this.trackLength = this.trackHeight-this.dragHeight;
        this.trackBottom = this.trackTop+this.trackLength;
        this.contentMaskHeight = this.contentMaskObj.getClipHeight();
        this.contentHeight = this.contentObj.getHeight();
        this.contentLength = this.contentHeight-this.contentMaskHeight;
        this.scrollLength = this.trackLength/this.contentLength;
        this.scrollTimer = null;

        if(this.contentHeight <= this.contentMaskHeight){
                this.dragObj.hideVis();
        }else{
                var self = this;
                this.trackObj.addEvent("onmousedown", function(e){self.scrollJump(e);return false});
                if(document.selection) this.trackObj.addEvent("onmousemove", function(){ ieClearSel(); return false;});  // ie hack
                this.upObj.addEvent("onmousedown", function(){self.scroll(self.speed);return false});
                this.upObj.addEvent("onmouseup", function(){self.stopScroll()});
                this.upObj.addEvent("onmouseout", function(){self.stopScroll()});
                this.downObj.addEvent("onmousedown", function(){self.scroll(-self.speed);return false});
                this.downObj.addEvent("onmouseup", function(){self.stopScroll()});
                this.downObj.addEvent("onmouseout", function(){self.stopScroll()});
                this.dragObj.addEvent("onmousedown", function(e){self.startDrag(e);return false});
                this.contentObj.addEvent("onmousewheel", function(){self.mouseWheel()});
                if(iex) this.dragObj.addEvent("ondragstart", function(){return false});
        }
}

ScrollObj.prototype.mouseWheel = function(){
        var mouseDifference = 0;
        if(event.wheelDelta >= 120) {
                mouseDifference = -20;
        } else if(event.wheelDelta <= -120) {
                  mouseDifference = 20;
        }
        var dragDistance = this.dragObj.getTop() + 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);
}

ScrollObj.prototype.startDrag = function(e){
        ieClearSel();
        this.dragStartMouse = getYMouse(e);
        this.dragStartOffset = this.dragObj.getTop();
        var self = this;
        document.addEvent("onmousemove", function(e){self.drag(e)});
        document.addEvent("onmouseup", function(){self.stopDrag()});
}
ScrollObj.prototype.stopDrag = function(){
        ieClearSel();
        document.removeEvent("onmousemove");
        document.removeEvent("onmouseup");
}
ScrollObj.prototype.drag = function(e){
        ieClearSel();
        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 = -(dragMovement-this.trackTop)*(1/this.scrollLength);
        this.contentObj.setTop(contentMovement);
}
ScrollObj.prototype.scroll = function(speed){
        ieClearSel();
        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);
}
ScrollObj.prototype.stopScroll = function(){
        ieClearSel();
        if(this.scrollTimer){
                window.clearTimeout(this.scrollTimer);
                this.scrollTimer = null;
        }
}
ScrollObj.prototype.scrollJump = function(e){
        ieClearSel();
        var currentMouse = getYMouse(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);
}

// Misc Functions

function ieClearSel(){
        try {
                if(document.selection) document.selection.clear();
        } catch (e) {
                  // do nothing
        }
}

function fixNetscape4(){
        if(ns4origWidth != window.innerWidth || ns4origHeight != window.innerHeight){
                window.location.reload();
        }
}
if(document.layers){
        ns4origWidth = window.innerWidth;
        ns4origHeight = window.innerHeight;
        window.onresize = fixNetscape4;
}
