(function ($) {
	// Global accessible
	$.slider = {};

	// Provide global settings
	$.slider.globalSettings = {
		'containerSelector'  : '.slider-container',
		'navigationSelector' : '.slider-nav',
		'linkSelector'       : 'a',
		'linkTargetAttr'     : 'href',
		'linkCurrentClass'   : 'current',
		'linkEvent'          : 'click',
		'speed'              : 500,
		'cycleSpeed'         : 3000,
		'axis'               : 'x',
		'perPage'            : 1,
		'showNav'            : false
	};

	$.fn.slider = function (settings) {

		var slider = this;
		settings = $.extend({}, $.slider.globalSettings, settings);

		slider.each(function () {

			// Collect the three main jQuery objects
			var $slider = $(this);
			var $container = $slider.children(settings.containerSelector);
			var $panels = $container.children('ul');
			var $nav = $slider.children(settings.navigationSelector);
			var $links = $nav.find(settings.linkSelector);
			
      var panelCount = $panels.find('li').size();
			var height = $container.height();
			var width = $container.width();
			var dir;
			var scrollFunc;

      if (settings.showNav)
      {
			  $nav.show();
      }
      $links.first().addClass(settings.linkCurrentClass);
      
			if (settings.axis === 'x') {
				dir = 'left';
				scrollFunc = 'scrollLeft';
				$panels.width(panelCount * (width/settings.perPage))
			} else {
				dir = 'top';
				scrollFunc = 'scrollTop';
				$panels.height(panelCount * (height/settings.perPage))
			}

			$nav.delegate(settings.linkSelector, settings.linkEvent, function (e, cycle) {
				e.preventDefault();
				var $link = $(this);
				var $target = $($link.attr(settings.linkTargetAttr));

				var animate = {};
				animate[scrollFunc] = $container[scrollFunc]() + $target.position()[dir];
				$container.animate(animate, settings.speed);

				$links.removeClass(settings.linkCurrentClass);
				$link.addClass(settings.linkCurrentClass);

				if (! cycle && slider.cycleInstance !== null)
				{
					slider.stop().cycle();
				}
			});
		});

		// Change target
		slider.step = function (step) {
			return slider.each(function () {
			  
				var $links = $(this).children(settings.navigationSelector).find(settings.linkSelector);
				var $currentLink = $links.filter('.' + settings.linkCurrentClass);
				var currentIndex = $links.index($currentLink);
				var $nextLink;

				if ($links[currentIndex + step]) {
					$nextLink = $links.eq(currentIndex + step);
				} else if (step > 0) {
					$nextLink = $links.first();
				} else {
					$nextLink = $links.last();
				}
        
				$nextLink.trigger(settings.linkEvent, [true]);
			});
		};

		// Go forward
		slider.next = function () {
			return slider.step(+1);
		};

		// Go back
		slider.previous = function () {
			return slider.step(-1);
		};

		// Global cycle instance
		slider.cycleInstance = null;

		// Add cycle functionality
		slider.cycle = function (speed) {
			// No multi cycling
			if (slider.cycleInstance !== null) {
				return slider;
			}

			// Allow custom speed or use default
			speed = speed || settings.cycleSpeed;

			function cycle() {
				slider.next();
				slider.cycleInstance = setTimeout(cycle, speed);
			}

			slider.cycleInstance = setTimeout(cycle, speed);

			return slider;
		};

		// Allow the stopping of cycle
		slider.stop = function () {
			if (slider.cycleInstance !== null) {
				clearTimeout(slider.cycleInstance);
				slider.cycleInstance = null;
			}
			return slider;
		};

		// Return slider (aka this)
		return slider;
	};
}(this.jQuery));

