/**
 * hscroll : Horizontal Scroller Control
 *
 * @requires jQuery v1.2
 *
 * Pass in a container, with the following "parts" inside
 *
 *  1. content container : <div class="hscroll-container">
 *  2. content items		 : <ul class="hscroll-content"><li> ... </li> 
 *  3. scroll track			 : <div class="hscroll-track">
 *  4. scroll bar				 : <div class="hscroll-handle">
 *
 */

jQuery.fn.hscroll = function(o){

	var cfg = {
		/* config vals */
		par1: 'default-value',
		par2: 'default-value'		
	};
	jQuery.extend(cfg, o);

	return this.each(function(iter){
		// fires for each div[iter].
		// 	this     ...is a div

		/*
		alert(this + ' ...is a div [' + tblIter + '] , id="' + jQuery(this).attr('id') + '"')
		*/
		
		// parts
		var scrollpane  	= jQuery(this).find('.hscroll-pane');
		var content				= jQuery(this).find('.hscroll-content');
		var scrolltrack 	= jQuery(this).find('.hscroll-track')
		var scrollbar			= jQuery(this).find('.hscroll-handle');
		
		// dimensions
		var paneWidth 		= scrollpane.width();
		var contentWidth 	= content.width();
		var percentInView = paneWidth / contentWidth;
		
		// disable scroller if it's not needed
		if (contentWidth <= paneWidth) {
			scrolltrack.parent().hide();
			return;
		}
		
		// positioning
		var dragPosition 	= 0;
		var destX					= 0;
		var dragMiddle 		= percentInView * paneWidth / 2;
		var maxX					= scrolltrack.width() - scrollbar.width();
		var currentOffset;
		
		var initDrag = function()	{
			currentOffset = scrollbar.offset();
			currentOffset.left -= dragPosition;
		};
		var onStartDrag = function(event)	{
			initDrag();
			dragMiddle = getPos(event, 'X') - dragPosition - currentOffset.left;
			$('html').bind('mouseup', onStopDrag).bind('mousemove', updateScroll);
			if ($.browser.msie) {
				$('html').bind('dragstart', ignoreNativeDrag).bind('selectstart', ignoreNativeDrag);
			}
			return false;
		};
		var onStopDrag = function()	{
			$('html').unbind('mouseup', onStopDrag).unbind('mousemove', updateScroll);
			dragMiddle = percentInView*paneWidth/2;
			if ($.browser.msie) {
				$('html').unbind('dragstart', ignoreNativeDrag).unbind('selectstart', ignoreNativeDrag);
			}
		};
		var updateScroll = function(e) {
			positionDrag(getPos(e, 'X') - currentOffset.left - dragMiddle);
		};
		var positionDrag = function(destX) {
			// update scrollbar pos
			destX = destX < 0 ? 0 : (destX > maxX ? maxX : destX);
			dragPosition = destX;
			scrollbar.css({'left':destX+'px'});
			// update content pos
			// get pct of scrollbar move, move content same pct
			var p = destX / maxX;
			var m = (paneWidth-contentWidth) * p;
			//console.log('m=' + m);
			content.css({'left' : m + 'px'});
		};
		var getPos = function (event, c) {
			var p = c == 'X' ? 'Left' : 'Top';
			return event['page' + c] || (event['client' + c] + (document.documentElement['scroll' + p] || document.body['scroll' + p])) || 0;
		};
		var ignoreNativeDrag = function() {	return false; };
		
		scrollbar.bind('mousedown', onStartDrag);

	});
};


