/************************************************************
 * Choco-Slider v2.0
 * http://chocoslider.alandawi.com.ar
 *
 * Desarrollado por Alan G. Dawidowicz
 * Web Site: www.alandawi.com.ar
 *
 * Copyright 2010
 * Licencia: MIT - http://es.wikipedia.org/wiki/Licencia_MIT
************************************************************/

(function($) {

	$.fn.chocoslider = function(options) {


		var settings = $.extend({}, $.fn.chocoslider.defaults, options);

		return this.each(function() {

			var vars = {
				currentSlide: 0,
				currentImage: '',
				totalSlides: 0,
				randAnim: '',
				running: false,
				paused: false,
				stop:false
			};
		

			var slider = $(this);
			slider.data('choco:vars', vars);
			slider.css('position','relative');
			slider.addClass('chocoslider');
			

			var kids = slider.children();
			kids.each(function() {
				var child = $(this);
				var link = '';
				if(!child.is('img')){
					if(child.is('a')){
						child.addClass('choco-imageLink');
						link = child;
					}
					child = child.find('img:first');
				}

                var childWidth = child.width();
                if(childWidth == 0) childWidth = child.attr('width');
                var childHeight = child.height();
                if(childHeight == 0) childHeight = child.attr('height');

                if(childWidth > slider.width()){
                    slider.width(childWidth);
                }
                if(childHeight > slider.height()){
                    slider.height(childHeight);
                }
                if(link != ''){
                    link.css('display','none');
                }
                child.css('display','none');
                vars.totalSlides++;
			});
			

			if($(kids[vars.currentSlide]).is('img')){
				vars.currentImage = $(kids[vars.currentSlide]);
			} else {
				vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
			}
			

			if($(kids[vars.currentSlide]).is('a')){
				$(kids[vars.currentSlide]).css('display','block');
			}
			

			slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat');
			

			for(var i = 0; i < settings.numberStrips; i++){
				var sliceWidth = Math.round(slider.width()/settings.numberStrips);
				if(i == settings.numberStrips-1){
					slider.append(
						$('<div class="choco-slice"></div>').css({ left:(sliceWidth*i)+'px', width:(slider.width()-(sliceWidth*i))+'px' })
					);
				} else {
					slider.append(
						$('<div class="choco-slice"></div>').css({ left:(sliceWidth*i)+'px', width:sliceWidth+'px' })
					);
				}
			}
			

			slider.append(
				$('<div class="choco-title"><p></p></div>').css({ display:'none', opacity:settings.transparencytitle })
			);			

			if(vars.currentImage.attr('title') != ''){
                var title = vars.currentImage.attr('title');
                if(title.substr(0,1) == '#') title = $(title).html();
                $('.choco-title p', slider).html(title);					
				$('.choco-title', slider).fadeIn(settings.speedStrip);
			}
			

			var timer = 0;
			if(!settings.auto && kids.length > 1){
				timer = setInterval(function(){ chocoRun(slider, kids, settings, false); }, settings.sliderDelay);
			}

			

			if(settings.controlNavigation){
				var chocoControl = $('<div class="choco-controlNavigation"></div>');
				slider.append(chocoControl);
				for(var i = 0; i < kids.length; i++){
						chocoControl.append('<a class="choco-control" rel="'+ i +'">'+ (i + 1) +'</a>');	
				}
				

				$('.choco-controlNavigation a:eq('+ vars.currentSlide +')', slider).addClass('active');
				
				$('.choco-controlNavigation a', slider).live('click', function(){
					if(vars.running) return false;
					if($(this).hasClass('active')) return false;
					clearInterval(timer);
					timer = '';
					slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat');
					vars.currentSlide = $(this).attr('rel') - 1;
					chocoRun(slider, kids, settings, 'control');
				});
			}
			

			if(settings.autoPause){
				slider.hover(function(){
					vars.paused = true;
					clearInterval(timer);
					timer = '';
				}, function(){
					vars.paused = false;

					if(timer == '' && !settings.auto){
						timer = setInterval(function(){ chocoRun(slider, kids, settings, false); }, settings.sliderDelay);
					}
				});
			}
			

			slider.bind('choco:animFinished', function(){ 
				vars.running = false; 

				$(kids).each(function(){
					if($(this).is('a')){
						$(this).css('display','none');
					}
				});

				if($(kids[vars.currentSlide]).is('a')){
					$(kids[vars.currentSlide]).css('display','block');
				}

				if(timer == '' && !vars.paused && !settings.auto){
					timer = setInterval(function(){ chocoRun(slider, kids, settings, false); }, settings.sliderDelay);
				}

				settings.aChange.call(this);
			});
		});
		
		function chocoRun(slider, kids, settings, nudge){

			var vars = slider.data('choco:vars');
			if((!vars || vars.stop) && !nudge) return false;
			

			settings.bChange.call(this);
					

			if(!nudge){
				slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat');
			} else {
				if(nudge == 'prev'){
					slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat');
				}
				if(nudge == 'next'){
					slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat');
				}
			}
			vars.currentSlide++;
			if(vars.currentSlide == vars.totalSlides){ 
				vars.currentSlide = 0;

				settings.chocoEnd.call(this);
			}
			if(vars.currentSlide < 0) vars.currentSlide = (vars.totalSlides - 1);

			if($(kids[vars.currentSlide]).is('img')){
				vars.currentImage = $(kids[vars.currentSlide]);
			} else {
				vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
			}
			

			if(settings.controlNavigation){
				$('.choco-controlNavigation a', slider).removeClass('active');
				$('.choco-controlNavigation a:eq('+ vars.currentSlide +')', slider).addClass('active');
			}
			

			if(vars.currentImage.attr('title') != ''){
                var title = vars.currentImage.attr('title');
                if(title.substr(0,1) == '#') title = $(title).html();	
                    
				if($('.choco-title', slider).css('display') == 'block'){
					$('.choco-title p', slider).fadeOut(settings.speedStrip, function(){
						$(this).html(title);
						$(this).fadeIn(settings.speedStrip);
					});
				} else {
					$('.choco-title p', slider).html(title);
				}					
				$('.choco-title', slider).fadeIn(settings.speedStrip);
			} else {
				$('.choco-title', slider).fadeOut(settings.speedStrip);
			}
			

			var  i = 0;
			$('.choco-slice', slider).each(function(){
				var sliceWidth = Math.round(slider.width()/settings.numberStrips);
				$(this).css({ height:'0px', opacity:'0', 
					background: 'url('+ vars.currentImage.attr('src') +') no-repeat -'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px 0%' });
				i++;
			});
			
			if(settings.effect == 'random'){
				var anims = new Array("effect1","effect2");
				vars.randAnim = anims[Math.floor(Math.random()*(anims.length + 1))];
				if(vars.randAnim == undefined) vars.randAnim = 'effect2';
			}
            

            if(settings.effect.indexOf(',') != -1){
                var anims = settings.effect.split(',');
                vars.randAnim = $.trim(anims[Math.floor(Math.random()*anims.length)]);
            }
		

			vars.running = true;
			if(settings.effect == 'effect1' || vars.randAnim == 'effect1'){
				var timeBuff = 0;
				var i = 0;
				$('.choco-slice', slider).each(function(){
					var slice = $(this);
					var origWidth = slice.width();
					slice.css({ top:'0px', height:'100%', width:'0px' });
					if(i == settings.numberStrips-1){
						setTimeout(function(){
							slice.animate({ width:origWidth, opacity:'1.0' }, settings.speedStrip, '', function(){ slider.trigger('choco:animFinished'); });
						}, (100 + timeBuff));
					} else {
						setTimeout(function(){
							slice.animate({ width:origWidth, opacity:'1.0' }, settings.speedStrip);
						}, (100 + timeBuff));
					}
					timeBuff += 50;
					i++;
				});
			}  
			else if(settings.effect == 'effect2' || vars.randAnim == 'effect2'){
				var i = 0;
				$('.choco-slice', slider).each(function(){
					$(this).css('height','100%');
					if(i == settings.numberStrips-1){
						$(this).animate({ opacity:'1.0' }, (settings.speedStrip*2), '', function(){ slider.trigger('choco:animFinished'); });
					} else {
						$(this).animate({ opacity:'1.0' }, (settings.speedStrip*2));
					}
					i++;
				});
			}
		}
	};
	

	$.fn.chocoslider.defaults = {
		auto:true,
		autoPause:true,		
		speedStrip:500,
		effect:'random',
		numberStrips:15,
		sliderDelay:3000,		
		transparencytitle:0.8,		
		bChange: function(){},
		aChange: function(){},
		chocoEnd: function(){},
		controlNavigation:true
	};
	
	$.fn._reverse = [].reverse;
	
})(jQuery);
