/*
 * jQuery dragscrollable Plugin
 * version: 1.0 (25-Jun-2009)
 * Copyright (c) 2009 Miquel Herrera
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 */
$(function(){ // secure $ jQuery alias

	//for NEWS photo gallery by Kangning
	var news_qEle = $('#news_big .tank_li').length - 1;
	var news_cEle = 0;
	$('.news_dot').click(function(){
		var n = $('.news_dot').index(this);
		$('#news_sections').scrollTo( '.tank_li:eq('+n+')', 800, {axis:'x'} );
		$(this).parent().children().css('background-position','top');
		$(this).css('background-position','bottom');
		news_cEle = n;
	});	
	//for NEWS photo gallery by Kangning
	
/**
 * Adds the ability to manage elements scroll by dragging
 * one or more of its descendant elements. Options parameter
 * allow to specifically select which inner elements will
 * respond to the drag events.
 * 
 * options properties:
 * ------------------------------------------------------------------------		
 *  dragSelector         | jquery selector to apply to each wrapped element 
 *                       | to find which will be the dragging elements. 
 *                       | Defaults to '>:first' which is the first child of 
 *                       | scrollable element
 * ------------------------------------------------------------------------		
 *  acceptPropagatedEvent| Will the dragging element accept propagated 
 *	                     | events? default is yes, a propagated mouse event 
 *	                     | on a inner element will be accepted and processed.
 *	                     | If set to false, only events originated on the
 *	                     | draggable elements will be processed.
 * ------------------------------------------------------------------------
 *  preventDefault       | Prevents the event to propagate further effectivey
 *                       | dissabling other default actions. Defaults to true
 * ------------------------------------------------------------------------
 *  
 *  usage examples:
 *
 *  To add the scroll by drag to the element id=viewport when dragging its 
 *  first child accepting any propagated events
 *	$('#viewport').dragscrollable(); 
 *
 *  To add the scroll by drag ability to any element div of class viewport
 *  when dragging its first descendant of class dragMe responding only to
 *  evcents originated on the '.dragMe' elements.
 *	$('div.viewport').dragscrollable({dragSelector:'.dragMe:first',
 *									  acceptPropagatedEvent: false});
 *
 *  Notice that some 'viewports' could be nested within others but events
 *  would not interfere as acceptPropagatedEvent is set to false.
 *		
 */
$.fn.dragscrollable = function( options ){
	
	var space = 0;//judge drag direction add by Kangning
   
	var settings = $.extend(
		{   
			dragSelector:'>:first',
			acceptPropagatedEvent: true,
            preventDefault: true
		},options || {});
	 
	
	var dragscroll= {
		mouseDownHandler : function(event) {
			// mousedown, left click, check propagation
			if (event.which!=1 ||
				(!event.data.acceptPropagatedEvent && event.target != this)){ 
				return false; 
			}
			
			// Initial coordinates will be the last when dragging
			event.data.lastCoord = {left: event.clientX, top: event.clientY}; 
		
			$.event.add( document, "mouseup", 
						 dragscroll.mouseUpHandler, event.data );
			$.event.add( document, "mousemove", 
						 dragscroll.mouseMoveHandler, event.data );
			if (event.data.preventDefault) {
                event.preventDefault();
                return false;
            }
		},
		mouseMoveHandler : function(event) { // User is dragging
			// How much did the mouse move?
			var delta = {left: (event.clientX - event.data.lastCoord.left),
						 top: (event.clientY - event.data.lastCoord.top)};
						 
			space = delta.left;
			
			// Set the scroll position relative to what ever the scroll is now
			event.data.scrollable.scrollLeft(
							event.data.scrollable.scrollLeft() - delta.left);
			event.data.scrollable.scrollTop(
							event.data.scrollable.scrollTop() - delta.top);
			
			// Save where the cursor is
			event.data.lastCoord={left: event.clientX, top: event.clientY}
			if (event.data.preventDefault) {
                event.preventDefault();
                return false;
            }

		},
		mouseUpHandler : function(event) { // Stop scrolling
			$.event.remove( document, "mousemove", dragscroll.mouseMoveHandler);
			$.event.remove( document, "mouseup", dragscroll.mouseUpHandler);
			
			if(space < 0){//for drag scrollTo by Kangning
				if(news_cEle < news_qEle){
					news_cEle ++;
				}else{
					news_cEle = 0;
				};
				//alert('news_cEle = ' + news_cEle);
				$('#news_sections').scrollTo( '.tank_li:eq('+news_cEle+')', 800, {axis:'x'} );
				$('.news_dot:eq('+news_cEle+')').parent().children().css('background-position','top');
				$('.news_dot:eq('+news_cEle+')').css('background-position','bottom');
				//alert('news_qEle = ' + news_qEle);
				
				//postValue(news_cEle);
						
			}
			else if(space == 0){}
			else{
				//if(news_cEle == 0){}else if(news_cEle == 1){news_cEle = 0}else{news_cEle -= 2;};
				
				if(news_cEle < news_qEle){
					news_cEle --;
					if(news_cEle < -1){news_cEle = 0;}else if(news_cEle == -1){news_cEle = news_qEle}else{};
				}
				else if(news_cEle == news_qEle){news_cEle --;}
				else{news_cEle = 0;};
				
				//alert('news_cEle = ' + news_cEle);
				$('#news_sections').scrollTo( '.tank_li:eq('+news_cEle+')', 800, {axis:'x'} );
				$('.news_dot:eq('+news_cEle+')').parent().children().css('background-position','top');
				$('.news_dot:eq('+news_cEle+')').css('background-position','bottom');
				//alert('news_qEle = ' + news_qEle);
				
				//postValue(news_cEle);	
							
			};
			
			
			if (event.data.preventDefault) {
                event.preventDefault();
                return false;
            }
		}
	}
	
	// set up the initial events
	this.each(function() {
		// closure object data for each scrollable element
		var data = {scrollable : $(this),
					acceptPropagatedEvent : settings.acceptPropagatedEvent,
                    preventDefault : settings.preventDefault }
		// Set mouse initiating event on the desired descendant
		$(this).find(settings.dragSelector).
						bind('mousedown', data, dragscroll.mouseDownHandler);
	});
}; //end plugin dragscrollable

}); // confine scope
