HEX
Server: LiteSpeed
System: Linux server.zepintelhosting.com 4.18.0 #1 SMP Mon Sep 30 15:36:27 MSK 2024 x86_64
User: enamadmin (1026)
PHP: 8.2.30
Disabled: exec,system,passthru,shell_exec,proc_open,popen,apache_child_terminate
Upload Files
File: /home/enamadmin/public_html/aaelearningb/theme/academi/amd/build/jquery.sudoSlider.min.js.map
{"version":3,"file":"jquery.sudoSlider.min.js","sources":["../src/jquery.sudoSlider.js"],"sourcesContent":["/**@preserve\n * Sudo Slider version 3.4.10 - jQuery plugin\n * Written by Erik Krogh Kristensen erik@webbies.dk.\n * http://webbies.dk/SudoSlider/\n *\n * Dual licensed under the MIT and GPL licenses.\n *\n * Based on EasySlider http://cssglobe.com/easy-slider-17-numeric-navigation-jquery-slider/\n * But bear little resemblance at this point.\n *\n * Built for jQuery library\n * http://jquery.com\n *\n */\n(function(factory) {\n    // window/root object.\n    var root = (typeof self == 'object' && self.self == self && self) ||\n        (typeof global == 'object' && global.global == global && global);\n\n    // AMD.\n    if (typeof define === 'function' && define.amd) {\n        define(['jquery'], function($) {\n            factory($, root);\n        });\n\n        // CommonJS.\n    } else if (typeof exports !== 'undefined') {\n        var $ = require('jquery');\n        factory($, root);\n\n        // Finally, as a browser global.\n    } else {\n        factory(root.jQuery, root);\n    }\n\n})(function ($, win) {\n    // Saves space in the minified version.\n    var undefined; // Makes sure that undefined really is undefined within this scope.\n    var FALSE = false;\n    var TRUE = true;\n\n    // Constants.\n    var PAGES_MARKER_STRING = \"pages\";\n    var NEXT_STRING = \"next\";\n    var PREV_STRING = \"prev\";\n    var LAST_STRING = \"last\";\n    var FIRST_STRING = \"first\";\n    var ABSOLUTE_STRING = \"absolute\";\n    var RELATIVE_STRING = \"relative\";\n    var HIDDEN_STRING = \"hidden\";\n    var SWING = \"swing\";\n    var EMPTY_FUNCTION = function () { };\n    var ANIMATION_CLONE_MARKER_CLASS = \"sudo-box\";\n    var DIV_TAG = \"<div>\";\n    var CSSVendorPrefix = getCSSVendorPrefix();\n    var jWin = $(win);\n    var doc = $(document);\n\n    var TOUCHSTART = \"touchstart\";\n    var TOUCHMOVE = \"touchmove\";\n    var TOUCHCANCEL = \"touchcancel\";\n    var TOUCHEND = \"touchend\";\n    var MOUSEDOWN = \"mousedown\";\n    var MOUSEMOVE = \"mousemove\";\n    var MOUSEUP = \"mouseup\";\n    var SLIDES_CONTAINER = \"slidesContainer\";\n    var SUDO_DRAGGING_CLASS = \"sudoSlider-dragging\";\n\n    $.fn.sudoSlider = function (optionsOrg) {\n        // Defining the base element.\n        var baseSlider = this;\n\n        optionsOrg = $.extend(objectToLowercase(getDefaultOptions()), objectToLowercase(optionsOrg));\n        if (CSSVendorPrefix === FALSE || !minJQueryVersion([1, 8, 0])) {\n            optionsOrg.usecss = FALSE;\n        }\n\n        return this.each(function () {\n            var init,\n                fullyInitialized = FALSE,\n                isSlideContainerUl,\n                slidesContainer,\n                slides,\n                imagesInSlidesLoaded,\n                totalSlides,\n                currentSlide,\n                previousSlide,\n                clickable,\n                currentlyAnimatingTowards,\n                numericControls,\n                numericContainer,\n                destroyed,\n                slideNumberBeforeDestroy = FALSE,\n                controls,\n                nextbutton,\n                prevbutton,\n                autoTimeout,\n                autoOn,\n                numberOfVisibleSlides,\n                asyncDelayedSlideLoadTimeout,\n                obj = $(this),\n                finishedAdjustingTo = FALSE, // This variable tells if the slider is currently adjusted (height and width) to any specific slide. This is usefull when ajax-loading stuff.\n                adjustingTo, // This one tells what slide we are adjusting to, to make sure that we do not adjust to something we shouldn't.\n                adjustTargetTime = 0, // This one holds the time that the autoadjust animation should complete.\n                currentlyAnimating = FALSE,\n                currentAnimation,\n                currentAnimationCallback,\n                currentAnimationObject,\n                runAfterAnimationCallbacks,\n                awaitingAjaxCallbacks,\n                startedAjaxLoads,\n                finishedAjaxLoads,\n                animateToAfterCompletion = FALSE,\n                animateToAfterCompletionClicked,\n                animateToAfterCompletionSpeed,\n                slideContainerCreated = FALSE,\n                option = [],\n                options = $.extend(TRUE, {}, optionsOrg),\n                currentSliderPositionTop,\n                currentSliderPositionLeft,\n                unBindCallbacks = [],\n                autoStartedWithPause = FALSE,\n                animationWasInterrupted = FALSE;\n\n            // The call to the init function is after the definition of all the functions.\n            function initSudoSlider() {\n                // Storing the public options in an array.\n                var optionIndex = 0;\n                for (var key in options) {\n                    option[optionIndex] = options[key];\n                    optionIndex++;\n                }\n\n                init = TRUE;\n                fullyInitialized = FALSE;\n\n                imagesInSlidesLoaded = [];\n                runAfterAnimationCallbacks = [];\n                awaitingAjaxCallbacks = [];\n                startedAjaxLoads = [];\n                finishedAjaxLoads = [];\n\n                // Fix for nested list items\n                slidesContainer = childrenNotAnimationClones(obj);\n\n                // Is the ul element there?\n                var ulLength = slidesContainer.length;\n                var newUl = $(DIV_TAG);\n                if (!ulLength) {\n                    obj.append(slidesContainer = newUl);\n                    isSlideContainerUl = FALSE;\n                } else if (!((isSlideContainerUl = slidesContainer.is(\"ul\")) || slidesContainer.hasClass(SLIDES_CONTAINER)) && !slideContainerCreated) {\n                    newUl.append(slidesContainer);\n                    obj.append(slidesContainer = newUl);\n                }\n                slideContainerCreated = TRUE;\n\n                var slidesJquery = childrenNotAnimationClones(slidesContainer);\n\n                slides = [];\n\n                totalSlides = slidesJquery.length;\n\n                slidesJquery.each(function autofunction(index, elem) {\n                    var that = $(elem);\n                    slides[index] = that;\n                    that.css({position: RELATIVE_STRING});\n                    if (that.css(\"display\") == \"none\") {\n                        that.css(\"display\", \"inline\");\n                    }\n                });\n\n                // Adding CSS classes.\n                slidesContainer.addClass(SLIDES_CONTAINER);\n\n                slidesJquery.addClass(\"slide\");\n\n                slidesJquery.each(function (index, elem) {\n                    $(elem).attr(\"data-slide\", index + 1);\n                });\n\n                // Now we are going to fix the document, if it's 'broken'. (No <li>).\n                // I assume that it's can only be broken, if ajax is enabled. If it's broken without Ajax being enabled, the script doesn't have anything to fill the holes.\n                if (option[30]/*ajax*/) {\n                    // Do we have enough list elements to fill out all the ajax documents.\n                    var numerOfAjaxUrls = option[30]/*ajax*/.length;\n                    if (numerOfAjaxUrls > totalSlides) {\n                        for (var a = 1; a <= numerOfAjaxUrls - totalSlides; a++) {\n                            var tag;\n                            if (isSlideContainerUl) {\n                                tag = \"li\";\n                            } else {\n                                tag = \"div\";\n                            }\n                            var slide = $(\"<\" + tag + \">\" + option[32]/*loadingtext*/ + \"</\" + tag + \">\");\n                            slidesContainer.append(slide);\n                            slides[totalSlides + (a - 1)] = slide;\n                        }\n                        slidesJquery = childrenNotAnimationClones(slidesContainer);\n                        totalSlides = numerOfAjaxUrls;\n                    }\n                }\n\n                slidesJquery.each(function (index, elem) {\n                    imagesInSlidesLoaded[index] = FALSE;\n                    runOnImagesLoaded($(elem), TRUE, function () {\n                        imagesInSlidesLoaded[index] = TRUE;\n                    });\n                });\n\n                if (slideNumberBeforeDestroy === FALSE) {\n                    currentSlide = 0;\n                } else {\n                    currentSlide = slideNumberBeforeDestroy;\n                }\n                currentSlide = currentSlide || 0;\n\n                previousSlide = currentSlide;\n\n                clickable = TRUE;\n                numericControls = [];\n                destroyed = FALSE;\n\n                // Set obj overflow to hidden (and position to relative <strike>, if fade is enabled. </strike>).\n                obj.css({overflow: HIDDEN_STRING});\n                if (obj.css(\"position\") == \"static\") obj.css({position: RELATIVE_STRING}); // Fixed a lot of IE6 + IE7 bugs.\n\n                // Float items to the left, and make sure that all elements are shown.\n                slidesJquery.css({\"float\": \"left\", listStyle: \"none\"});\n                // The last CSS to make it work.\n                slidesContainer.add(slidesJquery).css({display: \"block\", position: RELATIVE_STRING, margin: \"0\"});\n\n                adjustPositionToPosition(0, 0, TRUE);\n\n                option[7]/*slidecount*/ = parseInt10(option[7]/*slidecount*/);\n\n                // Lets just redefine slidecount\n                numberOfVisibleSlides = option[7]/*slidecount*/;\n\n                option[7]/*slidecount*/ += option[8]/*movecount*/ - 1;\n\n                // Startslide can only be a number (and not 0). Converting from 1 index to 0 index.\n                // Unless it is the string \"random\".\n                if (typeof option[9]/*startslide*/ == \"string\" && option[9]/*startslide*/.toLowerCase() == \"random\") {\n                    option[9]/*startslide*/ = (Math.random() * totalSlides) | 0;\n                }\n                option[9]/*startslide*/ = parseInt10(option[9]/*startslide*/) - 1 || 0;\n\n                option[0]/*effect*/ = getEffectMethod(option[0]/*effect*/);\n\n                // Cloning numericText, so the array same array can be modifed outside SudoSlider without doing weird things.\n                option[18]/*numerictext*/ = option[18]/*numerictext*/.slice(0);\n\n                for (var a = 0; a < totalSlides; a++) {\n                    if (!option[18]/*numerictext*/[a] && option[18]/*numerictext*/[a] != \"\") {\n                        option[18]/*numerictext*/[a] = (a + 1);\n                    }\n                    if (option[30]/*ajax*/) {\n                        option[30]/*ajax*/[a] = option[30]/*ajax*/[a] || FALSE;\n                    }\n                }\n\n                option[4]/*controlsfade*/ = option[4]/*controlsfade*/ && !option[15];/*continuous*/\n\n                if (option[10]/*responsive*/) {\n                    adjustResponsiveLayout(TRUE);\n                }\n\n                // Making sure that i have enough room in the <ul> (Through testing, i found out that the max supported size (height or width) in Firefox is 17895697px, Chrome supports up to 134217726px, and i didn't find any limits in IE (6/7/8/9)).\n                // 9000000px gives room for about 12500 slides of 700px each (and works in every browser i tested). Down to 9000000 from 10000000 because the later might not work perfectly in FireFox on OSX.\n                slidesContainer[option[6]/*vertical*/ ? \"height\" : \"width\"](9000000)[option[6]/*vertical*/ ? \"width\" : \"height\"](\"100%\");\n\n                // If responsive is turned on, autowidth doesn't work.\n                option[28]/*autowidth*/ = option[28]/*autowidth*/ && !option[10];/*responsive*/\n\n                if (option[10]/*responsive*/) {\n                    bindAndRegisterOff(jWin, \"resize focus\", adjustResponsiveLayout, \"\");\n                }\n\n                if (option[17]/*numeric*/ || option[16]/*prevnext*/) {\n                    controls = $(\"<span \" + option[35]/*controlsattr*/ + \"></span>\");\n                    obj[option[5]/*insertafter*/ ? \"after\" : \"before\"](controls);\n\n                    if (option[17]/*numeric*/) {\n                        numericContainer = $(\"<ol \" + option[36]/*numericattr*/ + \"></ol>\");\n                        controls.prepend(numericContainer);\n                        var usePages = option[17]/*numeric*/ == PAGES_MARKER_STRING;\n                        var distanceBetweenPages = usePages ? numberOfVisibleSlides : 1;\n                        for (var a = 0; a < totalSlides - ((option[15]/*continuous*/ || usePages) ? 1 : numberOfVisibleSlides) + 1; a += distanceBetweenPages) {\n                            numericControls[a] = $(\"<li data-target=\\\"\" + (a + 1) + \"\\\"><a href=\\\"#\\\"><span>\" + option[18]/*numerictext*/[a] + \"</span></a></li>\")\n                                .appendTo(numericContainer)\n                                .click(function () {\n                                    enqueueAnimation(getTargetAttribute(this) - 1, TRUE);\n                                    return FALSE;\n                                });\n                        }\n                    }\n                    if (option[16]/*prevnext*/) {\n                        nextbutton = makecontrol(option[34]/*nexthtml*/, NEXT_STRING);\n                        prevbutton = makecontrol(option[33]/*prevhtml*/, PREV_STRING);\n                    }\n                    if (option[4]/*controlsfade*/) {\n                        fadeControls(currentSlide, 0);\n                    }\n                }\n\n                // Lets make those fast/normal/fast into some numbers we can make calculations with.\n                var optionsToConvert = [4/*controlsfadespeed*/, 1/*speed*/, 14/*pause*/];\n                for (var i = 0; i < optionsToConvert.length; i++) {\n                    option[optionsToConvert[i]] = textSpeedToNumber(option[optionsToConvert[i]]);\n                }\n\n                if (option[2]/*customlink*/) {\n                    var filter = stringTrim(option[2]/*customlink*/);\n                    if (filter.charAt(0) == \">\") {\n                        bindAndRegisterOff(obj, \"click\", customLinkClickHandler, filter.substr(1, filter.length));\n                    } else {\n                        bindAndRegisterOff(doc, \"click\", customLinkClickHandler, filter);\n                    }\n                }\n\n                runOnImagesLoaded(getSlides(option[9]/*startslide*/, option[7]/*slidecount*/), TRUE, function () {\n                    if (slideNumberBeforeDestroy !== FALSE) {\n                        goToSlide(slideNumberBeforeDestroy, FALSE);\n                    } else if (option[26]/*history*/) {\n                        // I support the jquery.address plugin, Ben Alman's hashchange plugin and Ben Alman's jQuery.BBQ.\n                        var hashPlugin;\n                        if (hashPlugin = jWin.hashchange) {\n                            hashPlugin(URLChange);\n                        } else if (hashPlugin = $.address) {\n                            hashPlugin.change(URLChange);\n                        } else {\n                            // This assumes that jQuery BBQ is included. If not, stuff won't work in old browsers.\n                            bindAndRegisterOff(jWin, \"hashchange\", URLChange);\n                        }\n                        URLChange();\n\n                    } else {\n                        goToSlide(option[9]/*startslide*/, FALSE);\n                    }\n\n                    setCurrent(currentSlide);\n                });\n                if (option[30]/*ajax*/[option[9]/*startslide*/]) {\n                    ajaxLoad(option[9]/*startslide*/);\n                }\n                if (option[31]/*preloadajax*/ === TRUE) {\n                    for (var i = 0; i < totalSlides; i++) {\n                        if (option[30]/*ajax*/[i] && option[9]/*startslide*/ != i) {\n                            ajaxLoad(i);\n                        }\n                    }\n                } else {\n                    startAsyncDelayedLoad();\n                }\n            }\n\n            /*\n             * The functions do the magic.\n             */\n\n            function customLinkClickHandler() {\n                var target;\n                if (target = getTargetAttribute(this)) {\n                    if (target == 'stop') {\n                        option[12]/*auto*/ = FALSE;\n                        stopAuto();\n                    } else if (target == \"start\") {\n                        startAuto();\n                        option[12]/*auto*/ = TRUE;\n                    } else if (target == 'block') {\n                        clickable = FALSE;\n                    } else if (target == 'unblock') {\n                        clickable = TRUE;\n                    } else {\n                        enqueueAnimation((target == parseInt10(target)) ? target - 1 : target, TRUE);\n                    }\n                }\n                return FALSE;\n            }\n\n            // Adjusts the slider when a change in layout has happened.\n            var previousAdjustedResponsiveWidth = -1;\n\n            function adjustResponsiveLayout(forced) {\n                function doTheAdjustment() {\n                    if ((cantDoAdjustments() && !(forced === TRUE)) || totalSlides == 0) {\n                        return;\n                    }\n\n                    var subPixelNewWidth = getResponsiveWidth();\n                    var newWidth = parseInt10(subPixelNewWidth);\n                    var addAPixelEvery = 1 / (subPixelNewWidth - newWidth);\n\n                    if (previousAdjustedResponsiveWidth !== subPixelNewWidth || (forced === TRUE)) {\n                        previousAdjustedResponsiveWidth = subPixelNewWidth;\n\n                        var slideCounter = 1;\n                        for (var i = 0; i < totalSlides; i++) {\n                            slideCounter++;\n                            if (slideCounter >= addAPixelEvery) {\n                                slideCounter = 0;\n                                slides[i].width(newWidth + 1);\n                            } else {\n                                slides[i].width(newWidth);\n                            }\n                        }\n                        if (autoStartedWithPause !== FALSE) {\n                            startAuto(autoStartedWithPause);\n                        }\n\n                        stopAnimation();\n                        ensureSliderContainerCSSDurationReset();\n                        adjustPositionTo(currentSlide);\n                        autoadjust(currentSlide, 0);\n                    }\n                }\n\n                doTheAdjustment();\n                callAsync(doTheAdjustment); // Fixing invisible scrollbar.\n                schedule(doTheAdjustment, 20);\n            }\n\n            // Returns the width of a single <li> if the page layout is responsive.\n            function getResponsiveWidth() {\n                var width = obj.width();\n                if (option[6]/*vertical*/) {\n                    return width;\n                } else {\n                    return width / numberOfVisibleSlides;\n                }\n            }\n\n            // For backwards compability, the rel attribute is used as a fallback.\n            function getTargetAttribute(that) {\n                that = $(that);\n                return that.attr(\"data-target\") || that.attr(\"rel\");\n            }\n\n            // Triggered when the URL changes.\n            function URLChange() {\n                var target = getUrlHashTarget();\n                if (init) {\n                    goToSlide(target, FALSE);\n                } else {\n                    enqueueAnimation(target, FALSE);\n                }\n            }\n\n            function startAsyncDelayedLoad() {\n                if (option[31]/*preloadajax*/ !== FALSE) {\n                    var preloadAjaxTime = parseInt10(option[31]/*preloadajax*/);\n                    if (option[30]/*ajax*/) {\n                        for (var i = 0; i < option[30]/*ajax*/.length; i++) {\n                            if (option[30]/*ajax*/[i]) {\n                                clearTimeout(asyncDelayedSlideLoadTimeout);\n                                asyncDelayedSlideLoadTimeout = schedule(function () {\n                                    if (option[30]/*ajax*/[i]) {\n                                        ajaxLoad(i);\n                                    } else {\n                                        startAsyncDelayedLoad();\n                                    }\n                                }, preloadAjaxTime);\n\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n\n            function startAuto(pause) {\n                if (pause === undefined) {\n                    var dataPause = slides[currentSlide].attr(\"data-pause\");\n                    if (dataPause !== undefined) {\n                        pause = parseInt10(dataPause);\n                    } else {\n                        pause = option[13]/*pause*/;\n                    }\n                }\n                if (animationWasInterrupted) {\n                    pause = mathMax(pause, 100);\n                }\n                stopAuto();\n                autoOn = TRUE;\n                autoStartedWithPause = pause;\n                autoTimeout = schedule(function () {\n                    if (autoOn && !currentlyAnimating) {\n                        enqueueAnimation(NEXT_STRING, FALSE);\n                        autoStartedWithPause = FALSE;\n                    }\n                }, pause);\n            }\n\n            function stopAuto(autoPossibleStillOn) {\n                if (autoTimeout) {\n                    clearTimeout(autoTimeout);\n                }\n                if (!autoPossibleStillOn) autoOn = FALSE;\n            }\n\n            function textSpeedToNumber(speed) {\n                if (parseInt10(speed) || speed == 0) {\n                    return parseInt10(speed);\n                }\n                if (speed == \"fast\") {\n                    return 200;\n                }\n                if (speed == \"normal\" || speed == \"medium\") {\n                    return 400;\n                }\n                if (speed == \"slow\") {\n                    return 600;\n                }\n                return 600;\n            }\n\n            function makecontrol(html, action) {\n                return $(html).prependTo(controls).click(function () {\n                    enqueueAnimation(action, TRUE);\n                    return FALSE;\n                });\n            }\n\n            function enqueueAnimation(direction, clicked, speed) {\n                if (clickable && !init) {\n                    // Stopping, because if its needed then its restarted after the end of the animation.\n                    stopAuto(TRUE);\n\n                    if (!destroyed) {\n                        loadSlidesAndAnimate(direction, clicked, speed);\n                    }\n                } else {\n                    if (option[37]/*interruptible*/ && currentlyAnimating) {\n                        if (getRealPos(filterDir(direction)) !== currentlyAnimatingTowards) {\n                            stopAnimation();\n                            enqueueAnimation(direction, clicked, speed);\n                        }\n                    } else {\n                        animateToAfterCompletion = direction;\n                        animateToAfterCompletionClicked = clicked;\n                        animateToAfterCompletionSpeed = speed;\n\n                        // I can just as well start the ajax loads\n                        if (option[30]/*ajax*/) {\n                            var targetSlide = filterDir(direction);\n                            for (var loadSlide = targetSlide; loadSlide < targetSlide + numberOfVisibleSlides; loadSlide++) {\n                                if (option[30]/*ajax*/[loadSlide]) {\n                                    ajaxLoad(getRealPos(loadSlide));\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n            // It may not sound like it, but the variable fadeOpacity is only for TRUE/FALSE.\n            function fadeControl(fadeOpacity, fadetime, nextcontrol) {\n                fadeOpacity = fadeOpacity ? 1 : 0;\n                var fadeElement = $();\n\n                if (option[16]/*prevnext*/) {\n                    fadeElement = nextcontrol ? nextbutton : prevbutton;\n                }\n\n                if (option[2]/*customlink*/) {\n                    var customLink = $(option[2]/*customlink*/);\n                    var filterString = \"=\\\"\" + (nextcontrol ? NEXT_STRING : PREV_STRING) + \"\\\"]\";\n                    var filtered = customLink.filter(\"[rel\" + filterString + \", [data-target\" + filterString + \"\");\n                    fadeElement = fadeElement.add(filtered);\n                }\n\n                var adjustObject = {opacity: fadeOpacity};\n\n                function callback() {\n                    if (!fadeOpacity && fadeElement.css(\"opacity\") == 0) {\n                        fadeElement.css({visibility: HIDDEN_STRING});\n                    }\n                }\n\n                if (fadeOpacity) {\n                    fadeElement.css({visibility: \"visible\"});\n                }\n\n                if (option[38]/*useCSS*/) {\n                    animate(fadeElement, adjustObject, fadetime, option[46]/*CSSease*/, callback);\n                } else {\n                    fadeElement.animate(\n                        adjustObject,\n                        {\n                            queue: FALSE,\n                            duration: fadetime,\n                            easing: option[11]/*ease*/,\n                            callback: callback\n                        }\n                    );\n                }\n            }\n\n            // Fade the controls, if we are at the end of the slide.\n            // It's all the different kind of controls.\n            function fadeControls(slide, fadetime) {\n                fadeControl(slide, fadetime, FALSE); // abusing that the number 0 == FALSE.\n                // The new way of doing it.\n                fadeControl(slide < totalSlides - numberOfVisibleSlides, fadetime, TRUE);\n            }\n\n            // Updating the 'current' class.\n            function setCurrent(i) {\n                i = getRealPos(i) + 1;\n\n                // Fixing that the last numeric control isn't marked when we are at the last possible position.\n                if (option[17]/*numeric*/ == PAGES_MARKER_STRING && i == totalSlides - numberOfVisibleSlides + 1 && !option[15]/*continuous*/) {\n                    i = totalSlides;\n                }\n\n                if (option[17]/*numeric*/) {\n                    for (var control = 0; control < numericControls.length; ++control) {\n                        var element = numericControls[control];\n                        setCurrentElement(element, i)\n                    }\n                }\n                if (option[2]/*customlink*/) setCurrentElement($(option[2]/*customlink*/), i);\n            }\n\n            function setCurrentElement(element, i) {\n                if (element && element.filter) {\n                    element\n                        .filter(\".current\")\n                        .removeClass(\"current\");\n\n                    element\n                        .filter(function () {\n                            var elementTarget = getTargetAttribute(this);\n                            if (option[17]/*numeric*/ == PAGES_MARKER_STRING) {\n                                for (var a = numberOfVisibleSlides - 1; a >= 0; a--) {\n                                    if (elementTarget == i - a) {\n                                        return TRUE;\n                                    }\n                                }\n                            } else {\n                                return elementTarget == i;\n                            }\n                            return FALSE;\n                        })\n                        .addClass(\"current\");\n                }\n            }\n\n            function getUrlHashTarget() {\n                var hashString = location.hash.substr(1)\n                for (var i = 0; i < option[18]/*numerictext*/.length; i++) {\n                    if (option[18]/*numerictext*/[i] == hashString) {\n                        return i;\n                    }\n                }\n                if (hashString && !init) {\n                    return currentSlide;\n                } else {\n                    return option[9]/*startslide*/;\n                }\n            }\n\n            function autoadjust(i, speed) {\n                i = getRealPos(i); // I assume that the continuous clones, and the original element is the same height. So i always adjust according to the original element.\n\n                adjustingTo = i;\n                adjustTargetTime = getTimeInMillis() + speed;\n\n                if (speed == 0) {\n                    finishedAdjustingTo = i;\n                } else {\n                    finishedAdjustingTo = FALSE;\n                }\n\n                if (option[27]/*autoheight*/ || option[28]/*autowidth*/) {\n                    autoHeightWidth(i);\n                }\n            }\n\n            function autoHeightWidth(i) {\n                obj.ready(function () {\n                    adjustHeightWidth(i);\n                    runOnImagesLoaded(slides[i], FALSE, makeCallback(adjustHeightWidth, [i]));\n                });\n            }\n\n            // Axis: TRUE == height, FALSE == width.\n            function getSliderDimensions(fromSlide, vertical) {\n                var pixels = 0;\n                for (var slide = fromSlide; slide < fromSlide + numberOfVisibleSlides; slide++) {\n                    var targetSlide = slides[getRealPos(slide)];\n                    if (targetSlide) {\n                        var targetPixels = targetSlide['outer' + (vertical ? \"Height\" : \"Width\")](TRUE);\n                        if (vertical == option[6]/*vertical*/) {\n                            pixels += targetPixels;\n                        } else {\n                            pixels = mathMax(targetPixels, pixels);\n                        }\n                    }\n                }\n                return pixels;\n            }\n\n            var prevHeightWidthAdjustObject  = {};\n\n            function adjustHeightWidth(i) {\n                if (i != adjustingTo || cantDoAdjustments()) {\n                    return;\n                }\n\n                var speed = adjustTargetTime - getTimeInMillis();\n                speed = mathMax(speed, 0);\n                var adjustObject = {};\n                if (option[27]/*autoheight*/) {\n                    adjustObject.height = getSliderDimensions(i, TRUE) || 1; // Making it completely invisible gives trouble.\n                }\n                if (option[28]/*autowidth*/) {\n                    adjustObject.width = getSliderDimensions(i, FALSE) || 1;\n                }\n\n                if (simpleObjectEquals(prevHeightWidthAdjustObject, adjustObject)) {\n                    return;\n                } else {\n                    prevHeightWidthAdjustObject = adjustObject;\n                }\n\n                if (option[38]/*useCSS*/) {\n                    animate(obj, adjustObject, speed, option[46]/*CSSease*/)\n                } else {\n                    if (speed == 0) {\n                        // Doing CSS if speed == 0, 1: its faster. 2: it fixes bugs.\n                        obj.stop().css(adjustObject);\n                    } else {\n                        obj.animate(\n                            adjustObject,\n                            {\n                                queue: FALSE,\n                                duration: speed,\n                                easing: option[11]/*ease*/\n                            }\n                        );\n                    }\n                }\n            }\n\n            function adjustPositionTo(slide) {\n                var left = getSlidePosition(slide, FALSE);\n                var top = getSlidePosition(slide, TRUE);\n\n                adjustPositionToPosition(left, top);\n            }\n\n            function adjustPositionToPosition(left, top, both) {\n                currentSliderPositionLeft = left;\n                currentSliderPositionTop = top;\n\n                if (option[38]/*useCSS*/ || both) {\n                    slidesContainer.css({transform: \"translate(\" + left + \"px, \" + top + \"px)\"});\n                }\n                if (!option[38]/*useCSS*/ || both) {\n                    function setMargins(left, top) {\n                        slidesContainer.css({\n                            marginLeft: left,\n                            marginTop: top\n                        });\n                    }\n\n                    setMargins(0, 0);\n                    setMargins(left, top);\n                }\n            }\n\n            function getSlidePosition(slide, vertical) {\n                if (vertical == undefined) {\n                    vertical = option[6]/*vertical*/;\n                }\n                var targetSlide = slides[getRealPos(slide)];\n                return (targetSlide && targetSlide.length) ? -targetSlide.position()[vertical ? \"top\" : \"left\"] : 0;\n            }\n\n            function callQueuedAnimation() {\n                if (animateToAfterCompletion !== FALSE) {\n                    var animateTo = animateToAfterCompletion;\n                    animateToAfterCompletion = FALSE;\n                    callAsync(makeCallback(enqueueAnimation, [animateTo, animateToAfterCompletionClicked, animateToAfterCompletionSpeed]));\n                }\n            }\n\n            function adjust(clicked) {\n                ensureSliderContainerCSSDurationReset();\n\n                autoadjust(currentSlide, 0);\n                currentSlide = getRealPos(currentSlide); // Going to the real slide, away from the clone.\n                if (!option[29]/*updateBefore*/) setCurrent(currentSlide);\n                adjustPositionTo(currentSlide);\n                clickable = TRUE;\n                currentlyAnimatingTowards = FALSE;\n\n                if (option[12]/*auto*/) {\n                    // Stopping auto if clicked. And also continuing after X seconds of inactivity.\n                    if (clicked) {\n                        stopAuto();\n                        if (option[14]/*resumepause*/) startAuto(option[14]/*resumepause*/);\n                    } else if (!init) {\n                        startAuto();\n                    }\n                }\n\n                callQueuedAnimation();\n            }\n\n            // This function is called when i need a callback on the current element and it's continuous clones (if they are there).\n            // after:  TRUE == afteranimation : FALSE == beforeanimation;\n            function aniCall(i, after, synchronous, speed) {\n                i = getRealPos(i);\n                // Wierd fix to let IE accept the existance of the sudoSlider object.\n                var func = makeCallback(after ? afterAniCall : beforeAniCall, [slides[i], i + 1, speed]);\n                if (synchronous) {\n                    func();\n                } else {\n                    callAsync(func);\n                }\n            }\n\n            function afterAniCall(el, a) {\n                option[25]/*afteranimation*/.call(el, a, baseSlider);\n            }\n\n            function beforeAniCall(el, a, speed) {\n                option[24]/*beforeanimation*/.call(el, a, baseSlider, speed);\n            }\n\n            // Convert the direction into a usefull number.\n            function filterDir(dir) {\n                if (dir == NEXT_STRING) {\n                    return limitDir(currentSlide + option[8]/*movecount*/, dir);\n                } else if (dir == PREV_STRING) {\n                    return limitDir(currentSlide - option[8]/*movecount*/, dir);\n                } else if (dir == FIRST_STRING) {\n                    return 0;\n                } else if (dir == LAST_STRING) {\n                    return totalSlides - 1;\n                } else {\n                    return limitDir(parseInt10(dir), dir);\n                }\n            }\n\n            // If continuous is off, we sometimes do not want to move to far.\n            // This method was added in 2.1.8, se the changelog as to why.\n            function limitDir(i, dir) {\n                if (option[15]/*continuous*/) {\n                    if (dir == NEXT_STRING || dir == PREV_STRING) {\n                        return i;\n                    } else {\n                        return getRealPos(i);\n                    }\n                } else {\n                    var maxSlide = totalSlides - numberOfVisibleSlides;\n                    if (i > maxSlide) {\n                        if (currentSlide == maxSlide && dir == NEXT_STRING) {\n                            return 0;\n                        } else {\n                            return maxSlide;\n                        }\n                    } else if (i < 0) {\n                        if (currentSlide == 0 && dir == PREV_STRING) {\n                            return maxSlide;\n                        } else {\n                            return 0;\n                        }\n                    } else {\n                        return i;\n                    }\n                }\n            }\n\n            // Load a ajax document (or image) into a slide.\n            // If testing this locally (loading everything from a harddisk instead of the internet), it may not work.\n            // But then try to upload it to a server, and see it shine.\n            function ajaxLoad(slide, ajaxCallBack) {\n                if (ajaxCallBack) {\n                    var callbackList = awaitingAjaxCallbacks[slide];\n                    if (!callbackList) {\n                        callbackList = awaitingAjaxCallbacks[slide] = [];\n                    }\n                    callbackList.push(ajaxCallBack);\n                }\n\n                if (finishedAjaxLoads[slide]) {\n                    if (ajaxCallBack) {\n                        runOnImagesLoaded(slides[slide], TRUE, makeCallback(callAsync, [ajaxCallBack]));\n                    }\n                    return;\n                }\n\n                if (startedAjaxLoads[slide]) {\n                    return;\n                }\n                startedAjaxLoads[slide] = TRUE;\n\n                var target = option[30]/*ajax*/[slide];\n                if (!target) {\n                    callAsync(ajaxCallBack);\n                    return;\n                }\n\n                if (asyncDelayedSlideLoadTimeout) clearTimeout(asyncDelayedSlideLoadTimeout);// I dont want it to run to often.\n\n                var targetslide = slides[slide];\n\n                // Loads the url as an image, either if it is an image, or if everything else failed.\n                function loadImage() {\n                    var image = new Image();\n                    image.src = target;\n                    var thatImage = $(image);\n                    runOnImagesLoaded(thatImage, TRUE, function () {\n                        targetslide.empty().append(image);\n\n                        ajaxAdjust(slide, TRUE);\n                    });\n                }\n\n                // It is loaded, we dont need to do that again.\n                option[30]/*ajax*/[slide] = FALSE;\n                // It is the only option that i need to change for good.\n                options.ajax[slide] = FALSE;\n\n                if (option[47]/*AjaxHasHTML*/) {\n                    var succesRan = FALSE;\n                    $.ajax({\n                        url: target,\n                        success: function (data, textStatus, jqXHR) {\n                            succesRan = TRUE;\n                            runWhenNotAnimating(function () {\n                                var type = jqXHR.getResponseHeader('Content-Type');\n                                if (type && type.substr(0, 1) != \"i\") {\n                                    targetslide.html(data);\n                                    ajaxAdjust(slide, FALSE);\n                                } else {\n                                    loadImage();\n                                }\n                            });\n                        },\n                        complete: function () {\n                            // Some browsers wont load images this way, so i treat an error as an image.\n                            // There is no stable way of determining if it's a real error or if i tried to load an image in a old browser, so i do it this way.\n                            if (!succesRan) {\n                                loadImage();\n                            }\n                        }\n                    });\n                } else {\n                    loadImage();\n                }\n            }\n\n            // Performs the callback immediately if no animation is running.\n            // Otherwise waits for the animation to complete in a FIFO queue.\n            function runWhenNotAnimating(completeFunction) {\n                if (currentlyAnimating) {\n                    runAfterAnimationCallbacks.push(completeFunction);\n                } else {\n                    callAsync(completeFunction);\n                }\n            }\n\n            function ajaxAdjust(i, img) {\n                var target = slides[i];\n\n                if (!currentlyAnimating) {\n                    adjustPositionTo(currentSlide);\n                    autoadjust(currentSlide, 0);\n                }\n\n                runOnImagesLoaded(target, TRUE, makeCallback(runWhenNotAnimating, [\n                    function () {\n                        adjustPositionTo(currentSlide);\n                        autoadjust(currentSlide, 0);\n\n                        finishedAjaxLoads[i] = TRUE;\n\n                        performCallbacks(awaitingAjaxCallbacks[i]);\n\n                        startAsyncDelayedLoad();\n\n                        callAsync(function () {\n                            option[23]/*ajaxload*/.call(slides[i], i + 1, img, baseSlider);\n                        });\n\n                        if (init) {\n                            init = FALSE;\n                            callAsync(performInitCallback);\n                        }\n                    }\n                ]));\n            }\n\n            function performInitCallback() {\n                fullyInitialized = TRUE;\n                if (option[15]/*continuous*/) {\n                    centerTargetSlideAfter(currentSlide);\n                }\n\n                autoadjust(currentSlide, 0);\n                adjustPositionTo(currentSlide);\n                callQueuedAnimation();\n                if (option[10]/*responsive*/) {\n                    adjustResponsiveLayout();\n                }\n                if (option[12]/*auto*/) {\n                    startAuto();\n                }\n                option[22]/*initCallback*/.call(baseSlider);\n\n                if (option[41]/*touch*/) {\n                    setUpTouch();\n                }\n\n                // Fixing once and for all that the wrong slide is shown on init.\n                runOnImagesLoaded(getSlides(currentSlide, totalSlides), FALSE, makeCallback(runWhenNotAnimating, [\n                    function () {\n                        autoadjust(currentSlide, 0);\n                        adjustPositionTo(currentSlide);\n                    }\n                ]));\n            }\n\n            function setUpTouch() {\n                var body = $(\"body\");\n                var easingToUse;\n                var runningTouchEffect = FALSE;\n\n                var prevEffect = option[0]/*effect*/;\n\n                option[0]/*effect*/ = function (obj) {\n                    if (runningTouchEffect) {\n                        runningTouchEffect = FALSE;\n                        var options = obj.options;\n                        options.ease = easingToUse;\n                        options.cssease = easingToUse;\n                        return slide(obj);\n                    } else {\n                        return prevEffect(obj);\n                    }\n                };\n                var initialOffsetLeft;\n                var initialOffsetTop;\n\n                var startTime;\n                var lastTime;\n                var lastDistance;\n\n                var bufferSize = 3;\n                var positionsBuffer = [];\n                var timeBuffer = [];\n                var bufferIndex = 0;\n\n                var currentTouchSlide;\n                var baseDistance;\n\n                function touchStart(x, y) {\n                    body.addClass(SUDO_DRAGGING_CLASS);\n                    currentTouchSlide = currentSlide;\n                    baseDistance = 0;\n\n                    currentlyAnimating = TRUE;\n                    ensureSliderContainerCSSDurationReset();\n                    initialOffsetTop = currentSliderPositionTop;\n                    initialOffsetLeft = currentSliderPositionLeft;\n\n                    var distance;\n                    if (option[6]/*vertical*/) {\n                        distance = mathAbs(y);\n                    } else {\n                        distance = mathAbs(x);\n                    }\n\n                    lastDistance = distance;\n                    startTime = getTimeInMillis();\n                    lastTime = startTime;\n\n                    var currentSlidePosition = getSlidePosition(currentTouchSlide);\n                    distanceToRightSlide = getSlidePosition(currentTouchSlide + 1) - currentSlidePosition;\n\n                    correctionWhenCalculatingWhereToMoveTouchDistance = FALSE;\n                }\n\n                var distanceToRightSlide;\n                var correctionWhenCalculatingWhereToMoveTouchDistance;\n\n                function touchMove(x, y) {\n                    var distance;\n                    if (option[6]/*vertical*/) {\n                        distance = y;\n                    } else {\n                        distance = x;\n                    }\n                    var distanceAbs = mathAbs(distance);\n                    positionsBuffer[bufferIndex] = distanceAbs - lastDistance;\n                    var newTime = getTimeInMillis();\n                    timeBuffer[bufferIndex] = newTime - lastTime;\n                    bufferIndex = (bufferIndex + 1) % bufferSize;\n\n                    lastTime = newTime;\n                    lastDistance = distanceAbs;\n\n                    if (option[15]/*continuous*/ && totalSlides >= numberOfVisibleSlides + 1) {\n                        // Moving everything to the right.\n                        var direction = 0;\n                        if ((distance - baseDistance) < distanceToRightSlide) {\n                            correctionWhenCalculatingWhereToMoveTouchDistance = FALSE;\n\n                            baseDistance += distanceToRightSlide;\n                            direction = 1;\n\n                            var rightSlidePositionBefore = getSlidePosition(currentTouchSlide + direction);\n\n                            centerTargetSlideAfter(currentTouchSlide + direction);\n                            var rightSlidePositionAfter = getSlidePosition(currentTouchSlide + direction);\n\n                        }\n\n                        // Moving everything to the left.\n                        if ((distance - baseDistance) > 0) {\n                            direction = -1;\n\n                            var rightSlidePositionBefore = getSlidePosition(currentTouchSlide);\n\n                            centerTargetSlideAfter(currentTouchSlide + direction);\n                            rightSlidePositionAfter = getSlidePosition(currentTouchSlide);\n\n                            var moveBaseDistance = getSlidePosition(currentTouchSlide - 1) - rightSlidePositionAfter;\n                            baseDistance += moveBaseDistance;\n\n                            correctionWhenCalculatingWhereToMoveTouchDistance = -moveBaseDistance;\n                        }\n\n                        if (direction != 0) {\n                            currentTouchSlide += direction;\n\n                            if (option[6]/*vertical*/) {\n                                initialOffsetTop -= rightSlidePositionBefore - rightSlidePositionAfter;\n                            } else {\n                                initialOffsetLeft -= rightSlidePositionBefore - rightSlidePositionAfter;\n                            }\n\n                            distanceToRightSlide = getSlidePosition(currentTouchSlide + 1) - getSlidePosition(currentTouchSlide);\n                        }\n                    }\n\n                    if (option[6]/*vertical*/) {\n                        x = 0;\n                    } else {\n                        y = 0;\n                    }\n                    adjustPositionToPosition(initialOffsetLeft + x, initialOffsetTop + y);\n                }\n\n                function touchEnd(x, y) {\n                    body.removeClass(SUDO_DRAGGING_CLASS);\n                    var distance;\n                    if (option[6]/*vertical*/) {\n                        distance = y;\n                    } else {\n                        distance = x;\n                    }\n                    distance -= baseDistance;\n\n                    if (correctionWhenCalculatingWhereToMoveTouchDistance) {\n                        distance -= correctionWhenCalculatingWhereToMoveTouchDistance;\n                        currentTouchSlide++;\n                    }\n\n                    var distanceAbs = mathAbs(distance);\n                    var currentTime = getTimeInMillis();\n                    var time = 0;\n                    var bufferDistance = 0;\n                    for (var i = 0; i < bufferSize; i++) {\n                        var thisTime = timeBuffer[i];\n                        if (thisTime + 100 < currentTime) {\n                            time += thisTime;\n                            bufferDistance += positionsBuffer[i];\n                        }\n                    }\n                    var slideDimensions;\n                    if (option[6]/*vertical*/) {\n                        slideDimensions = obj.height();\n                    } else {\n                        slideDimensions = obj.width();\n                    }\n                    // This is in pixels pr. ms.\n                    var speed = mathAbs(bufferDistance) / time;\n\n                    var goToAnotherSlide = speed >= 0.2 || distanceAbs >= slideDimensions / 2;\n\n                    if ((bufferDistance > 0 && distanceAbs < 0) || (bufferDistance < 0 && distanceAbs > 0) || distanceAbs <= 10) {\n                        goToAnotherSlide = FALSE;\n                    }\n\n                    var direction = distance < 0 ? NEXT_STRING : PREV_STRING;\n\n                    if (!option[15]/*continuous*/) {\n                        if (currentSlide + 1 == totalSlides) {\n                            if (direction == NEXT_STRING) {\n                                goToAnotherSlide = FALSE;\n                            }\n                        } else if (currentSlide == 0) {\n                            if (direction == PREV_STRING) {\n                                goToAnotherSlide = FALSE;\n                            }\n                        }\n                    }\n\n                    direction = direction == NEXT_STRING ? currentTouchSlide + 1 : currentTouchSlide - 1;\n                    direction = mod(direction, totalSlides);\n\n                    var distanceLeft;\n                    if (goToAnotherSlide) {\n                        distanceLeft = slideDimensions - distanceAbs;\n                    } else {\n                        distanceLeft = distanceAbs;\n                    }\n\n                    var timeFromSpeed = (distanceLeft / speed) * 1.3;\n                    var timeFromDistance = mathMax((option[1]/*speed*/) * (slideDimensions / distanceLeft), (option[1]/*speed*/) / 4);\n\n                    var timeLeft;\n                    if (timeFromSpeed < timeFromDistance) {\n                        timeLeft = mathMin(timeFromSpeed, (option[1]/*speed*/));\n                    } else {\n                        timeLeft = mathMin(timeFromDistance, (option[1]/*speed*/));\n                    }\n\n                    var cubicBezierY = (speed * timeLeft) / (distanceLeft + speed * timeLeft);\n                    var cubicBezierX = 1 - cubicBezierY;//distanceLeft/(distanceLeft + speed*timeLeft);\n\n                    if (option[38]/*useCSS*/) {\n                        easingToUse = \"cubic-bezier(\" + cubicBezierX + \",\" + cubicBezierY + \",0.3,1)\";\n                    } else {\n                        easingToUse = makeBezier([cubicBezierX || 0, cubicBezierY || 0, 0.3, 1]);\n                    }\n\n                    clickable = FALSE;\n                    runningTouchEffect = TRUE;\n                    if (goToAnotherSlide) {\n                        performAnimation(direction, timeLeft, TRUE, TRUE, TRUE);\n                    } else {\n                        performAnimation(currentTouchSlide, timeLeft, TRUE, TRUE, TRUE);\n                    }\n                }\n\n                {\n                    var startedTouch = FALSE;\n                    var startX = 0;\n                    var startY = 0;\n                    var prevX = 0;\n                    var prevY = 0;\n\n                    var dragFunction = function (event) {\n                        if (!clickable) {\n                            return;\n                        }\n                        var type = event.type;\n                        var startEvent;\n                        var endEvent1;\n                        var endEvent2;\n                        var isMouseEvent = type.substr(0, 1) == \"m\";\n                        if (isMouseEvent) {\n                            startEvent = MOUSEDOWN;\n                            endEvent1 = MOUSEUP;\n                            endEvent2 = \"\";\n                        } else {\n                            startEvent = TOUCHSTART;\n                            endEvent1 = TOUCHEND;\n                            endEvent2 = TOUCHCANCEL;\n                            event = event.originalEvent;\n                        }\n\n                        if (!startedTouch) {\n                            if (type != startEvent) {\n                                return;\n                            }\n\n                            var eventTarget = event.target;\n                            var target = $(eventTarget);\n                            if (!option[42]/*touchHandle*/) {\n                                target = target.parents().add(eventTarget);\n                            }\n                            var filter = option[42]/*touchHandle*/ || obj;\n                            if (typeof filter === \"string\") {\n                                filter = stringTrim(filter);\n                                if (filter.charAt(0) == \">\") {\n                                    filter = $(filter.substr(1, filter.length), obj);\n                                }\n                            }\n\n                            var isTarget = target.filter(filter).length;\n\n                            if (!isTarget) {\n                                return;\n                            } else {\n                                startedTouch = TRUE;\n                            }\n                        }\n\n                        if (type != endEvent1 && type != endEvent2) {\n                            var x;\n                            var y;\n                            if (isMouseEvent) {\n                                x = event.pageX;\n                                y = event.pageY;\n                            } else {\n                                var touch = event.touches[0];\n                                x = touch.pageX;\n                                y = touch.pageY;\n                            }\n\n                            if (type == startEvent) {\n                                startX = x;\n                                startY = y;\n\n                                touchStart(x - startX, y - startY);\n                                if (isMouseEvent || !option[45]/*allowScroll*/) {\n                                    event.preventDefault();\n                                }\n                            } else {\n                                touchMove(x - startX, y - startY);\n\n                                if (!allowScroll(isMouseEvent, x - startX, y - startY)) {\n                                    event.preventDefault();\n                                }\n                            }\n\n                            prevX = x - startX;\n                            prevY = y - startY;\n                        } else {\n                            touchEnd(prevX, prevY);\n                            startedTouch = FALSE;\n                        }\n                    };\n                    bindAndRegisterOff(doc, [TOUCHSTART, TOUCHMOVE, TOUCHEND, TOUCHCANCEL].join(\" \"), dragFunction);\n                    if (option[44]/*mouseTouch*/) {\n                        bindAndRegisterOff(doc, [MOUSEDOWN, MOUSEMOVE, MOUSEUP].join(\" \"), dragFunction);\n                    }\n                }\n\n                function allowScroll(isMouseEvent, x, y) {\n                    var isGeneralDirectionVertical = mathAbs(y) > mathAbs(x);\n                    if (isMouseEvent) {\n                        // If the user drags vertically, prevent the (horizontal) scroll event\n                        return FALSE;\n                    }\n                    if (!option[45]/*allowScroll*/) {\n                        return FALSE;\n                    }\n                    if (option[6]/*vertical*/) {\n                        return !isGeneralDirectionVertical;\n                    } else {\n                        return isGeneralDirectionVertical;\n                    }\n                }\n            }\n\n            function performCallbacks(callbacks) {\n                while (callbacks && callbacks.length) {\n                    // Removing and running the first, so we maintain FIFO.\n                    callbacks.splice(0, 1)[0]();\n                }\n            }\n\n            function isContentInSlideReady(slide) {\n                if (!imagesInSlidesLoaded[slide]) {\n                    return FALSE;\n                }\n                if (!option[30]/*ajax*/) {\n                    return TRUE;\n                } else {\n                    if (option[30]/*ajax*/[slide]) {\n                        return FALSE;\n                    }\n                    return !(startedAjaxLoads[slide] && !finishedAjaxLoads[slide]);\n                }\n            }\n\n            function loadSlidesAndAnimate(i, clicked, speed) {\n                var dir = filterDir(i);\n                var prevNext = i == NEXT_STRING || i == PREV_STRING;\n\n                var targetSlide = getRealPos(dir);\n                if (targetSlide == currentSlide) {\n                    return;\n                }\n                clickable = FALSE;\n                currentlyAnimatingTowards = targetSlide;\n\n                if (option[30]/*ajax*/) {\n                    var waitCounter = 0;\n                    for (var loadSlide = targetSlide; loadSlide < targetSlide + numberOfVisibleSlides; loadSlide++) {\n                        var realLoadSlide = getRealPos(loadSlide);\n                        if (!isContentInSlideReady(realLoadSlide)) {\n                            waitCounter++;\n                            ajaxLoad(realLoadSlide, function () {\n                                // This runs aync, so every callback is placed before the first is run. Therefore this works.\n                                waitCounter--;\n                                if (waitCounter == 0) {\n                                    option[40]/*loadFinish*/.call(baseSlider, dir + 1);\n                                    performAnimation(dir, speed, clicked, prevNext);\n                                }\n                            });\n                        }\n                    }\n                    if (waitCounter == 0) {\n                        performAnimation(dir, speed, clicked, prevNext);\n                    } else {\n                        option[39]/*loadStart*/.call(baseSlider, dir + 1);\n                    }\n                } else {\n                    performAnimation(dir, speed, clicked, prevNext);\n                }\n            }\n\n            function ensureSliderContainerCSSDurationReset() {\n                if (option[38]/*useCSS*/) {\n                    slidesContainer.css(CSSVendorPrefix + \"transition-duration\", \"\");\n                }\n            }\n\n            var reorderedSlidesToStartFromSlide = 0;\n\n            function reorderSlides(slide) {\n                slide = getRealPos(slide);\n                if (slide == reorderedSlidesToStartFromSlide) {\n                    return;\n                }\n                reorderedSlidesToStartFromSlide = slide;\n                ensureSliderContainerCSSDurationReset();\n                for (var i = 0; i < totalSlides; i++) {\n                    var slideToInsert = slides[getRealPos((slide + i))];\n                    slidesContainer.append(slideToInsert);\n                }\n                adjustPositionTo(currentSlide);\n            }\n\n            function centerTargetSlideAdjusted(targetSlide, extraSpace) {\n                var offset = mathMax(parseInt10((totalSlides - extraSpace - numberOfVisibleSlides) / 2), 0);\n                targetSlide = mod(targetSlide - offset, totalSlides);\n                reorderSlides(targetSlide);\n            }\n\n            function centerTargetSlideAfter(targetSlide) {\n                centerTargetSlideAdjusted(targetSlide, 0);\n            }\n\n            function centerTargetSlideBefore(targetSlide) {\n                var startSlide = mathMin(targetSlide, currentSlide);\n                var adjustment = mathAbs(targetSlide - currentSlide);\n\n                centerTargetSlideAdjusted(startSlide, adjustment);\n            }\n\n            function performAnimation(dir, speed, clicked, prevNext, skipPreCenterTargetSlide) {\n                if (option[29]/*updateBefore*/) setCurrent(dir);\n\n                if (option[26]/*history*/ && clicked) win.location.hash = option[18]/*numerictext*/[dir];\n\n                if (option[4]/*controlsfade*/) fadeControls(dir, option[3]/*controlsfadespeed*/);\n\n                var fromSlides = $();\n                var toSlides = $();\n                for (var a = 0; a < numberOfVisibleSlides; a++) {\n                    fromSlides = fromSlides.add(slides[getRealPos(currentSlide + a)]);\n                    toSlides = toSlides.add(slides[getRealPos(dir + a)]);\n                }\n\n                // Finding a \"shortcut\", used for calculating the offsets.\n                var diff = dir - currentSlide;\n                var targetSlide;\n                if (option[15]/*continuous*/ && !prevNext) {\n                    var diffAbs = mathAbs(diff);\n                    targetSlide = dir;\n\n                    var newDiff = -currentSlide + dir + totalSlides;\n                    if (mathAbs(newDiff) < diffAbs) {\n                        targetSlide = dir + totalSlides;\n                        diff = newDiff;\n                        diffAbs = mathAbs(diff);\n                    }\n\n                    newDiff = -currentSlide + dir - totalSlides;\n                    if (mathAbs(newDiff) < diffAbs) {\n                        targetSlide = dir - totalSlides;\n                        diff = newDiff;\n                    }\n                } else {\n                    targetSlide = dir;\n                }\n\n                if (option[15]/*continuous*/ && !skipPreCenterTargetSlide) {\n                    centerTargetSlideBefore(targetSlide);\n                }\n\n                var leftTarget = getSlidePosition(targetSlide, FALSE);\n                var topTarget = getSlidePosition(targetSlide, TRUE);\n\n                var targetLi = slides[getRealPos(dir)];\n                var callOptions = $.extend(TRUE, {}, options); // Making a copy, to enforce read-only.\n                var overwritingSpeed = option[1]/*speed*/;\n                var attributeSpeed = targetLi.attr(\"data-speed\");\n                if (attributeSpeed != undefined) {\n                    overwritingSpeed = parseInt10(attributeSpeed);\n                }\n                if (speed != undefined) {\n                    overwritingSpeed = parseInt10(speed);\n                }\n                callOptions.speed = overwritingSpeed;\n\n                var effect = option[0]/*effect*/;\n\n                var specificEffectAttrName = \"data-effect\";\n                var slideSpecificEffect = targetLi.attr(specificEffectAttrName);\n                if (slideSpecificEffect) {\n                    effect = getEffectMethod(slideSpecificEffect);\n                }\n\n                var slideOutSlide = slides[currentSlide];\n                if (slideOutSlide) {\n                    var slideOutSpecificEffect = slides[currentSlide].attr(specificEffectAttrName + \"out\")\n                    if (slideOutSpecificEffect) {\n                        effect = getEffectMethod(slideOutSpecificEffect);\n                    }\n                }\n\n                currentlyAnimating = TRUE;\n                currentAnimation = effect;\n\n                var callbackHasYetToRun = TRUE;\n                currentAnimationCallback = function () {\n                    currentlyAnimating = FALSE;\n                    callbackHasYetToRun = FALSE;\n\n                    goToSlide(dir, clicked);\n                    fixClearType(toSlides);\n\n                    if (option[15]/*continuous*/) {\n                        centerTargetSlideAfter(targetSlide);\n                    }\n\n                    // Afteranimation.\n                    aniCall(dir, TRUE);\n                    if (option[10]/*responsive*/) {\n                        adjustResponsiveLayout();\n                    }\n\n                    performCallbacks(runAfterAnimationCallbacks);\n                };\n                currentAnimationObject = {\n                    fromSlides: fromSlides,\n                    toSlides: toSlides,\n                    slider: obj,\n                    container: slidesContainer,\n                    options: callOptions,\n                    to: dir + 1,\n                    from: currentSlide + 1,\n                    diff: diff,\n                    target: {\n                        left: leftTarget,\n                        top: topTarget\n                    },\n                    stopCallbacks: [],\n                    callback: function () {\n                        if (callbackHasYetToRun) {\n                            callbackHasYetToRun = FALSE;\n                            stopAnimation();\n                        }\n                    },\n                    goToNext: function () {\n                        if (callbackHasYetToRun) {\n                            // Only moving after there is content ready to replace the previous.\n                            runOnImagesLoaded($(\".\" + ANIMATION_CLONE_MARKER_CLASS, obj), TRUE, makeCallback(adjustPositionTo, [dir]));\n                        }\n                    }\n                };\n\n                autoadjust(dir, overwritingSpeed);\n                callAsync(function () {\n                    // Beforeanimation.\n                    aniCall(dir, FALSE, TRUE, overwritingSpeed);\n\n                    effect.call(baseSlider, currentAnimationObject);\n                });\n            }\n\n            function stopAnimation() {\n                if (currentlyAnimating) {\n                    // Noinspection JSUnusedAssignment.\n                    animationWasInterrupted = TRUE;\n                    // Doing it in this order isn't a problem in relation to the user-callbacks, since they are run in a setTimeout(callback, 0) anyway.\n                    if (currentAnimationCallback) {\n                        currentAnimationCallback();\n                    }\n\n                    performCallbacks(currentAnimationObject.stopCallbacks);\n\n                    var stopFunction = currentAnimation.stop;\n                    if (stopFunction) {\n                        stopFunction();\n                    } else {\n                        defaultStopFunction();\n                    }\n                    autoadjust(currentSlide, 0);\n                    adjustPositionTo(currentSlide);\n                    animationWasInterrupted = FALSE;\n                }\n            }\n\n            function bindAndRegisterOff(element, events, handler, selector) {\n                element.on(events, selector, handler);\n                unBindCallbacks.push(function () {\n                    element.off(events, selector, handler);\n                });\n            }\n\n            function cantDoAdjustments() {\n                return !obj.is(\":visible\") || init || destroyed;\n            }\n\n            function defaultStopFunction() {\n                $(\".\" + ANIMATION_CLONE_MARKER_CLASS, obj).remove();\n                slidesContainer.stop();\n            }\n\n            function goToSlide(slide, clicked) {\n                clickable = !clicked && !option[12]/*auto*/;\n                previousSlide = currentSlide;\n                currentSlide = slide;\n\n                adjust(clicked);\n\n                if (option[4]/*controlsfade*/ && init) {\n                    fadeControls(currentSlide, 0);\n                }\n                // This is handles in AjaxAdjust, if something is loading.\n                if (init && !option[30]/*ajax*/[currentSlide] && !startedAjaxLoads[currentSlide]) {\n                    init = FALSE;\n                    callAsync(performInitCallback);\n                }\n            }\n\n            function getSlides(from, count) {\n                var visibleSlides = $();\n                for (var i = 0; i < count; i++) {\n                    visibleSlides = visibleSlides.add(slides[getRealPos(from + i)]);\n                }\n                return visibleSlides;\n            }\n\n            function getRealPos(a) {\n                return mod(a, totalSlides);\n            }\n\n            function fixClearType(element) {\n                if (screen.fontSmoothingEnabled && element.style) {\n                    try {\n                        element.style.removeAttribute(\"filter\"); // Fix cleartype\n                    } catch (ignored) { }\n                }\n            }\n\n            /*\n             * Public methods.\n             */\n\n            // First i just define those i use more than one. Then i just add the others as anonymous functions.\n            function publicDestroy() {\n                stopAuto();\n                stopAnimation();\n                autoadjust(currentSlide, 0);\n                destroyed = TRUE;\n\n                slideNumberBeforeDestroy = currentSlide;\n\n                performCallbacks(unBindCallbacks);\n\n                ensureSliderContainerCSSDurationReset();\n                if (controls) {\n                    controls.remove();\n                }\n\n                reorderSlides(0);\n                adjustPositionTo(currentSlide);\n\n                option[43]/*destroyCallback*/.call(baseSlider);\n            }\n\n            baseSlider.destroy = publicDestroy;\n\n            function publicInit() {\n                if (destroyed) {\n                    initSudoSlider();\n                }\n            }\n\n            function runOnDestroyedSlider(func) {\n                return function foo() {\n                    var reinit = !destroyed;\n                    if (!init && !fullyInitialized) {\n                        var args = arguments;\n                        callAsync(function () {\n                            foo.apply(undefined, args);\n                        }); // Fixing a very special, special case.\n                        return;\n                    }\n                    publicDestroy();\n\n                    func.apply(this, arguments);\n\n                    if (reinit) {\n                        publicInit();\n                    }\n                }\n            }\n\n            baseSlider.init = publicInit;\n\n            baseSlider.getOption = function (a) {\n                return options[a.toLowerCase()];\n            };\n\n            baseSlider.setOption = runOnDestroyedSlider(function (key, val) {\n                options[key.toLowerCase()] = val;\n            });\n\n            baseSlider.setOptions = runOnDestroyedSlider(function (newOptions) {\n                for (var key in newOptions) {\n                    options[key.toLowerCase()] = newOptions[key];\n                }\n            });\n\n            baseSlider.runWhenNotAnimating = runWhenNotAnimating;\n\n            baseSlider.insertSlide = runOnDestroyedSlider(function (html, pos, numtext, goToSlide) {\n                // pos = 0 means before everything else.\n                // pos = 1 means after the first slide.\n                // if pos is negative, then we count from the right instead.\n                if (pos < 0) {\n                    pos = totalSlides - mod(-pos - 1, totalSlides + 1);\n                } else {\n                    pos = mod(pos, totalSlides + 1);\n                }\n\n                html = $(html || DIV_TAG);\n                if (isSlideContainerUl) {\n                    html = $(\"<li>\").prepend(html);\n                } else {\n                    if (html.length != 1) {\n                        html = $(DIV_TAG).prepend(html);\n                    } else {\n                        // Inserting as is.\n                    }\n                }\n\n                if (!pos || pos == 0) {\n                    slidesContainer.prepend(html);\n                } else {\n                    slides[pos - 1].after(html);\n                }\n\n                // Finally, we make it work again.\n                if (goToSlide) {\n                    slideNumberBeforeDestroy = goToSlide - 1;\n                } else if (pos <= slideNumberBeforeDestroy || (!pos || pos == 0)) {\n                    slideNumberBeforeDestroy++;\n                }\n\n                if (option[18]/*numerictext*/.length < pos) {\n                    option[18]/*numerictext*/.length = pos;\n                }\n\n                option[18]/*numerictext*/.splice(pos, 0, numtext || parseInt10(pos) + 1);\n            });\n\n            baseSlider.removeSlide = runOnDestroyedSlider(function (pos) {\n                pos = mathMax(0, parseInt10(pos) - 1); // 1 == the first.\n\n                slides[mathMin(pos, totalSlides - 1)].remove();\n                option[18]/*numerictext*/.splice(pos, 1);\n                if (pos < slideNumberBeforeDestroy) {\n                    slideNumberBeforeDestroy--;\n                }\n            });\n\n            baseSlider.goToSlide = function (a, speed) {\n                var parsedDirection = (a == parseInt10(a)) ? a - 1 : a;\n                callAsync(makeCallback(enqueueAnimation, [parsedDirection, TRUE, speed]));\n            };\n\n            baseSlider.block = function () {\n                clickable = FALSE;\n            };\n\n            baseSlider.unblock = function () {\n                clickable = TRUE;\n            };\n\n            baseSlider.startAuto = function () {\n                option[12]/*auto*/ = TRUE;\n                startAuto();\n            };\n\n            baseSlider.stopAuto = function () {\n                option[12]/*auto*/ = FALSE;\n                stopAuto();\n            };\n\n            baseSlider.adjust = function adjustMethod(repeat) {\n                var autoAdjustSpeed = mathMax(adjustTargetTime - getTimeInMillis(), 0);\n                autoadjust(currentSlide, autoAdjustSpeed);\n                if (!currentlyAnimating) {\n                    adjustPositionTo(currentSlide);\n                }\n                if (!repeat) {\n                    callAsync(makeCallback(adjustMethod, [true]));\n                }\n            };\n\n            baseSlider.getValue = function (a) {\n                return {\n                    currentslide: currentSlide + 1,\n                    totalslides: totalSlides,\n                    clickable: clickable,\n                    destroyed: destroyed,\n                    autoanimation: autoOn\n                }[a.toLowerCase()];\n            };\n\n            baseSlider.getSlide = function (number) {\n                return slides[getRealPos(parseInt10(number) - 1)];\n            };\n\n            baseSlider.stopAnimation = stopAnimation;\n\n            // Done, now initialize.\n            initSudoSlider();\n        });\n    };\n\n    /*\n     * End generic slider.\n     * Factory method for default options (no accidental writes!).\n    */\n    function getDefaultOptions() {\n        return {\n            effect: \"slide\", /*option[0]/*effect*/\n            speed: 1500, /*  option[1]/*speed*/\n            customLink: FALSE, /* option[2]/*customlink*/\n            controlsFadeSpeed: 400, /*   option[3]/*controlsfadespeed*/\n            controlsFade: TRUE, /*  option[4]/*controlsfade*/\n            insertAfter: TRUE, /*  option[5]/*insertafter*/\n            vertical: FALSE, /* option[6]/*vertical*/\n            slideCount: 1, /*     option[7]/*slidecount*/\n            moveCount: 1, /*     option[8]/*movecount*/\n            startSlide: 1, /*     option[9]/*startslide*/\n            responsive: TRUE, /* option[10]/*responsive*/\n            ease: SWING, /* option[11]/*ease*/\n            auto: FALSE, /* option[12]/*auto*/\n            pause: 2000, /*  option[13]/*pause*/\n            resumePause: FALSE, /* option[14]/*resumepause*/\n            continuous: FALSE, /* option[15]/*continuous*/\n            prevNext: TRUE, /*  option[16]/*prevnext*/\n            numeric: FALSE, /* option[17]/*numeric*/\n            numericText: [], /*    option[18]/*numerictext*/\n            slices: 15, /*   option[19]/*slices*/\n            boxCols: 8, /*    option[20]/*boxCols*/\n            boxRows: 4, /*    option[21]/*boxRows*/\n            initCallback: EMPTY_FUNCTION, /* option[22]/*initCallback*/\n            ajaxLoad: EMPTY_FUNCTION, /* option[23]/*ajaxload*/\n            beforeAnimation: EMPTY_FUNCTION, /* option[24]/*beforeanimation*/\n            afterAnimation: EMPTY_FUNCTION, /* option[25]/*afteranimation*/\n            history: FALSE, /* option[26]/*history*/\n            autoHeight: TRUE, /*  option[27]/*autoheight*/\n            autoWidth: TRUE, /*  option[28]/*autowidth*/\n            updateBefore: FALSE, /* option[29]/*updateBefore*/\n            ajax: FALSE, /* option[30]/*ajax*/\n            preloadAjax: 100, /*   option[31]/*preloadajax*/\n            loadingText: \"\", /*    option[32]/*loadingtext*/\n            prevHtml: '<a href=\"#\" class=\"prevBtn\"> previous </a>', /* option[33]/*prevhtml*/\n            nextHtml: '<a href=\"#\" class=\"nextBtn\"> next </a>', /* option[34]/*nexthtml*/\n            controlsAttr: 'class=\"controls\"', /* option[35]/*controlsattr*/\n            numericAttr: 'class=\"numericControls\"', /* option[36]/*numericattr*/\n            interruptible: FALSE, /* option[37]/*interruptible*/\n            useCSS: TRUE, /* option[38]/*useCSS*/\n            loadStart: EMPTY_FUNCTION, /* option[39]/*loadStart*/\n            loadFinish: EMPTY_FUNCTION,  /* option[40]/*loadFinish*/\n            touch: FALSE,  /* option[41]/*touch*/\n            touchHandle: FALSE, /* option[42]/*touchHandle*/\n            destroyCallback: EMPTY_FUNCTION,  /* option[43]/*destroyCallback*/\n            mouseTouch: TRUE, /* option[44]/*mouseTouch*/\n            allowScroll: TRUE, /* option[45]/*allowScroll*/\n            CSSease: SWING, /* option[46]/*CSSease*/\n            ajaxHasHTML: FALSE /* option[47]/*AjaxHasHTML*/\n\n        };\n    }\n    $.fn.sudoSlider.getDefaultOptions = getDefaultOptions;\n\n    /* Start animations.\n     * A lot of the code here is an if-else-elseif nightmare. This is because it is smaller in JavaScript, and this thing needs to be small (when minimized).\n     */\n    var GROW_IN = \"GrowIn\";\n    var GROW_OUT = \"GrowOut\";\n    var ROUNDED = \"Rounded\";\n    var FLY_IN = \"FlyIn\";\n    var FLY_OUT = \"FlyOut\";\n\n    // Start by defining everything, the implementations are below.\n    var normalEffectsPrefixObject = {\n        /*box: {\n            Random: [\n                \"\",\n                GROW_IN,\n                GROW_IN + ROUNDED,\n                GROW_OUT,\n                GROW_OUT + ROUNDED,\n                FLY_IN,\n                FLY_OUT,\n                boxRandomTemplate\n            ],\n            Rain: [\n                \"\",\n                GROW_IN,\n                GROW_IN + ROUNDED,\n                GROW_OUT,\n                GROW_OUT + ROUNDED,\n                FLY_IN,\n                FLY_OUT,\n                [\n                    \"UpLeft\",\n                    \"DownLeft\",\n                    \"DownRight\",\n                    \"UpRight\",\n                    boxRainTemplate\n                ]\n            ],\n            Spiral: [\n                \"InWards\",\n                \"OutWards\",\n                {\n                    \"\": boxSpiralTemplate,\n                    Grow: [\n                        \"In\",\n                        \"Out\",\n                        [\n                            \"\",\n                            \"Rounded\",\n                            boxSpiralGrowTemplate\n                        ]\n                    ]\n                }\n            ]\n        },*/\n        fade: {\n            \"\": fade,\n            OutIn: fadeOutIn\n        },\n        foldRandom: [\n            \"Horizontal\",\n            \"Vertical\",\n            foldRandom\n        ],\n        slide: slide,\n        stack: [\n            \"Up\",\n            \"Right\",\n            \"Down\",\n            \"Left\",\n            [\n                \"\",\n                \"Reverse\",\n                stackTemplate\n            ]\n        ]\n        // TODO: Name!\n        /*unnamed: [\n            \"\",\n            \"Reveal\",\n            [\n                \"\",\n                \"Vertical\",\n                [\n                    \"\",\n                    \"Reverse\",\n                    \"Random\",\n                    testAnimation\n                ]\n            ]\n        ]*/\n    };\n\n    // Generic effects needs to have a \"dir\" attribute as their last argument.\n    var genericEffectsPrefixObject = {\n        blinds: [\n            \"1\",\n            \"2\",\n            blinds\n        ],\n        fold: fold,\n        push: [\n            \"Out\",\n            \"In\",\n            pushTemplate\n        ],\n        reveal: revealTemplate,\n        slice: {\n            \"\": [\n                \"\",\n                \"Reveal\",\n                [\n                    \"\",\n                    \"Reverse\",\n                    \"Random\",\n                    slice\n                ]\n            ],\n            Fade: slicesFade\n        },\n        zip: zip,\n        unzip: unzip\n    };\n\n    function parsePrefixedEffects(resultObject, effectsObject, prefix, generic, argumentsStack) {\n        if (isFunction(effectsObject)) {\n            if (generic) {\n                // Parsing the value 0, as a hack to make generic effects work, see the below else case.\n                parsePrefixedEffects(resultObject, [\"\", \"Up\", \"Right\", \"Down\", \"Left\", effectsObject], prefix, 0, argumentsStack);\n            } else {\n                resultObject[prefix] = function (obj) {\n                    var argumentArray = [obj].concat(argumentsStack);\n\n                    // Ugly hack, to make \"generic\" functions to work.\n                    var genericArgumentIndex = argumentArray.length - 1;\n                    if (generic === 0 && argumentArray[genericArgumentIndex] == 0) {\n                        argumentArray[genericArgumentIndex] = getDirFromAnimationObject(obj);\n                    }\n\n                    effectsObject.apply(this, argumentArray);\n                }\n            }\n        } else if (isArray(effectsObject)) {\n            var effectIndex = effectsObject.length - 1;\n            var effect = effectsObject[effectIndex];\n            for (var i = 0; i < effectIndex; i++) {\n                var newArgumentStack = cloneArray(argumentsStack);\n                newArgumentStack.push(i);\n                var name = effectsObject[i];\n                parsePrefixedEffects(resultObject, effect, prefix + name, generic, newArgumentStack);\n            }\n        } else {\n            $.each(effectsObject, function (name, effect) {\n                parsePrefixedEffects(resultObject, effect, prefix + name, generic, argumentsStack);\n            });\n        }\n    }\n\n    var allEffects = {};\n    parsePrefixedEffects(allEffects, genericEffectsPrefixObject, \"\", TRUE, []);\n    parsePrefixedEffects(allEffects, normalEffectsPrefixObject, \"\", FALSE, []);\n\n    allEffects.random = makeRandomEffect(allEffects);\n\n    // Saving it.\n    $.fn.sudoSlider.effects = allEffects;\n\n    // The implementations\n    // dir: 0: UpRight, 1: DownRight: 2: DownLeft, 3: UpLeft\n    // effect: 0: none, 1: growIn, 2: growRoundedIn, 3: growOut, 4: growRoundedOut, 5: flyIn, 6: flyOut\n    function boxRainTemplate(obj, effect, dir) {\n        var reverseRows = dir == 1 || dir == 3;\n        var reverse = dir == 0 || dir == 3;\n        var grow = effect >= 1 && effect <= 4;\n        var flyIn = effect == 5 || effect == 6;\n        var reveal = effect == 6 || effect == 3 || effect == 4;\n        var roundedGrow = effect == 2 || effect == 4;\n        boxTemplate(obj, reverse, reverseRows, grow, FALSE, 1, flyIn, reveal, roundedGrow);\n    }\n\n    function boxSpiralTemplate(obj, direction) {\n        boxTemplate(obj, direction, FALSE, FALSE, FALSE, 2, FALSE, FALSE, FALSE);\n    }\n\n    function boxSpiralGrowTemplate(obj, direction, reveal, rounded) {\n        boxTemplate(obj, direction, FALSE, TRUE, FALSE, 2, FALSE, reveal, rounded);\n    }\n\n    // effect: 0: no grow, 1: growIn: 2: growInRounded, 3: growOut, 4: growOutRounded, 5: flyIn, 6: flyOut.\n    function boxRandomTemplate(obj, effect) {\n        var reveal = effect == 3 || effect == 4 || effect == 6;\n        var roundedGrow = effect == 2 || effect == 4;\n        var flyIn = effect == 5 || effect == 6;\n        boxTemplate(obj, FALSE, FALSE, effect > 0 && effect < 5, TRUE, 0, flyIn, reveal, roundedGrow);\n    }\n\n    // SelectionAlgorithm: 0: Standard selection, 1: rain, 2: spiral.\n    function boxTemplate(obj, reverse, reverseRows, grow, randomize, selectionAlgorithm, flyIn, reveal, roundedGrow) {\n        var options = obj.options;\n        var boxRows = options.boxrows;\n        var boxCols = options.boxcols;\n        var totalBoxes = boxRows * boxCols;\n        var speed = options.speed / (totalBoxes == 1 ? 1 : 2.5); // To make the actual time spent equal to options.speed.\n        var boxes = createLazyBoxes(obj, boxCols, boxRows, !reveal);\n        var timeBuff = 0;\n        var rowIndex = 0;\n        var colIndex = 0;\n        var box2DArr = [];\n        box2DArr[rowIndex] = [];\n        if (reverse) {\n            reverseArray(boxes);\n        }\n        if (randomize) {\n            shuffle(boxes);\n        }\n\n        for (var i = 0; i < boxes.length; i++) {\n            var element = boxes[i];\n            box2DArr[rowIndex][colIndex] = element;\n            colIndex++;\n            if (colIndex == boxCols) {\n                if (reverseRows) {\n                    reverseArray(box2DArr[rowIndex]);\n                }\n                rowIndex++;\n                colIndex = 0;\n                box2DArr[rowIndex] = [];\n            }\n        }\n\n        var boxesResult = [];\n        if (selectionAlgorithm == 1) {\n            // Rain.\n            for (var cols = 0; cols < (boxCols * 2) + 1; cols++) {\n                var prevCol = cols;\n                var boxesResultLine = [];\n                for (var rows = 0; rows < boxRows; rows++) {\n                    if (prevCol >= 0 && prevCol < boxCols) {\n                        var rawBox = box2DArr[rows][prevCol];\n                        if (!rawBox) {\n                            return;\n                        }\n                        boxesResultLine.push(rawBox);\n                    }\n                    prevCol--;\n                }\n                if (boxesResultLine.length != 0) {\n                    boxesResult.push(boxesResultLine);\n                }\n            }\n        } else if (selectionAlgorithm == 2) {\n            // Spiral\n            // Algorithm borrowed from the Camera plugin by Pixedelic.com.\n            var rows2 = boxRows / 2, x, y, z, n = reverse ? totalBoxes : -1;\n            var negative = reverse ? -1 : 1;\n            for (z = 0; z < rows2; z++) {\n                y = z;\n                for (x = z; x < boxCols - z - 1; x++) {\n                    boxesResult[n += negative] = boxes[y * boxCols + x];\n                }\n                x = boxCols - z - 1;\n                for (y = z; y < boxRows - z - 1; y++) {\n                    boxesResult[n += negative] = boxes[y * boxCols + x];\n                }\n                y = boxRows - z - 1;\n                for (x = boxCols - z - 1; x > z; x--) {\n                    boxesResult[n += negative] = boxes[y * boxCols + x];\n                }\n                x = z;\n                for (y = boxRows - z - 1; y > z; y--) {\n                    boxesResult[n += negative] = boxes[y * boxCols + x];\n                }\n            }\n        } else {\n            for (var row = 0; row < boxRows; row++) {\n                for (var col = 0; col < boxCols; col++) {\n                    boxesResult.push([box2DArr[row][col]]);\n                }\n            }\n        }\n\n        if (reveal) {\n            obj.goToNext();\n        }\n\n        var count = 0;\n        for (var i = 0; i < boxesResult.length; i++) {\n            var boxLine = boxesResult[i];\n\n            if (!isArray(boxLine)) {\n                boxLine = [boxLine];\n            }\n\n            for (var j = 0; j < boxLine.length; j++) {\n                var lazyBox = boxLine[j];\n                (function (lazyBox, delay) {\n                    function boxAnimationFunction(delay) {\n                        var box = lazyBox();\n                        var boxChildren = box.children();\n                        var orgWidth = box.width();\n                        var orgHeight = box.height();\n                        var goToWidth = orgWidth;\n                        var goToHeight = orgHeight;\n                        var orgLeft = parseNumber(box.css(\"left\"));\n                        var orgTop = parseNumber(box.css(\"top\"));\n                        var goToLeft = orgLeft;\n                        var goToTop = orgTop;\n\n                        var childOrgLeft = parseNumber(boxChildren.css(\"left\"));\n                        var childOrgTop = parseNumber(boxChildren.css(\"top\"));\n                        var childGoToLeft = childOrgLeft;\n                        var childGoToTop = childOrgTop;\n\n                        if (flyIn) {\n                            var adjustTop;\n                            var adjustLeft;\n\n                            if (randomize) {\n                                adjustLeft = pickRandomValue([-goToWidth, goToWidth]);\n                                adjustTop = pickRandomValue([-goToHeight, goToHeight]);\n                            } else {\n                                adjustLeft = reverse != reverseRows ? -goToWidth : goToWidth;\n                                adjustTop = reverse ? -goToHeight : goToHeight;\n                            }\n\n                            var flyDistanceFactor = 1.5;\n\n                            if (reveal) {\n                                goToLeft -= adjustLeft * flyDistanceFactor;\n                                goToTop -= adjustTop * flyDistanceFactor;\n                            } else {\n                                box.css({\n                                    left: orgLeft + adjustLeft * flyDistanceFactor,\n                                    top: orgTop + adjustTop * flyDistanceFactor\n                                });\n                            }\n                        }\n\n                        if (grow) {\n                            if (reveal) {\n                                childGoToLeft -= goToWidth / 2;\n                                goToLeft += goToWidth / 2;\n                                childGoToTop -= goToHeight / 2;\n                                goToTop += goToHeight / 2;\n\n                                goToHeight = goToWidth = 0;\n                            } else {\n                                box.css({left: orgLeft + (goToWidth / 2), top: orgTop + (goToHeight / 2)});\n                                boxChildren.css({\n                                    left: childOrgLeft - goToWidth / 2,\n                                    top: childOrgTop - goToHeight / 2\n                                });\n\n                                box.width(0).height(0);\n                                if (roundedGrow) {\n                                    box.css({borderRadius: mathMax(orgHeight, orgWidth)});\n                                }\n                            }\n                        }\n\n                        if (reveal) {\n                            box.css({opacity: 1});\n                        }\n                        count++;\n                        schedule(function () {\n                            doc.ready(function () {\n                                animate(boxChildren, {left: childGoToLeft, top: childGoToTop}, speed, FALSE, FALSE, obj);\n                                animate(box, {\n                                    opacity: reveal ? 0 : 1,\n                                    width: goToWidth,\n                                    height: goToHeight,\n                                    left: goToLeft,\n                                    top: goToTop,\n                                    borderRadius: grow && reveal && roundedGrow ? mathMax(orgHeight, orgWidth) : 0\n                                }, speed, FALSE, function () {\n                                    count--;\n                                    if (count == 0) {\n                                        obj.callback();\n                                    }\n                                }, obj);\n                            })\n                        }, delay);\n                    }\n\n                    var minWaitTime = 150;\n                    if (reveal || delay < minWaitTime) {\n                        boxAnimationFunction(delay);\n                    } else {\n                        schedule(makeCallback(boxAnimationFunction, [minWaitTime]), delay - minWaitTime);\n                    }\n                })(lazyBox, timeBuff);\n            }\n            timeBuff += (speed / boxesResult.length) * 1.5;\n        }\n    }\n\n    function slicesFade(obj, dir) {\n        var vertical = dir == 2 || dir == 4;\n        var negative = dir == 1 || dir == 4;\n        foldTemplate(obj, vertical, negative, FALSE, TRUE);\n    }\n\n    function fold(obj, dir) {\n        var vertical = dir == 2 || dir == 4;\n        var negative = dir == 1 || dir == 4;\n        foldTemplate(obj, vertical, negative);\n    }\n\n    function foldRandom(obj, vertical) {\n        foldTemplate(obj, vertical, FALSE, TRUE);\n    }\n\n    function blinds(obj, blindsEffect, dir) {\n        blindsEffect++;\n        var vertical = dir == 2 || dir == 4;\n        var negative = dir == 1 || dir == 4;\n        foldTemplate(obj, vertical, negative, FALSE, FALSE, blindsEffect);\n    }\n\n    function slice(obj, reveal, reverse, dir) {\n        var random = reverse == 2;\n        var vertical = dir == 1 || dir == 3;\n        var negative = dir == 1 || dir == 4;\n        foldTemplate(obj, vertical, reverse, random, FALSE, 0, negative ? 1 : 2, reveal);\n    }\n\n    function testAnimation(obj, reveal, vertical, reverseArg) {\n        var reverse = reverseArg == 1;\n        var random = reverseArg == 2;\n\n        foldTemplate(obj, vertical, reverse, random, FALSE, 0, 1, reveal);\n        foldTemplate(obj, vertical, reverse, random, FALSE, 0, 2, reveal);\n    }\n\n    function zip(obj, dir) {\n        var vertical = dir == 2 || dir == 4;\n        var negative = dir == 1 || dir == 4;\n        foldTemplate(obj, vertical, negative, FALSE, FALSE, 0, 3);\n    }\n\n    function unzip(obj, dir) {\n        var vertical = dir == 2 || dir == 4;\n        var negative = dir == 1 || dir == 4;\n        foldTemplate(obj, vertical, negative, FALSE, FALSE, 0, 3, TRUE);\n    }\n\n    function foldTemplate(obj, vertical, reverse, randomize, onlyFade, curtainEffect, upDownEffect, reveal) {\n        var options = obj.options;\n        var slides = options.slices;\n        var speed = options.speed / 2; // To make the actual time spent be equal to options.speed.\n        var objSlider = obj.slider;\n        var lazySlides = createLazyBoxes(obj, vertical ? slides : 1, vertical ? 1 : slides, !reveal);\n        var slicesElement = $();\n        for (var i = 0; i < lazySlides.length; i++) {\n            slicesElement = slicesElement.add(lazySlides[i]());\n        }\n        var count = 0;\n        var upDownAlternator = FALSE;\n        if (reverse) {\n            reverseArray(slicesElement);\n        } else {\n            $(reverseArray(slicesElement.get())).appendTo(objSlider);\n        }\n        if (randomize) {\n            shuffle(slicesElement);\n        }\n        slicesElement.each(function (i) {\n            var timeout = ((speed / slides) * i);\n            var slice = $(this);\n            var orgWidth = slice.width();\n            var orgHeight = slice.height();\n            var goToLeft = slice.css(\"left\");\n            var goToTop = slice.css(\"top\");\n            var startPosition = vertical ? goToLeft : goToTop;\n\n            var innerBox = slice.children();\n            var startAdjustment = innerBox[vertical ? \"width\" : \"height\"]();\n            if (curtainEffect == 1) {\n                startPosition = 0\n            } else if (curtainEffect == 2) {\n                startPosition = startAdjustment / 2;\n            }\n            if (reverse) {\n                startPosition = startAdjustment - startPosition;\n            }\n            if (vertical) {\n                slice.css({\n                    width: (onlyFade || upDownEffect ? orgWidth : 0),\n                    left: startPosition\n                });\n            } else {\n                slice.css({\n                    height: (onlyFade || upDownEffect ? orgHeight : 0),\n                    top: startPosition\n                });\n            }\n\n            if (reveal) {\n                var negative = upDownEffect == 1 ? -1 : 1;\n                slice.css({\n                    top: goToTop,\n                    left: goToLeft,\n                    width: orgWidth,\n                    height: orgHeight,\n                    opacity: 1\n                });\n                if (vertical) {\n                    goToTop = negative * orgHeight;\n                } else {\n                    goToLeft = negative * orgWidth;\n                }\n            }\n\n            if (upDownEffect) {\n                var bottom = TRUE;\n                if (upDownEffect == 3) {\n                    if (upDownAlternator) {\n                        bottom = FALSE;\n                        upDownAlternator = FALSE;\n                    } else {\n                        upDownAlternator = TRUE;\n                    }\n                } else if (upDownEffect == 2) {\n                    bottom = FALSE;\n                }\n                if (vertical) {\n                    if (reveal) {\n                        goToTop = (bottom ? -1 : 1) * orgHeight;\n                    } else {\n                        slice.css({\n                            bottom: bottom ? 0 : orgHeight,\n                            top: bottom ? orgHeight : 0,\n                            height: reveal ? orgHeight : 0\n                        });\n                    }\n                } else {\n                    if (reveal) {\n                        goToLeft = (bottom ? -1 : 1) * orgWidth;\n                    } else {\n                        slice.css({\n                            right: bottom ? 0 : orgWidth,\n                            left: bottom ? orgWidth : 0,\n                            width: reveal ? orgWidth : 0\n                        });\n                    }\n                }\n            }\n\n            count++;\n            schedule(makeCallback(animate, [\n                    slice, {\n                        width: orgWidth,\n                        height: orgHeight,\n                        opacity: reveal ? 0 : 1,\n                        left: goToLeft,\n                        top: goToTop\n                    }, speed, FALSE, function () {\n                        count--;\n                        if (count == 0) {\n                            obj.callback();\n                        }\n                    }, obj])\n                , timeout);\n        });\n        if (reveal) {\n            obj.goToNext();\n        }\n    }\n\n    function stackTemplate(obj, dir, reverse) {\n        var pushIn = obj.diff > 0;\n        if (reverse) {\n            pushIn = !pushIn;\n        }\n\n        pushTemplate(obj, pushIn, ++dir);\n    }\n\n    // 1: up, 2: right, 3: down, 4, left:\n    function pushTemplate(obj, pushIn, dir) {\n        var vertical = dir == 2 || dir == 4;\n        var negative = (dir == 2 || dir == 3) ? 1 : -1;\n        var options = obj.options;\n        var speed = options.speed;\n        var callback = obj.callback;\n        if (pushIn) {\n            var fromSlides = obj.fromSlides;\n            var toSlides = makeClone(obj, TRUE).hide();\n            obj.slider.append(toSlides);\n            var height = mathMax(toSlides.height(), fromSlides.height());\n            var width = mathMax(toSlides.width(), fromSlides.width());\n            toSlides.css(vertical ? {left: negative * width} : {top: negative * height}).show();\n            animate(toSlides, {left: 0, top: 0}, speed, FALSE, callback, obj);\n        } else {\n            var fromSlides = makeClone(obj, FALSE);\n            obj.slider.append(fromSlides);\n            obj.goToNext();\n            var toSlides = obj.toSlides;\n\n            var measurementSlides = negative == -1 ? fromSlides : toSlides;\n            var height = measurementSlides.height();\n            var width = measurementSlides.width();\n\n            animate(fromSlides, vertical ? {left: negative * width} : {top: negative * height}, speed, FALSE, callback, obj);\n        }\n    }\n\n    function revealTemplate(obj, dir) {\n        var vertical = dir == 1 || dir == 3;\n        var options = obj.options;\n        var speed = options.speed;\n        var innerBox = makeClone(obj, TRUE);\n        var width = innerBox.width();\n        var height = innerBox.height();\n        var box = createBox(innerBox, 0, 0, 0, 0)\n            .css({opacity: 1})\n            .appendTo(obj.slider);\n        var both = box.add(innerBox);\n        both.hide(); // FF css animation fix.\n        if (vertical) {\n            box.css({width: width});\n            if (dir == 1) {\n                innerBox.css({top: -height});\n                box.css({bottom: 0, top: \"auto\"});\n            }\n        } else {\n            box.css({height: height});\n            if (dir == 4) {\n                innerBox.css({left: -width});\n                box.css({right: 0, left: \"auto\"});\n            }\n        }\n        // <FF css animation fix>\n        both.show();\n        if (vertical) {\n            both.width(width);\n        } else {\n            both.height(height);\n        }\n        // </FF css animation fix>\n        animate(innerBox, {left: 0, top: 0}, speed, FALSE, EMPTY_FUNCTION, obj);\n        animate(box, {width: width, height: height}, speed, FALSE, obj.callback, obj);\n    }\n\n    function slide(obj) {\n        var ul = childrenNotAnimationClones(obj.slider);\n        var options = obj.options;\n        var speed = options.speed;\n        var target = obj.target;\n\n        var left = target.left;\n        var top = target.top;\n\n        if (obj.options.usecss) {\n            animate(ul, {transform: \"translate(\" + left + \"px, \" + top + \"px)\"}, speed, FALSE, obj.callback, obj, TRUE);\n        } else {\n            animate(ul, {marginTop: top, marginLeft: left}, speed, FALSE, obj.callback, obj);\n        }\n    }\n\n    function animate(elem, properties, speed, ease, callback, obj, doNotResetCss) {\n        var usecss = !obj || obj.options.usecss;\n        if (CSSVendorPrefix === FALSE || !usecss) {\n            if (!ease) {\n                ease = obj.options.ease;\n            }\n            elem.animate(properties, speed, ease, callback);\n            return;\n        }\n        if (!ease) {\n            ease = obj.options.cssease;\n        }\n\n        var CSSObject = {};\n        var transitionProperty = CSSVendorPrefix + \"transition\";\n        var keys = getKeys(properties);\n        // Adding vendor prefix, because sometimes it's needed.\n        CSSObject[transitionProperty] = keys.join(\" \") + (CSSVendorPrefix == \"\" ? \"\" : \" \" + CSSVendorPrefix + keys.join(\" \" + CSSVendorPrefix));\n\n        var transitionTiming = transitionProperty + \"-duration\";\n        CSSObject[transitionTiming] = speed + \"ms\";\n\n        var transitionEase = transitionProperty + \"-timing-function\";\n        if (ease == SWING) {\n            ease = \"ease-in-out\";\n        }\n        CSSObject[transitionEase] = ease;\n\n        function resetCSS() {\n            if (!doNotResetCss) {\n                var cssObject = {};\n                cssObject[transitionTiming] = \"0s\";\n                cssObject[transitionEase] = \"\";\n                cssObject[transitionProperty] = \"\";\n                elem.css(cssObject);\n            }\n        }\n\n        if (obj) {\n            obj.stopCallbacks.push(resetCSS);\n        }\n\n        var eventsVendorPrefix = CSSVendorPrefix.replace(/\\-/g, \"\"); // replaces all \"-\" with \"\";\n        var eventsSuffix = (eventsVendorPrefix ? \"T\" : \"t\") + \"ransitionend\";\n        var events = eventsVendorPrefix + eventsSuffix + \" t\" + \"ransitionend\";\n\n        var called = FALSE;\n        var callbackFunction = function () {\n            if (!called) {\n                called = TRUE;\n                elem.unbind(events);\n                resetCSS();\n                if (callback) {\n                    callback();\n                }\n            }\n        };\n\n        if (speed < 20) { // If instant animation.\n            elem.css(properties);\n            callbackFunction();\n            return;\n        }\n\n        callAsync(function () {\n            elem.css(CSSObject);\n            callAsync(function () {\n                elem.css(properties);\n                var startTime = getTimeInMillis();\n\n                elem.on(events, function eventHandler(event) {\n                    if (elem.is(event.target) && (getTimeInMillis() - startTime) - speed > -100) {\n                        elem.off(events, eventHandler);\n                        callbackFunction();\n                    }\n                });\n                // If the animation doesn't do anything, the bind will never be triggered, so this is a fallback.\n                schedule(callbackFunction, speed + 100);\n            });\n        });\n        return callbackFunction\n    }\n\n    function fadeOutIn(obj) {\n        var options = obj.options;\n        var fadeSpeed = options.speed;\n\n        var fadeinspeed = parseInt10(fadeSpeed * (3 / 5));\n        var fadeoutspeed = fadeSpeed - fadeinspeed;\n\n        obj.stopCallbacks.push(function () {\n            obj.fromSlides.stop().css({opacity: 1});\n        });\n\n        animate(obj.fromSlides, {opacity: 0.0001}, fadeoutspeed, FALSE, makeCallback(finishFadeAnimation, [obj, fadeSpeed]), obj);\n    }\n\n    function fade(obj) {\n        finishFadeAnimation(obj, obj.options.speed);\n    }\n\n    function finishFadeAnimation(obj, speed) {\n        var options = obj.options;\n        options.boxcols = 1;\n        options.boxrows = 1;\n        options.speed = speed;\n        boxTemplate(obj, FALSE);\n    }\n\n    // 1: up, 2: right, 3: down, 4, left:\n    function getDirFromAnimationObject(obj) {\n        var vertical = obj.options.vertical;\n        var diff = obj.diff;\n        var dir;\n        if (vertical) {\n            if (diff < 0) {\n                dir = 1;\n            } else {\n                dir = 3;\n            }\n        } else {\n            if (diff < 0) {\n                dir = 2;\n            } else {\n                dir = 4;\n            }\n        }\n        return dir;\n    }\n\n    function createLazyBoxes(obj, numberOfCols, numberOfRows, useToSlides) {\n        var slider = obj.slider;\n        var vertical = obj.options.vertical;\n        var result = [];\n        var width;\n        if (!vertical) {\n            width = 0;\n        } else {\n            if (useToSlides) {\n                width = obj.toSlides.width();\n            } else {\n                width = obj.slider.width();\n            }\n        }\n\n        var height;\n        if (vertical) {\n            height = 0;\n        } else {\n            if (useToSlides) {\n                height = obj.toSlides.height();\n            } else {\n                height = obj.slider.height();\n            }\n        }\n\n        obj.toSlides.each(function () {\n            var that = $(this);\n            if (vertical) {\n                height += that.height();\n            } else {\n                width += that.width();\n            }\n        });\n\n        var boxWidth = Math.ceil(width / numberOfCols);\n        var boxHeight = Math.ceil(height / numberOfRows);\n        for (var row = 0; row < numberOfRows; row++) {\n            for (var col = 0; col < numberOfCols; col++) {\n                doStuff(row, col);\n            }\n        }\n        function doStuff(row, col) {\n            result.push(function () {\n                var innerBox = makeClone(obj, useToSlides);\n\n                var box = createBox(innerBox, boxHeight * row, boxWidth * col, boxHeight, boxWidth);\n                slider.append(box);\n                return box;\n            });\n        }\n        return result;\n    }\n\n    function createBox(innerBox, top, left, height, width) {\n        innerBox.css({\n            width: innerBox.width(),\n            height: innerBox.height(),\n            display: \"block\",\n            top: -top,\n            left: -left\n        });\n        return $(DIV_TAG).css({\n            left: left,\n            top: top,\n            width: width,\n            height: height,\n            opacity: 0,\n            overflow: HIDDEN_STRING,\n            position: ABSOLUTE_STRING\n        }).append(innerBox).addClass(ANIMATION_CLONE_MARKER_CLASS);\n    }\n\n    // Makes a single box that contains clones of the toSlides/fromSlides. Positioned correctly relative to each other. And the returned box has the correct height and width.\n    function makeClone(obj, useToSlides) {\n        var slides = useToSlides ? obj.toSlides : obj.fromSlides;\n        var firstSlidePosition = slides.eq(0).position();\n        var orgLeft = firstSlidePosition.left;\n        var orgTop = firstSlidePosition.top;\n        var height = 0;\n        var width = 0;\n        var result = $(DIV_TAG).css({\n            position: ABSOLUTE_STRING,\n            top: 0,\n            left: 0\n        }).addClass(ANIMATION_CLONE_MARKER_CLASS);\n        slides.each(function (index, elem) {\n            var that = $(elem);\n            var cloneWidth = that.outerWidth(TRUE);\n            var cloneHeight = that.outerHeight(TRUE);\n            var clone = that.clone();\n            var position = that.position();\n            var left = position.left - orgLeft;\n            var top = position.top - orgTop;\n            clone.css({position: ABSOLUTE_STRING, left: left, top: top, opacity: 1});\n            height = mathMax(height, top + cloneHeight);\n            width = mathMax(width, left + cloneWidth);\n            result.append(clone);\n        });\n        result.width(width).height(height);\n        return result;\n    }\n\n    /*\n     * Util scripts.\n     */\n\n    // This is not deep equals, and only using ==\n    function simpleObjectEquals(a, b) {\n        if (getKeys(a).length != getKeys(b).length) {\n            return FALSE;\n        }\n        for (var key in a) {\n            if (a[key] != b[key]) {\n                return FALSE;\n            }\n        }\n        return TRUE;\n    }\n\n    function makeCallback(func, args) {\n        return function () {\n            func.apply(undefined, args);\n        }\n    }\n\n    function runOnImagesLoaded(target, waitForAllImages, callback) {\n        if (!target) {\n            callback();\n            return;\n        }\n        var elems = target.add(target.find(\"img\")).filter(\"img\");\n        var numberOfRemainingImages = elems.length;\n        if (!numberOfRemainingImages) {\n            callback();\n            return;\n        }\n\n        elems.each(function () {\n            var that = this;\n            var jQueryThat = $(that);\n            var events = \"load error\";\n            var loadFunction = function () {\n                jQueryThat.off(events, loadFunction);\n                numberOfRemainingImages--;\n                if (waitForAllImages) {\n                    if (numberOfRemainingImages == 0) {\n                        callback();\n                    }\n                } else {\n                    callback();\n                }\n            };\n            jQueryThat.on(events, loadFunction);\n            /*\n             * Start ugly working IE fix.\n             */\n            if (that.readyState == \"complete\") {\n                jQueryThat.trigger(\"load\");\n            } else if (that.readyState) {\n                // Sometimes IE doesn't fire the readystatechange, even though the readystate has been changed to complete. AARRGHH!! I HATE IE, I HATE IT, I HATE IE!\n                that.src = that.src; // Do not ask me why this works, ask the IE team!\n            }\n            /*\n             * End ugly working IE fix.\n             */\n            else if (that.complete) {\n                jQueryThat.trigger(\"load\");\n            }\n            else if (that.complete === undefined) {\n                var src = that.src;\n                // Webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f.\n                // Data uri bypasses webkit log warning (thx doug jones).\n                that.src = \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==\";\n                that.src = src;\n            }\n        });\n    }\n\n    // The minVersion is specified in an array, like [1, 8, 0] for 1.8.\n    // Partially copy-pasted from: https://gist.github.com/dshaw/652870.\n    function minJQueryVersion(minVersion) {\n        var version = $.fn.jquery.split(\".\");\n        var length = version.length\n        for (var a = 0; a < length; a++) {\n            if (minVersion[a] && +version[a] < +minVersion[a]) {\n                return FALSE;\n            }\n        }\n        return TRUE;\n    }\n\n    function getVendorPrefixedProperty(property, searchElement) {\n        for (var name in searchElement) {\n            if (endsWith(name.toLowerCase(), property.toLowerCase())) {\n                return name;\n            }\n        }\n        return FALSE;\n    }\n\n    function getCSSVendorPrefix() {\n        var property = \"transition\";\n        var styleName = getVendorPrefixedProperty(property, $(DIV_TAG)[0].style);\n        if (styleName === FALSE) {\n            return FALSE;\n        }\n        var prefix = styleName.slice(0, styleName.length - property.length);\n        if (prefix.length != 0) {\n            return \"-\" + prefix + \"-\";\n        }\n        return \"\";\n    }\n\n    function stringTrim(str) {\n        return str.replace(/^\\s+|\\s+$/g, '');\n    }\n\n    function endsWith(string, suffix) {\n        return string.indexOf(suffix, string.length - suffix.length) !== -1;\n    }\n\n    function getKeys(obj) {\n        var keys = [];\n        for (var key in obj) {\n            keys.push(key);\n        }\n        return keys;\n    }\n\n    // Puts the specified function in a setTimeout([function], 0);\n    function callAsync(func) {\n        schedule(func, 0);\n    }\n\n    function schedule(func, time) {\n        return setTimeout(func, time);\n    }\n\n    function matches(string, patternWithWildCards) {\n        return !!string.match(new RegExp(\"^\" + patternWithWildCards.split(\"*\").join(\".*\") + \"$\", \"g\"));\n    }\n\n    function startsWith(string, prefix) {\n        return string.indexOf(prefix) == 0;\n    }\n\n    function cloneArray(arrayToClone) {\n        return arrayToClone.slice();\n    }\n\n    // This mutates the given array, so that it is reversed.\n    // It also returns it.\n    function reverseArray(array) {\n        return [].reverse.call(array);\n    }\n\n    function childrenNotAnimationClones(obj) {\n        return obj.children().not(\".\" + ANIMATION_CLONE_MARKER_CLASS);\n    }\n\n    function objectToLowercase(obj) {\n        var ret = {};\n        for (var key in obj)\n            ret[key.toLowerCase()] = obj[key];\n        return ret;\n    }\n\n    // Mutates and returns the array.\n    function shuffle(array) {\n        for (var j, x, i = array.length; i; j = (Math.random() * i) | 0, x = array[--i], array[i] = array[j], array[j] = x) {\n        }\n        return array;\n    }\n\n    function isFunction(func) {\n        return $.isFunction(func);\n    }\n\n    function isArray(object) {\n        return $.isArray(object);\n    }\n\n    function parseInt10(num) {\n        return parseInt(num, 10);\n    }\n\n    function parseNumber(num) {\n        return parseFloat(num);\n    }\n\n    function getTimeInMillis() {\n        return +new Date();\n    }\n\n    // Actual modulo, not remainder. From here: http://stackoverflow.com/questions/4467539/javascript-modulo-not-behaving\n    // Added a or zero, to ensure it returns a number.\n    function mod(a, n) {\n        return (((a % n) + n) % n) || 0;\n    }\n\n    function mathAbs(number) {\n        return number < 0 ? -number : number;\n    }\n\n    function mathMax(a, b) {\n        return a > b ? a : b;\n    }\n\n    function mathMin(a, b) {\n        return a < b ? a : b;\n    }\n\n    function getEffectMethod(inputEffect) {\n        if (isArray(inputEffect)) {\n            return makeRandomEffect(inputEffect);\n        } else if (isFunction(inputEffect)) {\n            return inputEffect\n        } else /* if (typeof inputEffect === \"string\") */{\n            inputEffect = stringTrim(inputEffect);\n            if (inputEffect.indexOf(\",\") != -1) {\n                var array = inputEffect.split(\",\");\n                return makeRandomEffect(array);\n            } else {\n                var effects = objectToLowercase(allEffects);\n                var effectName = stringTrim(inputEffect.toLowerCase());\n                var result = effects[effectName];\n                if (result) {\n                    return result;\n                } else {\n                    var array = [];\n                    for (var name in effects) {\n                        if (matches(name, effectName)) {\n                            array.push(effects[name]);\n                        }\n                    }\n                    if (!array.length) {\n                        return slide;\n                    }\n                    return makeRandomEffect(array);\n                }\n            }\n        }\n    }\n\n    function makeRandomEffect(array) {\n        return function (obj) {\n            var effect = pickRandomValue(array);\n            return getEffectMethod(effect)(obj);\n        }\n    }\n\n    function pickRandomValue(obj) {\n        return obj[shuffle(getKeys(obj))[0]];\n    }\n\n    var requestAnimationFrame = function(callback, frameCount){\n        var equestAnimationFrame = \"equestAnimationFrame\";\n        var requestWindow = win[\"r\" + equestAnimationFrame] ||\n            win[\"webkitR\" + equestAnimationFrame] ||\n            win[\"mozR\" + equestAnimationFrame] ||\n            win[\"oR\" + equestAnimationFrame] ||\n            win[\"msR\" + equestAnimationFrame] ||\n            function (callback) {\n                schedule(callback, 1000 / 60);\n            };\n        if (frameCount) {\n            requestWindow(makeCallback(recursive, [callback, frameCount - 1]));\n        } else {\n            requestWindow(callback);\n        }\n    };\n\n    // From this guy: https://github.com/rdallasgray/bez.\n    // Inlined into my own script to make it shorter.\n    function makeBezier(coOrdArray) {\n        var encodedFuncName = \"bez_\" + coOrdArray.join(\"_\").replace(/\\./g, \"p\");\n        var jqueryEasing = $.easing;\n        if (!isFunction(jqueryEasing[encodedFuncName])) {\n            var polyBez = function (p1, p2) {\n                var A = [0, 0];\n                var B = [0, 0];\n                var C = [0, 0];\n\n                function bezCoOrd(t, ax) {\n                    C[ax] = 3 * p1[ax], B[ax] = 3 * (p2[ax] - p1[ax]) - C[ax], A[ax] = 1 - C[ax] - B[ax];\n                    return t * (C[ax] + t * (B[ax] + t * A[ax]));\n                }\n\n                function xDeriv(t) {\n                    return C[0] + t * (2 * B[0] + 3 * A[0] * t);\n                }\n\n                function xForT(t) {\n                    var x = t, i = 0, z;\n                    while (++i < 14) {\n                        z = bezCoOrd(x, 0) - t;\n                        if (mathAbs(z) < 1e-3) break;\n                        x -= z / xDeriv(x);\n                    }\n                    return x;\n                }\n\n                return function (t) {\n                    return bezCoOrd(xForT(t), 1);\n                }\n            };\n            jqueryEasing[encodedFuncName] = function (x, t, b, c, d) {\n                return c * polyBez([coOrdArray[0], coOrdArray[1]], [coOrdArray[2], coOrdArray[3]])(t / d) + b;\n            }\n        }\n        return encodedFuncName;\n    }\n});\n// If you did just read the entire code, congrats.\n// Did you find a bug? I didn't, so plz tell me if you did. (https://github.com/webbiesdk/SudoSlider/issues).\n// You can use this fiddle: http://jsfiddle.net/32m7bhtn/ as a starting point if you want to create a snall test-case for me."],"names":["factory","root","self","global","define","amd","$","exports","require","jQuery","win","EMPTY_FUNCTION","CSSVendorPrefix","styleName","property","searchElement","name","endsWith","toLowerCase","getVendorPrefixedProperty","style","prefix","slice","length","getCSSVendorPrefix","jWin","doc","document","TOUCHSTART","TOUCHMOVE","TOUCHCANCEL","TOUCHEND","MOUSEDOWN","MOUSEMOVE","MOUSEUP","getDefaultOptions","effect","speed","customLink","controlsFadeSpeed","controlsFade","insertAfter","vertical","slideCount","moveCount","startSlide","responsive","ease","auto","pause","resumePause","continuous","prevNext","numeric","numericText","slices","boxCols","boxRows","initCallback","ajaxLoad","beforeAnimation","afterAnimation","history","autoHeight","autoWidth","updateBefore","ajax","preloadAjax","loadingText","prevHtml","nextHtml","controlsAttr","numericAttr","interruptible","useCSS","loadStart","loadFinish","touch","touchHandle","destroyCallback","mouseTouch","allowScroll","CSSease","ajaxHasHTML","fn","sudoSlider","optionsOrg","baseSlider","this","extend","objectToLowercase","minVersion","version","jquery","split","a","minJQueryVersion","usecss","each","init","isSlideContainerUl","slidesContainer","slides","imagesInSlidesLoaded","totalSlides","currentSlide","clickable","currentlyAnimatingTowards","numericControls","numericContainer","destroyed","controls","nextbutton","prevbutton","autoTimeout","autoOn","numberOfVisibleSlides","asyncDelayedSlideLoadTimeout","adjustingTo","currentAnimation","currentAnimationCallback","currentAnimationObject","runAfterAnimationCallbacks","awaitingAjaxCallbacks","startedAjaxLoads","finishedAjaxLoads","animateToAfterCompletionClicked","animateToAfterCompletionSpeed","currentSliderPositionTop","currentSliderPositionLeft","fullyInitialized","slideNumberBeforeDestroy","obj","adjustTargetTime","currentlyAnimating","animateToAfterCompletion","slideContainerCreated","option","options","unBindCallbacks","autoStartedWithPause","animationWasInterrupted","initSudoSlider","optionIndex","key","ulLength","childrenNotAnimationClones","newUl","is","hasClass","append","slidesJquery","index","elem","that","css","position","addClass","attr","numerOfAjaxUrls","tag","slide","runOnImagesLoaded","overflow","listStyle","add","display","margin","adjustPositionToPosition","parseInt10","Math","random","getEffectMethod","adjustResponsiveLayout","bindAndRegisterOff","prepend","usePages","distanceBetweenPages","appendTo","click","enqueueAnimation","getTargetAttribute","makecontrol","fadeControls","optionsToConvert","i","textSpeedToNumber","filter","stringTrim","charAt","customLinkClickHandler","substr","getSlides","goToSlide","hashPlugin","hashchange","URLChange","address","change","setCurrent","startAsyncDelayedLoad","target","stopAuto","startAuto","previousAdjustedResponsiveWidth","forced","doTheAdjustment","cantDoAdjustments","width","subPixelNewWidth","newWidth","addAPixelEvery","slideCounter","stopAnimation","ensureSliderContainerCSSDurationReset","adjustPositionTo","autoadjust","callAsync","schedule","hashString","location","hash","getUrlHashTarget","preloadAjaxTime","clearTimeout","undefined","dataPause","mathMax","autoPossibleStillOn","html","action","prependTo","direction","clicked","dir","filterDir","targetSlide","getRealPos","waitCounter","loadSlide","realLoadSlide","isContentInSlideReady","call","performAnimation","loadSlidesAndAnimate","fadeControl","fadeOpacity","fadetime","nextcontrol","fadeElement","filterString","filtered","adjustObject","opacity","callback","visibility","animate","queue","duration","easing","control","setCurrentElement","element","removeClass","elementTarget","getTimeInMillis","ready","adjustHeightWidth","makeCallback","autoHeightWidth","getSliderDimensions","fromSlide","pixels","targetPixels","prevHeightWidthAdjustObject","height","b","getKeys","simpleObjectEquals","stop","getSlidePosition","left","top","both","transform","setMargins","marginLeft","marginTop","callQueuedAnimation","animateTo","aniCall","after","synchronous","func","afterAniCall","beforeAniCall","el","limitDir","maxSlide","ajaxCallBack","callbackList","push","targetslide","succesRan","url","success","data","textStatus","jqXHR","runWhenNotAnimating","type","getResponseHeader","ajaxAdjust","loadImage","complete","image","Image","src","empty","completeFunction","img","performCallbacks","performInitCallback","centerTargetSlideAfter","easingToUse","initialOffsetLeft","initialOffsetTop","startTime","lastTime","lastDistance","body","runningTouchEffect","prevEffect","cssease","currentTouchSlide","baseDistance","distanceToRightSlide","correctionWhenCalculatingWhereToMoveTouchDistance","bufferSize","positionsBuffer","timeBuffer","bufferIndex","touchStart","x","y","distance","mathAbs","currentSlidePosition","touchMove","distanceAbs","newTime","rightSlidePositionBefore","rightSlidePositionAfter","moveBaseDistance","touchEnd","slideDimensions","currentTime","time","bufferDistance","thisTime","goToAnotherSlide","distanceLeft","mod","timeLeft","timeFromSpeed","timeFromDistance","cubicBezierY","mathMin","cubicBezierX","coOrdArray","encodedFuncName","join","replace","jqueryEasing","isFunction","polyBez","p1","p2","A","B","C","bezCoOrd","t","ax","xDeriv","xForT","z","c","d","makeBezier","startedTouch","startX","startY","prevX","prevY","dragFunction","event","startEvent","endEvent1","endEvent2","isMouseEvent","originalEvent","eventTarget","parents","pageX","pageY","touches","preventDefault","isGeneralDirectionVertical","setUpTouch","callbacks","splice","reorderedSlidesToStartFromSlide","reorderSlides","slideToInsert","centerTargetSlideAdjusted","extraSpace","skipPreCenterTargetSlide","fromSlides","toSlides","diff","diffAbs","newDiff","centerTargetSlideBefore","leftTarget","topTarget","targetLi","callOptions","overwritingSpeed","attributeSpeed","slideSpecificEffect","slideOutSpecificEffect","specificEffectAttrName","callbackHasYetToRun","screen","fontSmoothingEnabled","removeAttribute","ignored","fixClearType","slider","container","to","from","stopCallbacks","goToNext","stopFunction","remove","events","handler","selector","on","off","adjust","count","visibleSlides","publicDestroy","publicInit","runOnDestroyedSlider","foo","reinit","apply","arguments","args","destroy","getOption","setOption","val","setOptions","newOptions","insertSlide","pos","numtext","removeSlide","block","unblock","adjustMethod","repeat","autoAdjustSpeed","getValue","currentslide","totalslides","autoanimation","getSlide","number","normalEffectsPrefixObject","fade","finishFadeAnimation","OutIn","fadeSpeed","fadeinspeed","fadeoutspeed","foldRandom","foldTemplate","stack","reverse","pushIn","pushTemplate","parsePrefixedEffects","resultObject","effectsObject","generic","argumentsStack","argumentArray","concat","genericArgumentIndex","getDirFromAnimationObject","isArray","effectIndex","newArgumentStack","allEffects","boxTemplate","reverseRows","grow","randomize","selectionAlgorithm","flyIn","reveal","roundedGrow","boxrows","boxcols","totalBoxes","boxes","createLazyBoxes","timeBuff","rowIndex","colIndex","box2DArr","reverseArray","shuffle","boxesResult","cols","prevCol","boxesResultLine","rows","rawBox","rows2","n","negative","row","col","boxLine","j","lazyBox","delay","boxAnimationFunction","box","boxChildren","children","orgWidth","orgHeight","goToWidth","goToHeight","orgLeft","parseNumber","orgTop","goToLeft","goToTop","childOrgLeft","childOrgTop","childGoToLeft","childGoToTop","adjustTop","adjustLeft","pickRandomValue","borderRadius","onlyFade","curtainEffect","upDownEffect","objSlider","lazySlides","slicesElement","upDownAlternator","get","timeout","startPosition","startAdjustment","bottom","right","makeClone","hide","show","measurementSlides","ul","properties","doNotResetCss","CSSObject","transitionProperty","keys","transitionTiming","transitionEase","resetCSS","cssObject","eventsVendorPrefix","called","callbackFunction","unbind","eventHandler","numberOfCols","numberOfRows","useToSlides","result","boxWidth","ceil","boxHeight","doStuff","createBox","innerBox","firstSlidePosition","eq","cloneWidth","outerWidth","cloneHeight","outerHeight","clone","waitForAllImages","elems","find","numberOfRemainingImages","jQueryThat","loadFunction","readyState","trigger","str","string","suffix","indexOf","setTimeout","array","not","ret","object","num","parseInt","parseFloat","Date","inputEffect","makeRandomEffect","effects","effectName","patternWithWildCards","match","RegExp","blinds","blindsEffect","fold","Fade","zip","unzip"],"mappings":"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"}