/**
 * scroll plugin
 * @author 王超
 * @desc 循环滚动内容，最外层最好用 div, 且必须赋予 width 和 overflow:hidden 属性
 * @version 1.0
 * @example
 *
 * @license free
 * @site http://www.chinaido.com
 *
 */

(function($) {
	$.fn.myScroll = function (settings) {
		return this.each(function() {
			settings = $.extend({
				type: 'h',   // h -> 水平滚动, v -> 垂直, vertica
				direction: 'left',   // left, right, up, down
				step: 1,   // 每次滚动的距离(像素); 0 不滚动
				interval: 50,   // 毫秒
				stopTimeAtStart: 0,   // 初始化完毕后暂停指定时间后再滚动
				mouseoverStop: true,   // 鼠标悬浮时暂停_
				stopStep: 0,   // 每滚动指定像素暂停_
				stopTime: 3000,   // 暂停时间(毫秒)
				leftTriggerId: '',
				upTriggerId: '',
				rightTriggerId: '',
				downTriggerId: '',
				fasterSettings: null
			}, settings);

			var originalSettings = {
				step: settings.step,
				interval: settings.interval,
				stopStep: settings.stopStep,
				stopTime: settings.stopTime
			};

			function _Start() {
				if (settings.step > 0) {
					if (timer) clearTimeout(timer);
					if (!settings.mouseoverStop || !mouseOver) {
						if (stopped) stopped = false;
						var step = settings.step;
						// 水平滚动
						if (settings.type == 'h') {
							var curScrollLeft = $container.scrollLeft();
							if (settings.direction == 'left') {
								while (curScrollLeft >= scrollWidth) {
									curScrollLeft -= scrollWidth;
									$container.scrollLeft(curScrollLeft);
								}
								if (settings.stopStep > 0) {
									distance += step;
									if (distance >= settings.stopStep) {
										step -= (distance - settings.stopStep);
										distance = 0;
										stopped = true;
									} else if (curScrollLeft + step >= scrollWidth) {
										step = scrollWidth - curScrollLeft;
										distance = 0;
										stopped = true;
									}
								}
								$container.scrollLeft(curScrollLeft + step);

							} else if (settings.direction == 'right') {
								while (curScrollLeft <= scrollWidth - width) {
									curScrollLeft += scrollWidth;
									$container.scrollLeft(curScrollLeft);
								}
								if (settings.stopStep > 0) {
									distance += step;
									if (distance >= settings.stopStep) {
										step -= (distance - settings.stopStep);
										distance = 0;
										stopped = true;
									} else if (curScrollLeft - step <= scrollWidth) {
										step = curScrollLeft - scrollWidth;
										distance = 0;
										stopped = true;
									}
								}
								$container.scrollLeft(curScrollLeft - step);
							}

						// 垂直滚动
						} else if (settings.type == 'v') {
							var curScrollTop = $container.scrollTop();
							if (settings.direction == 'up') {
								while (curScrollTop >= scrollHeight) {
									curScrollTop -= scrollHeight;
									$container.scrollTop(curScrollTop);
								}
								if (settings.stopStep > 0) {
									distance += step;
									if (distance >= settings.stopStep) {
										step -= (distance - settings.stopStep);
										distance = 0;
										stopped = true;
									} else if (curScrollTop + step >= scrollHeight) {
										step = scrollHeight - curScrollTop;
										distance = 0;
										stopped = true;
									}
								}
								$container.scrollTop(curScrollTop + step);

							} else if (settings.direction == 'down') {
								while (curScrollTop <= scrollHeight - height) {
									curScrollTop += scrollHeight;
									$container.scrollTop(curScrollTop);
								}
								if (settings.stopStep > 0) {
									distance += step;
									if (distance >= settings.stopStep) {
										step -= (distance - settings.stopStep);
										distance = 0;
										stopped = true;
									} else if (curScrollTop - step <= scrollHeight) {
										step = curScrollTop - scrollHeight;
										distance = 0;
										stopped = true;
									}
								}
								$container.scrollTop(curScrollTop - step);
							}

						} else {
							return;
						}
					}
				}
				timer = setTimeout(_Start, (stopped ? settings.stopTime : settings.interval));
			}

			var $container;   // 滚动内容的容器
			var $me = $(this);
			var width  = $me.width();
			var height = $me.height();
			var scrollWidth  = $me.attr('scrollWidth');
			var scrollHeight = $me.attr('scrollHeight');

			var timer;   // 定时器
			var mouseOver = false;   // 鼠标当前是否悬停
			var distance = 0;   // 连续移动的距离
			var stopped = false;   // 是否处于暂停滚动状态

			// 确保内容外部为div
			if ($me[0].tagName != 'DIV')
				$container = $('<div style="overflow:hidden;"></div>');
			else {
				$container = $me;
				$container.css('overflow', 'hidden');
			}

			// 设置容器大小
			if (settings.type == 'h') {
				if (width == 0) {
					alert('无法确定滚动区域的宽度。');
					return;
				} else if (width >= scrollWidth) {
					return;
				} else {
					$container.width(width);
				}
			} else if (settings.type == 'v') {
				if (height == 0) {
					alert('无法确定滚动区域的高度。');
					return;
				} else if (height >= scrollHeight) {
					return;
				} else {
					$container.height(height);
				}
			} else
				return;

			// 添加鼠标悬浮事件
			if (settings.mouseoverStop) {
				$container
					.mouseover(function(){mouseOver = true;})
					.mouseout(function(){mouseOver = false;});
			}

			// 复制两份重复的内容
			var $table = $('<table cellspacing="0" cellpadding="0" style="border:none;visibility:visible;"></table>');
			if (settings.type == 'h')
				$table.html('<tr><td></td><td></td></tr>').css({'border': 'none','padding': '0', 'white-space' : 'nowrap'}).find('td').html($me.html());
			else if (settings.type == 'v')
				$table.html('<tr><td></td></tr><tr><td></td></tr>').css({'border': 'none','padding': '0'}).find('td').html($me.html());
			else
				return;
			$container.empty().append($table);

			if (settings.leftTriggerId) {
				$('#' + settings.leftTriggerId).mousedown(function(){
					if (settings.stopStep <= 0) {
						settings.direction = 'left';
						if (settings.fasterSettings) $.extend(settings, settings.fasterSettings);
					} else if (stopped) {
						settings.direction = 'left';
						if (settings.fasterSettings) $.extend(settings, settings.fasterSettings);
						_Start();
					}
				}).mouseup(function(){
					if (settings.stopStep <= 0) {
						settings.direction = 'left';
						if (settings.fasterSettings) $.extend(settings, originalSettings);
					} else {
						if (stopped) settings.direction = 'left';
						if (settings.fasterSettings) $.extend(settings, originalSettings);
						_Start();
					}
				});
			}
			if (settings.rightTriggerId) {
				$('#' + settings.rightTriggerId).mousedown(function(){
					if (settings.stopStep <= 0) {
						settings.direction = 'right';
						if (settings.fasterSettings) $.extend(settings, settings.fasterSettings);
					} else if (stopped) {
						settings.direction = 'right';
						if (settings.fasterSettings) $.extend(settings, settings.fasterSettings);
						_Start();
					}
				}).mouseup(function(){
					if (settings.stopStep <= 0) {
						settings.direction = 'right';
						if (settings.fasterSettings) $.extend(settings, originalSettings);
					} else {
						if (stopped) settings.direction = 'right';
						if (settings.fasterSettings) $.extend(settings, originalSettings);
						_Start();
					}
				});
			}
			if (settings.upTriggerId) {
				$('#' + settings.upTriggerId).mousedown(function(){
					if (settings.stopStep <= 0) {
						settings.direction = 'up';
						if (settings.fasterSettings) $.extend(settings, settings.fasterSettings);
					} else if (stopped) {
						settings.direction = 'up';
						if (settings.fasterSettings) $.extend(settings, settings.fasterSettings);
						_Start();
					}
				}).mouseup(function(){
					if (settings.stopStep <= 0) {
						settings.direction = 'up';
						if (settings.fasterSettings) $.extend(settings, originalSettings);
					} else {
						if (stopped) settings.direction = 'up';
						if (settings.fasterSettings) $.extend(settings, originalSettings);
						_Start();
					}
				});
			}
			if (settings.downTriggerId) {
				$('#' + settings.downTriggerId).mousedown(function(){
					if (settings.stopStep <= 0) {
						settings.direction = 'down';
						if (settings.fasterSettings) $.extend(settings, settings.fasterSettings);
					} else if (stopped) {
						settings.direction = 'down';
						if (settings.fasterSettings) $.extend(settings, settings.fasterSettings);
						_Start();
					}
				}).mouseup(function(){
					if (settings.stopStep <= 0) {
						settings.direction = 'down';
						if (settings.fasterSettings) $.extend(settings, originalSettings);
					} else {
						if (stopped) settings.direction = 'down';
						if (settings.fasterSettings) $.extend(settings, originalSettings);
						_Start();
					}
				});
			}

			if (settings.stopTimeAtStart) {
				timer = setTimeout(_Start, settings.stopTimeAtStart);
			} else {
				_Start();
			}

		});
	};
})(jQuery);
