/*
 * Custom Scrollbar - referred from Third-Party
 * site.(http://www.akxl.net/labs/articles/scrollbars-made-from-javascript-and-css/)
 * Few of the functionalities are customized to suit our requirements.
 */
CustomScroller = {
	scrollIncrement : 15,
	blockTrackClick : false,
	scrollInterval : null,
	dragObj : new Object(),
	scrollHoldInterval : 250,
	activeScrollArea : null,
	activeScrollResetTimer : null,

	setScrollAreaActive : function(elem) {
		clearTimeout(CustomScroller.activeScrollResetTimer);
		CustomScroller.activeScrollArea = elem;
	},

	setScrollAreaInactive : function(elem) {
		CustomScroller.activeScrollResetTimer = setTimeout(
				"CustomScroller.activeScrollArea = null", 100);
	},

	startScrollUp : function(elem) {
		CustomScroller.scrollUp(elem);
		CustomScroller.scrollInterval = setInterval(
				"scrollUp('" + elem + "');", CustomScroller.scrollHoldInterval);
	},

	startScrollDown : function(elem) {
		CustomScroller.scrollDown(elem);
		CustomScroller.scrollInterval = setInterval("scrollDown('" + elem
						+ "');", CustomScroller.scrollHoldInterval);
	},

	stopScroll : function() {
		clearInterval(CustomScroller.scrollInterval);
	},

	scrollUp : function(elem) {
		var scrollPos = CustomScroller.getTopScrollAmount(elem)
				+ CustomScroller.scrollIncrement;
		if (scrollPos > 0) {
			scrollPos = 0;
		}
		document.getElementById(elem + "_ScrollingArea").style.top = scrollPos
				+ "px";
		CustomScroller.setScrollBarPercentage(elem, CustomScroller
						.getScrollPercentage(elem));
	},

	scrollDown : function(elem) {		
		var scrollPos = CustomScroller.getTopScrollAmount(elem)
				- CustomScroller.scrollIncrement;
		scrollHeight = CustomScroller.getScrollHeight(elem);
		if (scrollPos < (-1 * scrollHeight)) {
			scrollPos = (-1 * scrollHeight);
		}
		document.getElementById(elem + "_ScrollingArea").style.top = scrollPos
				+ "px";
		CustomScroller.setScrollBarPercentage(elem, CustomScroller
						.getScrollPercentage(elem));
	},

	scrollBarTrackClick : function(elem, event) {
		if (CustomScroller.blockTrackClick) {
			return;
		}
		var y, yMove;
		if (CustomScroller.browser() == 'MSIE') {
			y = window.event.clientY + document.documentElement.scrollTop
					+ document.body.scrollTop;
		}
		if (CustomScroller.browser() == 'NS') {
			y = event.clientY + window.scrollY;
		}
		if (y > CustomScroller.getPosY(document.getElementById(elem + "_Drag"))) {
			CustomScroller.scrollDown(elem);
			CustomScroller.scrollDown(elem);
		} else {
			CustomScroller.scrollUp(elem);
			CustomScroller.scrollUp(elem);
		}
	},

	getTopScrollAmount : function(elem) {
		return CustomScroller.getPosY(document.getElementById(elem
				+ "_ScrollingArea"))
				- CustomScroller.getPosY(document.getElementById(elem
						+ "_Content"));
	},

	getScrollHeight : function(elem) {
		return document.getElementById(elem + "_ScrollingArea").offsetHeight
				- document.getElementById(elem + "_Content").offsetHeight;
	},

	getTrackDistance : function(elem) {
		return document.getElementById(elem + "_GripperContainer").offsetHeight
				- document.getElementById(elem + "_Drag").offsetHeight;
	},

	getGripperPosition : function(elem) {
		return CustomScroller.getPosY(document.getElementById(elem + "_Drag"))
				- CustomScroller.getPosY(document.getElementById(elem
						+ "_GripperContainer"));
	},

	getScrollBarPercentage : function(elem) {
		var topOffset = CustomScroller.getGripperPosition(elem);
		var trackDistance = CustomScroller.getTrackDistance(elem);
		return topOffset / trackDistance;
	},

	setScrollBarPercentage : function(elem, percentage) {
		CustomScroller.getTrackDistance(elem)
		if (isNaN(percentage)) {
			percentage = "0";
		}
		document.getElementById(elem + "_Drag").style.top = Math
				.floor(CustomScroller.getTrackDistance(elem) * percentage)	+ "px";
	},

	getScrollPercentage : function(elem) {
		return -1
				* (CustomScroller.getTopScrollAmount(elem) / CustomScroller
						.getScrollHeight(elem));
	},

	setScrollPercentage : function(elem, percentage) {
		document.getElementById(elem + "_ScrollingArea").style.top = (-1 * Math
				.floor(CustomScroller.getScrollHeight(elem) * percentage))	+ "px";
	},

	setScrollbarHeight : function(elem) {
		var visiblePercentage = document.getElementById(elem + "_Content").offsetHeight
				/ document.getElementById(elem + "_ScrollingArea").offsetHeight;

		if (visiblePercentage > 1) {
			visiblePercentage = 1;
		}

		var gripperHeight = Math.floor(document.getElementById(elem
				+ "_GripperContainer").offsetHeight
				* visiblePercentage);

		if (gripperHeight < 20) {
			gripperHeight = 20;
		}

		document.getElementById(elem + "_Drag").style.height = gripperHeight + "px";
		// here 5 is the half of the height of the gripper
		document.getElementById(elem + "_Gripper").style.top = ((gripperHeight / 2) - 5) + "px";
	},

	getPosX : function(obj) {
		var curleft = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent) {
				curleft += obj.offsetLeft
				obj = obj.offsetParent;
			}
		} else if (obj.x) {
			curleft += obj.x;
		}
		return curleft;
	},

	getPosY : function(obj) {
		var curtop = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent) {
				curtop += obj.offsetTop
				obj = obj.offsetParent;
			}
		} else if (obj.y) {
			curtop += obj.y;
		}
		return curtop;
	},

	/*
	 * Javascript Mouse Wheel handling code - based on an article by:
	 * http://adomas.org/javascript-mouse-wheel/
	 */
	handleMouseWheelScroll : function(scrollDelta) {
		var safety = 0;

		if (scrollDelta < 0) {
			for (var x = 0; x > scrollDelta && safety < 3; x--) {
				CustomScroller.scrollDown(CustomScroller.activeScrollArea);
				safety++;
			}
		}

		if (scrollDelta > 0) {
			for (var x = 0; x < scrollDelta && safety < 3; x++) {
				CustomScroller.scrollUp(CustomScroller.activeScrollArea);
				safety++;
			}
		}

	},

	mouseWheelActive : function(event) {

		if (CustomScroller.activeScrollArea == null) {
			return;
		}

		var delta = 0;
		if (!event) {
			event = window.event;
		}
		if (event.wheelDelta) {
			delta = event.wheelDelta / 120;
			if (window.opera) {
				delta = -delta;
			}
		} else if (event.detail) {
			delta = -event.detail / 4;
		}
		if (delta) {
			CustomScroller.handleMouseWheelScroll(delta);
		}
		if (event.preventDefault) {
			event.preventDefault();
		}
		event.returnValue = false;
	},

	/*
	 * Modified to bound allowable drag area to relative parent
     */

	// Determine browser and version.
	browser : function() {
		var ua, s, i;
		this.version = null;
		ua = navigator.userAgent;

		if ((i = ua.indexOf("MSIE")) >= 0) {
			s = "MSIE";
			this.version = parseFloat(ua.substr(i + s.length));
		}

		if ((i = ua.indexOf("Netscape6/")) >= 0) {
			s = "NS";
			this.version = parseFloat(ua.substr(i + s.length));
		}

		// Treat any other "Gecko" browser as NS 6.1.
		if ((i = ua.indexOf("Gecko")) >= 0) {
			s = "NS";
			this.version = 6.1;
		}
		return s;
	},

	scrollBarDragStart : function(event, id) {
		CustomScroller.blockTrackClick = true;
		var el;
		var x, y;

		// If an element id was given, find it. Otherwise use the element being
		// clicked on.
		if (id)
			CustomScroller.dragObj.elNode = document.getElementById(id);
		else {
			if (CustomScroller.browser() == 'MSIE') {
				CustomScroller.dragObj.elNode = window.event.srcElement;
			}
			if (CustomScroller.browser() == 'NS') {
				CustomScroller.dragObj.elNode = event.target;
			}

			// If this is a text node, use its parent element.
			if (CustomScroller.dragObj.elNode.nodeType == 3) {
				CustomScroller.dragObj.elNode = CustomScroller.dragObj.elNode.parentNode;
			}
		}

		// Get cursor position with respect to the page.
		if (CustomScroller.browser() == 'MSIE') {
			x = window.event.clientX + document.documentElement.scrollLeft
					+ document.body.scrollLeft;
			y = window.event.clientY + document.documentElement.scrollTop
					+ document.body.scrollTop;
		}
		if (CustomScroller.browser() == 'NS') {
			x = event.clientX + window.scrollX;
			y = event.clientY + window.scrollY;
		}

		// Save starting positions of cursor and element.
		CustomScroller.dragObj.cursorStartX = x;
		CustomScroller.dragObj.cursorStartY = y;
		CustomScroller.dragObj.elStartLeft = parseInt(
				CustomScroller.dragObj.elNode.style.left, 10);
		CustomScroller.dragObj.elStartTop = parseInt(
				CustomScroller.dragObj.elNode.style.top, 10);

		if (isNaN(CustomScroller.dragObj.elStartLeft))
			CustomScroller.dragObj.elStartLeft = 0;
		if (isNaN(CustomScroller.dragObj.elStartTop))
			CustomScroller.dragObj.elStartTop = 0;

		// Update element's z-index.
		CustomScroller.dragObj.elNode.style.zIndex = ++CustomScroller.dragObj.zIndex;

		// Capture mousemove and mouseup events on the page.
		if (CustomScroller.browser() == 'MSIE') {
			document.attachEvent("onmousemove", this.scrollBarDragGo);
			document.attachEvent("onmouseup", this.scrollBarDragStop);
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (CustomScroller.browser() == 'NS') {
			document.addEventListener("mousemove",
					CustomScroller.scrollBarDragGo, true);
			document.addEventListener("mouseup",
					CustomScroller.scrollBarDragStop, true);
			event.preventDefault();
		}
	},

	scrollBarDragGo : function(event) {
		var x, y;

		// Get cursor position with respect to the page.

		if (CustomScroller.browser() == 'MSIE') {
			x = window.event.clientX + document.documentElement.scrollLeft
					+ document.body.scrollLeft;
			y = window.event.clientY + document.documentElement.scrollTop
					+ document.body.scrollTop;
		}
		if (CustomScroller.browser() == 'NS') {
			x = event.clientX + window.scrollX;
			y = event.clientY + window.scrollY;
		}

		// Bound the movement of the element to within it's parent
		var ctx, cty, mtx, mty; // , cbx, cby;

		ctx = CustomScroller.dragObj.elStartLeft + x
				- CustomScroller.dragObj.cursorStartX;
		cty = CustomScroller.dragObj.elStartTop + y
				- CustomScroller.dragObj.cursorStartY;

		mtx = CustomScroller.dragObj.elNode.parentNode.offsetWidth
				- CustomScroller.dragObj.elNode.offsetWidth;
		mty = CustomScroller.dragObj.elNode.parentNode.offsetHeight
				- CustomScroller.dragObj.elNode.offsetHeight;

		if (ctx > mtx) {
			ctx = mtx;
		}
		if (ctx < 0) {
			ctx = 0;
		}

		if (cty > mty) {
			cty = mty;
		}
		if (cty < 0) {
			cty = 0;
		}

		// Move drag element by the same amount the cursor has moved.
		CustomScroller.dragObj.elNode.style.left = (ctx) + "px";
		CustomScroller.dragObj.elNode.style.top = (cty) + "px";

		if (CustomScroller.browser() == 'MSIE') {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (CustomScroller.browser() == 'NS')
			event.preventDefault();

		var elemName = CustomScroller.dragObj.elNode.id.split('_')[0];
		CustomScroller.setScrollPercentage(elemName, CustomScroller
						.getScrollBarPercentage(elemName));
	},

	scrollBarDragStop : function(event) {
		setTimeout("CustomScroller.blockTrackClick = false;", 100);

		// Stop capturing mousemove and mouseup events.
		if (CustomScroller.browser() == 'MSIE') {
			document.detachEvent("onmousemove", CustomScroller.scrollBarDragGo);
			document.detachEvent("onmouseup", CustomScroller.scrollBarDragStop);
		}
		if (CustomScroller.browser() == 'NS') {
			document.removeEventListener("mousemove",
					CustomScroller.scrollBarDragGo, true);
			document.removeEventListener("mouseup",
					CustomScroller.scrollBarDragStop, true);
		}
	}
}

if (window.addEventListener)
	window.addEventListener('DOMMouseScroll', CustomScroller.mouseWheelActive,
			false);
window.onmousewheel = document.onmousewheel = CustomScroller.mouseWheelActive;

