(function($) {

	function Gallery(el, options) {

		this._hold = $(el);

		this.initOptions(options);

		this._timer = options.autoRotation;

		this._t;

		this.initialize();

	}

	

	$.fn.gallery = function(options) {

		return new Gallery(this.get(0), options);

	};

	

	Gallery.prototype = {

		initOptions: function(_obj){

			this.options = {

				duration: 600,

				slideElement: 1,

				autoRotation: true,

				effect: false,

				listOfSlides: 'ul > li',

				switcher: false,

				disableBtn: false,

				nextBtn: 'a.link-next, a.btn-next, a.next',

				prevBtn: 'a.link-prev, a.btn-prev, a.prev',

				circle: true,

				direction: false,

				IE: false

			};

			for(key in _obj) this.options[key] = _obj[key];

		},

		initialize: function(){

			var _this = this;

			var _hold = _this._hold;

			var _speed = _this.options.duration;

			var _timer = _this.options.autoRotation;

			var _el = _hold.find(_this.options.listOfSlides);

			if (_this.options.effect) var _list = _el;

			else var _list = _el.parent();

			var _switcher = _hold.find(_this.options.switcher);

			var _next = _hold.find(_this.options.nextBtn);

			var _prev = _hold.find(_this.options.prevBtn);

			var _count = _el.index(_el.filter(':last'));

			var _w = _el.outerWidth(true);

			var _h = _el.outerHeight(true);

			if (_this.options.switcher) var _active = _switcher.index(_switcher.filter('.active:eq(0)'));

			else var _active = _el.index(_el.filter('.active:eq(0)'));

			if (_active < 0) _active = 0;

			var _last = _active;

			

			// Installation directions

			if (!_this.options.direction) {

				var _wrapHolderW = Math.ceil(_list.parent().width() / _w);

				if (((_wrapHolderW - 1) * _w + _w / 2) > _list.parent().width()) _wrapHolderW--;

			}

			else{

				var _wrapHolderW = Math.ceil(_list.parent().height()/_h);

				if (((_wrapHolderW-1)*_h + _h/2) > _list.parent().height()) _wrapHolderW--;

			}

			

			// Setting "fade" or "slide" effect

			if (!_this.options.effect) var rew = _count - _wrapHolderW + 1;

			else var rew = _count;

			if (!_this.options.effect) {

				if (!_this.options.direction) _list.css({marginLeft: -(_w * _active)})

				else _list.css({marginTop: -(_h * _active)})

			}

			else {

				_list.css({

					opacity: 0

				}).removeClass('active').eq(_active).addClass('active').css({

					opacity: 1

				}).css('opacity', 'auto');

				_switcher.removeClass('active').eq(_active).addClass('active');

			}

			

			// Disable or enable buttons "prev next"

			if (_this.options.disableBtn) {

				if (_count < _wrapHolderW) _next.addClass(_this.options.disableBtn);

				_prev.addClass(_this.options.disableBtn);

			}

			

			// Function to "fade"

			function fadeElement(){

				if ($.browser.msie && _this.options.IE){

					_list.eq(_last).css({opacity:0});

					_list.removeClass('active').eq(_active).addClass('active').css({opacity:'auto'});

				}

				else{

					_list.eq(_last).animate({opacity:0}, {queue:false, duration: _speed});

					_list.removeClass('active').eq(_active).addClass('active').animate({

						opacity:1

					}, {queue:false, duration: _speed, complete: function(){

						$(this).css('opacity','auto');

					}});

				}

				if (_this.options.switcher) _switcher.removeClass('active').eq(_active).addClass('active');

				_last = _active;

			}

			

			// Function for "slide"

			function scrollEl(){

				if (!_this.options.direction) _list.animate({marginLeft: -(_w * _active)}, {queue:false, duration: _speed})

				else _list.animate({marginTop: -(_h * _active)}, {queue:false, duration: _speed})

				if (_this.options.switcher) _switcher.removeClass('active').eq(_active).addClass('active');

			}

			function toPrepare(){

				if ((_active == rew) && _this.options.circle) _active = -_this.options.slideElement;

				for (var i = 0; i < _this.options.slideElement; i++){

					_active++;

					if (_active > rew) {

						_active--;

						if (_this.options.disableBtn &&(_count > _wrapHolderW)) _next.addClass(_this.options.disableBtn);

					}

				};

				if (_active == rew) if (_this.options.disableBtn &&(_count > _wrapHolderW)) _next.addClass(_this.options.disableBtn);

				if (!_this.options.effect) scrollEl();

				else fadeElement();

			}

			_this._hold.bind('runTimer', function(){

				_this._t = setInterval(function(){

					toPrepare();

				}, _this._timer);

			});

			_next.click(function(){

				if(_this._t) clearTimeout(_this._t);

				if (_this.options.disableBtn &&(_count > _wrapHolderW)) _prev.removeClass(_this.options.disableBtn);

				toPrepare();

				if (_this._timer) _this._hold.trigger('runTimer');

				return false;

			});

			_prev.click(function(){

				if(_this._t) clearTimeout(_this._t);

				if (_this.options.disableBtn &&(_count > _wrapHolderW)) _next.removeClass(_this.options.disableBtn);

				if ((_active == 0) && _this.options.circle) _active = rew + _this.options.slideElement;

				for (var i = 0; i < _this.options.slideElement; i++){

					_active--;

					if (_active < 0) {

						_active++;

						if (_this.options.disableBtn &&(_count > _wrapHolderW)) _prev.addClass(_this.options.disableBtn);

					}

				};

				if (_active == 0) if (_this.options.disableBtn &&(_count > _wrapHolderW)) _prev.addClass(_this.options.disableBtn);

				if (!_this.options.effect) scrollEl();

				else fadeElement();

				if (_this._timer) _this._hold.trigger('runTimer');

				return false;

			});

			if (_this.options.switcher) _switcher.click(function(){

				_active = _switcher.index($(this));

				if(_this._t) clearTimeout(_this._t);

				if (!_this.options.effect) scrollEl();

				else fadeElement();

				if (_this._timer) _this._hold.trigger('runTimer');

				return false;

			});

			if (_this._timer) _this._hold.trigger('runTimer');

		},

		stop: function(){

			var _this = this;

			alert(1);

			if (_this._t) clearTimeout(_this._t);

		},

		play: function(){

			var _this = this;

			alert(2);

			if (_this._t) clearTimeout(_this._t);

			if (_this._timer) _this._hold.trigger('runTimer');

		}

	}

}(jQuery));



$(document).ready(function(){

	$('.visual').gallery({

		duration: 500,

		autoRotation: false,

		listOfSlides: 'ul.carusel-holder>li',

		switcher: 'ul.carusel-nav>li'

	});

});


