jQuery.noConflict();
function gallery(_obj) {
	// defaults options
	var _this = this;
	_this.options = {
		hold: 'div.gallery-slide',
		duration: 700,
		slideElement: 1,
		autoRotation: false,
		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
	};
	for(key in _obj) _this.options[key] = _obj[key];
	
	// Variables
	jQuery(_this.options.hold).each(function(){
		var _hold = jQuery(this);
		if (jQuery.browser.msie) {
			var _speed = 0;
		}
		else{
			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 (_timer) 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;
		
		// 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: _speed});
				_list.removeClass('active').eq(_active).addClass('active').animate({
					opacity:1
				}, {queue:false, duration: _speed, complete: function(){
					jQuery(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: _speed})
				else _list.animate({marginTop: -(_h * _active)}, {queue:false, duration: _speed})
				if (_this.options.switcher) _switcher.removeClass('active').eq(_active).addClass('active');
				_last = _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();
		}
		function runTimer(){
			_t = setInterval(function(){
				toPrepare();
			}, _timer);
		}
		_next.click(function(){
			if(_t) clearTimeout(_t);
			if (_this.options.disableBtn &&(_count > _wrapHolderW)) _prev.removeClass(_this.options.disableBtn);
			toPrepare();
			if (_timer) runTimer();
			return false;
		});
		_prev.click(function(){
			if(_t) clearTimeout(_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 (_timer) runTimer();
			return false;
		});
		if (_this.options.switcher) _switcher.click(function(){
			_active = _switcher.index(jQuery(this));
			if(_t) clearTimeout(_t);
			if (!_this.options.effect) scrollEl();
			else fadeElement();
			if (_timer) runTimer();
			return false;
		});
		if (_timer) runTimer();
		
		_this.stop = function(){
			if (_t) clearTimeout(_t);
		}
		_this.play = function(){
			if (_t) clearTimeout(_t);
			if (_timer) runTimer();
		}
	});
}

jQuery(document).ready(function(){
	var gal1 = new gallery({
		hold: 'div.gallery-holder',
		autoRotation: 5000,
		duration: 800,
		circle: true,
		listOfSlides: 'div.text-wrapp > div.slide',
		switcher: 'div.features-box-holder li > span',
		effect: 'fade'
	});
	jQuery("div.text-wrapp > div").mouseover(function(){
		gal1.stop();
	}).mouseleave(function(){
		gal1.play();
	});
	jQuery("ul.features-box li > span").click(function(){
		gal1.stop();
	});
});
