$(document).ready(function(){
	$('div.gallery').galleryCircle({
		btPrev: 'a.link-prev',
		btNext: 'a.link-next',
		holderList: 'div.gallery-holder',
		scrollElParent: 'ul',
		scrollEl: 'li',
		step: true,
		numHolder: false,
		numCreate: false,
		easing: false,
		switchTime: false,
		duration : 700
	});
	$('div.gallery-brands').slideGallery({
		overflower : 'div.gallery-holder',
		gallery : 'ul',
		prev : 'a.link-prev',
		next : 'a.link-next',
		step : 1,
		slide_duration:700
		
	});
});

/* circular gallery diff width */
jQuery.fn.slideGallery = function(options){
	// default options	
	var options = jQuery.extend({
		overflower : '> div',
		gallery : '.gallery',
		slides : 'li',
		prev : '.prev',
		next : '.next',
		paging:'.paging',
		slide_duration: 1000,
		step : false
	}, options);
	
	return this.each(function(){
		var holder = $(this);
		var	gallery = $(options.gallery, holder);
		var	_prev =  $(options.prev, holder);
		var	_next =  $(options.next, holder);
		var	slide_duration = options.slide_duration;
		var overflower = $(options.overflower, holder);
		var _widthArray = [];
		_widthArray[0] = 0;
		var _overflower_w = overflower.width();
		var	slides =  $(options.slides, gallery);
		var animation = false;
		var current = 0;
		var _paging = $(options.paging ,holder);
		
		// generate new slides
		gallery.append(slides.clone()).prepend(slides.clone());
		
		var	newslides =  $(options.slides, gallery);
		
		// array of widths
		newslides.each(function(i){
			var _widthSum = 0;
			for (var j = 0; j <= i; j++) {
				_widthSum += newslides.eq(j).outerWidth(true);
			}
			_widthArray[i+1] = _widthSum;
		});
		
		//array of indset
		var _indSet = [];
		var z = 1;
		var newcurrent = slides.length; 
		var sum = 0;
		_indSet[0] = slides.length;
		while (z < newslides.length) {
			for (var i = newcurrent; i <= newslides.length-1; i++) {
				if (_widthArray[i] <= _widthArray[newcurrent]+_overflower_w) {
					var tmp = i;
				}
			}
			newcurrent = tmp;
			_indSet[z] = tmp;
			z++;
			if (tmp >= slides.length*2) {
				var _pagingElems = z;
				break;
			}
		}
		
		//generate paging
		_paging.empty();
		for (var i = 0; i < _pagingElems-1; i++) {
			var _num = i+1;
			_paging.append('<li><a href="#">'+_num+'</a></li>');
		}		
		_paging = $('li', _paging);		
		_paging.eq(0).addClass('active');
		
		//set start margin on center slide
		gallery.css({marginLeft:-_widthArray[slides.length]});
		var current = slides.length;
		
		
		//next/prev elems
		function nextElem(){
			if (options.step) {
				if ((current + options.step) >= slides.length*2) {
					gallery.css({marginLeft:-_widthArray[current-slides.length]});
					current -= slides.length;
				}
				current += options.step;
				return current;
			} else {
				for (var i = current; i <= newslides.length-1; i++) {
					if (_widthArray[i] <= _widthArray[current]+_overflower_w) {
						var tmp = i;
					}
				}
				if (_widthArray[tmp] > _widthArray[newslides.length-1]-_overflower_w) {
					gallery.css({marginLeft: (_widthArray[slides.length]-_widthArray[current])});
					current =  tmp - slides.length;
					return tmp - slides.length;
				}
				current = tmp;
				return tmp;
			}
		}
		
		function prevElem(){
			if (options.step) {
				if ((current - options.step) <= 0) {
					gallery.css({marginLeft:-_widthArray[current+slides.length]});
					current += slides.length;
				}
				current -= options.step;
				return current;
			} else {
				for (var i = current; i >= 0; i--) {
					if (_widthArray[i] >= _widthArray[current]-_overflower_w) {
						var tmp = i;
					}
				}
				if (_widthArray[tmp] == 0) {
					current += slides.length
					gallery.css({marginLeft: -_widthArray[current]});
					for (var i = current; i >= 0; i--) {
						if (_widthArray[i] >= _widthArray[current]-_overflower_w) {
							var tmp = i;
						}
					}
					current = tmp;
					return tmp;
				}
				current = tmp;
				return tmp;
			}
		}
		
		
		//events
		_next.click(function(){
			if (!animation) move(nextElem());
			return false;
		});
		
		_prev.click(function(){
			if (!animation) move(prevElem());
			return false;
		});
		
		//paging 
		_paging.each(function(){
			$(this).click(function(){
				if ((!animation) && (_indSet[$(this).index()] !== current)) {
					var _indFromArray = _indSet[$(this).index()];
					var _widthFromArray = _widthArray[_indSet[$(this).index()]];
					var _widthFromArrayNext = _widthArray[_indSet[$(this).index()]+slides.length];
					var _widthFromArrayPrev = _widthArray[_indSet[$(this).index()]-slides.length];
					
					if (_indSet[$(this).index()] < current) {
						if (_widthFromArrayNext - _widthArray[current] < _widthArray[current] - _widthFromArray) {
							
							gallery.css({marginLeft: -_widthArray[current-slides.length]});
							current = _indFromArray;
							move(current);
							return false;
						}
					} else {
						if ((_widthArray[current] - _widthFromArrayPrev) < (_widthFromArray -_widthArray[current] )) {
							gallery.css({marginLeft: -_widthArray[current+slides.length]});
							current = _indFromArray;
							move(current);
							return false;
						}
					}
					current = _indFromArray;
					move(current);
				}
				return false;
			});
		});
		
		// main animation
		function move(_ind) {
			animation = true;
			gallery.stop().animate({
				marginLeft: -_widthArray[_ind]
			},slide_duration,function(){
				animation = false;
			});
			_paging.removeClass('active');
			var i = 0;
			while (i <= _indSet.length-2) {
				if ((_ind == _indSet[i]) || ((_ind + slides.length) == _indSet[i]) || ((_ind - slides.length) == _indSet[i])) {
					var tmp = i;
				}
				i++;
			}
			_paging.eq(tmp).addClass('active');
		}
	});
}

/*--- gallery function ---*/
jQuery.fn.galleryCircle = function(_options){
	// defaults options
	var _options = jQuery.extend({
		btPrev: 'a.prev',
		btNext: 'a.next',
		holderList: 'div',
		scrollElParent: 'ul',
		scrollEl: 'li',
		numHolder: false,
		numCreate: false,
		step: false,
		innerMargin: 0,
		curPage: false,
		onClick: null,
		easing: 'linear',
		switchTime: false,
		duration : 1500
	},_options);

	return this.each(function(){
		var _this = jQuery(this);
		var _next = jQuery(_options.btNext, _this).length ? jQuery(_options.btNext, _this) : false;
		var _prev = jQuery(_options.btPrev, _this).length ? jQuery(_options.btPrev, _this) : false;
		var _holderList = jQuery(_options.holderList, _this);
		var _scrollElParent = jQuery(_options.scrollElParent, _holderList);
		var _scrollEl = jQuery(_options.scrollEl, _scrollElParent);
		var _numHolder = false ;
		if (_options.numHolder) _numHolder = jQuery(_options.numHolder, _this).length ? jQuery(_options.numHolder, _this) : false;
		var _step, _t = null;
		var _widthSum = 0;
		_scrollEl.each(function(){_widthSum += jQuery(this).outerWidth(true);})
		var _startPosition = _scrollEl.index(_scrollEl.filter('.active'));
		if (_startPosition==-1) _startPosition=0;
		_scrollEl.removeClass('active');
		var _easing = _options.easing;

		if (!_options.step) _step = _holderList.innerWidth();
		var _margin = _widthSum;
		_scrollElParent.append(_scrollEl.clone(true));
		_scrollElParent.prepend(_scrollEl.clone(true));

		var _offsetStartPosition =0;
		_offsetStartPosition = culcOffset(_startPosition);

		_scrollElParent.css('marginLeft', (-_margin+_options.innerMargin-_offsetStartPosition));

		//auto rotation
		if (_options.switchTime) {
			_t = setTimeout(function(){
				nextSlides();
			},_options.switchTime);
		}
		
		//button next "click"
		if (_options.btNext) {
			_next.click(function(){
				if (!_scrollElParent.is(':animated')) {
					if (jQuery.isFunction(_options.onClick)) _options.onClick.apply(_this);
					nextSlides();
				}
				return false;
			});
		}

		//button prev "click"
		if (_options.btPrev) {
			_prev.click(function(){
				if (!_scrollElParent.is(':animated')) {
					if (jQuery.isFunction(_options.onClick)) _options.onClick.apply(_this);
					prevSlides();
				}
				return false;
			});
		}

		//curent position
		function getCurElIndex(){
			var _curMargin = parseInt(_scrollElParent.css('marginLeft')) + _widthSum - _options.innerMargin;
			for(i=0; i < _scrollEl.length; i++){
				if (_curMargin == 0) return i;
				if (_curMargin <= _options.innerMargin) _curMargin += _scrollEl.eq(i).innerWidth(true);
				else _curMargin -= _scrollEl.eq(i).innerWidth(true);
				if (_curMargin == _options.innerMargin) return i+1;
			}
		}

		// offset of gallery if when activ element not first at start 
		function culcOffset(_ind){
			var _tmpcounter=0;
			var _pos=0;
			while (_tmpcounter < _ind){
				_pos += _scrollEl.eq(_tmpcounter).outerWidth(true);
				_tmpcounter++;
			};
			return _pos;
		}

		//go next slide
		function nextSlides(){
			if (_t) clearTimeout(_t);
			if (_options.step) {
				_curElIndex = getCurElIndex();
				_step = _scrollEl.eq(_curElIndex).innerWidth(true);
			};
			_margin = -parseInt(_scrollElParent.css('marginLeft'));
			_margin += _step;
			
			_scrollElParent.animate({'marginLeft':(-_margin+_options.innerMargin)}, {duration:_options.duration, easing: _easing, complete:function(){
				if (_margin >= _widthSum*2) {
					_margin = _widthSum + (_margin - _widthSum*2);
				}
				_scrollElParent.css({'marginLeft':-_margin+_options.innerMargin});
				jQuery.fn.galleryCircle.numListActive(_numHolder, _scrollEl);

				//autoslide
				if (_options.switchTime) {
					_t = setTimeout(function(){
						nextSlides();
					},_options.switchTime)
				}
			}});
		}

		//go prev slide
		function prevSlides(){
			if (_t) clearTimeout(_t);
			if (_options.step) {
				_curElIndex = getCurElIndex();
				if (_curElIndex == 0) _curElIndex= _scrollEl.length;
				_step = _scrollEl.eq(_curElIndex-1).innerWidth(true);
			};
			_margin = -parseInt(_scrollElParent.css('marginLeft'));
			_margin -= _step;
			_scrollElParent.animate({'marginLeft':(-_margin+_options.innerMargin)}, {duration:_options.duration, easing: _easing, complete:function(){
				if (_margin < _widthSum) {
					_margin = _widthSum*2 - (_widthSum - _margin);
				}
				_scrollElParent.css({'marginLeft':-_margin+_options.innerMargin});
				jQuery.fn.galleryCircle.numListActive(_numHolder, _scrollEl);

				//autoslide
				if (_options.switchTime) {
					_t = setTimeout(function(){
						nextSlides();
					},_options.switchTime)
				}
			}});
		}

		// Number list Create
		jQuery.fn.galleryCircle.numListCreate = function(_numHolder, _scrollEl){
			var _numListElC = '';
			for(var i=0; i<_scrollEl.length; i++){
				_numListElC += '<li><a href="">'+(i+1)+'</a></li>';
			}
			jQuery(_numHolder).html('<ul>'+_numListElC+'</ul>');
		};

		// Number list Activate
		jQuery.fn.galleryCircle.numListActive = function(_numHolder, _scrollEl){
			_curElIndex = getCurElIndex();
			if (jQuery(_options.curPage, _this).length && _options.curPage) jQuery(_options.curPage, _this).text('Pagina '+(getCurElIndex()+1)+'/'+_scrollEl.length);
			if (_numHolder) {
				jQuery('a',_numHolder).removeClass('active');
				jQuery('a',_numHolder).eq(_curElIndex).addClass('active');
			}
		};

		//click on control elemens
		function numClick() {
			jQuery(_options.numHolder, _this).find('a').click(function(){
				if (_t) clearTimeout(_t);
				var _aList = jQuery(_options.numHolder, _this).find('a');
				var _index = _aList.index(jQuery(this));
				_margin = _widthSum + _index * _scrollEl.outerWidth(true);
				_scrollElParent.animate({'marginLeft':(-_margin+_options.innerMargin)}, {duration:_options.duration, easing: _easing, complete:function(){
					if (_margin >= _widthSum*2) {
						_margin = _widthSum + (_margin - _widthSum*2);
					}
					_scrollElParent.css({'marginLeft':-_margin+_options.innerMargin});
					_aList.removeClass('active').eq(_index).addClass('active');

					//autoslide
					if (_options.switchTime) {
						_t = setTimeout(function(){
							nextSlides();
						},_options.switchTime)
					}
				}});
				return false;
			});
		};

		// init creating num list
		if (_options.numCreate) jQuery.fn.galleryCircle.numListCreate(_numHolder, _scrollEl);

		// pagination first init (example Page 2/6)
		if (jQuery(_options.curPage, _this).length && _options.curPage) jQuery(_options.curPage, _this).text('Pagina '+(getCurElIndex()+1)+'/'+_scrollEl.length);

		// init activate num list item and init numClick()
		if (_options.numHolder) {
			jQuery.fn.galleryCircle.numListActive(_numHolder, _scrollEl);
			numClick();
		}
	});
}
