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

		if (current >= 0) {
			ul.stop(true,true).animate({
				left : "+="+width+"px"
			}, settings.transition_speed, settings.easing);
			item.data('current', current);
		}
	}

	function next_item(item, loop) {
	  reset_timer(item);
	  
	  var settings = item.data('settings');
		var ul = item.find("ul");
		var lis = item.find("ul li");
		var width = item.width();
		var size = lis.size();
		var current = item.data('current')+1;

		if (current < size) {
			ul.stop(true, true).animate({
				left : "-="+width+"px"
			}, settings.transition_speed, settings.easing);
			item.data('current', current);
		} else if (loop != undefined && loop) {
		  goto_item(item, 0);
		}
	}

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

		if (index >= 0 && index < size) {
			var left = -1*width*index+"px";
			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) {
	  console.log("resetting interval");
	  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() {
	      console.log("in interval");
	      next_item(item, true);
	    }, settings.duration);
	    item.data('interval', interval);
	  }
	}
	
	$.fn.huffslider = function(arg1, arg2) {

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

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

				// setup css
				$(this).css('overflow', 'hidden');
				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 $(this);
	};
})(jQuery);
