/*
* Chunker - (c) Bartek Bazyluk <bartosz@bazyluk.net>, 2009.
*/

(function($) {
	
	$.fn.extend({
		
		chunker: function(options) {
			
			var defaults = {
				chunkSize: 4,
				sliceSize: 2,
				delayOffset: 200,
				animationSpeed: 350,
				ease: 'easeOutQuint',
				previousLabel: 'Wstecz',
				nextLabel: 'Dalej',
				previousImg: '/_images/icons/arrow-orange-left.png',
				nextImg: '/_images/icons/arrow-orange.png',
				autoDelay: 5
			};
			
			options = $.extend(defaults, options);
			
			return this.each(function() {
				
				this.m_oOptions = options;
				this.m_iActiveChunk = 0;
				this.m_iChunks = 0;
				this.m_bAnimation = false;
				this.m_iTimer = 0;
				
				this.Show = function() {
					$(this).find('.chunk:not(:eq(' + this.m_iActiveChunk + '))').css('display', 'none');
					$(this).find('.chunk:eq(' + this.m_iActiveChunk + ')').css('display', 'block');
					var iDelay = 0;
					for (var i = 0; i < this.m_oOptions.chunkSize; i++) {
						if (!jLi.eq(this.m_iActiveChunk * this.m_oOptions.chunkSize + i).length) {
							break;
						}
						if (i % 2 == 0) {
							var jLiLeft = jLi.eq(this.m_iActiveChunk * this.m_oOptions.chunkSize + i);
							jLiLeft.css({
								display: 'block',
								left: '-100%'
							});
							jLiLeft.delay(iDelay).animate({
								left: 0
							}, this.m_oOptions.animationSpeed, this.m_oOptions.ease);
						}
						else {
							var jLiRight = jLi.eq(this.m_iActiveChunk * this.m_oOptions.chunkSize + i);
							jLiRight.css({
								display: 'block',
								right: '-100%'
							});
							jLiRight.delay(iDelay).animate({
								right: 0
							}, this.m_oOptions.animationSpeed, this.m_oOptions.ease);
						}
						iDelay += this.m_oOptions.delayOffset;
					}
					$(this).delay(iDelay, function() {
						this.m_bAnimation = false;
					});
				};
				
				this.Hide = function() {
					$(this).find('li:visible').fadeOut(100);
					$(this).delay(100, this.Show);
				};
				
				this.Next = function() {
					this.ChangeChunk(this.m_iActiveChunk + 1);
				};
				
				this.Previous = function() {
					this.ChangeChunk(this.m_iActiveChunk - 1);
				};
				
				this.ChangeChunk = function(iNewChunk) {
					iNewChunk = Math.min(this.m_iChunks - 1, Math.max(0, iNewChunk));
					if ((this.m_iActiveChunk == iNewChunk) || (this.m_bAnimation)) {
						return;
					}
					this.m_bAnimation = true;
					this.m_iActiveChunk = iNewChunk;
					this.Hide();
					this.UpdateButtons();
				};
				
				this.UpdateButtons = function() {
					if (this.m_iActiveChunk <= 0) {
						$(this).find('.previous a').css({
							opacity: .3,
							cursor: 'default'
						});
					}
					else {
						$(this).find('.previous a').css({
							opacity: 1,
							cursor: 'pointer'
						});
					}
					if (this.m_iActiveChunk >= this.m_iChunks - 1) {
						$(this).find('.next a').css({
							opacity: .3,
							cursor: 'default'
						});
					}
					else {
						$(this).find('.next a').css({
							opacity: 1,
							cursor: 'pointer'
						});
					}
				};
				
				this.InitRotation = function() {
					this.StopRotation();
					var cChunker = this;
					this.m_iTimer = setInterval(function() {
						cChunker.AutoRotate();
					}, this.m_oOptions.autoDelay * 1000);
				};
				
				this.StopRotation = function() {
					this.m_iTimer && clearInterval(this.m_iTimer);
				};
				
				this.AutoRotate = function() {
					if (this.m_iActiveChunk >= this.m_iChunks - 1) {
						this.ChangeChunk(0);
					}
					else {
						this.Next();
					}
				};
				
				$(this).addClass('chunker');
				
				var jLi = $(this).find('li');
				$(this).find('ul').remove();
				for (var j = 0; j < jLi.length; j += this.m_oOptions.chunkSize) {
					var jChunk = $('<div/>').addClass('chunk').css({
						position: 'relative',
						overflow: 'hidden'
					});
					if (this.m_oOptions.sliceSize >= 2) {
						for (var i = j; i < j + this.m_oOptions.chunkSize; i += 2) {
							var jUl = $('<ul/>').append(jLi.slice(i, i + 2));
							if (jUl.find('li').length) {
								jChunk.append(jUl);
							}
						}
					}
					else {
						var jUl = $('<ul/>').append(jLi.slice(j, j + this.m_oOptions.chunkSize));
						if (jUl.find('li').length) {
							jChunk.append(jUl);
						}
					}
					$(this).append(jChunk);
					jChunk.css({
						width: jChunk.width()
					});
					this.m_iChunks++;
				}
				
				$(this).append('<p class="next"><a href="#next"><img src="' + this.m_oOptions.nextImg + '" alt="' + this.m_oOptions.nextLabel + '"/></a></p>');
				$(this).append('<p class="previous"><a href="#previous"><img src="' + this.m_oOptions.previousImg + '" alt="' + this.m_oOptions.previousLabel + '"/></a></p>');
				
				$(this).find('.next').click(function() {
					$(this).closest('.chunker').get(0).Next();
					return false;
				});
				
				$(this).find('.previous').click(function() {
					$(this).closest('.chunker').get(0).Previous();
					return false;
				});
				
				$(this).hover(this.StopRotation, this.InitRotation);
				
				this.UpdateButtons();
				this.Show();
				this.InitRotation();
				
			});
			
		}
		
	});
	
})(jQuery);