YUI().use('node','anim', function(Y) {

	var scrollControlObj = function(prefix) {
		this.prefix = prefix;
		this.scrolling = false;
		this.content = null,
		this.contentHeight = null,
		this.lastMouseX = null,
		this.handleTop = null,
		this.handleTravelTotal = null
	};
	
	var scrollControl = []; // array of control objs
	//var scrollControlPrefix = []; // array of control prefix strings
	var activeScrollControl = {};
	
	var initControls = function(e) {

		try {
			if (scrollControlPrefix.length == 0) return false;
		}
		catch(e) {
			return false;
		}
		
		for (i=0; i<scrollControlPrefix.length; i++) {
			var ctrl = new scrollControlObj(scrollControlPrefix[i]);
			ctrl.scrolling = false;
			ctrl.content = Y.one('#'+scrollControlPrefix[i]+'-scrollcontent');
			ctrl.handleTop = 0;
			barWidth = isNaN(parseInt(Y.one('#'+scrollControlPrefix[i]+'-scrollbar').getStyle('height'))) ? 0 : parseInt(Y.one('#'+scrollControlPrefix[i]+'-scrollbar').getStyle('height'));
			handleWidth = isNaN(parseInt(Y.one('#'+scrollControlPrefix[i]+'-scrollbar-handle').getStyle('height'))) ? 0 : parseInt(Y.one('#'+scrollControlPrefix[i]+'-scrollbar-handle').getStyle('height'));
			scrollMaskHeight = isNaN(parseInt(Y.one('#'+scrollControlPrefix[i]+'-scrollmask').getStyle('height'))) ? 0 : parseInt(Y.one('#'+scrollControlPrefix[i]+'-scrollmask').getStyle('height'));
			ctrl.handleTravelTotal= barWidth - handleWidth;
			ctrl.contentHeight =  isNaN(parseInt(Y.one('#'+scrollControlPrefix[i]+'-scrollcontent').getStyle('height'))) ? 0 : parseInt(Y.one('#'+scrollControlPrefix[i]+'-scrollcontent').getStyle('height'));
			ctrl.contentTravelTotal =  ctrl.contentHeight - scrollMaskHeight;
			if (ctrl.contentTravelTotal > 0) {
				Y.one('#'+scrollControlPrefix[i]+'-scrollbar').setStyle('display','block');
				Y.one('#'+scrollControlPrefix[i]+'-scrollbar-handle').setStyle('display','block');
				Y.on('mousedown', initScroll, '#'+scrollControlPrefix[i]+'-scrollbar-handle');
			}
			scrollControl[scrollControlPrefix[i]] = ctrl;
		}
	};
	
	var initScroll = function(e) {
		
		// prevent default actions
		e.preventDefault();
		
		// get control obj
		var prefix = e.target.get('id').split('-')[0];
		
		// set active control and props
		activeScrollControl = scrollControl[prefix];
		activeScrollControl.scrolling = true;
		activeScrollControl.lastMouseY = e.pageY;
		activeScrollControl.handleTop = isNaN(parseInt(e.target.getStyle('top'))) ? 0 : parseInt(e.target.getStyle('top'));
		
		// set listeners
		var selector = Y.one('document');
		Y.on('mousemove', scroll, selector);
		Y.on('mouseup', stopScroll, selector);
	};
	
	var stopScroll = function(e) {
		activeScrollControl.scrolling = false;
	};
	
	var scroll = function(e) {

		if (activeScrollControl.scrolling) {
			
			activeScrollControl.handleTop = isNaN(parseInt(Y.one('#'+activeScrollControl.prefix+'-scrollbar-handle').getStyle('top'))) ? 0 : parseInt(Y.one('#'+activeScrollControl.prefix+'-scrollbar-handle').getStyle('top'));
			if (activeScrollControl.handleTop < 0) {
				Y.one('#'+activeScrollControl.prefix+'-scrollbar-handle').setStyle('top', '0px');
				Y.one('#'+activeScrollControl.prefix+'-scrollcontent').setStyle('top', '0px');
				return false;
			}
			if (activeScrollControl.handleTop > activeScrollControl.handleTravelTotal) {
				var contentTop = Math.floor(activeScrollControl.contentHeight);
				Y.one('#'+activeScrollControl.prefix+'-scrollbar-handle').setStyle('top', activeScrollControl.handleTravelTotal + 'px');
				Y.one('#'+activeScrollControl.prefix+'-scrollcontent').setStyle('top', '-' + contentTop + 'px');
				return false;
			}
			
			// scroll content up
			if (e.pageY > activeScrollControl.lastMouseY) {
				// move handle
				var moveDistance = e.pageY - activeScrollControl.lastMouseY;
				activeScrollControl.handleTop += moveDistance;
				if (activeScrollControl.handleTop > activeScrollControl.handleTravelTotal) activeScrollControl.handleTop = activeScrollControl.handleTravelTotal;
				Y.one('#'+activeScrollControl.prefix+'-scrollbar-handle').setStyle('top', activeScrollControl.handleTop + 'px');
				activeScrollControl.lastMouseY = e.pageY;
			}
			
			// scroll content down
			if (e.pageY < activeScrollControl.lastMouseY) {
				var moveDistance = activeScrollControl.lastMouseY - e.pageY;
				activeScrollControl.handleTop -= moveDistance;
				if (activeScrollControl.handleTop < 0) activeScrollControl.handleTop = 0;
				Y.one('#'+activeScrollControl.prefix+'-scrollbar-handle').setStyle('top', activeScrollControl.handleTop + 'px');
				activeScrollControl.lastMouseY = e.pageY;
			}
			// calculate position of content
			handleTop = isNaN(parseInt(activeScrollControl.handleTop)) ? 0 : parseInt(activeScrollControl.handleTop);
			var handlePosition = ((handleTop / activeScrollControl.handleTravelTotal) * 100);
			var moveDistance = (activeScrollControl.contentTravelTotal / 100) * handlePosition;
			var contentTop = '-' + Math.floor(moveDistance) + 'px';
			Y.one('#'+activeScrollControl.prefix+'-scrollcontent').setStyle('top', contentTop);
		}
	};
	
	Y.on('domready', initControls);
	
});
