PageSourceSearch

https://saintsstatistics.co.uk/templates/joothemes-transport/js/jquery.flexisel.js

js saintsstatistics.co.uk collected 2026-09-25 10:30:00 UTC 16,228 bytes, 396 lines download raw bytes

1/*
2* File: jquery.flexisel.js
3* Version: 2.1.0
4* Description: Responsive carousel jQuery plugin
5* Author: 9bit Studios
6* Copyright 2016, 9bit Studios
7* http://www.9bitstudios.com
8* Free to use and abuse under the MIT license.
9* http://www.opensource.org/licenses/mit-license.php
10*/
11
12(function ($) {
13
14    $.fn.flexisel = function (options) {
15
16        var defaults = $.extend({
17            visibleItems: 4,
18            itemsToScroll: 3,
19            animationSpeed: 400,
20            infinite: true,
21            navigationTargetSelector: null,
22            autoPlay: {
23                enable: false,
24                interval: 5000,
25                pauseOnHover: true
26            },
27            responsiveBreakpoints: { 
28                portrait: { 
29                    changePoint:480,
30                    visibleItems: 1,
31                    itemsToScroll: 1
32                }, 
33                landscape: { 
34                    changePoint:640,
35                    visibleItems: 2,
36                    itemsToScroll: 2
37                },
38                tablet: { 
39                    changePoint:768,
40                    visibleItems: 3,
41                    itemsToScroll: 3
42                }
43            }
44        }, options);
45        
46        /******************************
47        Private Variables
48        *******************************/         
49        
50        var object = $(this);
51        var settings = $.extend(defaults, options);        
52        var itemsWidth;
53        var canNavigate = true; 
54        var itemCount; 
55        var itemsVisible = settings.visibleItems; 
56        var itemsToScroll = settings.itemsToScroll;
57        var responsivePoints = [];
58        var resizeTimeout;
59        var autoPlayInterval;        
60        
61        /******************************
62        Public Methods
63        *******************************/        
64        
65        var methods = {
66                
67            init: function() {
68                return this.each(function () {
69                    methods.appendHTML();
70                    methods.setEventHandlers();                  
71                    methods.initializeItems();                    
72                });
73            },
74
75            /******************************
76            Initialize Items
77            *******************************/            
78            
79            initializeItems: function() {
80                
81                var obj = settings.responsiveBreakpoints;
82                for(var i in obj) { responsivePoints.push(obj[i]); }
83                responsivePoints.sort(function(a, b) { return a.changePoint - b.changePoint; });
84                var childSet = object.children();
85                itemsWidth = methods.getCurrentItemWidth();
86                itemCount = childSet.length;
87                childSet.width(itemsWidth);
88                object.css({ 'left': -itemsWidth * (itemsVisible + 1) });
89                object.fadeIn();
90                $(window).trigger('resize');
91                
92            },
93            
94            /******************************
95            Append HTML
96            *******************************/            
97            
98            appendHTML: function() {
99                
100                object.addClass("nbs-flexisel-ul");
101                object.wrap("<div class='nbs-flexisel-container'><div class='nbs-flexisel-inner'></div></div>");
102                object.find("li").addClass("nbs-flexisel-item");
103                
104                if(settings.navigationTargetSelector && $(settings.navigationTargetSelector).length > 0) {
105                    $("<div class='nbs-flexisel-nav-left'></div><div class='nbs-flexisel-nav-right'></div>").appendTo(".nbs-flexisel-container");
106                } else {
107                    settings.navigationTargetSelector = object.parent();
108                    $("<div class='nbs-flexisel-nav-left'></div><div class='nbs-flexisel-nav-right'></div>").appendTo(".nbs-flexisel-container");
109                }
110                    
111                if(settings.infinite) {    
112                    var childSet = object.children();
113                    var cloneContentBefore = childSet.clone();
114                    var cloneContentAfter = childSet.clone();
115                    object.prepend(cloneContentBefore);
116                    object.append(cloneContentAfter);
117                }
118                
119            },
120                    
121            
122            /******************************
123            Set Event Handlers
124            *******************************/
125            setEventHandlers: function() {
126                
127                var childSet = object.children();
128                
129                $(window).on("resize", function(event){
130                    clearTimeout(resizeTimeout);
131                    resizeTimeout = setTimeout(function(){
132                        methods.calculateDisplay();
133                        itemsWidth = methods.getCurrentItemWidth();
134                        childSet.width(itemsWidth);
135                        
136                        if(settings.infinite) {
137                            object.css({
138                                'left': -itemsWidth * Math.floor(childSet.length / 2)
139                            });        
140                        } else {
141                            methods.clearDisabled();
142                            $(settings.navigationTargetSelector).find(".nbs-flexisel-nav-left").addClass('disabled');
143                            object.css({
144                                'left': 0
145                            });
146                        }                                                    
147                    }, 100);
148                    
149                });                    
150                
151                $(".nbs-flexisel-container").find(".nbs-flexisel-nav-left").on("click", function (event) {
152                    methods.scroll(true);
153                });
154                
155                $(".nbs-flexisel-container").find(".nbs-flexisel-nav-right").on("click", function (event) {
156                    methods.scroll(false);
157                });
158                
159                if(settings.autoPlay.enable) {
160
161                    methods.setAutoplayInterval();
162
163                    if (settings.autoPlay.pauseOnHover === true) {
164                        object.on({
165                            mouseenter : function() {
166                                canNavigate = false;
167                            },
168                            mouseleave : function() {
169                                canNavigate = true;
170                            }
171                        });        
172                    }            
173                    
174                }
175                
176                object[0].addEventListener('touchstart', methods.touchHandler.handleTouchStart, false);        
177                object[0].addEventListener('touchmove', methods.touchHandler.handleTouchMove, false);                
178                
179            },        
180            
181            /******************************
182            Calculate Display
183            *******************************/            
184            
185            calculateDisplay: function() {
186                var contentWidth = $('html').width();
187                var largestCustom = responsivePoints[responsivePoints.length-1].changePoint; // sorted array 
188                
189                for(var i in responsivePoints) {
190                    
191                    if(contentWidth >= largestCustom) { // set to default if width greater than largest custom responsiveBreakpoint 
192                        itemsVisible = settings.visibleItems;
193                        itemsToScroll = settings.itemsToScroll;
194                        break;
195                    }
196                    else { // determine custom responsiveBreakpoint to use
197                    
198                        if(contentWidth < responsivePoints[i].changePoint) {
199                            itemsVisible = responsivePoints[i].visibleItems;
200                            itemsToScroll = responsivePoints[i].itemsToScroll;
201                            break;
202                        }
203                        else {
204                            continue;
205                        }
206                    }
207                }
208                
209            },                
210            
211            /******************************
212            Scroll
213            *******************************/                
214            
215            scroll: function(reverse) {
216
217                if(typeof reverse === 'undefined') { reverse = true }
218
219                if(canNavigate == true) {
220                    canNavigate = false;
221                    itemsWidth = methods.getCurrentItemWidth();
222                    
223                    if(settings.autoPlay.enable) {
224                        clearInterval(autoPlayInterval);
225                    }
226                    
227                    if(!settings.infinite) {
228                        
229                        var scrollDistance = itemsWidth * itemsToScroll;
230                        
231                        if(reverse) {                            
232                            object.animate({
233                                'left': methods.calculateNonInfiniteLeftScroll(scrollDistance)
234                            }, settings.animationSpeed, function(){
235                                canNavigate = true;
236                            });                            
237                            
238                        } else {
239                            object.animate({
240                                'left': methods.calculateNonInfiniteRightScroll(scrollDistance)
241                            },settings.animationSpeed, function(){
242                                canNavigate = true;
243                            });                                    
244                        }
245                        
246                        
247                        
248                    } else {                    
249                        object.animate({
250                            'left' : reverse ? "+=" + itemsWidth * itemsToScroll : "-=" + itemsWidth * itemsToScroll
251                        }, settings.animationSpeed, function() {
252                            canNavigate = true;
253                            
254                            if(reverse) { 
255                                methods.offsetItemsToBeginning(itemsToScroll); 
256                            } else {
257                                methods.offsetItemsToEnd(itemsToScroll);
258                            }
259                            methods.offsetSliderPosition(reverse); 
260                            
261                        });
262                    }
263                    
264                    if(settings.autoPlay.enable) {
265                        methods.setAutoplayInterval();
266                    }
267                    
268                }
269            },
270            
271            touchHandler: {
272
273                xDown: null,
274                yDown: null,
275                handleTouchStart: function(evt) {                                         
276                    this.xDown = evt.touches[0].clientX;                                      
277                    this.yDown = evt.touches[0].clientY;
278                }, 
279                handleTouchMove: function (evt) {
280                    if (!this.xDown || !this.yDown) {
281                        return;
282                    }
283
284                    var xUp = evt.touches[0].clientX;                                    
285                    var yUp = evt.touches[0].clientY;
286
287                    var xDiff = this.xDown - xUp;
288                    var yDiff = this.yDown - yUp;
289                    
290                    // only comparing xDiff
291                    // compare which is greater against yDiff to determine whether left/right or up/down  e.g. if (Math.abs( xDiff ) > Math.abs( yDiff ))
292                    if (Math.abs( xDiff ) > 0) {
293                        if ( xDiff > 0 ) {
294                            // swipe left
295                            methods.scroll(false);
296                        } else {
297                            //swipe right
298                            methods.scroll(true);
299                        }                       
300                    }
301                    
302                    /* reset values */
303                    this.xDown = null;
304                    this.yDown = null;
305                    canNavigate = true;
306                }
307            },            
308            
309            /******************************
310            Utility Functions
311            *******************************/
312            
313            getCurrentItemWidth: function() {
314                return (object.parent().width())/itemsVisible;
315            },            
316            
317            offsetItemsToBeginning: function(number) {
318                if(typeof number === 'undefined') { number = 1 }
319                for(var i = 0; i < number; i++) {
320                    object.children().last().insertBefore(object.children().first());
321                }    
322            },                
323            
324            offsetItemsToEnd: function(number) {
325                if(typeof number === 'undefined') { number = 1 }
326                for(var i = 0; i < number; i++) {
327                    object.children().first().insertAfter(object.children().last());    
328                }
329            },            
330            
331            offsetSliderPosition: function(reverse) {
332                var left = parseInt(object.css('left').replace('px', ''));
333                if (reverse) { 
334                    left = left - itemsWidth * itemsToScroll; 
335                } else {
336                    left = left + itemsWidth * itemsToScroll;
337                }
338                object.css({
339                    'left': left
340                });
341            },
342
343            getOffsetPosition: function() {
344                return parseInt(object.css('left').replace('px', ''));    
345            },
346            
347            calculateNonInfiniteLeftScroll: function(toScroll) {
348                
349                methods.clearDisabled();
350                if(methods.getOffsetPosition() + toScroll >= 0) {
351                    $(settings.navigationTargetSelector).find(".nbs-flexisel-nav-left").addClass('disabled');
352                    return 0;
353                } else {
354                    return methods.getOffsetPosition() + toScroll;
355                }
356            },
357            
358            calculateNonInfiniteRightScroll: function(toScroll){
359                
360                methods.clearDisabled();
361                var negativeOffsetLimit = (itemCount * itemsWidth) - (itemsVisible * itemsWidth);
362                
363                if(methods.getOffsetPosition() - toScroll <= -negativeOffsetLimit) {
364                    $(settings.navigationTargetSelector).find(".nbs-flexisel-nav-right").addClass('disabled');
365                    return -negativeOffsetLimit;        
366                } else {
367                    return methods.getOffsetPosition() - toScroll;
368                }
369            },
370            
371            setAutoplayInterval: function(){
372                autoPlayInterval = setInterval(function() {
373                    if (canNavigate) {
374                        methods.scroll(false);
375                    }
376                }, settings.autoPlay.interval);                    
377            },
378            
379            clearDisabled: function() {
380                var parent = $(settings.navigationTargetSelector);
381                parent.find(".nbs-flexisel-nav-left").removeClass('disabled');
382                parent.find(".nbs-flexisel-nav-right").removeClass('disabled');
383            }                        
384            
385        };
386        
387        if (methods[options]) {     // $("#element").pluginName('methodName', 'arg1', 'arg2');
388            return methods[options].apply(this, Array.prototype.slice.call(arguments, 1));
389        } else if (typeof options === 'object' || !options) {     // $("#element").pluginName({ option: 1, option:2 });
390            return methods.init.apply(this);  
391        } else {
392            $.error( 'Method "' +  method + '" does not exist in flexisel plugin!');
393        }        
394};
395
396})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.