(function($, undefined) {
	
	function prev_item(item) {
	  reset_timer(item);
	  
	  var settings = item.data('settings');
		var ul = item.children("ul").eq(0);
		var lis = ul.children("li");
		var width = item.width();
		var size = lis.size();
		var current = item.data('current')-1;

		if (current >= 0) {
			goto_item(item, current);
		} else {
		  if (settings.reset) {
		    goto_item(item, size-1);
		  }
		}
	}

	function next_item(item) {
	  reset_timer(item);
	  
	  var settings = item.data('settings');
		var ul = item.children("ul").eq(0);
		var lis = ul.children("li");
		var width = item.width();
		var size = lis.size();
		var current = item.data('current')+1;
		if (current < size) {
			goto_item(item, current);
		} else {
		  if (settings.reset) {
		    goto_item(item, 0);
	    }	    
		}
	}

	function goto_item(item, index) {
	  reset_timer(item);
	  
	  var settings = item.data('settings');
		var ul = item.children("ul").eq(0);
		var lis = ul.children("li");
		var width = item.width();
		var size = lis.size();

		if (index >= 0 && index < size) {
		  item.trigger("slide", {item:item, current:index});
			var left = -100*index+"%";
			ul.stop(true, true).animate({
				left : left
			}, settings.transition_speed, settings.easing);
			item.data('current', index);
		}
	}

	function set(item, obj) {
	  var settings = item.data('settings');
		$.extend(settings, obj);
		item.data('settings', settings);
	}
	
	function reset_timer(item) {
	  var settings = item.data('settings');
	  var interval = item.data('interval');
	  var interval = item.data('interval');
	  if (settings.duration) {
	    if (interval)
	      clearInterval(interval);
	    interval = setInterval(function() {
	      next_item(item);
	    }, settings.duration);
	    item.data('interval', interval);
	  }
	}
	
	$.fn.huffslider = function(arg1, arg2, arg3) {

		var settings ={
			easing : "easeInOutExpo",
			transition_speed : 750,
			duration : null,
			reset : true,
			events : {}
		};
    
		if (arg1 == undefined || typeof arg1 == "object") {
			// do setup
			if (typeof arg1 == "object")
				$.extend(settings, arg1);

			$(this).each(function() {
				var ul = $(this).children("ul");
				var lis = ul.children("li");
				var width = $(this).width();
				var height = $(this).height();

				// setup css
				$(this).css({
				  overflow: 'hidden',
				  position: 'relative'
				});
				ul.css({
					width : width*lis.size()+"px",
					height : height+"px",
					position : "relative"
				});
				lis.css({
					width : width+"px",
					height : height+"px",
					float : "left"
				});

				// setup data
				$(this).data('current', 0).data('settings', settings).data('interval', null);
				
				reset_timer($(this));
			});
		} else {
			//handle option
			_this = $(this).eq(0);
			settings = _this.data('settings');
			switch (arg1) {
				case "prev":
					prev_item(_this);
					break;
				case "next":
					next_item(_this, arg2);
					break;
				case "goto":
					goto_item(_this, arg2);
					break;
				case "set":
					set(_this, arg2);
					break;
				case "get_current":
					return _this.data('current');
			}
			
			return false;
		}

		return $(this);
	};
})(jQuery);
