מדיה ויקי:MultiSlider.js: הבדלים בין גרסאות בדף
מתוך מכביפדיה
אין תקציר עריכה
אין תקציר עריכה
שורה 7: שורה 7:
*/
*/
$(document).ready(function () {
$(document).ready(function () {
    (function ($) {
(function($){


        // ==== BEGINS PLUGGIN ====
    // ==== BEGINS PLUGGIN ====
        $.fn.multislider = function (data, callback) {
    $.fn.multislider = function(data, callback){


            // ==== CACHE DOM ====
        // ==== CACHE DOM ====
            var $multislider = $(this);
        var $multislider = $(this);
            var $msContent = $multislider.find('.nmpIndexSliderContent');
        var $msContent = $multislider.find('.nmpIndexSliderContent');
            var $msRight = $multislider.find('button.nmpIndexSliderButtonRight');
        var $msRight = $multislider.find('.nmpIndexSliderButtonRight');
            var $msLeft = $multislider.find('button.nmpIndexSliderButtonLeft');
        var $msLeft = $multislider.find('.nmpIndexSliderButtonLeft');
            var $imgFirst = $msContent.find('.nmpIndexSliderItem:first');
        var $imgFirst = $msContent.find('.nmpIndexSliderItem:first');


            // === DETERMINE ACTION ====
        // === DETERMINE ACTION ====
            // string = method | object or nothing is to initialize
        // string = method | object or nothing is to initialize
            if (typeof data === 'string') {
        if(typeof data === 'string'){
                getStringArgs(data);
            getStringArgs(data);
                return $multislider;
            return $multislider;
            } else if (typeof data === 'object' || typeof data === 'undefined') {
        } else if (typeof data === 'object' || typeof data ==='undefined'){
                init();
            init();
            }
        }


            // ==== PLUGGIN VARIABLES ====
        // ==== PLUGGIN VARIABLES ====
            var $imgLast,
        var $imgLast,
                totalWidth,
        totalWidth,
                numberVisibleSlides,
        numberVisibleSlides,
                animateDistance,
        animateDistance,
                animateSlideRight,
        animateSlideRight,
                animateSlideLeft,
        animateSlideLeft,
                defaults,
        defaults,
                settings,
        settings,
                animateDuration,
        animateDuration,
                autoSlideInterval;
        autoSlideInterval;


            // = INITIALIZE =
        // = INITIALIZE =
            function init() {
        function init(){
                minifyContent();        // minify html
            minifyContent();        // minify html
                createSettings();      // merge defaults and user provided options
            createSettings();      // merge defaults and user provided options
                saveData();            // add data object to DOM el with reference to animation functions, allows for methods to reference at any time
            saveData();            // add data object to DOM el with reference to animation functions, allows for methods to reference at any time
                selectAnimations();    // choose default animation
            selectAnimations();    // choose default animation
            }
        }




            // ==== EVENT HANDLERS ====
        // ==== EVENT HANDLERS ====
            $msRight.on('click', animateSlideRight);
        $msRight.on('click', animateSlideLeft);
            $msLeft.on('click', animateSlideLeft);
        $msLeft.on('click', animateSlideRight);
            $multislider.on('click', '.nmpIndexSliderButtonRight, .nmpIndexSliderButtonLeft', resetInterval);
        $multislider.on('click','.nmpIndexSliderButtonRight, .nmpIndexSliderButtonLeft', resetInterval);
            $(window).on('resize', findItemWidth);
        $(window).on('resize', findItemWidth);




            // ==== FUNCTIONS (for days...) ====
        // ==== FUNCTIONS (for days...) ====
            // =================================
        // =================================


            function pauseAbove() {
        function pauseAbove(){
                if (window.innerWidth > settings.pauseAbove) { $multislider.addClass('ms-PAUSE'); }
            if (window.innerWidth > settings.pauseAbove){ $multislider.addClass('ms-PAUSE'); }
                $(window).on('resize', function () {
            $(window).on('resize',function(){
                    if (window.innerWidth > settings.pauseAbove) {
                if (window.innerWidth > settings.pauseAbove){
                        $multislider.addClass('ms-PAUSE');
                     $multislider.addClass('ms-PAUSE');
                     } else {
                        $multislider.removeClass('ms-PAUSE');
                    }
                });
            }
 
            function pauseBelow() {
                if (window.innerWidth < settings.pauseBelow) { $multislider.addClass('ms-PAUSE'); }
                $(window).on('resize', function () {
                    if (window.innerWidth < settings.pauseBelow) {
                        $multislider.addClass('ms-PAUSE');
                    } else {
                        $multislider.removeClass('ms-PAUSE');
                    }
                });
            }
 
            // used if method is called after initialization
            function getStringArgs(str) {
                if (typeof $multislider.data(str) !== 'undefined') {
                    $multislider.data(str)();
                 } else {
                 } else {
                     console.error("Multislider currently only accepts the following methods: next, prev, pause, play");
                     $multislider.removeClass('ms-PAUSE');
                 }
                 }
             }
             });
        }


            // saves data object to DOM element
        function pauseBelow(){
            function saveData() {
            if (window.innerWidth < settings.pauseBelow){ $multislider.addClass('ms-PAUSE'); }
                $multislider.data({
            $(window).on('resize',function(){
                    "pause": function () { $multislider.addClass('ms-PAUSE'); },
                 if (window.innerWidth < settings.pauseBelow){
                    "unPause": function () { $multislider.removeClass('ms-PAUSE'); },
                    "continuous": function () { $multislider.removeClass('ms-PAUSE'); continuousLeft(); },
                    "next": function () { overRidePause(singleLeft); },
                    "nextAll": function () { overRidePause(allLeft); },
                    "prev": function () { overRidePause(singleRight); },
                    "prevAll": function () { overRidePause(allRight); },
                    "settings": settings
                });
            }
 
            // used when calling 'next', 'prev' methods
            function overRidePause(animation) {
                 if ($multislider.hasClass('ms-PAUSE')) {
                    $multislider.removeClass('ms-PAUSE');
                    animation();
                     $multislider.addClass('ms-PAUSE');
                     $multislider.addClass('ms-PAUSE');
                 } else {
                 } else {
                     animation();
                     $multislider.removeClass('ms-PAUSE');
                 }
                 }
                 resetInterval();
            });
        }
 
        // used if method is called after initialization
        function getStringArgs(str){
            if (typeof $multislider.data(str) !== 'undefined'){
                $multislider.data(str)();
            } else {
                 console.error("Multislider currently only accepts the following methods: next, prev, pause, play");
             }
             }
        }


            // CRITICAL for items to be perfectly side-by-side without floating them
        // saves data object to DOM element
             function minifyContent() {
        function saveData(){
                 $msContent.contents().filter(function () {
             $multislider.data({
                    return (this.nodeType == 3 && !/\S/.test(this.nodeValue));
                "pause":function(){ $multislider.addClass('ms-PAUSE'); },
                 }).remove();
                 "unPause":function(){ $multislider.removeClass('ms-PAUSE'); },
                "continuous":function(){ $multislider.removeClass('ms-PAUSE'); continuousLeft(); },
                "next":function(){ overRidePause(singleLeft); },
                "nextAll":function(){ overRidePause(allLeft); },
                "prev":function(){ overRidePause(singleRight); },
                "prevAll":function(){ overRidePause(allRight); },
                "settings":settings
            });
        }
 
        // used when calling 'next', 'prev' methods
        function overRidePause(animation){
            if ($multislider.hasClass('ms-PAUSE')){
                $multislider.removeClass('ms-PAUSE');
                animation();
                 $multislider.addClass('ms-PAUSE');
            } else {
                animation();
             }
             }
            resetInterval();
        }


            // updated options with defaults, measure slide widths for animation calculations, carry out setting implementations
        // CRITICAL for items to be perfectly side-by-side without floating them
             function createSettings() {
        function minifyContent(){
                 defaults = settings || {
             $msContent.contents().filter(function(){
                    continuous: false, // endless scrolling with no pauses
                 return (this.nodeType == 3 && !/\S/.test(this.nodeValue));
                    slideAll: false, // slide all visible slides, or just one at a time
            }).remove();
                    // autoSlide: true, // DEPRECATED
        }
                    interval: 2000, // time bewteen slide animation, 0 or 'false' prevents auto-sliding
                    duration: 500,     // duration of slide animation
                    hoverPause: true, // pause slideshow on hover
                    pauseAbove: null,  // pause above specified screen width
                    pauseBelow: null    // pause below specified screen width
                };


                settings = $.extend({}, defaults, data);
        // updated options with defaults, measure slide widths for animation calculations, carry out setting implementations
        function createSettings() {
            defaults = settings || {
    continuous: false, // endless scrolling with no pauses
    slideAll: false, // slide all visible slides, or just one at a time
    // autoSlide: true, // DEPRECATED
    interval: 2000, // time bewteen slide animation, 0 or 'false' prevents auto-sliding
    duration: 500,     // duration of slide animation
    hoverPause: true, // pause slideshow on hover
                pauseAbove: null,   // pause above specified screen width
                pauseBelow: null    // pause below specified screen width
    };


                findItemWidth();
    settings = $.extend({},defaults,data);
                animateDuration = settings.duration;


                if (settings.hoverPause) { pauseHover(); }
            findItemWidth();
                // autoSlide is being depricated | Feb 2 2017
            animateDuration = settings.duration;
                if (settings.continuous !== true && settings.interval !== 0 && settings.interval !== false && settings.autoSlide !== false) { autoSlide(); }
                if (settings.pauseAbove !== null && typeof settings.pauseAbove === 'number') { pauseAbove(); }
                if (settings.pauseBelow !== null && typeof settings.pauseBelow === 'number') { pauseBelow(); }
            }


             // determine between single and multi-slide animations
            if (settings.hoverPause){pauseHover();}
             function selectAnimations() {
             // autoSlide is being depricated | Feb 2 2017
                if (settings.continuous) {
             if (settings.continuous !== true && settings.interval !== 0 && settings.interval !== false && settings.autoSlide !== false){autoSlide();}
                    settings.autoSlide = false;
            if (settings.pauseAbove !== null && typeof settings.pauseAbove === 'number'){ pauseAbove(); }
                    continuousLeft();
            if (settings.pauseBelow !== null && typeof settings.pauseBelow === 'number'){ pauseBelow(); }
                } else if (settings.slideAll) {
        }
                    animateSlideRight = $multislider.data('prevAll');
                    animateSlideLeft = $multislider.data('nextAll');
                } else {
                    animateSlideRight = $multislider.data('prev');
                    animateSlideLeft = $multislider.data('next');
                }
            }


            // measure slide width, for animation calculations
        // determine between single and multi-slide animations
            function findItemWidth() {
        function selectAnimations () {
                reTargetSlides();
            if (settings.continuous){
                 animateDistance = $imgFirst.width();
                settings.autoSlide = false;
                 var left = parseInt($msContent.find('.nmpIndexSliderItem:first').css('padding-left'));
                 continuousLeft();
                 var right = parseInt($msContent.find('.nmpIndexSliderItem:first').css('padding-right'));
            } else if (settings.slideAll){
                 if (left !== 0) { animateDistance += left; }
                 animateSlideRight = $multislider.data('prevAll');
                if (right !== 0) { animateDistance += right; }
                animateSlideLeft = $multislider.data('nextAll');
            } else {
                 animateSlideRight = $multislider.data('prev');
                 animateSlideLeft = $multislider.data('next');
             }
             }
        }


            // recursive auto-slide loop
        // measure slide width, for animation calculations
            function autoSlide() {
        function findItemWidth(){
                autoSlideInterval = setInterval(function () {
            reTargetSlides();
                    if (!$multislider.hasClass('ms-PAUSE')) {
            animateDistance = $imgFirst.width();
                        animateSlideLeft();
            var left = parseInt($msContent.find('.nmpIndexSliderItem:first').css('padding-left'));
                    }
            var right = parseInt($msContent.find('.nmpIndexSliderItem:first').css('padding-right'));
                }, settings.interval);
            if (left !== 0){animateDistance += left;}
            }
            if (right !== 0){animateDistance += right;}
        }


             function resetInterval() {
        // recursive auto-slide loop
                 if (settings.interval !== 0 && settings.interval !== false && settings.continuous !== true) {
        function autoSlide() {
                     clearInterval(autoSlideInterval);
             autoSlideInterval = setInterval(function(){
                    autoSlide();
                 if (!$multislider.hasClass('ms-PAUSE')){
                     animateSlideLeft();
                 }
                 }
            }, settings.interval);
        }
        function resetInterval() {
            if (settings.interval !== 0 && settings.interval !== false && settings.continuous !== true){
                clearInterval(autoSlideInterval);
                autoSlide();
             }
             }
        }


            // target first and last visible slides before each new animation
        // target first and last visible slides before each new animation
            function reTargetSlides() {
        function reTargetSlides(){
                $imgFirst = $msContent.find('.nmpIndexSliderItem:first');
            $imgFirst = $msContent.find('.nmpIndexSliderItem:first');
                $imgLast = $msContent.find('.nmpIndexSliderItem:last');
            $imgLast = $msContent.find('.nmpIndexSliderItem:last');
            }
        }


            // prevent animation firing if multislider is currently animating
        // prevent animation firing if multislider is currently animating
            // all animations pass through this function, which emits events, and adds/removes animating class
        // all animations pass through this function, which emits events, and adds/removes animating class
            function isItAnimating(callback) {
        function isItAnimating(callback){
                if (!$multislider.hasClass('ms-animating') &&
if(!$multislider.hasClass('ms-animating') &&
                    !$multislider.hasClass('ms-HOVER') &&
              !$multislider.hasClass('ms-HOVER') &&
                    !$multislider.hasClass('ms-PAUSE')) {
              !$multislider.hasClass('ms-PAUSE')){
                     $multislider.trigger('ms.before.animate'); // event!
                     $multislider.trigger('ms.before.animate'); // event!
                     $multislider.addClass('ms-animating');
                     $multislider.addClass('ms-animating');
                     callback();    //callback is animation
                     callback();    //callback is animation
                }
}
            }
}


            // update multislider at the end of each animation
        // update multislider at the end of each animation
            function doneAnimating() {
        function doneAnimating() {
                if ($multislider.hasClass('ms-animating')) {
if($multislider.hasClass('ms-animating')){
                    $multislider.removeClass('ms-animating');
$multislider.removeClass('ms-animating');
                    $multislider.trigger('ms.after.animate'); // event!
                $multislider.trigger('ms.after.animate'); // event!
                }
             }
             }
}


            // logic for pausing and restarting the multislider on hover
        // logic for pausing and restarting the multislider on hover
            function pauseHover() {
        function pauseHover() {
                // continuous scroll pause slightly different
            // continuous scroll pause slightly different
                if (settings.continuous) {
            if(settings.continuous){
                    $msContent.on('mouseover', function () {
$msContent.on('mouseover',function(){
                        doneAnimating();
doneAnimating();
                        $msContent.children('.nmpIndexSliderItem:first').stop();
$msContent.children('.nmpIndexSliderItem:first').stop();
                    });
});
                    $msContent.on('mouseout', function () {
$msContent.on('mouseout',function(){
                        continuousLeft();
continuousLeft();
                    });
});
                } else {
} else {
                    // regular animation pausing
            // regular animation pausing
                    $msContent.on('mouseover', function () {
                $msContent.on('mouseover',function(){
                        $multislider.addClass('ms-HOVER');
                    $multislider.addClass('ms-HOVER');
                    });
                });
                    $msContent.on('mouseout', function () {
                $msContent.on('mouseout',function(){
                        $multislider.removeClass('ms-HOVER');
                    $multislider.removeClass('ms-HOVER');
                    });
                });
                }
}
            }
        }


            // calculate remaining animation, if stopped mid-animation and resuming
        // calculate remaining animation, if stopped mid-animation and resuming
            function midAnimateResume() {
        function midAnimateResume(){
                animateDuration = settings.duration;
            animateDuration = settings.duration;
                var currentMargin = parseFloat($msContent.find('.nmpIndexSliderItem:first').css("margin-left"));
            var currentMargin = parseFloat($msContent.find('.nmpIndexSliderItem:first').css("margin-left"));
                var percentageRemaining = 1 - (currentMargin / -(animateDistance - 1));
            var percentageRemaining = 1-(currentMargin/-(animateDistance-1));
                animateDuration = percentageRemaining * animateDuration;
            animateDuration = percentageRemaining*animateDuration;
            }
        }


            // determine how many slides need to be moved over, if slideAll is true
        // determine how many slides need to be moved over, if slideAll is true
            function calcNumSlidesToMove() {
        function calcNumSlidesToMove(){
                totalWidth = $msContent.width();           // total width of .nmpIndexSliderContent containing all visible slides
            totalWidth = $msContent.width();           // total width of .nmpIndexSliderContent containing all visible slides
                numberVisibleSlides = Math.floor(totalWidth / animateDistance);    // number of (visible) slides needed to be moved in each animation
    numberVisibleSlides = Math.floor(totalWidth/animateDistance);    // number of (visible) slides needed to be moved in each animation
            }
        }




            // ==== ANIMATION FUNCTIONS ====
        // ==== ANIMATION FUNCTIONS ====
            // =============================
        // =============================
            function continuousLeft() {
        function continuousLeft () {
                isItAnimating(function () {
            isItAnimating(function(){
                    reTargetSlides();
                reTargetSlides();
                    midAnimateResume();
                midAnimateResume();
                    $imgFirst.animate(
                $imgFirst.animate(
                        { marginLeft: -(animateDistance + 1) },
                    {marginLeft: -(animateDistance+1)},
                        {
                    {
                            duration: animateDuration,
                        duration: animateDuration,
                            easing: "linear",
                        easing: "linear",
                            complete: function () {
                        complete: function(){
                                $imgFirst.insertAfter($imgLast).removeAttr("style");
                            $imgFirst.insertAfter($imgLast).removeAttr("style");
                                doneAnimating();
                            doneAnimating();
                                continuousLeft();
                            continuousLeft ();
                            }
                         }
                         }
                     );
                     }
                });
                );
            }
            });
        }


            function allLeft() {
        function allLeft(){
                isItAnimating(function () {
            isItAnimating(function(){
                    reTargetSlides();
                reTargetSlides();
                    calcNumSlidesToMove();
                calcNumSlidesToMove();


                    var $clonedItemSet = $msContent.children('.nmpIndexSliderItem').clone();
                var $clonedItemSet = $msContent.children('.nmpIndexSliderItem').clone();
                    var filteredClones = $clonedItemSet.splice(0, numberVisibleSlides);
                var filteredClones = $clonedItemSet.splice(0, numberVisibleSlides);


                    $msContent.append(filteredClones);
                $msContent.append(filteredClones);


                    $imgFirst.animate(
                $imgFirst.animate(
                        { marginLeft: -totalWidth }, {
                    {marginLeft: -totalWidth}, {
                         duration: animateDuration,
                         duration: animateDuration,
                         easing: "swing",
                         easing: "swing",
                         complete: function () {
                         complete: function(){
                             $($msContent.children('.nmpIndexSliderItem').splice(0, numberVisibleSlides)).remove();
                             $($msContent.children('.nmpIndexSliderItem').splice(0,numberVisibleSlides)).remove();
                             doneAnimating();
                             doneAnimating();
                         }
                         }
                     }
                     }
                    );
                );
                });
            });
            }
        }


            function allRight() {
        function allRight() {
                isItAnimating(function () {
            isItAnimating(function(){
                    reTargetSlides();
                reTargetSlides();
                    calcNumSlidesToMove();
                calcNumSlidesToMove();


                    var numberTotalSlides = $msContent.children('.nmpIndexSliderItem').length;
                var numberTotalSlides = $msContent.children('.nmpIndexSliderItem').length;
                    var $clonedItemSet = $msContent.children('.nmpIndexSliderItem').clone();
                var $clonedItemSet = $msContent.children('.nmpIndexSliderItem').clone();
                    var filteredClones = $clonedItemSet.splice(numberTotalSlides - numberVisibleSlides, numberTotalSlides);
                var filteredClones = $clonedItemSet.splice(numberTotalSlides-numberVisibleSlides,numberTotalSlides);


                    $($(filteredClones)[0]).css('margin-left', -totalWidth); // give clone array negative margin before preppending
                $($(filteredClones)[0]).css('margin-left',-totalWidth); // give clone array negative margin before preppending
                    $msContent.prepend(filteredClones);
                $msContent.prepend(filteredClones);


                    reTargetSlides();
                reTargetSlides();


                    $imgFirst.animate(
                $imgFirst.animate(
                        {
                    {
                            marginLeft: 0
                        marginLeft: 0
                        }, {
                    }, {
                         duration: animateDuration,
                         duration: animateDuration,
                         easing: "swing",
                         easing: "swing",
                         complete: function () {
                         complete: function(){
                             numberTotalSlides = $msContent.find('nmpIndexSliderItem').length;
                             numberTotalSlides = $msContent.find('.nmpIndexSliderItem').length;
                             $($msContent.find('.nmpIndexSliderItem').splice(numberTotalSlides - numberVisibleSlides, numberTotalSlides)).remove();
                             $($msContent.find('.nmpIndexSliderItem').splice(numberTotalSlides-numberVisibleSlides,numberTotalSlides)).remove();
                             $imgFirst.removeAttr('style');
                             $imgFirst.removeAttr('style');
                             doneAnimating();
                             doneAnimating();
                         }
                         }
                     }
                     }
                    );
                );
                });
            });
            }
        }


            function singleLeft() {
        function singleLeft(){
                isItAnimating(function () {
            isItAnimating(function(){
                    reTargetSlides();
                reTargetSlides();
                    $imgFirst.animate(
                $imgFirst.animate(
                        {
                    {
                            marginLeft: -animateDistance
                        marginLeft: -animateDistance
                        }, {
                    }, {
                         duration: animateDuration,
                         duration: animateDuration,
                         easing: "swing",
                         easing: "swing",
                         complete: function () {
                         complete: function(){
                             $imgFirst.detach().removeAttr('style').appendTo($msContent);
                             $imgFirst.detach().removeAttr('style').appendTo($msContent);
                             doneAnimating();
                             doneAnimating();
                         }
                         }
                     }
                     }
                    );
                );
                });
            });
            }
        }


            function singleRight() {
        function singleRight(){
                isItAnimating(function () {
            isItAnimating(function(){
                    reTargetSlides();
                reTargetSlides();
                    $imgLast.css('margin-left', -animateDistance).prependTo($msContent);
                $imgLast.css('margin-left',-animateDistance).prependTo($msContent);
                    $imgLast.animate(
                $imgLast.animate(
                        {
                    {
                            marginLeft: 0
                        marginLeft: 0
                        }, {
                    }, {
                         duration: animateDuration,
                         duration: animateDuration,
                         easing: "swing",
                         easing: "swing",
                         complete: function () {
                         complete: function(){
                             $imgLast.removeAttr("style");
                             $imgLast.removeAttr("style");
                             doneAnimating();
                             doneAnimating();
                         }
                         }
                     }
                     }
                    );
                );
                });
            });
            }
        }  
            return $multislider;
        return $multislider;
        }
    }
    })(jQuery);
})(jQuery);
 
$('#nmpIndexSliderContainer').multislider({
 
    interval: false,
    $('#nmpIndexSliderContainer').multislider({
    slideAll: false,
        interval: false,
    duration: 500
        slideAll: false,
});
        duration: 1000
    });
});
});

גרסה מ־02:11, 5 בפברואר 2021

/*
*   MultiSlider | MIT License
*
*   Copyright (c) 2017 Trevor Blackman
*   http://www.multislider.info
*
*/
$(document).ready(function () {
(function($){

    // ==== BEGINS PLUGGIN ====
    $.fn.multislider = function(data, callback){

        // ==== CACHE DOM ====
        var $multislider = $(this);
        var $msContent = $multislider.find('.nmpIndexSliderContent');
        var $msRight = $multislider.find('.nmpIndexSliderButtonRight');
        var $msLeft = $multislider.find('.nmpIndexSliderButtonLeft');
        var $imgFirst = $msContent.find('.nmpIndexSliderItem:first');

        // === DETERMINE ACTION ====
        // string = method | object or nothing is to initialize
        if(typeof data === 'string'){
            getStringArgs(data);
            return $multislider;
        } else if (typeof data === 'object' || typeof data  ==='undefined'){
            init();
        }

        // ==== PLUGGIN VARIABLES ====
        var $imgLast,
        totalWidth,
        numberVisibleSlides,
        animateDistance,
        animateSlideRight,
        animateSlideLeft,
        defaults,
        settings,
        animateDuration,
        autoSlideInterval;

        // = INITIALIZE =
        function init(){
            minifyContent();        // minify html
            createSettings();       // merge defaults and user provided options
            saveData();             // add data object to DOM el with reference to animation functions, allows for methods to reference at any time
            selectAnimations();     // choose default animation
        }


        // ==== EVENT HANDLERS ====
        $msRight.on('click', animateSlideLeft);
        $msLeft.on('click', animateSlideRight);
        $multislider.on('click','.nmpIndexSliderButtonRight, .nmpIndexSliderButtonLeft', resetInterval);
        $(window).on('resize', findItemWidth);


        // ==== FUNCTIONS (for days...) ====
        // =================================

        function pauseAbove(){
            if (window.innerWidth > settings.pauseAbove){ $multislider.addClass('ms-PAUSE'); }
            $(window).on('resize',function(){
                if (window.innerWidth > settings.pauseAbove){
                    $multislider.addClass('ms-PAUSE');
                } else {
                    $multislider.removeClass('ms-PAUSE');
                }
            });
        }

        function pauseBelow(){
            if (window.innerWidth < settings.pauseBelow){ $multislider.addClass('ms-PAUSE'); }
            $(window).on('resize',function(){
                if (window.innerWidth < settings.pauseBelow){
                    $multislider.addClass('ms-PAUSE');
                } else {
                    $multislider.removeClass('ms-PAUSE');
                }
            });
        }

        // used if method is called after initialization
        function getStringArgs(str){
            if (typeof $multislider.data(str) !== 'undefined'){
                $multislider.data(str)();
            } else {
                console.error("Multislider currently only accepts the following methods: next, prev, pause, play");
            }
        }

        // saves data object to DOM element
        function saveData(){
            $multislider.data({
                "pause":function(){ $multislider.addClass('ms-PAUSE'); },
                "unPause":function(){ $multislider.removeClass('ms-PAUSE'); },
                "continuous":function(){ $multislider.removeClass('ms-PAUSE'); continuousLeft(); },
                "next":function(){ overRidePause(singleLeft); },
                "nextAll":function(){ overRidePause(allLeft); },
                "prev":function(){ overRidePause(singleRight); },
                "prevAll":function(){ overRidePause(allRight); },
                "settings":settings
            });
        }

        // used when calling 'next', 'prev' methods
        function overRidePause(animation){
            if ($multislider.hasClass('ms-PAUSE')){
                $multislider.removeClass('ms-PAUSE');
                animation();
                $multislider.addClass('ms-PAUSE');
            } else {
                animation();
            }
            resetInterval();
        }

        // CRITICAL for items to be perfectly side-by-side without floating them
        function minifyContent(){
            $msContent.contents().filter(function(){
                return (this.nodeType == 3 && !/\S/.test(this.nodeValue));
            }).remove();
        }

        // updated options with defaults, measure slide widths for animation calculations, carry out setting implementations
        function createSettings() {
            defaults = settings || {
    			continuous: false,	// endless scrolling with no pauses
    			slideAll: false,	// slide all visible slides, or just one at a time
    			// autoSlide: true,	// DEPRECATED
    			interval: 2000,		// time bewteen slide animation, 0 or 'false' prevents auto-sliding
    			duration: 500,	    // duration of slide animation
    			hoverPause: true,	// pause slideshow on hover
                pauseAbove: null,   // pause above specified screen width
                pauseBelow: null    // pause below specified screen width
    		};

    		settings = $.extend({},defaults,data);

            findItemWidth();
            animateDuration = settings.duration;

            if (settings.hoverPause){pauseHover();}
            // autoSlide is being depricated | Feb 2 2017
            if (settings.continuous !== true && settings.interval !== 0 && settings.interval !== false && settings.autoSlide !== false){autoSlide();}
            if (settings.pauseAbove !== null && typeof settings.pauseAbove === 'number'){ pauseAbove(); }
            if (settings.pauseBelow !== null && typeof settings.pauseBelow === 'number'){ pauseBelow(); }
        }

        // determine between single and multi-slide animations
        function selectAnimations () {
            if (settings.continuous){
                settings.autoSlide = false;
                continuousLeft();
            } else if (settings.slideAll){
                animateSlideRight = $multislider.data('prevAll');
                animateSlideLeft = $multislider.data('nextAll');
            } else {
                animateSlideRight = $multislider.data('prev');
                animateSlideLeft = $multislider.data('next');
            }
        }

        // measure slide width, for animation calculations
        function findItemWidth(){
            reTargetSlides();
            animateDistance = $imgFirst.width();
            var left = parseInt($msContent.find('.nmpIndexSliderItem:first').css('padding-left'));
            var right = parseInt($msContent.find('.nmpIndexSliderItem:first').css('padding-right'));
            if (left !== 0){animateDistance += left;}
            if (right !== 0){animateDistance += right;}
        }

        // recursive auto-slide loop
        function autoSlide() {
            autoSlideInterval = setInterval(function(){
                if (!$multislider.hasClass('ms-PAUSE')){
                    animateSlideLeft();
                }
            }, settings.interval);
        }

        function resetInterval() {
            if (settings.interval !== 0 && settings.interval !== false && settings.continuous !== true){
                clearInterval(autoSlideInterval);
                autoSlide();
            }
        }

        // target first and last visible slides before each new animation
        function reTargetSlides(){
            $imgFirst = $msContent.find('.nmpIndexSliderItem:first');
            $imgLast = $msContent.find('.nmpIndexSliderItem:last');
        }

        // prevent animation firing if multislider is currently animating
        // all animations pass through this function, which emits events, and adds/removes animating class
        function isItAnimating(callback){
			if(!$multislider.hasClass('ms-animating') &&
               !$multislider.hasClass('ms-HOVER') &&
               !$multislider.hasClass('ms-PAUSE')){
                    $multislider.trigger('ms.before.animate'); // event!
                    $multislider.addClass('ms-animating');
                    callback();    //callback is animation
			}
		}

        // update multislider at the end of each animation
        function doneAnimating() {
			if($multislider.hasClass('ms-animating')){
				$multislider.removeClass('ms-animating');
                $multislider.trigger('ms.after.animate'); // event!
            }
		}

        // logic for pausing and restarting the multislider on hover
        function pauseHover() {
            // continuous scroll pause slightly different
            if(settings.continuous){
				$msContent.on('mouseover',function(){
					doneAnimating();
					$msContent.children('.nmpIndexSliderItem:first').stop();
				});
				$msContent.on('mouseout',function(){
					continuousLeft();
				});
			} else {
            // regular animation pausing
                $msContent.on('mouseover',function(){
                    $multislider.addClass('ms-HOVER');
                });
                $msContent.on('mouseout',function(){
                    $multislider.removeClass('ms-HOVER');
                });
			}
        }

        // calculate remaining animation, if stopped mid-animation and resuming
        function midAnimateResume(){
            animateDuration = settings.duration;
            var currentMargin = parseFloat($msContent.find('.nmpIndexSliderItem:first').css("margin-left"));
            var percentageRemaining = 1-(currentMargin/-(animateDistance-1));
            animateDuration = percentageRemaining*animateDuration;
        }

        // determine how many slides need to be moved over, if slideAll is true
        function calcNumSlidesToMove(){
            totalWidth = $msContent.width();						          // total width of .nmpIndexSliderContent containing all visible slides
		    numberVisibleSlides = Math.floor(totalWidth/animateDistance);     // number of (visible) slides needed to be moved in each animation
        }


        // ==== ANIMATION FUNCTIONS ====
        // =============================
        function continuousLeft () {
            isItAnimating(function(){
                reTargetSlides();
                midAnimateResume();
                $imgFirst.animate(
                    {marginLeft: -(animateDistance+1)},
                    {
                        duration: animateDuration,
                        easing: "linear",
                        complete: function(){
                            $imgFirst.insertAfter($imgLast).removeAttr("style");
                            doneAnimating();
                            continuousLeft ();
                        }
                    }
                );
            });
        }

        function allLeft(){
            isItAnimating(function(){
                reTargetSlides();
                calcNumSlidesToMove();

                var $clonedItemSet = $msContent.children('.nmpIndexSliderItem').clone();
                var filteredClones = $clonedItemSet.splice(0, numberVisibleSlides);

                $msContent.append(filteredClones);

                $imgFirst.animate(
                    {marginLeft: -totalWidth}, {
                        duration: animateDuration,
                        easing: "swing",
                        complete: function(){
                            $($msContent.children('.nmpIndexSliderItem').splice(0,numberVisibleSlides)).remove();
                            doneAnimating();
                        }
                    }
                );
            });
        }

        function allRight() {
            isItAnimating(function(){
                reTargetSlides();
                calcNumSlidesToMove();

                var numberTotalSlides = $msContent.children('.nmpIndexSliderItem').length;
                var $clonedItemSet = $msContent.children('.nmpIndexSliderItem').clone();
                var filteredClones = $clonedItemSet.splice(numberTotalSlides-numberVisibleSlides,numberTotalSlides);

                $($(filteredClones)[0]).css('margin-left',-totalWidth); // give clone array negative margin before preppending
                $msContent.prepend(filteredClones);

                reTargetSlides();

                $imgFirst.animate(
                    {
                        marginLeft: 0
                    }, {
                        duration: animateDuration,
                        easing: "swing",
                        complete: function(){
                            numberTotalSlides = $msContent.find('.nmpIndexSliderItem').length;
                            $($msContent.find('.nmpIndexSliderItem').splice(numberTotalSlides-numberVisibleSlides,numberTotalSlides)).remove();
                            $imgFirst.removeAttr('style');
                            doneAnimating();
                        }
                    }
                );
            });
        }

        function singleLeft(){
            isItAnimating(function(){
                reTargetSlides();
                $imgFirst.animate(
                    {
                        marginLeft: -animateDistance
                    }, {
                        duration: animateDuration,
                        easing: "swing",
                        complete: function(){
                            $imgFirst.detach().removeAttr('style').appendTo($msContent);
                            doneAnimating();
                        }
                    }
                );
            });
        }

        function singleRight(){
            isItAnimating(function(){
                reTargetSlides();
                $imgLast.css('margin-left',-animateDistance).prependTo($msContent);
                $imgLast.animate(
                    {
                        marginLeft: 0
                    }, {
                        duration: animateDuration,
                        easing: "swing",
                        complete: function(){
                            $imgLast.removeAttr("style");
                            doneAnimating();
                        }
                    }
                );
            });
        } 
        return $multislider;
    }
})(jQuery);
$('#nmpIndexSliderContainer').multislider({
    interval: false,
    slideAll: false,
    duration: 500
});
});