/*
* Copyright 2010 Fredrik Forsmo (@Frozzare)
* jSlider is under GPL Version 2 licenses.
* http://www.gnu.org/licenses/gpl-2.0.html
* Contribution by: David Rodrigues (@DavidProw)
*/

(function ($) {
    $.fn.jSlider = function (g) {
        var i = $(this);
        var j = $.extend({
            title: true,
            startWithZero: false,
            usingEasing: false,
            easingEffect: '',
            easingDuration: 'slow',
            timeChange: true,
            time: 5000,
            nextPrevPosition: 1,
            PrevText: 'Previous',
            NextText: 'Next',
            HideText: 'Hide',
            ShowText: 'Show',
            StartText: 'Start',
            StopText: 'Stop',
            StopStartClass: 'stop-auto',
            height: 0,
            hide: '',
            slideType: 'default'
        }, g || {});
        var k = 0;
        var b = 0;
        var l = 0;
        var h = 0;
        var m = 0;
        var o = 0;
        var p = 0;
        var t = 0;
        var a = $('#jSlider').attr('rel');

        var slideTime = 'slow';
        
        function goToSlider(n) {
            l = i.find('.slide').length;
            
            if (n == l)
            {
              slideTime = 0;
            }
            else
            {
              slideTime = 'slow';
            }
            
            if (m == l || m == l + 1 || m == NaN) m = 0;
            if (j.title) {
                if (n == l || n == NaN) h = 0;
                else if (n == -1) h = l - 1;
                else h = n;
                setTitle($($('.slide img')[h]).attr('alt'))
            }
            if ($('.slide-title').hasClass('title-hide')) {
                $('.slide-title').hide()
            }
            if (n < 0) n = l - 1;
            else if (n > l - 1){
              n = 0;
            }
            
            
            e = n - k;
            e = e * a;
            
            if (j.slideType === 'default') {
                slideThis(true, false, false, false, e, 0, slideTime)
            } else if (j.slideType === 'slideDown') {
                j.title = false;
                slideDown(n, l)
            } else if (j.slideType === 'slideHalf') {
                j.title = false;
                slideHalf(e, l)
            } else if (j.slideType === 'slideHalfTwo') {
                j.title = false;
                slideHalfTwo(e, l)
            }

            $(".slidernumbers a").removeClass("active");
            $($(".slidernumbers a[rel^=" + n + "]")).addClass("active");
            k = n
            
            // need patch to hidden skip to first slide
        }
        function slideHalf(e, l) {
            var r = l * j.height;
            var b = l / 2;
            var c = b - 1;
            var d = c * a;
            m++;
            if (m == b) slideThis(true, true, true, false, d, j.height);
            else if (m >= l) slideThis(true, true, true, true, d, j.height);
            else slideThis(true, false, false, false, e, 0)
        }
        function slideHalfTwo(e, l) {
            var r = l * j.height;
            var b = l / 2;
            var c = b - 1;
            var d = c * j.height;
            if (m >= 2) m = 0;
            m++;
            o++;
            if (m == 2 && o != l) slideThis(true, true, true, false, a, j.height);
            else if (o == l) o = 0,
            slideThis(true, true, true, true, a, d);
            else slideThis(true, false, false, false, e, 0)
        }
        function slideDown(n, l) {
            var a = l - 1;
            var r = a * j.height;
            m++;
            if (n < 0) n = l - 1;
            else if (n > l - 1) n = 0;
            e = n - k;
            e = e * j.height;
            slideThis(true, true, false, false, 0, e)
        }
        function slideThis(a, b, c, d, e, f, slideTime) {
            if (a && !b) {
                if (j.usingEasing) {
                    if (c) {
                        i.animate({
                            marginLeft: "+=" + e
                        }, {
                            easing: j.easingEffect,
                            duration: j.easingDuration
                        }, slideTime, 'swing')
                    } else {
                        i.animate({
                            marginLeft: "-=" + e
                        }, {
                            easing: j.easingEffect,
                            duration: j.easingDuration
                        }, slideTime, 'swing')
                    }
                } else {
                    if (c) {
                        i.animate({
                            marginLeft: "+=" + e
                        }, slideTime, 'swing')
                    } else {
                        i.animate({
                            marginLeft: "-=" + e
                        }, slideTime, 'swing')
                    }
                }
            } else if (a && b) {
                if (j.usingEasing) {
                    if (c) {
                        if (d) {
                            i.animate({
                                marginLeft: "+=" + e,
                                marginTop: "+=" + f
                            }, {
                                easing: j.easingEffect,
                                duration: j.easingDuration
                            }, slideTime, 'swing')
                        } else {
                            i.animate({
                                marginLeft: "+=" + e,
                                marginTop: "-=" + f
                            }, {
                                easing: j.easingEffect,
                                duration: j.easingDuration
                            }, slideTime, 'swing')
                        }
                    } else {
                        if (d) {
                            i.animate({
                                marginLeft: "-=" + e,
                                marginTop: "+=" + f
                            }, {
                                easing: j.easingEffect,
                                duration: j.easingDuration
                            }, slideTime, 'swing')
                        } else {
                            i.animate({
                                marginLeft: "-=" + e,
                                marginTop: "-=" + f
                            }, {
                                easing: j.easingEffect,
                                duration: j.easingDuration
                            }, slideTime, 'swing')
                        }
                    }
                } else {
                    if (c) {
                        if (d) {
                            i.animate({
                                marginLeft: "+=" + e,
                                marginTop: "+=" + f
                            }, slideTime, 'swing')
                        } else {
                            i.animate({
                                marginLeft: "+=" + e,
                                marginTop: "-=" + f
                            }, slideTime, 'swing')
                        }
                    } else {
                        if (d) {
                            i.animate({
                                marginLeft: "-=" + e,
                                marginTop: "+=" + f
                            }, slideTime, 'swing')
                        } else {
                            i.animate({
                                marginLeft: "-=" + e,
                                marginTop: "-=" + f
                            }, slideTime, 'swing')
                        }
                    }
                }
            }
        }
        function setTitle(t) {
            if (j.slideType === 'default') {
                if (typeof(t) !== 'undefined' && t != null) {
                    $('.slide-title').show();
                    $('.slide-title span:first').remove();
                    $('.slide-title').prepend('<span id="spantitle">' + t + '</span>')
                } else {
                    $('.slide-title').hide();
                    $('.slide-show').hide()
                }
            } else {
                $('.slide-title').hide()
            }
        }
        function buttonsAndNumbers() {
            
            if (j.nextPrevPosition == 1) {
                if (j.hide != 'nextPrev' && j.hide != 'both') $('#jSlider').prepend('<p class="buttons"><a class="slideprev" href="#">' + j.PrevText + '</a><a class="slidenext" href="#">' + j.NextText + '</a></p>');
                if (j.hide != 'numbers' && j.hide != 'both') $('#jSlider').append('<p id="scroll" class="slidernumbers"></p>')
            } else if (j.nextPrevPosition == 2) {
                if (j.hide != 'numbers' && j.hide != 'both') $('#jSlider').prepend('<div id="scroll" class="slidernumbers"></div>');
                if (j.hide != 'nextPrev' && j.hide != 'both') $('#jSlider').append('<p class="buttons"><a class="slideprev" href="#">' + j.PrevText + '</a><a class="slidenext" href="#">' + j.NextText + '</a></p>')
            } else {
                alert("Error! You have to set nextPrevPosition value to 1 or 2 not " + j.nextPrevPosition + "!")
            }
        }
        function renderItem() {
            buttonsAndNumbers();
            $('#jSlider').find('.slider').append('<div class="slidetitle"><p class="slide-title"><span></span><span class="hide"><a href="#" class="slide-hide" rel="1">' + j.HideText + '</a></span></p><p class="slide-tools"><span class="hide"><a class="slide-show" href="#">' + j.ShowText + '</a></span></p></div>');
            // add -1 hide final slide 
            var l = i.find('.slide').length;
            $(".slidernumbers").append('<a href="javascript:void(0);" class="slideprev prev"></a>')
            for (var c = 0; c < l-1; c++) {
                var n = 0;
                if (j.startWithZero) n = c;
                else n = c + 1;
                if (c == 0) {
                    $(".slidernumbers").append('<a href="javascript:void(0);" class="once active" rel="' + c + '"></a>')
                } else {
                    $(".slidernumbers").append('<a href="javascript:void(0);" class="once" rel="' + c + '"></a>')
                }
            }
            $(".slidernumbers").append('<a href="javascript:void(0);" class="slidenext next"></a>')
        }
        function slider() {
            renderItem();
            if (j.title) setTitle($($('.slide img')[0]).attr('alt'));
            else $('.slide-title').hide();
            $('.slide-show').hide();
            $(".slidernumbers a.once").live("click", function () {
                var b = parseInt($(this).attr('rel'));
                if (j.title) setTitle($($('.slide img')[b]).attr('alt'));
                goToSlider(b);
                t = 1
            });
            $(".slidenext").click(function () {
                goToSlider(k + 1);
                t = 1
            });
            $(".slideprev").click(function () {
                goToSlider(k - 1);
                t = 1
            });
            $('.slide-hide').click(function () {
                $('.slide-title').addClass('title-hide').hide();
                $('.slide-show').show()
            });
            $('.slide-show').click(function () {
                $('.slide-show').hide();
                $('.slide-title').removeClass('title-hide').show()
            });
            $('.' + j.StopStartClass).click(function () {
                if (p > 1) {
                    $(this).text(j.StopText);
                    p = 0;
                    var a = j.time;
                    j.time = 0;
                    j.time = a;
                    t = 0
                } else {
                    p = 2;
                    $(this).text(j.StartText)
                }
            });
            if (j.timeChange) {
                setInterval(function () {
                    timeChanges()
                }, j.time)
            }
        }
        function timeChanges() {
            if (t > 0) {
                var a = j.time;
                j.time = 0;
                j.time = a;
                t = 0
            } else if (p != 2) {
                goToSlider(k + 1)
            }
        }
        return slider()
    }
})(jQuery);
