;(function($) {
	$.fn.marquee = function(settings) {
		var _defaultSettings = {
			move_time:50,
			move_step:3,
			move_type:'marquee',
			move_direction: 'horizontal', // vertical
			start_one:true,
			start_wait:0,
			navigate_ol:''
		};
		var _settings = $.extend(_defaultSettings, settings);
		var _handler = function(index,element) {
			var _old_action, _action = function(){
				var distance=0,marquee_go=1,marquee_timeout=null,
					scrollFromDirection,
					$element = $(element), $element_hover, $navigate_ol,
					child_num,current_child=0,
					i;
				if( _settings.move_type == 'marquee' ){
					child_num = element.children.length;
					$element_hover = $element;
				}else if( _settings.move_type == 'slideshow' ){
					child_num = $('li',element).length ;
					$element_hover = $element.parent();
				}
				if( child_num <= 0 || child_num == 1 && !_settings.start_one)
					return ;
				switch(_settings.move_type){
					case 'slideshow':
						$element.scrollLeft(0);
						distance = $('li:first',$element).clone().appendTo($('ul',$element)).width();
						if( _settings.navigate_ol != '' ){
							$navigate_ol = $(_settings.navigate_ol,$element.parent());
							$navigate_ol.find('a').bind('click',function(){
								clearTimeout(marquee_timeout);
								$navigate_ol.find('a').removeClass('hilite');
								current_child = $(this).addClass('hilite').attr('sliderindex') - 1;
								$element.animate({'scrollLeft': distance * current_child}, 'normal',function(){
									marquee_timeout = setTimeout(scrollFromDirection,_settings.move_time);
								});
								return false;
							});
						}
						break;
					case 'marquee':
						i=0;
						do{
							var element_child = element.children[i].cloneNode(true);
							element.appendChild(element_child);
							if( _settings.move_direction === 'horizontal' )
								distance += element_child.scrollWidth;
							else if( _settings.move_direction === 'vertical' )
								distance += element_child.scrollHeight;
							i+=1;
						}while( (_settings.move_direction === 'horizontal') && (distance < element.clientWidth) ||
							(_settings.move_direction === 'vertical') && (distance < element.clientHeight) );
						break;
					default:
						return ;
				}
				scrollFromDirection = function(){
					if(marquee_timeout)
						clearTimeout(marquee_timeout);
					if(!marquee_go)
						return ;
					switch(_settings.move_type){
						case 'slideshow':
							$element.animate({'scrollLeft': distance * (current_child + 1)}, 'normal',function(){
								current_child += 1;
								if(current_child == child_num)
									$element.scrollLeft((current_child=0));
								if( _settings.navigate_ol != '' )
									$navigate_ol.find('a').removeClass('hilite').end().find('a[sliderindex="'+(current_child+1).toString()+'"]').addClass('hilite');
							});
							break;
						case 'marquee':
							if( _settings.move_direction === 'horizontal' ){
								if(element.scrollLeft >= element.scrollWidth - distance)
									element.scrollLeft = 0;
								element.scrollLeft = element.scrollLeft + _settings.move_step;
							}else if( _settings.move_direction === 'vertical' ){
								if(element.scrollTop >= element.scrollHeight - distance)
									element.scrollTop = 0;
								element.scrollTop = element.scrollTop + 1;
							}
							
							break;
						default:
							return ;
					}
					marquee_timeout = setTimeout(scrollFromDirection,_settings.move_time);
				};
				$element.css({'overflow':'hidden','white-space':'nowrap'}).contents().filter(function () {
					return this.nodeType == 3;
				}).replaceWith('');
				$element_hover.mouseenter(function(){
					marquee_go = 0;
				}).mouseleave(function(){
					marquee_go = 1;
					scrollFromDirection();
				});
				scrollFromDirection();
			};
			if( _settings.start_wait > 0 ){
				_old_action = _action;
				_action = function(){
					setTimeout(_old_action,_settings.start_wait);
				}
			}
			_action();
		};
		return this.each(_handler);
	};
})(jQuery);
