var EventControl = {
  
    add: function(obj, etype, fp, cap) {
        cap = cap || false;
        if (obj.addEventListener) obj.addEventListener(etype, fp, cap);
        else if (obj.attachEvent) obj.attachEvent("on" + etype, fp);
    }
}

function scrollObject(scrObjId, lyrId, horizId) {
    var wn = document.getElementById(scrObjId);
    this.id = scrObjId; scrollObject.col[this.id] = this;
    this.animString = "scrollObject.col." + this.id;
    this.load(lyrId, horizId);
    if(wn)
	{
      if (wn.addEventListener) {
        wn.addEventListener('DOMMouseScroll', scrollObject.doOnMouseWheel, false);
      } 
      wn.onmousewheel = scrollObject.doOnMouseWheel;
	}
}

scrollObject.defaultSpeed = scrollObject.prototype.speed = 150;

scrollObject.isSupported = function () {
    if ( document.getElementById && document.getElementsByTagName 
         && document.addEventListener || document.attachEvent ) {
        return true;
    }
    return false;
}

scrollObject.col = {};


scrollObject.prototype.on_load = function() {}
scrollObject.prototype.on_scroll = function() {}
scrollObject.prototype.on_scroll_start = function() {}
scrollObject.prototype.on_scroll_stop = function() {}
scrollObject.prototype.on_scroll_end = function() {}


scrollObject.prototype.load = function(lyrId, horizId) {
    var scrObj, lyr;
    if (this.lyrId) {
        lyr = document.getElementById(this.lyrId);
        lyr.style.visibility = "hidden";
    }
    this.lyr = lyr = document.getElementById(lyrId);
	if ( !scrollObject.printEnabled) {
		if(this.lyr)		
	        this.lyr.style.position = 'absolute'; 
    }
    this.lyrId = lyrId;
    this.horizId = horizId || null;
    scrObj = document.getElementById(this.id);
    this.y = 0; this.x = 0; this.shiftTo(0,0);
    this.getDims(scrObj, lyr); 
	if(this.lyr)
    	lyr.style.visibility = "visible";
    this.ready = true; this.on_load(); 
}

scrollObject.prototype.shiftTo = function(x, y) {
    if (this.lyr) {
        this.lyr.style.left = (this.x = x) + "px"; 
        this.lyr.style.top = (this.y = y) + "px";
    }
}

scrollObject.prototype.getDims = function(scrObj, lyr) {
	if(this.lyr) {
    this.wd = this.horizId? document.getElementById( this.horizId ).offsetWidth: lyr.offsetWidth;
    this.maxX = (this.wd - scrObj.offsetWidth > 0)? this.wd - scrObj.offsetWidth: 0;
    this.maxY = (lyr.offsetHeight - scrObj.offsetHeight > 0)? lyr.offsetHeight - scrObj.offsetHeight: 0;
	this.maxY = this.maxY + 150;
	}
	
}


scrollObject.prototype.initScrollVals = function(deg, speed) {
    if (!this.ready) return; 
    if (this.timerId) {
        clearInterval(this.timerId); this.timerId = 0;
    }
    this.speed = speed || scrollObject.defaultSpeed;
    this.fx = (deg == 0)? -1: (deg == 180)? 1: 0;
    this.fy = (deg == 90)? 1: (deg == 270)? -1: 0;
    this.endX = (deg == 90 || deg == 270)? this.x: (deg == 0)? -this.maxX: 0; 
    this.endY = (deg == 0 || deg == 180)? this.y: (deg == 90)? 0: -this.maxY;
    this.lyr = document.getElementById(this.lyrId);
    this.lastTime = new Date().getTime();
    this.on_scroll_start(this.x, this.y);  
    this.timerId = setInterval(this.animString + ".scroll()", 10);    
}

scrollObject.prototype.scroll = function() {
    var now = new Date().getTime();
    var d = (now - this.lastTime)/1000 * this.speed;
    if (d > 0) { 
        var x = this.x + Math.round(this.fx * d); var y = this.y + Math.round(this.fy * d);
        if ( ( this.fx == -1 && x > -this.maxX ) || ( this.fx == 1 && x < 0 ) || 
                ( this.fy == -1 && y > -this.maxY ) || ( this.fy == 1 && y < 0 ) ) 
       {
            this.lastTime = now;
            this.shiftTo(x, y);
            this.on_scroll(x, y);
        } else {
            clearInterval(this.timerId); this.timerId = 0;
            this.shiftTo(this.endX, this.endY);
            this.on_scroll(this.endX, this.endY);
            this.on_scroll_end(this.endX, this.endY);
        }
    }
}

scrollObject.prototype.ceaseScroll = function() {
    if (!this.ready) return;
    if (this.timerId) {
        clearInterval(this.timerId); this.timerId = 0; 
    }
    this.on_scroll_stop(this.x, this.y); 
}

scrollObject.handleMouseWheel = function(id, delta) {
    var scrObj = scrollObject.col[id];
    var x = scrObj.x;
    var y = scrObj.y;
    scrObj.on_scroll_start(x,y);
    var ny;
    ny = 12  * delta + y
    ny = (ny < 0 && ny >= -scrObj.maxY)? ny: (ny < -scrObj.maxY)? -scrObj.maxY: 0;
    scrObj.shiftTo(x, ny);
    scrObj.on_scroll(x, ny);
}

scrollObject.doOnMouseWheel = function(e) {
    var delta = 0;
    if (!e) e = window.event;
    if (e.wheelDelta) { /* IE/Opera. */
        delta = e.wheelDelta/120;
    } else if (e.detail) {
        delta = -e.detail/3;
    }
    if (delta) {
        scrollObject.handleMouseWheel(this.id, delta);
    }
    if (e.preventDefault) e.preventDefault();
    e.returnValue = false;
}


scrollObject.prototype.setUpScrollControls = function(controlsId, autoHide, axis) {
    var scrObjId = this.id; var el = document.getElementById(controlsId); 
    if ( autoHide && axis == 'v' || axis == 'h' ) {
        scrollObject.handleControlVis(controlsId, scrObjId, axis);
        dw_Scrollbar_Co.addEvent( this, 'on_load', function() { scrollObject.handleControlVis(controlsId, scrObjId, axis); } );
        dw_Scrollbar_Co.addEvent( this, 'on_update', function() { scrollObject.handleControlVis(controlsId, scrObjId, axis); } );
    }
    
	if(el)
	{
      var links = el.getElementsByTagName('a'), cls, eType;
      for (var i=0; links[i]; i++) { 
        cls = scrollObject.get_DelimitedClass( links[i].className );
        eType = scrollObject.getEv_FnType( cls.slice(0, cls.indexOf('_') ) );
        switch ( eType ) {
            case 'mouseover' :
            case 'mousedown' :
                scrollObject.handleMouseOverDownLinks(links[i], scrObjId, cls);
                break;
            case 'scrollToId': 
                scrollObject.handleScrollToId(links[i], scrObjId, cls);
                break;
            case 'scrollTo' :
            case 'scrollBy':
            case 'click': 
                scrollObject.handleClick(links[i], scrObjId, cls) ;
                break;
        }
      }
	}
}


scrollObject.handleMouseOverDownLinks = function (linkEl, scrObjId, cls) {
    var parts = cls.split('_'); var eType = parts[0];
    var re = /^(mouseover|mousedown)_(up|down|left|right)(_[\d]+)?$/;
                
    if ( re.test(cls) ) { 
        var eAlt = (eType == 'mouseover')? 'mouseout': 'mouseup';
        var dir = parts[1];  var speed = parts[2] || null; 
        var deg = (dir == 'up')? 90: (dir == 'down')? 270: (dir == 'left')? 180: 0;
        
        EventControl.add(linkEl, eType, function (e) { scrollObject.col[scrObjId].initScrollVals(deg, speed); } );
        EventControl.add(linkEl, eAlt, function (e) { scrollObject.col[scrObjId].ceaseScroll(); } );
            
        if ( eType == 'mouseover') {
            EventControl.add( linkEl, 'mousedown', function (e) { scrollObject.col[scrObjId].speed *= 3; } );
            EventControl.add( linkEl, 'mouseup', function (e) { 
                scrollObject.col[scrObjId].speed = scrollObject.prototype.speed; } ); 
        }
        EventControl.add( linkEl, 'click', function(e) { if (e && e.preventDefault) e.preventDefault(); return false; } );
    }
}


scrollObject.getEv_FnType = function(str) {
    var re = /^(mouseover|mousedown|scrollBy|scrollTo|scrollToId|click)$/;
    if (re.test(str) ) {
        return str;
    }
    return '';
}

scrollObject.get_DelimitedClass = function(cls) {
    if ( cls.indexOf('_') == -1 ) {
        return '';
    }
    var whitespace = /\s+/;
    if ( !whitespace.test(cls) ) {
        return cls;
    } else {
        var classes = cls.split(whitespace); 
        for(var i = 0; classes[i]; i++) { 
            if ( classes[i].indexOf('_') != -1 ) {
                return classes[i];
            }
        }
    }
}
