function scroller(id, w, h, num, axis, bMouse){
    this.id=id;
    this.el = document.getElementById? document.getElementById(id): null;
    if (!this.el) return;
    this.css = this.el.style;
    this.css.left = this.x = 0;
    this.css.top = this.y = 0;
    this.w=w;
    this.h=h;
    this.num=num;
    this.axis=axis||"v";
    this.ctr=0;
    this.pause=5000;
    this.speed=60;
    if (bMouse) scrollers.setMouseEvents(this.el);
    this.lastTime = new Date().getTime();
    this.check = 0;
    this.index = scrollers.ar.length;
    scrollers.ar[this.index] = this;
    this.active = true;
}
scroller.prototype.setTiming = function(speed, pause){
    this.speed = speed;
    this.pause = pause;
}
scroller.prototype.controlScroll = function(){
    if (this.ctr > this.num-1){
        this.shiftTo(0, 0);
        this.ctr = 1;
    }
    else{
        switch (this.axis){
            case "v" :
            if (this.y > -this.h * this.ctr){
                var ny = this.y + -1 * this.elapsed/1000 * this.speed;
                ny = Math.max(ny, -this.h * this.ctr);
                this.shiftTo(0, ny);
            }
            else this.doPause();
            break;
            case "h" :
            if (this.x > -this.w * this.ctr){
                var nx = this.x + -1 * this.elapsed/1000 * this.speed;
                nx = Math.max(nx, -this.w * this.ctr);
                this.shiftTo(nx, 0);
            }
            else this.doPause();
            break;
        }
    }
}
scroller.prototype.doPause = function(){
    this.check += this.elapsed;
    if (this.check >= this.pause){
        this.ctr++;
        this.check = 0;
    }
}
scroller.prototype.shiftTo = function(x, y){
    this.css.left = (this.x = x) + "px";
    this.css.top = (this.y = y) + "px";
}
scrollers ={
};
scrollers.ar = [];
scrollers.setMouseEvents = function(obj){
    obj.onmouseover = scrollers.halt;
    obj.onmouseout = scrollers.resume;
}
scrollers.halt = function(){
    var curObj;
    for (var i=0; curObj = scrollers.ar[i]; i++)
    if ( curObj.id == this.id ){
        curObj.active = false;
        return;
    }
}
scrollers.resume = function(e){
    var curObj;
    for (var i=0; curObj = scrollers.ar[i]; i++){
        if ( curObj.id == this.id ){
            e = e? e: window.event;
            var toEl = e.relatedTarget? e.relatedTarget: e.toElement;
            if ( this != toEl && !contained(toEl, this) ){
                var now = new Date().getTime();
                curObj.elapsed = now - curObj.lastTime;
                curObj.lastTime = now;
                curObj.active = true;
                return;
            }
        }
    }
}
scrollers.timer = window.setInterval("scrollers.control()", 10);
scrollers.control = function(){
    var curObj;
    for (var i=0; curObj = scrollers.ar[i]; i++){
        if ( curObj.active ){
            var now = new Date().getTime();
            curObj.elapsed = now - curObj.lastTime;
            curObj.lastTime = now;
            curObj.controlScroll();
        }
    }
}
scrollers.GeckoTableFix = function(){
    var ua = navigator.userAgent;
    if ( ua.indexOf("Gecko") > -1 && ua.indexOf("Firefox") == -1
    && ua.toLowerCase().indexOf("like gecko") == -1 ){
        scrollers.hold = [];
        for (var i=0; arguments[i]; i++){
            var wndo = document.getElementById( arguments[i] );
            var holderId = wndo.parentNode.id;
            var holder = document.getElementById(holderId);
            document.body.appendChild( holder.removeChild(wndo) );
            wndo.style.zIndex = 1000;
            var pos = getPageOffsets(holder);
            wndo.style.left = pos.x + "px";
            wndo.style.top = pos.y + "px";
            scrollers.hold[i] = [ arguments[i], holderId ];
        }
        window.addEventListener("resize", scrollers.rePosition, true);
    }
}
scrollers.rePosition = function(){
    if (scrollers.hold){
        for (var i=0; scrollers.hold[i]; i++){
            var wndo = document.getElementById( scrollers.hold[i][0] );
            var holder = document.getElementById( scrollers.hold[i][1] );
            var pos = getPageOffsets(holder);
            wndo.style.left = pos.x + "px";
            wndo.style.top = pos.y + "px";
        }
    }
}
function getPageOffsets(el){
    var left = el.offsetLeft;
    var top = el.offsetTop;
    if ( el.offsetParent && el.offsetParent.clientLeft || el.offsetParent.clientTop ){
        left += el.offsetParent.clientLeft;
        top += el.offsetParent.clientTop;
    }
    while ( el = el.offsetParent ){
        left += el.offsetLeft;
        top += el.offsetTop;
    }
    return{
        x:left, y:top
    };
}
function contained(oNode, oCont){
    if (!oNode) return;
    while ( oNode = oNode.parentNode ) if ( oNode == oCont ) return true;
    return false;
}
scrollers.unHook = function(){
    var i, curObj;
    for (i=0; curObj = scrollers.ar[i]; i++){
        if ( curObj.el ){
            curObj.el.onmouseover = null;
            curObj.el.onmouseout = null;
            curObj.el = null;
        }
    }
}
if ( window.addEventListener ) window.addEventListener( "unload", scrollers.unHook, true);
else if ( window.attachEvent ) window.attachEvent( "onunload", scrollers.unHook );
