function gallery(_obj) {
	// defaults options
	var _this = this;
	_this.options = {
		hold: 'div.gallery-slide',
		duration: 1200,
		slideElement: 1,
		autoRotation: false,
		clickDelay: 3000,
		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,
		animateEffect: "jswing",
		run: true
	};
	for(key in _obj) _this.options[key] = _obj[key];

	// Variables
	$(_this.options.hold).each(function(){
		var _hold = $(this);
		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.autoRotation) var _t;
		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;
		var last_rotation = null;

		// 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 (_last != _active) {
				_list.eq(_last).animate({opacity:0}, {queue:false, duration: _this.options.duration});
				_list.removeClass('active').eq(_active).addClass('active').animate({
					opacity:1
				}, {queue:false, duration: _this.options.duration, 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 (_last != _active) {
				if (!_this.options.direction) _list.animate({marginLeft: -(_w * _active)}, {queue:false, duration: _this.options.duration, easing:  _this.options.animateEffect})
				else _list.animate({marginTop: -(_h * _active)}, {queue:false, duration: _this.options.duration, easing: _this.options.animateEffect})
				if (_this.options.switcher) _switcher.removeClass('active').eq(_active).addClass('active');
				_last = _active;
			}
		}
		function toPrepare(){
		    if (!_this.options.run) return;
			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();
			runTimer();
		}
		function runTimer(delay){
		    last_rotation = (new Date()).getTime();
		    if (typeof delay == "undefined") delay = _this.options.autoRotation;
  		    clearTimeout(_t);
		    if (delay) {
    			_t = setTimeout(toPrepare, delay);
			} else {
			    toPrepare();
			}
		}
		_next.click(function(){
			if (_this.options.disableBtn &&(_count > _wrapHolderW)) _prev.removeClass(_this.options.disableBtn);
			toPrepare();
			runTimer(_this.options.clickDelay);
			return false;
		});
		_prev.click(function(){
			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();
			runTimer(_this.options.clickDelay);
			return false;
		});
		if (_this.options.switcher) _switcher.click(function(){
			_active = _switcher.index($(this));
			if (!_this.options.effect) scrollEl();
			else fadeElement();
			runTimer(_this.options.clickDelay);
			return false;
		});
		runTimer();

		_this.stop = function(){
			_this.options.run = false;
		}
		_this.play = function() {
		    var delay = Math.max(0,this.options.autoRotation - (new Date()).getTime() + last_rotation)
			_this.options.run = true;
		    runTimer(delay);
		}
	});
}

var gal1 = null;


$(function(){
	gal1 = new gallery({
		hold: 'div.gallery',
		duration: 1300,
		autoRotation: 5000,
		clickDelay: 7000,
		effect: 'fade',
		circle: true,
		listOfSlides: 'div.wrap > ul > li',
		switcher: 'ul.switcher > li',
		disableBtn: true
	});
});


