// JavaScript Document

var rwScroll = {

	addListeners: function () {
		if (!document.getElementsByTagName || !document.getElementById)
			return;		
		
		// set objects
		rwScroll.objSCR_Container = document.getElementById('scrContainer');
		rwScroll.objSCR_Pane = document.getElementById('scrPane');
		var objContentHeader = document.getElementById('contentHeader');
		if (document.getElementById('contentSubHeader')) {
			var objContentSubHeader = document.getElementById('contentSubHeader');
		}
		
		// re-position content headers
		objContentHeader.style.margin = '0px 24px 5px 0px';
		if (objContentSubHeader) {
			objContentSubHeader.style.margin = '0px 24px 15px 0px';
		}
		
		// position scroll pane
		rwScroll.objSCR_Pane.style.top = '0px';
		rwScroll.objSCR_Pane.style.left = '0px';
		
		// add scroll button event listeners
		var btnScrollUp = document.getElementById('btnSCR_Up');
		rwScript.addEvent(btnScrollUp, 'mousedown', rwScroll.getMDown(btnScrollUp), false);
		rwScript.addEvent(btnScrollUp, 'mouseup', rwScroll.getMUp(btnScrollUp), false);
		rwScript.addEvent(btnScrollUp, 'mouseover', rwScroll.getMOver(btnScrollUp), false);
		rwScript.addEvent(btnScrollUp, 'mouseout', rwScroll.getMOut(btnScrollUp), false);

		var btnScrollDown = document.getElementById('btnSCR_Down');
		rwScript.addEvent(btnScrollDown, 'mousedown', rwScroll.getMDown(btnScrollDown), false);
		rwScript.addEvent(btnScrollDown, 'mouseup', rwScroll.getMUp(btnScrollDown), false);
		rwScript.addEvent(btnScrollDown, 'mouseover', rwScroll.getMOver(btnScrollDown), false);
		rwScript.addEvent(btnScrollDown, 'mouseout', rwScroll.getMOut(btnScrollDown), false);

		// add scroll wheel event listeners
			// NOTE: non-standard event listener, can't use addEvent function
		if (window.addEventListener) {
			window.addEventListener('DOMMouseScroll', rwScroll.getWheelEvent(window), false);
		} else if (window.attachEvent) {
			var r = window.attachEvent('onmousewheel', rwScroll.getWheelEvent(window));
			EventCache.add(window, 'mousewheel', rwScroll.getWheelEvent(window));
		} else {
			window.onmousewheel = rwScroll.getWheelEvent();
		}
	},

// Wheel Event Manager
	wheelEvent: function (e){
		
		var intDelta = 0;
		
		if (window.event) {
			intDelta = window.event.wheelDelta/120;
			
			if (window.opera) { intDelta = -intDelta; };
		} else if (e.detail) { /** Mozilla case. */
			/** In Mozilla, sign of delta is different than in IE.
			 * Also, delta is multiple of 3. */
			intDelta = -e.detail/3;
		}

		/* Send to Scroll Function */
		if (intDelta > 0) {
			rwScroll.scrollObject(0, rwScroll.intWRev, false);
		} else if (intDelta < 0) {
			rwScroll.scrollObject(0, rwScroll.intWFwd, false);
		} else {
			alert("nothing");
		}
		
		/* Prevent Default Scroll */
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			return false;
		}
	},
	getWheelEvent: function (node) { return function(e) { rwScroll.wheelEvent(e, node); }; },
	
	cancelScroll: function() { return false; },

//	Actual Scroll Functions
	scrollObject: function(intXrate, intYrate, blnPersist) {
		
		// set scroll positions
		var intContainerHeight = rwScroll.objSCR_Container.offsetHeight;
		var intContainerWidth = rwScroll.objSCR_Container.offsetWidth;
		var intPaneHeight = rwScroll.objSCR_Pane.offsetHeight;
		var intPaneWidth = rwScroll.objSCR_Pane.offsetWidth;
		
		rwScroll.intScrollPositions = [0, intContainerWidth - intPaneWidth, intContainerHeight - intPaneHeight, 0];
		
		if (intXrate < 0) {
			//scroll left
			if (rwScroll.objSCR_Pane.scrollState != "left") {
				rwScroll.objSCR_Pane.scrollState = "goingLeft";
			}
		} else if (intXrate > 0) {
			//scroll right
			if (rwScroll.objSCR_Pane.scrollState != "right") {
				rwScroll.objSCR_Pane.scrollState = "goingRight";
			}
		}
		
		if (intYrate < 0) {
			//scroll up
			if (rwScroll.objSCR_Pane.scrollState != "top") {
				rwScroll.objSCR_Pane.scrollState = "goingUp";
			}
		} else if (intYrate > 0) {
			//scroll down
			if (rwScroll.objSCR_Pane.scrollState != "bottom") {
				rwScroll.objSCR_Pane.scrollState = "goingDown";
			}
		}
		if (blnPersist) {
			rwScroll.blnLoop = true;
			rwScroll.lngTimer = setInterval(function() { rwScroll.moveObject(Math.abs(intXrate), Math.abs(intYrate)); }, rwScroll.intFrameRate);
		} else {
			rwScroll.blnLoop = false;
			rwScroll.moveObject(Math.abs(intXrate), Math.abs(intYrate));
		}
	},

	moveObject: function(intXrate, intYrate) {
		if (rwScroll.objSCR_Pane.animState == 'top' || rwScroll.objSCR_Pane.animState == 'bottom' || rwScroll.objSCR_Pane.animState == 'left' || rwScroll.objSCR_Pane.animState == 'right') {
			// do nothing
		} else {
			// vertical scroll
			var intYPosition = parseInt(rwScroll.objSCR_Pane.style.top);
			
			if (rwScroll.objSCR_Pane.scrollState == 'goingUp') {
				intYPosition += intYrate;
				if (intYPosition > rwScroll.intScrollPositions[0]) {
					intYPosition = rwScroll.intScrollPositions[0];
					rwScroll.objSCR_Pane.scrollState = 'top';
				}
			} else if (rwScroll.objSCR_Pane.scrollState == 'goingDown') {
				intYPosition -= intYrate;
				if (intYPosition < rwScroll.intScrollPositions[2]) {
					intYPosition = rwScroll.intScrollPositions[2];
					rwScroll.objSCR_Pane.scrollState = 'bottom';
				}
			}

			//horizontal scroll
			var intXPosition = parseInt(rwScroll.objSCR_Pane.style.left);

			if (rwScroll.objSCR_Pane.scrollState == 'goingLeft') {
				intXPosition += intXrate;
				if (intXPosition > rwScroll.intScrollPositions[3]) {
					intXPosition = rwScroll.intScrollPositions[3];
					rwScroll.objSCR_Pane.scrollState = 'left';
				}
			} else if (rwScroll.objSCR_Pane.scrollState == 'goingRight') {
				intXPosition -= intXrate;
				if (intXPosition < rwScroll.intScrollPositions[1]) {
					intXPosition = rwScroll.intScrollPositions[1];
					rwScroll.objSCR_Pane.scrollState = 'right';
				}
			}
			
			rwScroll.objSCR_Pane.style.top = intYPosition + 'px';
			rwScroll.objSCR_Pane.style.left = intXPosition + 'px';
		}
	},
	
//	Scroll Button Events
	mOver: function (e, targetElement) {
		var el = window.event ? targetElement : e ? e.currentTarget : null;
		if (!el) return;

		// begin slow scroll
		var strID = el.id;
		switch (strID) {
			case 'btnSCR_Up':
				var btnScrollButton = document.getElementById('scrButtonUp');
				btnScrollButton.className = 'scrButtonUp_over';
				rwScroll.scrollObject(0, rwScroll.intRev, true);
				break;
			case 'btnSCR_Down':
				var btnScrollButton = document.getElementById('scrButtonDown');
				btnScrollButton.className = 'scrButtonDown_over';
				rwScroll.scrollObject(0, rwScroll.intFwd, true);
				break;
			case 'btnSCR_Left':
				var btnScrollButton = document.getElementById('scrButtonLeft');
				btnScrollButton.className = 'scrButtonLeft_over';
				rwScroll.scrollObject(rwScroll.intRev, 0, true);
				break;
			case 'btnSCR_Right':
				var btnScrollButton = document.getElementById('scrButtonRight');
				btnScrollButton.className = 'scrButtonRight_over';
				rwScroll.scrollObject(rwScroll.intFwd, 0, true);
				break;				
		}

	},
	getMOver: function (node) { return function(e) { rwScroll.mOver(e, node); }; },

	mOut: function (e, targetElement) {
		var el = window.event ? targetElement : e ? e.currentTarget : null;
		if (!el) return;
		
		// cancel slow scroll
		if (rwScroll.lngTimer) clearInterval(rwScroll.lngTimer);

		var strID = el.id;
		switch (strID) {
			case 'btnSCR_Up':
				var btnScrollButton = document.getElementById('scrButtonUp');
				btnScrollButton.className = 'scrButtonUp';
				break;
			case 'btnSCR_Down':
				var btnScrollButton = document.getElementById('scrButtonDown');
				btnScrollButton.className = 'scrButtonDown';
				break;
			case 'btnSCR_Left':
				var btnScrollButton = document.getElementById('scrButtonLeft');
				btnScrollButton.className = 'scrButtonLeft';
				break;
			case 'btnSCR_Right':
				var btnScrollButton = document.getElementById('scrButtonRight');
				btnScrollButton.className = 'scrButtonRight';
				break;				
		}

	},
	getMOut: function (node) { return function(e) { rwScroll.mOut(e, node); }; },

	mDown: function (e, targetElement) {
		var el = window.event ? targetElement : e ? e.currentTarget : null;
		if (!el) return;

		// cancel slow scroll
		if (rwScroll.lngTimer) clearInterval(rwScroll.lngTimer);

		// begin fast scroll
		var strID = el.id;
		switch (strID) {
			case 'btnSCR_Up':
				rwScroll.scrollObject(0, rwScroll.intFRev, true);
				break;
			case 'btnSCR_Down':
				rwScroll.scrollObject(0, rwScroll.intFFwd, true);
				break;
			case 'btnSCR_Left':
				rwScroll.scrollObject(rwScroll.intFRev, 0, true);
				break;
			case 'btnSCR_Right':
				rwScroll.scrollObject(rwScroll.intFFwd, 0, true);
				break;				
		}
	},
	getMDown: function (node) { return function(e) { rwScroll.mDown(e, node); }; },

	mUp: function (e, targetElement) {
		var el = window.event ? targetElement : e ? e.currentTarget : null;
		if (!el) return;
		
		// cancel fast scroll
		rwScroll.blnLoop = false;
		if (rwScroll.lngTimer) clearInterval(rwScroll.lngTimer);
		
		// begin slow scroll
		var strID = el.id;
		switch (strID) {
			case 'btnSCR_Up':
				rwScroll.scrollObject(0, rwScroll.intRev, true);
				break;
			case 'btnSCR_Down':
				rwScroll.scrollObject(0, rwScroll.intFwd, true);
				break;
			case 'btnSCR_Left':
				rwScroll.scrollObject(rwScroll.intRev, 0, true);
				break;
			case 'btnSCR_Right':
				rwScroll.scrollObject(rwScroll.intFwd, 0, true);
				break;				
		}		
	},
	getMUp: function (node) { return function(e) { rwScroll.mUp(e, node); }; },

//	Object Properties
	blnInitialised: true,
	intFrameRate: 20,
	intWFwd: 20,
	intFFwd: 8,
	intFwd: 4,
	intWRev: -20,
	intFRev: -8,
	intRev: -4,
	lngTimer: 0,
	intScrollPosition: [0, 0, 0, 0],
	blnLoop: false,
	objSCR_Container: {},
	objSCR_Pane: {}
	
};

rwScript.addEvent(window, 'load', rwScroll.addListeners, false);
rwScript.addEvent(window, 'unload', EventCache.flush, false);
