/************************************************************
 * 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);
