/**
 * @version 1.0.
 */
function Slider($slider, $options)
{
	// KONFIGURACJA

	/**
	 * Tryb developerski wyświetla zmienne w konsoli przeglądarki.
	 * @type {Boolean}
	 */
	var _debug = $options.debug || false;

	/**
	 * Zmienna decyduje czy ma się generować listra slajdów.
	 * @type {Boolean}
	 */
	var _pager = $options.pager || false;

	/**
	 * Zmienna określa czas zatrzymania sklajdu.
	 * @type {Number}
	 */
	var _colddown = $options.coldown || 5000;

	/**
	 * Zmienna określa czas w MS ile ma trwać animacja zmiany slajdu.
	 * @type {Number}
	 */
	var _animationTime = $options.animationTime || 200;

	/**
	 * Zmienna określa ilość widocznych sladów na ekranie.
	 * @type {Number}
	 */
	var _visibleSlide =  $options.visibleSlide || 1;

	/**
	 * Zmienna określa o ile slajdów ma się przesuwać slider.
	 * @type {Number}
	 */
	var _moveSlide = $options.moveSlide || 1;

	/**
	 * Zmienna określa czy slajder ma sam zmieniać slajdy co określony czas {_colddown}.
	 * @type {Boolean}
	 */
	var _auto = $options.auto || false;

	/**
	 * @private _onAnimationFinish Zdarzenie zakończenia animacji.
	 */
	var _onAnimationFinish = $options.onAnimationFinish || function () {};

	var _onInit = $options.onInit || function () {};

	// KONFIGURACJA
	
	var _that = this;

	/**
	 * ID interwału.
	 * @type {Number}
	 */
	var _interval = 0;

	/**
	 * Uchwyt do wszystkich slajdów.
	 * @type {Array}
	 */
	var _slides = [];

	/**
	 * Ilośc slajdów.
	 * @type {Number}
	 */
	var _length = 0;

	/**
	 * Aktualny slajd.
	 * @type {Number}
	 */
	var _current = 0;

	/**
	 * Uchwyt do slidera
	 * @type {HTMLElement}
	 */
	var _slider = $slider || undefined;

	/**
	 * Uchwyt do slidera.
	 * @type {HTMLDivElement}
	 */
	var _handleSlider = '';

	/**
	 * Uchwyt do maski slidera.
	 * @type {HTMLDivElement}
	 */
	var _handleSliderMask = '';

	/**
	 * Zmienna przechowuje wszystkie slajdy.
	 * @type {Array}
	 */
	var _handleSlides = [];

	var _handlePrev = '';
	var _handleNext = '';

	/**
	 * Ustawia pozycje wszystkich slajdów.
	 */
	var _setPositionSlide = function ()
	{
		$(_slider).css({
			'position' : 'absolute',
			'left' : 0,
			'top' : 0
		});

		$(_handleSliderMask).css({
			'position' : 'relative',
			'width' : ($(_handleSlides).width() * _visibleSlide) + 'px',
			'overflow' : 'hidden',
			'height' : $(_slider).height() + 'px'
		});

		$(_handleSlides).each(function ($index , $value) {
			$($value).css({
				'position' : 'absolute',
				'left' : ($index * $($value).width()) + 'px'
			});
		});
	};

	var _prev = function ()
	{
		if (_current - 1 >= 0)
		{
			_gotoSlide(_current - 1);
		}
		else
		{
			_gotoSlide(_length - 1);
		}
		
	};

	var _next = function ()
	{
		if (_current + 1 < _length)
		{
			_gotoSlide(_current + 1);
		}
		else
		{
			_gotoSlide(0);
		}
	};


	/**
	 * @private _gotoSlide Animuje do danego slajdu, slajdy są liczone od 0.
	 * @param  {Number} $slide [description]
	 */
	var _gotoSlide = function ($slide)
	{

		if (_auto == true)
		{
			clearInterval(_interval);
			_interval = setInterval(_next, _colddown);
		}
		
		$(_slider).stop().animate({
			'left' : "-" + (($(_handleSlides).width() * _visibleSlide) * $slide) + 'px'
		}, _animationTime, function () {_onAnimationFinish(_that);});

		_current = $slide;
	};

	var _constructor = function ($slider, $options)
	{
		_handleSlider = document.createElement('div');
		$(_slider).after(_handleSlider);

		_handleSliderMask = document.createElement('div');
		$(_handleSliderMask).append(_slider);
		$(_handleSlider).append(_handleSliderMask);

		_handlePrev = document.createElement('a');
		$(_handlePrev).click(_prev);
		$(_handlePrev).addClass('fast-slider-prev');
		$(_handleSlider).append(_handlePrev);

		_handleNext = document.createElement('a');
		$(_handleNext).click(_next);
		$(_handleNext).addClass('fast-slider-next');
		$(_handleSlider).append(_handleNext);

		_handleSlides = $(_handleSlider).find('ul > li');

		_length = _handleSlides.length;

		_setPositionSlide();
		_gotoSlide(_current);

		if (_auto == true)
		{
			clearInterval(_interval);
			_interval = setInterval(_next, _colddown);
		}

		_onInit(_that);
	};

	/**
	 * @public _gotoSlide Animuje do danego slajdu, slajdy są liczone od 0.
	 * @param  {Number} $slide [description]
	 */
	this.gotoSlide = function ($slide)
	{
		_gotoSlide($slide);
	};

	this.getLength = function ()
	{
		return _length;
	};

	this.getCurrent = function ()
	{
		return _current;
	}

	_constructor($slider, $options);
}
