PageSourceSearch

https://www.hldni.com/js/swiper.js

js hldni.com collected 2026-10-10 00:30:35 UTC 244,518 bytes, 5,417 lines download raw bytes

1/**
2 * Swiper 3.4.2
3 * Most modern mobile touch slider and framework with hardware accelerated transitions
4 * 
5 * http://www.idangero.us/swiper/
6 * 
7 * Copyright 2017, Vladimir Kharlampidi
8 * The iDangero.us
9 * http://www.idangero.us/
10 * 
11 * Licensed under MIT
12 * 
13 * Released on: March 10, 2017
14 */
15(function () {
16    'use strict';
17    var $;
18
19    /*===========================
20    Swiper
21    ===========================*/
22    var Swiper = function (container, params) {
23        if (!(this instanceof Swiper)) return new Swiper(container, params);
24    
25
26        var defaults = {
27            direction: 'horizontal',
28            touchEventsTarget: 'container',
29            initialSlide: 0,
30            speed: 300,
31            // autoplay
32            autoplay: false,
33            autoplayDisableOnInteraction: true,
34            autoplayStopOnLast: false,
35            // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).
36            iOSEdgeSwipeDetection: false,
37            iOSEdgeSwipeThreshold: 20,
38            // Free mode
39            freeMode: false,
40            freeModeMomentum: true,
41            freeModeMomentumRatio: 1,
42            freeModeMomentumBounce: true,
43            freeModeMomentumBounceRatio: 1,
44            freeModeMomentumVelocityRatio: 1,
45            freeModeSticky: false,
46            freeModeMinimumVelocity: 0.02,
47            // Autoheight
48            autoHeight: false,
49            // Set wrapper width
50            setWrapperSize: false,
51            // Virtual Translate
52            virtualTranslate: false,
53            // Effects
54            effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
55            coverflow: {
56                rotate: 50,
57                stretch: 0,
58                depth: 100,
59                modifier: 1,
60                slideShadows : true
61            },
62            flip: {
63                slideShadows : true,
64                limitRotation: true
65            },
66            cube: {
67                slideShadows: true,
68                shadow: true,
69                shadowOffset: 20,
70                shadowScale: 0.94
71            },
72            fade: {
73                crossFade: false
74            },
75            // Parallax
76            parallax: false,
77            // Zoom
78            zoom: false,
79            zoomMax: 3,
80            zoomMin: 1,
81            zoomToggle: true,
82            // Scrollbar
83            scrollbar: null,
84            scrollbarHide: true,
85            scrollbarDraggable: false,
86            scrollbarSnapOnRelease: false,
87            // Keyboard Mousewheel
88            keyboardControl: false,
89            mousewheelControl: false,
90            mousewheelReleaseOnEdges: false,
91            mousewheelInvert: false,
92            mousewheelForceToAxis: false,
93            mousewheelSensitivity: 1,
94            mousewheelEventsTarged: 'container',
95            // Hash Navigation
96            hashnav: false,
97            hashnavWatchState: false,
98            // History
99            history: false,
100            // Commong Nav State
101            replaceState: false,
102            // Breakpoints
103            breakpoints: undefined,
104            // Slides grid
105            spaceBetween: 0,
106            slidesPerView: 1,
107            slidesPerColumn: 1,
108            slidesPerColumnFill: 'column',
109            slidesPerGroup: 1,
110            centeredSlides: false,
111            slidesOffsetBefore: 0, // in px
112            slidesOffsetAfter: 0, // in px
113            // Round length
114            roundLengths: false,
115            // Touches
116            touchRatio: 1,
117            touchAngle: 45,
118            simulateTouch: true,
119            shortSwipes: true,
120            longSwipes: true,
121            longSwipesRatio: 0.5,
122            longSwipesMs: 300,
123            followFinger: true,
124            onlyExternal: false,
125            threshold: 0,
126            touchMoveStopPropagation: true,
127            touchReleaseOnEdges: false,
128            // Unique Navigation Elements
129            uniqueNavElements: true,
130            // Pagination
131            pagination: null,
132            paginationElement: 'span',
133            paginationClickable: false,
134            paginationHide: false,
135			paginationBulletRender: function (swiper, index, className) {
136				var businessCategory = ["토목사업", "건축사업", "주택사업", "플랜트/환경사업", "해외사업"];
137				return '<li class="' + className + '">' + businessCategory[index] + '</li>'; 
138			},
139            paginationProgressRender: null,
140            paginationFractionRender: null,
141            paginationCustomRender: null,
142            paginationType: 'bullets', // 'bullets' or 'progress' or 'fraction' or 'custom'
143            // Resistance
144            resistance: true,
145            resistanceRatio: 0.85,
146            // Next/prev buttons
147            nextButton: null,
148            prevButton: null,
149            // Progress
150            watchSlidesProgress: false,
151            watchSlidesVisibility: false,
152            // Cursor
153            grabCursor: false,
154            // Clicks
155            preventClicks: true,
156            preventClicksPropagation: true,
157            slideToClickedSlide: false,
158            // Lazy Loading
159            lazyLoading: false,
160            lazyLoadingInPrevNext: false,
161            lazyLoadingInPrevNextAmount: 1,
162            lazyLoadingOnTransitionStart: false,
163            // Images
164            preloadImages: true,
165            updateOnImagesReady: true,
166            // loop
167            loop: false,
168            loopAdditionalSlides: 0,
169            loopedSlides: null,
170            // Control
171            control: undefined,
172            controlInverse: false,
173            controlBy: 'slide', //or 'container'
174            normalizeSlideIndex: true,
175            // Swiping/no swiping
176            allowSwipeToPrev: true,
177            allowSwipeToNext: true,
178            swipeHandler: null, //'.swipe-handler',
179            noSwiping: true,
180            noSwipingClass: 'swiper-no-swiping',
181            // Passive Listeners
182            passiveListeners: true,
183            // NS
184            containerModifierClass: 'swiper-container-', // NEW
185            slideClass: 'swiper-slide',
186            slideActiveClass: 'swiper-slide-active',
187            slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
188            slideVisibleClass: 'swiper-slide-visible',
189            slideDuplicateClass: 'swiper-slide-duplicate',
190            slideNextClass: 'swiper-slide-next',
191            slideDuplicateNextClass: 'swiper-slide-duplicate-next',
192            slidePrevClass: 'swiper-slide-prev',
193            slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
194            wrapperClass: 'swiper-wrapper',
195            bulletClass: 'swiper-pagination-bullet',
196            bulletActiveClass: 'swiper-pagination-bullet-active',
197            buttonDisabledClass: 'swiper-button-disabled',
198            paginationCurrentClass: 'swiper-pagination-current',
199            paginationTotalClass: 'swiper-pagination-total',
200            paginationHiddenClass: 'swiper-pagination-hidden',
201            paginationProgressbarClass: 'swiper-pagination-progressbar',
202            paginationClickableClass: 'swiper-pagination-clickable', // NEW
203            paginationModifierClass: 'swiper-pagination-', // NEW
204            lazyLoadingClass: 'swiper-lazy',
205            lazyStatusLoadingClass: 'swiper-lazy-loading',
206            lazyStatusLoadedClass: 'swiper-lazy-loaded',
207            lazyPreloaderClass: 'swiper-lazy-preloader',
208            notificationClass: 'swiper-notification',
209            preloaderClass: 'preloader',
210            zoomContainerClass: 'swiper-zoom-container',
211        
212            // Observer
213            observer: false,
214            observeParents: false,
215            // Accessibility
216            a11y: false,
217            prevSlideMessage: 'Previous slide',
218            nextSlideMessage: 'Next slide',
219            firstSlideMessage: 'This is the first slide',
220            lastSlideMessage: 'This is the last slide',
221            paginationBulletMessage: 'Go to slide {{index}}',
222            // Callbacks
223            runCallbacksOnInit: true,
224
225            /*
226            Callbacks:
227            onInit: function (swiper)
228            onDestroy: function (swiper)
229            onBeforeResize: function (swiper)
230            onAfterResize: function (swiper)
231            onClick: function (swiper, e)
232            onTap: function (swiper, e)
233            onDoubleTap: function (swiper, e)
234            onSliderMove: function (swiper, e)
235            onSlideChangeStart: function (swiper)
236            onSlideChangeEnd: function (swiper)
237            onTransitionStart: function (swiper)
238            onTransitionEnd: function (swiper)
239            onImagesReady: function (swiper)
240            onProgress: function (swiper, progress)
241            onTouchStart: function (swiper, e)
242            onTouchMove: function (swiper, e)
243            onTouchMoveOpposite: function (swiper, e)
244            onTouchEnd: function (swiper, e)
245            onReachBeginning: function (swiper)
246            onReachEnd: function (swiper)
247            onSetTransition: function (swiper, duration)
248            onSetTranslate: function (swiper, translate)
249            onAutoplayStart: function (swiper)
250            onAutoplayStop: function (swiper),
251            onLazyImageLoad: function (swiper, slide, image)
252            onLazyImageReady: function (swiper, slide, image)
253            onKeyPress: function (swiper, keyCode)
254            */
255        
256        };
257        var initialVirtualTranslate = params && params.virtualTranslate;
258        
259        params = params || {};
260        var originalParams = {};
261        for (var param in params) {
262            if (typeof params[param] === 'object' && params[param] !== null && !(params[param].nodeType || params[param] === window || params[param] === document || (typeof Dom7 !== 'undefined' && params[param] instanceof Dom7) || (typeof jQuery !== 'undefined' && params[param] instanceof jQuery))) {
263                originalParams[param] = {};
264                for (var deepParam in params[param]) {
265                    originalParams[param][deepParam] = params[param][deepParam];
266                }
267            }
268            else {
269                originalParams[param] = params[param];
270            }
271        }
272        for (var def in defaults) {
273            if (typeof params[def] === 'undefined') {
274                params[def] = defaults[def];
275            }
276            else if (typeof params[def] === 'object') {
277                for (var deepDef in defaults[def]) {
278                    if (typeof params[def][deepDef] === 'undefined') {
279                        params[def][deepDef] = defaults[def][deepDef];
280                    }
281                }
282            }
283        }
284        
285        // Swiper
286        var s = this;
287        
288        // Params
289        s.params = params;
290        s.originalParams = originalParams;
291        
292        // Classname
293        s.classNames = [];
294        /*=========================
295          Dom Library and plugins
296          ===========================*/
297        if (typeof $ !== 'undefined' && typeof Dom7 !== 'undefined'){
298            $ = Dom7;
299        }
300        if (typeof $ === 'undefined') {
301            if (typeof Dom7 === 'undefined') {
302                $ = window.Dom7 || window.Zepto || window.jQuery;
303            }
304            else {
305                $ = Dom7;
306            }
307            if (!$) return;
308        }
309        // Export it to Swiper instance
310        s.$ = $;
311        
312        /*=========================
313          Breakpoints
314          ===========================*/
315        s.currentBreakpoint = undefined;
316        s.getActiveBreakpoint = function () {
317            //Get breakpoint for window width
318            if (!s.params.breakpoints) return false;
319            var breakpoint = false;
320            var points = [], point;
321            for ( point in s.params.breakpoints ) {
322                if (s.params.breakpoints.hasOwnProperty(point)) {
323                    points.push(point);
324                }
325            }
326            points.sort(function (a, b) {
327                return parseInt(a, 10) > parseInt(b, 10);
328            });
329            for (var i = 0; i < points.length; i++) {
330                point = points[i];
331                if (point >= window.innerWidth && !breakpoint) {
332                    breakpoint = point;
333                }
334            }
335            return breakpoint || 'max';
336        };
337        s.setBreakpoint = function () {
338            //Set breakpoint for window width and update parameters
339            var breakpoint = s.getActiveBreakpoint();
340            if (breakpoint && s.currentBreakpoint !== breakpoint) {
341                var breakPointsParams = breakpoint in s.params.breakpoints ? s.params.breakpoints[breakpoint] : s.originalParams;
342                var needsReLoop = s.params.loop && (breakPointsParams.slidesPerView !== s.params.slidesPerView);
343                for ( var param in breakPointsParams ) {
344                    s.params[param] = breakPointsParams[param];
345                }
346                s.currentBreakpoint = breakpoint;
347                if(needsReLoop && s.destroyLoop) {
348                    s.reLoop(true);
349                }
350            }
351        };
352        // Set breakpoint on load
353        if (s.params.breakpoints) {
354            s.setBreakpoint();
355        }
356        
357        /*=========================
358          Preparation - Define Container, Wrapper and Pagination
359          ===========================*/
360        s.container = $(container);
361        if (s.container.length === 0) return;
362        if (s.container.length > 1) {
363            var swipers = [];
364            s.container.each(function () {
365                var container = this;
366                swipers.push(new Swiper(this, params));
367            });
368            return swipers;
369        }
370        
371        // Save instance in container HTML Element and in data
372        s.container[0].swiper = s;
373        s.container.data('swiper', s);
374        
375        s.classNames.push(s.params.containerModifierClass + s.params.direction);
376        
377        if (s.params.freeMode) {
378            s.classNames.push(s.params.containerModifierClass + 'free-mode');
379        }
380        if (!s.support.flexbox) {
381            s.classNames.push(s.params.containerModifierClass + 'no-flexbox');
382            s.params.slidesPerColumn = 1;
383        }
384        if (s.params.autoHeight) {
385            s.classNames.push(s.params.containerModifierClass + 'autoheight');
386        }
387        // Enable slides progress when required
388        if (s.params.parallax || s.params.watchSlidesVisibility) {
389            s.params.watchSlidesProgress = true;
390        }
391        // Max resistance when touchReleaseOnEdges
392        if (s.params.touchReleaseOnEdges) {
393            s.params.resistanceRatio = 0;
394        }
395        // Coverflow / 3D
396        if (['cube', 'coverflow', 'flip'].indexOf(s.params.effect) >= 0) {
397            if (s.support.transforms3d) {
398                s.params.watchSlidesProgress = true;
399                s.classNames.push(s.params.containerModifierClass + '3d');
400            }
401            else {
402                s.params.effect = 'slide';
403            }
404        }
405        if (s.params.effect !== 'slide') {
406            s.classNames.push(s.params.containerModifierClass + s.params.effect);
407        }
408        if (s.params.effect === 'cube') {
409            s.params.resistanceRatio = 0;
410            s.params.slidesPerView = 1;
411            s.params.slidesPerColumn = 1;
412            s.params.slidesPerGroup = 1;
413            s.params.centeredSlides = false;
414            s.params.spaceBetween = 0;
415            s.params.virtualTranslate = true;
416        }
417        if (s.params.effect === 'fade' || s.params.effect === 'flip') {
418            s.params.slidesPerView = 1;
419            s.params.slidesPerColumn = 1;
420            s.params.slidesPerGroup = 1;
421            s.params.watchSlidesProgress = true;
422            s.params.spaceBetween = 0;
423            if (typeof initialVirtualTranslate === 'undefined') {
424                s.params.virtualTranslate = true;
425            }
426        }
427        
428        // Grab Cursor
429        if (s.params.grabCursor && s.support.touch) {
430            s.params.grabCursor = false;
431        }
432        
433        // Wrapper
434        s.wrapper = s.container.children('.' + s.params.wrapperClass);
435        
436        // Pagination
437        if (s.params.pagination) {
438            s.paginationContainer = $(s.params.pagination);
439            if (s.params.uniqueNavElements && typeof s.params.pagination === 'string' && s.paginationContainer.length > 1 && s.container.find(s.params.pagination).length === 1) {
440                s.paginationContainer = s.container.find(s.params.pagination);
441            }
442        
443            if (s.params.paginationType === 'bullets' && s.params.paginationClickable) {
444                s.paginationContainer.addClass(s.params.paginationModifierClass + 'clickable');
445            }
446            else {
447                s.params.paginationClickable = false;
448            }
449            s.paginationContainer.addClass(s.params.paginationModifierClass + s.params.paginationType);
450        }
451        // Next/Prev Buttons
452        if (s.params.nextButton || s.params.prevButton) {
453            if (s.params.nextButton) {
454                s.nextButton = $(s.params.nextButton);
455                if (s.params.uniqueNavElements && typeof s.params.nextButton === 'string' && s.nextButton.length > 1 && s.container.find(s.params.nextButton).length === 1) {
456                    s.nextButton = s.container.find(s.params.nextButton);
457                }
458            }
459            if (s.params.prevButton) {
460                s.prevButton = $(s.params.prevButton);
461                if (s.params.uniqueNavElements && typeof s.params.prevButton === 'string' && s.prevButton.length > 1 && s.container.find(s.params.prevButton).length === 1) {
462                    s.prevButton = s.container.find(s.params.prevButton);
463                }
464            }
465        }
466        
467        // Is Horizontal
468        s.isHorizontal = function () {
469            return s.params.direction === 'horizontal';
470        };
471        // s.isH = isH;
472        
473        // RTL
474        s.rtl = s.isHorizontal() && (s.container[0].dir.toLowerCase() === 'rtl' || s.container.css('direction') === 'rtl');
475        if (s.rtl) {
476            s.classNames.push(s.params.containerModifierClass + 'rtl');
477        }
478        
479        // Wrong RTL support
480        if (s.rtl) {
481            s.wrongRTL = s.wrapper.css('display') === '-webkit-box';
482        }
483        
484        // Columns
485        if (s.params.slidesPerColumn > 1) {
486            s.classNames.push(s.params.containerModifierClass + 'multirow');
487        }
488        
489        // Check for Android
490        if (s.device.android) {
491            s.classNames.push(s.params.containerModifierClass + 'android');
492        }
493        
494        // Add classes
495        s.container.addClass(s.classNames.join(' '));
496        
497        // Translate
498        s.translate = 0;
499        
500        // Progress
501        s.progress = 0;
502        
503        // Velocity
504        s.velocity = 0;
505        
506        /*=========================
507          Locks, unlocks
508          ===========================*/
509        s.lockSwipeToNext = function () {
510            s.params.allowSwipeToNext = false;
511            if (s.params.allowSwipeToPrev === false && s.params.grabCursor) {
512                s.unsetGrabCursor();
513            }
514        };
515        s.lockSwipeToPrev = function () {
516            s.params.allowSwipeToPrev = false;
517            if (s.params.allowSwipeToNext === false && s.params.grabCursor) {
518                s.unsetGrabCursor();
519            }
520        };
521        s.lockSwipes = function () {
522            s.params.allowSwipeToNext = s.params.allowSwipeToPrev = false;
523            if (s.params.grabCursor) s.unsetGrabCursor();
524        };
525        s.unlockSwipeToNext = function () {
526            s.params.allowSwipeToNext = true;
527            if (s.params.allowSwipeToPrev === true && s.params.grabCursor) {
528                s.setGrabCursor();
529            }
530        };
531        s.unlockSwipeToPrev = function () {
532            s.params.allowSwipeToPrev = true;
533            if (s.params.allowSwipeToNext === true && s.params.grabCursor) {
534                s.setGrabCursor();
535            }
536        };
537        s.unlockSwipes = function () {
538            s.params.allowSwipeToNext = s.params.allowSwipeToPrev = true;
539            if (s.params.grabCursor) s.setGrabCursor();
540        };
541        
542        /*=========================
543          Round helper
544          ===========================*/
545        function round(a) {
546            return Math.floor(a);
547        }
548        /*=========================
549          Set grab cursor
550          ===========================*/
551        s.setGrabCursor = function(moving) {
552            s.container[0].style.cursor = 'move';
553            s.container[0].style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
554            s.container[0].style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
555            s.container[0].style.cursor = moving ? 'grabbing': 'grab';
556        };
557        s.unsetGrabCursor = function () {
558            s.container[0].style.cursor = '';
559        };
560        if (s.params.grabCursor) {
561            s.setGrabCursor();
562        }
563        /*=========================
564          Update on Images Ready
565          ===========================*/
566        s.imagesToLoad = [];
567        s.imagesLoaded = 0;
568        
569        s.loadImage = function (imgElement, src, srcset, sizes, checkForComplete, callback) {
570            var image;
571            function onReady () {
572                if (callback) callback();
573            }
574            if (!imgElement.complete || !checkForComplete) {
575                if (src) {
576                    image = new window.Image();
577                    image.onload = onReady;
578                    image.onerror = onReady;
579                    if (sizes) {
580                        image.sizes = sizes;
581                    }
582                    if (srcset) {
583                        image.srcset = srcset;
584                    }
585                    if (src) {
586                        image.src = src;
587                    }
588                } else {
589                    onReady();
590                }
591        
592            } else {//image already loaded...
593                onReady();
594            }
595        };
596        s.preloadImages = function () {
597            s.imagesToLoad = s.container.find('img');
598            function _onReady() {
599                if (typeof s === 'undefined' || s === null || !s) return;
600                if (s.imagesLoaded !== undefined) s.imagesLoaded++;
601                if (s.imagesLoaded === s.imagesToLoad.length) {
602                    if (s.params.updateOnImagesReady) s.update();
603                    s.emit('onImagesReady', s);
604                }
605            }
606            for (var i = 0; i < s.imagesToLoad.length; i++) {
607                s.loadImage(s.imagesToLoad[i], (s.imagesToLoad[i].currentSrc || s.imagesToLoad[i].getAttribute('src')), (s.imagesToLoad[i].srcset || s.imagesToLoad[i].getAttribute('srcset')), s.imagesToLoad[i].sizes || s.imagesToLoad[i].getAttribute('sizes'), true, _onReady);
608            }
609        };
610        
611        /*=========================
612          Autoplay
613          ===========================*/
614        s.autoplayTimeoutId = undefined;
615        s.autoplaying = false;
616        s.autoplayPaused = false;
617        function autoplay() {
618            var autoplayDelay = s.params.autoplay;
619            var activeSlide = s.slides.eq(s.activeIndex);
620            if (activeSlide.attr('data-swiper-autoplay')) {
621                autoplayDelay = activeSlide.attr('data-swiper-autoplay') || s.params.autoplay;
622            }
623            s.autoplayTimeoutId = setTimeout(function () {
624                if (s.params.loop) {
625                    s.fixLoop();
626                    s._slideNext();
627                    s.emit('onAutoplay', s);
628                }
629                else {
630                    if (!s.isEnd) {
631                        s._slideNext();
632                        s.emit('onAutoplay', s);
633                    }
634                    else {
635                        if (!params.autoplayStopOnLast) {
636                            s._slideTo(0);
637                            s.emit('onAutoplay', s);
638                        }
639                        else {
640                            s.stopAutoplay();
641                        }
642                    }
643                }
644            }, autoplayDelay);
645        }
646        s.startAutoplay = function () {
647            if (typeof s.autoplayTimeoutId !== 'undefined') return false;
648            if (!s.params.autoplay) return false;
649            if (s.autoplaying) return false;
650            s.autoplaying = true;
651            s.emit('onAutoplayStart', s);
652            autoplay();
653        };
654        s.stopAutoplay = function (internal) {
655            if (!s.autoplayTimeoutId) return;
656            if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId);
657            s.autoplaying = false;
658            s.autoplayTimeoutId = undefined;
659            s.emit('onAutoplayStop', s);
660        };
661        s.pauseAutoplay = function (speed) {
662            if (s.autoplayPaused) return;
663            if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId);
664            s.autoplayPaused = true;
665            if (speed === 0) {
666                s.autoplayPaused = false;
667                autoplay();
668            }
669            else {
670                s.wrapper.transitionEnd(function () {
671                    if (!s) return;
672                    s.autoplayPaused = false;
673                    if (!s.autoplaying) {
674                        s.stopAutoplay();
675                    }
676                    else {
677                        autoplay();
678                    }
679                });
680            }
681        };
682        /*=========================
683          Min/Max Translate
684          ===========================*/
685        s.minTranslate = function () {
686            return (-s.snapGrid[0]);
687        };
688        s.maxTranslate = function () {
689            return (-s.snapGrid[s.snapGrid.length - 1]);
690        };
691        /*=========================
692          Slider/slides sizes
693          ===========================*/
694        s.updateAutoHeight = function () {
695            var activeSlides = [];
696            var newHeight = 0;
697            var i;
698        
699            // Find slides currently in view
700            if(s.params.slidesPerView !== 'auto' && s.params.slidesPerView > 1) {
701                for (i = 0;
701 i < Math.ceil(s.params.slidesPerView); i++) {
702                    var index = s.activeIndex + i;
703                    if(index > s.slides.length) break;
704                    activeSlides.push(s.slides.eq(index)[0]);
705                }
706            } else {
707                activeSlides.push(s.slides.eq(s.activeIndex)[0]);
708            }
709        
710            // Find new height from heighest slide in view
711            for (i = 0; i < activeSlides.length; i++) {
712                if (typeof activeSlides[i] !== 'undefined') {
713                    var height = activeSlides[i].offsetHeight;
714                    newHeight = height > newHeight ? height : newHeight;
715                }
716            }
717        
718            // Update Height
719            if (newHeight) s.wrapper.css('height', newHeight + 'px');
720        };
721        s.updateContainerSize = function () {
722            var width, height;
723            if (typeof s.params.width !== 'undefined') {
724                width = s.params.width;
725            }
726            else {
727                width = s.container[0].clientWidth;
728            }
729            if (typeof s.params.height !== 'undefined') {
730                height = s.params.height;
731            }
732            else {
733                height = s.container[0].clientHeight;
734            }
735            if (width === 0 && s.isHorizontal() || height === 0 && !s.isHorizontal()) {
736                return;
737            }
738        
739            //Subtract paddings
740            width = width - parseInt(s.container.css('padding-left'), 10) - parseInt(s.container.css('padding-right'), 10);
741            height = height - parseInt(s.container.css('padding-top'), 10) - parseInt(s.container.css('padding-bottom'), 10);
742        
743            // Store values
744            s.width = width;
745            s.height = height;
746            s.size = s.isHorizontal() ? s.width : s.height;
747        };
748        
749        s.updateSlidesSize = function () {
750            s.slides = s.wrapper.children('.' + s.params.slideClass);
751            s.snapGrid = [];
752            s.slidesGrid = [];
753            s.slidesSizesGrid = [];
754        
755            var spaceBetween = s.params.spaceBetween,
756                slidePosition = -s.params.slidesOffsetBefore,
757                i,
758                prevSlideSize = 0,
759                index = 0;
760            if (typeof s.size === 'undefined') return;
761            if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
762                spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * s.size;
763            }
764        
765            s.virtualSize = -spaceBetween;
766            // reset margins
767            if (s.rtl) s.slides.css({marginLeft: '', marginTop: ''});
768            else s.slides.css({marginRight: '', marginBottom: ''});
769        
770            var slidesNumberEvenToRows;
771            if (s.params.slidesPerColumn > 1) {
772                if (Math.floor(s.slides.length / s.params.slidesPerColumn) === s.slides.length / s.params.slidesPerColumn) {
773                    slidesNumberEvenToRows = s.slides.length;
774                }
775                else {
776                    slidesNumberEvenToRows = Math.ceil(s.slides.length / s.params.slidesPerColumn) * s.params.slidesPerColumn;
777                }
778                if (s.params.slidesPerView !== 'auto' && s.params.slidesPerColumnFill === 'row') {
779                    slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, s.params.slidesPerView * s.params.slidesPerColumn);
780                }
781            }
782        
783            // Calc slides
784            var slideSize;
785            var slidesPerColumn = s.params.slidesPerColumn;
786            var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
787            var numFullColumns = slidesPerRow - (s.params.slidesPerColumn * slidesPerRow - s.slides.length);
788            for (i = 0; i < s.slides.length; i++) {
789                slideSize = 0;
790                var slide = s.slides.eq(i);
791                if (s.params.slidesPerColumn > 1) {
792                    // Set slides order
793                    var newSlideOrderIndex;
794                    var column, row;
795                    if (s.params.slidesPerColumnFill === 'column') {
796                        column = Math.floor(i / slidesPerColumn);
797                        row = i - column * slidesPerColumn;
798                        if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn-1)) {
799                            if (++row >= slidesPerColumn) {
800                                row = 0;
801                                column++;
802                            }
803                        }
804                        newSlideOrderIndex = column + row * slidesNumber
804EvenToRows / slidesPerColumn;
805                        slide
806                            .css({
807                                '-webkit-box-ordinal-group': newSlideOrderIndex,
808                                '-moz-box-ordinal-group': newSlideOrderIndex,
809                                '-ms-flex-order': newSlideOrderIndex,
810                                '-webkit-order': newSlideOrderIndex,
811                                'order': newSlideOrderIndex
812                            });
813                    }
814                    else {
815                        row = Math.floor(i / slidesPerRow);
816                        column = i - row * slidesPerRow;
817                    }
818                    slide
819                        .css(
820                            'margin-' + (s.isHorizontal() ? 'top' : 'left'),
821                            (row !== 0 && s.params.spaceBetween) && (s.params.spaceBetween + 'px')
822                        )
823                        .attr('data-swiper-column', column)
824                        .attr('data-swiper-row', row);
825        
826                }
827                if (slide.css('display') === 'none') continue;
828                if (s.params.slidesPerView === 'auto') {
829                    slideSize = s.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);
830                    if (s.params.roundLengths) slideSize = round(slideSize);
831                }
832                else {
833                    slideSize = (s.size - (s.params.slidesPerView - 1) * spaceBetween) / s.params.slidesPerView;
834                    if (s.params.roundLengths) slideSize = round(slideSize);
835        
836                    if (s.isHorizontal()) {
837                        s.slides[i].style.width = slideSize + 'px';
838                    }
839                    else {
840                        s.slides[i].style.height = slideSize + 'px';
841                    }
842                }
843                s.slides[i].swiperSlideSize = slideSize;
844                s.slidesSizesGrid.push(slideSize);
845        
846        
847                if (s.params.centeredSlides) {
848                    slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
849                    if(prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - s.size / 2 - spaceBetween;
850                    if (i === 0) slidePosition = slidePosition - s.size / 2 - spaceBetween;
851                    if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
852                    if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition);
853                    s.slidesGrid.push(slidePosition);
854                }
855                else {
856                    if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition);
857                    s.slidesGrid.push(slidePosition);
858                    slidePosition = slidePosition + slideSize + spaceBetween;
859                }
860        
861                s.virtualSize += slideSize + spaceBetween;
862        
863                prevSlideSize = slideSize;
864        
865                index ++;
866            }
867            s.virtualSize = Math.max(s.virtualSize, s.size) + s.params.slidesOffsetAfter;
868            var newSlidesGrid;
869        
870            if (
871                s.rtl && s.wrongRTL && (s.params.effect === 'slide' || s.params.effect === 'coverflow')) {
872                s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'});
873            }
874            if (!s.support.flexbox || s.params.setWrapperSize) {
875                if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'});
876                else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'});
877            }
878        
879            if (s.params.slidesPerColumn > 1) {
880                s.virtualSize = (slideSize + s.params.spaceBetween) * slidesNumberEvenToRows;
881                s.virtualSize = Math.ceil(s.virtualSize / s.params.slidesPerColumn) - s.params.spaceBetween;
882                if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'});
883                else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'});
884                if (s.params.centeredSlides) {
885                    newSlidesGrid = [];
886                    for (i = 0; i < s.snapGrid.length; i++) {
887                        if (s.snapGrid[i] < s.virtualSize + s.snapGrid[0]) newSlidesGrid.push(s.snapGrid[i]);
888                    }
889                    s.snapGrid = newSlidesGrid;
890                }
891            }
892        
893            // Remove last grid elements depending on width
894            if (!s.params.centeredSlides) {
895                newSlidesGrid = [];
896                for (i = 0; i < s.snapGrid.length; i++) {
897                    if (s.snapGrid[i] <= s.virtualSize - s.size) {
898                        newSlidesGrid.push(s.snapGrid[i]);
899                    }
900                }
901                s.snapGrid = newSlidesGrid;
902                if (Math.floor(s.virtualSize - s.size) - Math.floor(s.snapGrid[s.snapGrid.length - 1]) > 1) {
903                    s.snapGrid.push(s.virtualSize - s.size);
904                }
905            }
906            if (s.snapGrid.length === 0) s.snapGrid = [0];
907        
908            if (s.params.spaceBetween !== 0) {
909                if (s.isHorizontal()) {
910                    if (s.rtl) s.slides.css({marginLeft: spaceBetween + 'px'});
911                    else s.slides.css({marginRight: spaceBetween + 'px'});
912                }
913                else s.slides.css({marginBottom: spaceBetween + 'px'});
914            }
915            if (s.params.watchSlidesProgress) {
916                s.updateSlidesOffset();
917            }
918        };
919        s.updateSlidesOffset = function () {
920            for (var i = 0; i < s.slides.length; i++) {
921                s.slides[i].swiperSlideOffset = s.isHorizontal() ? s.slides[i].offsetLeft : s.slides[i].offsetTop;
922            }
923        };
924        
925        /*=========================
926          Dynamic Slides Per View
927          ===========================*/
928        s.currentSlidesPerView = function () {
929            var spv = 1, i, j;
930            if (s.params.centeredSlides) {
931                var size = s.slides[s.activeIndex].swiperSlideSize;
932                var breakLoop;
933                for (i = s.activeIndex + 1; i < s.slides.length; i++) {
934                    if (s.slides[i] && !breakLoop) {
935                        size += s.slides[i].swiperSlideSize;
936                        spv ++;
937                        if (size > s.size) breakLoop = true;
938                    }
939                }
940                for (j = s.activeIndex - 1; j >= 0; j--) {
941                    if (s.slides[j] && !breakLoop) {
942                        size += s.slides[j].swiperSlideSize;
943                        spv ++;
944                        if (size > s.size) breakLoop = true;
945                    }
946                }
947            }
948            else {
949                for (i = s.activeIndex + 1; i < s.slides.length; i++) {
950                    if (s.slidesGrid[i] - s.slidesGrid[s.activeIndex] < s.size) {
951                        spv++;
952                    }
953                }
954            }
955            return spv;
956        };
957        /*=========================
958          Slider/slides progress
959          ===========================*/
960        s.updateSlidesProgress = function (translate) {
961            if (typeof translate === 'undefined') {
962                translate = s.translate || 0;
963            }
964            if (s.slides.length === 0) return;
965            if (typeof s.slides[0].swiperSlideOffset === 'undefined') s.updateSlidesOffset();
966        
967            var offsetCenter = -translate;
968            if (s.rtl) offsetCenter = translate;
969        
970            // Visible Slides
971            s.slides.removeClass(s.params.slideVisibleClass);
972            for (var i = 0; i < s.slides.length; i++) {
973                var slide = s.slides[i];
974                var slideProgress = (offsetCenter + (s.params.centeredSlides ? s.minTranslate() : 0) - slide.swiperSlideOffset) / (slide.swiperSlideSize + s.params.spaceBetween);
975                if (s.params.watchSlidesVisibility) {
976                    var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
977                    var slideAfter = slideBefore + s.slidesSizesGrid[i];
978                    var isVisible =
979                        (slideBefore >= 0 && slideBefore < s.size) ||
980                        (slideAfter > 0 && slideAfter <= s.size) ||
981                        (slideBefore <= 0 && slideAfter >= s.size);
982                    if (isVisible) {
983                        s.slides.eq(i).addClass(s.params.slideVisibleClass);
984                    }
985                }
986                slide.progress = s.rtl ? -slideProgress : slideProgress;
987            }
988        };
989        s.updateProgress = function (translate) {
990            if (typeof translate === 'undefined') {
991                translate = s.translate || 0;
992            }
993            var translatesDiff = s.maxTranslate() - s.minTranslate();
994            var wasBeginning = s.isBeginning;
995            var wasEnd = s.isEnd;
996            if (translatesDiff === 0) {
997                s.progress = 0;
998                s.isBeginning = s.isEnd = true;
999            }
1000            else {
1001                s.progress = (translate - s.minTranslate()) / (translatesDiff);
1002                s.isBeginning = s.progress <= 0;
1003                s.isEnd = s.progress >= 1;
1004            }
1005            if (s.isBeginning && !wasBeginning) s.emit('onReachBeginning', s);
1006            if (s.isEnd && !wasEnd) s.emit('onReachEnd', s);
1007        
1008            if (s.params.watchSlidesProgress) s.updateSlidesProgress(translate);
1009            s.emit('onProgress', s, s.progress);
1010        };
1011        s.updateActiveIndex = function () {
1012            var translate = s.rtl ? s.translate : -s.translate;
1013            var newActiveIndex, i, snapIndex;
1014            for (i = 0; i < s.slidesGrid.length; i ++) {
1015                if (typeof s.slidesGrid[i + 1] !== 'undefined') {
1016                    if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1] - (s.slidesGrid[i + 1] - s.slidesGrid[i]) / 2) {
1017                        newActiveIndex = i;
1018                    }
1019                    else if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1]) {
1020                        newActiveIndex = i + 1;
1021                    }
1022                }
1023                else {
1024                    if (translate >= s.slidesGrid[i]) {
1025                        newActiveIndex = i;
1026                    }
1027                }
1028            }
1029            // Normalize slideIndex
1030            if(s.params.normalizeSlideIndex){
1031                if (newActiveIndex < 0 || typeof newActiveIndex === 'undefined') newActiveIndex = 0;
1032            }
1033            // for (i = 0; i < s.slidesGrid.length; i++) {
1034                // if (- translate >= s.slidesGrid[i]) {
1035                    // newActiveIndex = i;
1036                // }
1037            // }
1038            snapIndex = Math.floor(newActiveIndex / s.params.slidesPerGroup);
1039            if (snapIndex >= s.snapGrid.length) snapIndex = s.snapGrid.length - 1;
1040        
1041            if (newActiveIndex === s.activeIndex) {
1042                return;
1043            }
1044            s.snapIndex = snapIndex;
1045            s.previousIndex = s.activeIndex;
1046            s.activeIndex = newActiveIndex;
1047            s.updateClasses();
1048            s.updateRealIndex();
1049        };
1050        s.updateRealIndex = function(){
1051            s.realIndex = parseInt(s.slides.eq(s.activeIndex).attr('data-swiper-slide-index') || s.activeIndex, 10);
1052        };
1053        
1054        /*=========================
1055          Classes
1056          ===========================*/
1057        s.updateClasses = function () {
1058            s.slides.removeClass(s.params.slideActiveClass + ' ' + s.params.slideNextClass + ' ' + s.params.slidePrevClass + ' ' + s.params.slideDuplicateActiveClass + ' ' + s.params.slideDuplicateNextClass + ' ' + s.params.slideDuplicatePrevClass);
1059            var activeSlide = s.slides.eq(s.activeIndex);
1060            // Active classes
1061            activeSlide.addClass(s.params.slideActiveClass);
1062            if (params.loop) {
1063                // Duplicate to all looped slides
1064                if (activeSlide.hasClass(s.params.slideDuplicateClass)) {
1065                    s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + s.realIndex + '"]').addClass(s.params.slideDuplicateActiveClass);
1066                }
1067                else {
1068                    s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + s.realIndex + '"]').addClass(s.params.slideDuplicateActiveClass);
1069                }
1070            }
1071            // Next Slide
1072            var nextSlide = activeSlide.next('.' + s.params.slideClass).addClass(s.params.slideNextClass);
1073            if (s.params.loop && nextSlide.length === 0) {
1074                nextSlide = s.slides.eq(0);
1075                nextSlide.addClass(s.params.slideNextClass);
1076            }
1077            // Prev Slide
1078            var prevSlide = activeSlide.prev('.' + s.params.slideClass).addClass(s.params.slidePrevClass);
1079            if (s.params.loop && prevSlide.length === 0) {
1080                prevSlide = s.slides.eq(-1);
1081                prevSlide.addClass(s.params.slidePrevClass);
1082            }
1083            if (params.loop) {
1084                // Duplicate to all looped slides
1085                if (nextSlide.hasClass(s.params.slideDuplicateClass)) {
1086                    s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + nextSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicateNextClass);
1087                }
1088                else {
1089                    s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + nextSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicateNextClass);
1090                }
1091                if (prevSlide.hasClass(s.params.slideDuplicateClass)) {
1092                    s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + prevSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicatePrevClass);
1093                }
1094                else {
1095                    s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + prevSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicatePrevClass);
1096                }
1097            }
1098        
1099            // Pagination
1100            if (s.paginationContainer && s.paginationContainer.length > 0) {
1101                // Current/Total
1102                var current,
1103                    total = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length;
1104                if (s.params.loop) {
1105                    current = Math.ceil((s.activeIndex - s.loopedSlides)/s.params.slidesPerGroup);
1106                    if (current > s.slides.length - 1 - s.loopedSlides * 2) {
1107                        current = current - (s.slides.length - s.loopedSlides * 2);
1108                    }
1109                    if (current > total - 1) current = current - total;
1110                    if (current < 0 && s.params.paginationType !== 'bullets') current = total + current;
1111                }
1112                else {
1113                    if (typeof s.snapIndex !== 'undefined') {
1114                        current = s.snapIndex;
1115                    }
1116                    else {
1117                        current = s.activeIndex || 0;
1118                    }
1119                }
1120                // Types
1121                if (s.params.paginationType === 'bullets' && s.bullets && s.bullets.length > 0) {
1122                    s.bullets.removeClass(s.params.bulletActiveClass);
1123                    if (s.paginationContainer.length > 1) {
1124                        s.bullets.each(function () {
1125                            if ($(this).index() === current) $(this).addClass(s.params.bulletActiveClass);
1126                        });
1127                    }
1128                    else {
1129                        s.bullets.eq(current).addClass(s.params.bulletActiveClass);
1130                    }
1131                }
1132                if (s.params.paginationType === 'fraction') {
1133                    s.paginationContainer.find('.' + s.params.paginationCurrentClass).text(current + 1);
1134                    s.paginationContainer.find('.' + s.params.paginationTotalClass).text(total);
1135                }
1136                if (s.params.paginationType === 'progress') {
1137                    var scale = (current + 1) / total,
1138                        scaleX = scale,
1139                        scaleY = 1;
1140                    if (!s.isHorizontal()) {
1141                        scaleY = scale;
1142                        scaleX = 1;
1143                    }
1144                    s.paginationContainer.find('.' + s.params.paginationProgressbarClass).transform('translate3d(0,0,0) scaleX(' + scaleX + ') scaleY(' + scaleY + ')').transition(s.params.speed);
1145                }
1146                if (s.params.paginationType === 'custom' && s.params.paginationCustomRender) {
1147                    s.paginationContainer.html(s.params.paginationCustomRender(s, current + 1, total));
1148                    s.emit('onPaginationRendered', s, s.paginationContainer[0]);
1149                }
1150            }
1151        
1152            // Next/active buttons
1153            if (!s.params.loop) {
1154                if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) {
1155                    if (s.isBeginning) {
1156                        s.prevButton.addClass(s.params.buttonDisabledClass);
1157                        if (s.params.a11y && s.a11y) s.a11y.disable(s.prevButton);
1158                    }
1159                    else {
1160                        s.prevButton.removeClass(s.params.buttonDisabledClass);
1161                        if (s.params.a11y && s.a11y) s.a11y.enable(s.prevButton);
1162                    }
1163                }
1164                if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) {
1165                    if (s.isEnd) {
1166                        s.nextButton.addClass(s.params.buttonDisabledClass);
1167                        if (s.params.a11y && s.a11y) s.a11y.disable(s.nextButton);
1168                    }
1169                    else {
1170                        s.nextButton.removeClass(s.params.buttonDisabledClass);
1171                        if (s.params.a11y && s.a11y) s.a11y.enable(s.nextButton);
1172                    }
1173                }
1174            }
1175        };
1176        
1177        /*=========================
1178          Pagination
1179          ===========================*/
1180        s.updatePagination = function () {
1181            if (!s.params.pagination) return;
1182            if (s.paginationContainer && s.paginationContainer.length > 0) {
1183                var paginationHTML = '';
1184                if (s.params.paginationType === 'bullets') {
1185                    var numberOfBullets = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length;
1186                    for (var i = 0; i < numberOfBullets; i++) {
1187                        if (s.params.paginationBulletRender) {
1188                            paginationHTML += s.params.paginationBulletRender(s, i, s.params.bulletClass);
1189                        }
1190                        else {
1191                            paginationHTML += '<' + s.params.paginationElement+' class="' + s.params.bulletClass + '"></' + s.params.paginationElement + '>';
1192                        }
1193                    }
1194                    s.paginationContainer.html(paginationHTML);
1195                    s.bullets = s.paginationContainer.find('.' + s.params.bulletClass);
1196                    if (s.params.paginationClickable && s.params.a11y && s.a11y) {
1197                        s.a11y.initPagination();
1198                    }
1199                }
1200                if (s.params.paginationType === 'fraction') {
1201                    if (s.params.paginationFractionRender) {
1202                        paginationHTML = s.params.paginationFractionRender(s, s.params.paginationCurrentClass, s.params.paginationTotalClass);
1203                    }
1204                    else {
1205                        paginationHTML =
1206                            '<span class="' + s.params.paginationCurrentClass + '"></span>' +
1207                            ' / ' +
1208                            '<span class="' + s.params.paginationTotalClass+'"></span>';
1209                    }
1210                    s.paginationContainer.html(paginationHTML);
1211                }
1212                if (s.params.paginationType === 'progress') {
1213                    if (s.params.paginationProgressRender) {
1214                        paginationHTML = s.params.paginationProgressRender(s, s.params.paginationProgressbarClass);
1215                    }
1216                    else {
1217                        paginationHTML = '<span class="' + s.params.paginationProgressbarClass + '"></span>';
1218                    }
1219                    s.paginationContainer.html(paginationHTML);
1220                }
1221                if (s.params.paginationType !== 'custom') {
1222                    s.emit('onPaginationRendered', s, s.paginationContainer[0]);
1223                }
1224            }
1225        };
1226        /*=========================
1227          Common update method
1228          ===========================*/
1229        s.update = function (updateTranslate) {
1230            if (!s) return;
1231            s.updateContainerSize();
1232            s.updateSlidesSize();
1233            s.updateProgress();
1234            s.updatePagination();
1235            s.updateClasses();
1236            if (s.params.scrollbar && s.scrollbar) {
1237                s.scrollbar.set();
1238            }
1239            var newTranslate;
1240            function forceSetTranslate() {
1241                var translate = s.rtl ? -s.translate : s.translate;
1242                newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate());
1243                s.setWrapperTranslate(newTranslate);
1244                s.updateActiveIndex();
1245                s.updateClasses();
1246            }
1247            if (updateTranslate) {
1248                var translated;
1249                if (s.controller && s.controller.spline) {
1250                    s.controller.spline = undefined;
1251                }
1252                if (s.params.freeMode) {
1253                    forceSetTranslate();
1254                    if (s.params.autoHeight) {
1255                        s.updateAutoHeight();
1256                    }
1257                }
1258                else {
1259                    if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) {
1260                        translated = s.slideTo(s.slides.length - 1, 0, false, true);
1261                    }
1262                    else {
1263                        translated = s.slideTo(s.activeIndex, 0, false, true);
1264                    }
1265                    if (!translated) {
1266                        forceSetTranslate();
1267                    }
1268                }
1269            }
1270            else if (s.params.autoHeight) {
1271                s.updateAutoHeight();
1272            }
1273        };
1274        
1275        /*=========================
1276          Resize Handler
1277          ===========================*/
1278        s.onResize = function (forceUpdatePagination) {
1279            if (s.params.onBeforeResize) s.params.onBeforeResize(s);
1280            //Breakpoints
1281            if (s.params.breakpoints) {
1282                s.setBreakpoint();
1283            }
1284        
1285            // Disable locks on resize
1286            var allowSwipeToPrev = s.params.allowSwipeToPrev;
1287            var allowSwipeToNext = s.params.allowSwipeToNext;
1288            s.params.allowSwipeToPrev = s.params.allowSwipeToNext = true;
1289        
1290            s.updateContainerSize();
1291            s.updateSlidesSize();
1292            if (s.params.slidesPerView === 'auto' || s.params.freeMode || force
1292UpdatePagination) s.updatePagination();
1293            if (s.params.scrollbar && s.scrollbar) {
1294                s.scrollbar.set();
1295            }
1296            if (s.controller && s.controller.spline) {
1297                s.controller.spline = undefined;
1298            }
1299            var slideChangedBySlideTo = false;
1300            if (s.params.freeMode) {
1301                var newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate());
1302                s.setWrapperTranslate(newTranslate);
1303                s.updateActiveIndex();
1304                s.updateClasses();
1305        
1306                if (s.params.autoHeight) {
1307                    s.updateAutoHeight();
1308                }
1309            }
1310            else {
1311                s.updateClasses();
1312                if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) {
1313                    slideChangedBySlideTo = s.slideTo(s.slides.length - 1, 0, false, true);
1314                }
1315                else {
1316                    slideChangedBySlideTo = s.slideTo(s.activeIndex, 0, false, true);
1317                }
1318            }
1319            if (s.params.lazyLoading && !slideChangedBySlideTo && s.lazy) {
1320                s.lazy.load();
1321            }
1322            // Return locks after resize
1323            s.params.allowSwipeToPrev = allowSwipeToPrev;
1324            s.params.allowSwipeToNext = allowSwipeToNext;
1325            if (s.params.onAfterResize) s.params.onAfterResize(s);
1326        };
1327        
1328        /*=========================
1329          Events
1330          ===========================*/
1331        
1332        //Define Touch Events
1333        s.touchEventsDesktop = {start: 'mousedown', move: 'mousemove', end: 'mouseup'};
1334        if (window.navigator.pointerEnabled) s.touchEventsDesktop = {start: 'pointerdown', move: 'pointermove', end: 'pointerup'};
1335        else if (window.navigator.msPointerEnabled) s.touchEventsDesktop = {start: 'MSPointerDown', move: 'MSPointerMove', end: 'MSPointerUp'};
1336        s.touchEvents = {
1337            start : s.support.touch || !s.params.simulateTouch  ? 'touchstart' : s.touchEventsDesktop.start,
1338            move : s.support.touch || !s.params.simulateTouch ? 'touchmove' : s.touchEventsDesktop.move,
1339            end : s.support.touch || !s.params.simulateTouch ? 'touchend' : s.touchEventsDesktop.end
1340        };
1341        
1342        
1343        // WP8 Touch Events Fix
1344        if (window.navigator.pointerEnabled || window.navigator.msPointerEnabled) {
1345            (s.params.touchEventsTarget === 'container' ? s.container : s.wrapper).addClass('swiper-wp8-' + s.params.direction);
1346        }
1347        
1348        // Attach/detach events
1349        s.initEvents = function (detach) {
1350            var actionDom = detach ? 'off' : 'on';
1351            var action = detach ? 'removeEventListener' : 'addEventListener';
1352            var touchEventsTarget = s.params.touchEventsTarget === 'container' ? s.container[0] : s.wrapper[0];
1353            var target = s.support.touch ? touchEventsTarget : document;
1354        
1355            var moveCapture = s.params.nested ? true : false;
1356        
1357            //Touch Events
1358            if (s.browser.ie) {
1359                touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, false);
1360                target[action](s.touchEvents.move, s.onTouchMove, moveCapture);
1361                target[action](s.touchEvents.end, s.onTouchEnd, false);
1362            }
1363            else {
1364                if (s.support.touch) {
1365                    var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false;
1366                    touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, passiveListener);
1367                    touchEventsTarget[action](s.touchEvents.move, s.onTouchMove, moveCapture);
1368                    touchEventsTarget[action](s.touchEvents.end, s.onTouchEnd, passiveListener);
1369                }
1370                if ((params.simulateTouch && !s.device.ios && !s.device.android) || (params.simulateTouch && !s.support.touch && s.device.ios)) {
1371                    touchEventsTarget[action]('mousedown', s.onTouchStart, false);
1372                    document[action]('mousemove', s.onTouchMove, moveCapture);
1373                    document[action]('mouseup', s.onTouchEnd, false);
1374                }
1375            }
1376            window[action]('resize', s.onResize);
1377        
1378            // Next, Prev, Index
1379            if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) {
1380                s.nextButton[actionDom]('click', s.onClickNext);
1381                if (s.params.a11y && s.a11y) s.nextButton[actionDom]('keydown', s.a11y.onEnterKey);
1382            }
1383            if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) {
1384                s.prevButton[actionDom]('click', s.onClickPrev);
1385                if (s.params.a11y && s.a11y) s.prevButton[actionDom]('keydown', s.a11y.onEnterKey);
1386            }
1387            if (s.params.pagination && s.params.paginationClickable) {
1388                s.paginationContainer[actionDom]('click', '.' + s.params.bulletClass, s.onClickIndex);
1389                if (s.params.a11y && s.a11y) s.paginationContainer[actionDom]('keydown', '.' + s.params.bulletClass, s.a11y.onEnterKey);
1390            }
1391        
1392            // Prevent Links Clicks
1393            if (s.params.preventClicks || s.params.preventClicksPropagation) touchEventsTarget[action]('click', s.preventClicks, true);
1394        };
1395        s.attachEvents = function () {
1396            s.initEvents();
1397        };
1398        s.detachEvents = function () {
1399            s.initEvents(true);
1400        };
1401        
1402        /*=========================
1403          Handle Clicks
1404          ===========================*/
1405        // Prevent Clicks
1406        s.allowClick = true;
1407        s.preventClicks = function (e) {
1408            if (!s.allowClick) {
1409                if (s.params.preventClicks) e.preventDefault();
1410                if (s.params.preventClicksPropagation && s.animating) {
1411                    e.stopPropagation();
1412                    e.stopImmediatePropagation();
1413                }
1414            }
1415        };
1416        // Clicks
1417        s.onClickNext = function (e) {
1418            e.preventDefault();
1419            if (s.isEnd && !s.params.loop) return;
1420            s.slideNext();
1421        };
1422        s.onClickPrev = function (e) {
1423            e.preventDefault();
1424            if (s.isBeginning && !s.params.loop) return;
1425            s.slidePrev();
1426        };
1427        s.onClickIndex = function (e) {
1428            e.preventDefault();
1429            var index = $(this).index() * s.params.slidesPerGroup;
1430            if (s.params.loop) index = index + s.loopedSlides;
1431            s.slideTo(index);
1432        };
1433        
1434        /*=========================
1435          Handle Touches
1436          ===========================*/
1437        function findElementInEvent(e, selector) {
1438            var el = $(e.target);
1439            if (!el.is(selector)) {
1440                if (typeof selector === 'string') {
1441                    el = el.parents(selector);
1442                }
1443                else if (selector.nodeType) {
1444                    var found;
1445                    el.parents().each(function (index, _el) {
1446                        if (_el === selector) found = selector;
1447                    });
1448                    if (!found) return undefined;
1449                    else return selector;
1450                }
1451            }
1452            if (el.length === 0) {
1453                return undefined;
1454            }
1455            return el[0];
1456        }
1457        s.updateClickedSlide = function (e) {
1458            var slide = findElementInEvent(e, '.' + s.params.slideClass);
1459            var slideFound = false;
1460            if (slide) {
1461                for (var i = 0; i < s.slides.length; i++) {
1462                    if (s.slides[i] === slide) slideFound = true;
1463                }
1464            }
1465        
1466            if (slide && slideFound) {
1467                s.clickedSlide = slide;
1468                s.clickedIndex = $(slide).index();
1469            }
1470            else {
1471                s.clickedSlide = undefined;
1472                s.clickedIndex = undefined;
1473                return;
1474            }
1475            if (s.params.slideToClickedSlide && s.clickedIndex !== undefined && s.clickedIndex !== s.activeIndex) {
1476                var slideToIndex = s.clickedIndex,
1477                    realIndex,
1478                    duplicatedSlides,
1479                    slidesPerView = s.params.slidesPerView === 'auto' ? s.currentSlidesPerView() : s.params.slidesPerView;
1480                if (s.params.loop) {
1481                    if (s.animating) return;
1482                    realIndex = parseInt($(s.clickedSlide).attr('data-swiper-slide-index'), 10);
1483                    if (s.params.centeredSlides) {
1484                        if ((slideToIndex < s.loopedSlides - slidesPerView/2) || (slideToIndex > s.slides.length - s.loopedSlides + slidesPerView/2)) {
1485                            s.fixLoop();
1486                            slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index="' + realIndex + '"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index();
1487                            setTimeout(function () {
1488                                s.slideTo(slideToIndex);
1489                            }, 0);
1490                        }
1491                        else {
1492                            s.slideTo(slideToIndex);
1493                        }
1494                    }
1495                    else {
1496                        if (slideToIndex > s.slides.length - slidesPerView) {
1497                            s.fixLoop();
1498                            slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index="' + realIndex + '"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index();
1499                            setTimeout(function () {
1500                                s.slideTo(slideToIndex);
1501                            }, 0);
1502                        }
1503                        else {
1504                            s.slideTo(slideToIndex);
1505                        }
1506                    }
1507                }
1508                else {
1509                    s.slideTo(slideToIndex);
1510                }
1511            }
1512        };
1513        
1514        var isTouched,
1515            isMoved,
1516            allowTouchCallbacks,
1517            touchStartTime,
1518            isScrolling,
1519            currentTranslate,
1520            startTranslate,
1521            allowThresholdMove,
1522            // Form elements to match
1523            formElements = 'input, select, textarea, button, video',
1524            // Last click time
1525            lastClickTime = Date.now(), clickTimeout,
1526            //Velocities
1527            velocities = [],
1528            allowMomentumBounce;
1529        
1530        // Animating Flag
1531        s.animating = false;
1532        
1533        // Touches information
1534        s.touches = {
1535            startX: 0,
1536            startY: 0,
1537            currentX: 0,
1538            currentY: 0,
1539            diff: 0
1540        };
1541        
1542        // Touch handlers
1543        var isTouchEvent, startMoving;
1544        s.onTouchStart = function (e) {
1545            if (e.originalEvent) e = e.originalEvent;
1546            isTouchEvent = e.type === 'touchstart';
1547            if (!isTouchEvent && 'which' in e && e.which === 3) return;
1548            if (s.params.noSwiping && findElementInEvent(e, '.' + s.params.noSwipingClass)) {
1549                s.allowClick = true;
1550                return;
1551            }
1552            if (s.params.swipeHandler) {
1553                if (!findElementInEvent(e, s.params.swipeHandler)) return;
1554            }
1555        
1556            var startX = s.touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
1557            var startY = s.touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
1558        
1559            // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
1560            if(s.device.ios && s.params.iOSEdgeSwipeDetection && startX <= s.params.iOSEdgeSwipeThreshold) {
1561                return;
1562            }
1563        
1564            isTouched = true;
1565            isMoved = false;
1566            allowTouchCallbacks = true;
1567            isScrolling = undefined;
1568            startMoving = undefined;
1569            s.touches.startX = startX;
1570            s.touches.startY = startY;
1571            touchStartTime = Date.now();
1572            s.allowClick = true;
1573            s.updateContainerSize();
1574            s.swipeDirection = undefined;
1575            if (s.params.threshold > 0) allowThresholdMove = false;
1576            if (e.type !== 'touchstart') {
1577                var preventDefault = true;
1578                if ($(e.target).is(formElements)) preventDefault = false;
1579                if (document.activeElement && $(document.activeElement).is(formElements)) {
1580                    document.activeElement.blur();
1581                }
1582                if (preventDefault) {
1583                    e.preventDefault();
1584                }
1585            }
1586            s.emit('onTouchStart', s, e);
1587        };
1588        
1589        s.onTouchMove = function (e) {
1590            if (e.originalEvent) e = e.originalEvent;
1591            if (isTouchEvent && e.type === 'mousemove') return;
1592            if (e.preventedByNestedSwiper) {
1593                s.touches.startX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
1594                s.touches.startY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
1595                return;
1596            }
1597            if (s.params.onlyExternal) {
1598                // isMoved = true;
1599                s.allowClick = false;
1600                if (isTouched) {
1601                    s.touches.startX = s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
1602                    s.touches.startY = s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
1603                    touchStartTime = Date.now();
1604                }
1605                return;
1606            }
1607            if (isTouchEvent && s.params.touchReleaseOnEdges && !s.params.loop) {
1608                if (!s.isHorizontal()) {
1609                    // Vertical
1610                    if (
1611                        (s.touches.currentY < s.touches.startY && s.translate <= s.maxTranslate()) ||
1612                        (s.touches.currentY > s.touches.startY && s.translate >= s.minTranslate())
1613                        ) {
1614                        return;
1615                    }
1616                }
1617                else {
1618                    if (
1619                        (s.touches.currentX < s.touches.startX && s.translate <= s.maxTranslate()) ||
1620                        (s.touches.currentX > s.touches.startX && s.translate >= s.minTranslate())
1621                        ) {
1622                        return;
1623                    }
1624                }
1625            }
1626            if (isTouchEvent && document.activeElement) {
1627                if (e.target === document.activeElement && $(e.target).is(formElements)) {
1628                    isMoved = true;
1629                    s.allowClick = false;
1630                    return;
1631                }
1632            }
1633            if (allowTouchCallbacks) {
1634                s.emit('onTouchMove', s, e);
1635            }
1636            if (e.targetTouches && e.targetTouches.length > 1) return;
1637        
1638            s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
1639            s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
1640        
1641            if (typeof isScrolling === 'undefined') {
1642                var touchAngle;
1643                if (s.isHorizontal() && s.touches.currentY === s.touches.startY || !s.isHorizontal() && s.touches.currentX === s.touches.startX) {
1644                    isScrolling = false;
1645                }
1646                else {
1647                    touchAngle = Math.atan2(Math.abs(s.touches.currentY - s.touches.startY), Math.abs(s.touches.currentX - s.touches.startX)) * 180 / Math.PI;
1648                    isScroll
1648ing = s.isHorizontal() ? touchAngle > s.params.touchAngle : (90 - touchAngle > s.params.touchAngle);
1649                }
1650            }
1651            if (isScrolling) {
1652                s.emit('onTouchMoveOpposite', s, e);
1653            }
1654            if (typeof startMoving === 'undefined') {
1655                if (s.touches.currentX !== s.touches.startX || s.touches.currentY !== s.touches.startY) {
1656                    startMoving = true;
1657                }
1658            }
1659            if (!isTouched) return;
1660            if (isScrolling)  {
1661                isTouched = false;
1662                return;
1663            }
1664            if (!startMoving) {
1665                return;
1666            }
1667            s.allowClick = false;
1668            s.emit('onSliderMove', s, e);
1669            e.preventDefault();
1670            if (s.params.touchMoveStopPropagation && !s.params.nested) {
1671                e.stopPropagation();
1672            }
1673        
1674            if (!isMoved) {
1675                if (params.loop) {
1676                    s.fixLoop();
1677                }
1678                startTranslate = s.getWrapperTranslate();
1679                s.setWrapperTransition(0);
1680                if (s.animating) {
1681                    s.wrapper.trigger('webkitTransitionEnd transitionend oTransitionEnd MSTransitionEnd msTransitionEnd');
1682                }
1683                if (s.params.autoplay && s.autoplaying) {
1684                    if (s.params.autoplayDisableOnInteraction) {
1685                        s.stopAutoplay();
1686                    }
1687                    else {
1688                        s.pauseAutoplay();
1689                    }
1690                }
1691                allowMomentumBounce = false;
1692                //Grab Cursor
1693                if (s.params.grabCursor && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) {
1694                    s.setGrabCursor(true);
1695                }
1696            }
1697            isMoved = true;
1698        
1699            var diff = s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY;
1700        
1701            diff = diff * s.params.touchRatio;
1702            if (s.rtl) diff = -diff;
1703        
1704            s.swipeDirection = diff > 0 ? 'prev' : 'next';
1705            currentTranslate = diff + startTranslate;
1706        
1707            var disableParentSwiper = true;
1708            if ((diff > 0 && currentTranslate > s.minTranslate())) {
1709                disableParentSwiper = false;
1710                if (s.params.resistance) currentTranslate = s.minTranslate() - 1 + Math.pow(-s.minTranslate() + startTranslate + diff, s.params.resistanceRatio);
1711            }
1712            else if (diff < 0 && currentTranslate < s.maxTranslate()) {
1713                disableParentSwiper = false;
1714                if (s.params.resistance) currentTranslate = s.maxTranslate() + 1 - Math.pow(s.maxTranslate() - startTranslate - diff, s.params.resistanceRatio);
1715            }
1716        
1717            if (disableParentSwiper) {
1718                e.preventedByNestedSwiper = true;
1719            }
1720        
1721            // Directions locks
1722            if (!s.params.allowSwipeToNext && s.swipeDirection === 'next' && currentTranslate < startTranslate) {
1723                currentTranslate = startTranslate;
1724            }
1725            if (!s.params.allowSwipeToPrev && s.swipeDirection === 'prev' && currentTranslate > startTranslate) {
1726                currentTranslate = startTranslate;
1727            }
1728        
1729        
1730            // Threshold
1731            if (s.params.threshold > 0) {
1732                if (Math.abs(diff) > s.params.threshold || allowThresholdMove) {
1733                    if (!allowThresholdMove) {
1734                        allowThresholdMove = true;
1735                        s.touches.startX = s.touches.currentX;
1736                        s.touches.startY = s.touches.currentY;
1737                        currentTranslate = startTranslate;
1738                        s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY;
1739                        return;
1740                    }
1741                }
1742                else {
1743                    currentTranslate = startTranslate;
1744                    return;
1745                }
1746            }
1747        
1748            if (!s.params.followFinger) return;
1749        
1750            // Update active index in free mode
1751            if (s.params.freeMode || s.params.watchSlidesProgress) {
1752                s.updateActiveIndex();
1753            }
1754            if (s.params.freeMode) {
1755                //Velocity
1756                if (velocities.length === 0) {
1757                    velocities.push({
1758                        position: s.touches[s.isHorizontal() ? 'startX' : 'startY'],
1759                        time: touchStartTime
1760                    });
1761                }
1762                velocities.push({
1763                    position: s.touches[s.isHorizontal() ? 'currentX' : 'currentY'],
1764                    time: (new window.Date()).getTime()
1765                });
1766            }
1767            // Update progress
1768            s.updateProgress(currentTranslate);
1769            // Update translate
1770            s.setWrapperTranslate(currentTranslate);
1771        };
1772        s.onTouchEnd = function (e) {
1773            if (e.originalEvent) e = e.originalEvent;
1774            if (allowTouchCallbacks) {
1775                s.emit('onTouchEnd', s, e);
1776            }
1777            allowTouchCallbacks = false;
1778            if (!isTouched) return;
1779            //Return Grab Cursor
1780            if (s.params.grabCursor && isMoved && isTouched  && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) {
1781                s.setGrabCursor(false);
1782            }
1783        
1784            // Time diff
1785            var touchEndTime = Date.now();
1786            var timeDiff = touchEndTime - touchStartTime;
1787        
1788            // Tap, doubleTap, Click
1789            if (s.allowClick) {
1790                s.updateClickedSlide(e);
1791                s.emit('onTap', s, e);
1792                if (timeDiff < 300 && (touchEndTime - lastClickTime) > 300) {
1793                    if (clickTimeout) clearTimeout(clickTimeout);
1794                    clickTimeout = setTimeout(function () {
1795                        if (!s) return;
1796                        if (s.params.paginationHide && s.paginationContainer.length > 0 && !$(e.target).hasClass(s.params.bulletClass)) {
1797                            s.paginationContainer.toggleClass(s.params.paginationHiddenClass);
1798                        }
1799                        s.emit('onClick', s, e);
1800                    }, 300);
1801        
1802                }
1803                if (timeDiff < 300 && (touchEndTime - lastClickTime) < 300) {
1804                    if (clickTimeout) clearTimeout(clickTimeout);
1805                    s.emit('onDoubleTap', s, e);
1806                }
1807            }
1808        
1809            lastClickTime = Date.now();
1810            setTimeout(function () {
1811                if (s) s.allowClick = true;
1812            }, 0);
1813        
1814            if (!isTouched || !isMoved || !s.swipeDirection || s.touches.diff === 0 || currentTranslate === startTranslate) {
1815                isTouched = isMoved = false;
1816                return;
1817            }
1818            isTouched = isMoved = false;
1819        
1820            var currentPos;
1821            if (s.params.followFinger) {
1822                currentPos = s.rtl ? s.translate : -s.translate;
1823            }
1824            else {
1825                currentPos = -currentTranslate;
1826            }
1827            if (s.params.freeMode) {
1828                if (currentPos < -s.minTranslate()) {
1829                    s.slideTo(s.activeIndex);
1830                    return;
1831                }
1832                else if (currentPos > -s.maxTranslate()) {
1833                    if (s.slides.length < s.snapGrid.length) {
1834                        s.slideTo(s.snapGrid.length - 1);
1835                    }
1836                    else {
1837                        s.slideTo(s.slides.length - 1);
1838                    }
1839                    return;
1840                }
1841        
1842                if (s.params.freeModeMomentum) {
1843                    if (velocities.length > 1) {
1844                        var lastMoveEvent = velocities.pop(), velocityEvent = velocities.pop();
1845        
1846                        var distance = lastMoveEvent.position - velocityEvent.position;
1847                        var time = lastMoveEvent.time - velocityEvent.time;
1848                        s.velocity = distance / time;
1849                        s.velocity = s.velocity / 2;
1850                        if (Math.abs(s.velocity) < s.params.freeModeMinimumVelocity) {
1851                            s.velocity = 0;
1852                        }
1853                        // this implies that the user stopped moving a finger then released.
1854                        // There would be no events with distance zero, so the last event is stale.
1855                        if (time > 150 || (new window.Date().getTime() - lastMoveEvent.time) > 300) {
1856                            s.velocity = 0;
1857                        }
1858                    } else {
1859                        s.velocity = 0;
1860                    }
1861                    s.velocity = s.velocity * s.params.freeModeMomentumVelocityRatio;
1862        
1863                    velocities.length = 0;
1864                    var momentumDuration = 1000 * s.params.freeModeMomentumRatio;
1865                    var momentumDistance = s.velocity * momentumDuration;
1866        
1867                    var newPosition = s.translate + momentumDistance;
1868                    if (s.rtl) newPosition = - newPosition;
1869                    var doBounce = false;
1870                    var afterBouncePosition;
1871                    var bounceAmount = Math.abs(s.velocity) * 20 * s.params.freeModeMomentumBounceRatio;
1872                    if (newPosition < s.maxTranslate()) {
1873                        if (s.params.freeModeMomentumBounce) {
1874                            if (newPosition + s.maxTranslate() < -bounceAmount) {
1875                                newPosition = s.maxTranslate() - bounceAmount;
1876                            }
1877                            afterBouncePosition = s.maxTranslate();
1878                            doBounce = true;
1879                            allowMomentumBounce = true;
1880                        }
1881                        else {
1882                            newPosition = s.maxTranslate();
1883                        }
1884                    }
1885                    else if (newPosition > s.minTranslate()) {
1886                        if (s.params.freeModeMomentumBounce) {
1887                            if (newPosition - s.minTranslate() > bounceAmount) {
1888                                newPosition = s.minTranslate() + bounceAmount;
1889                            }
1890                            afterBouncePosition = s.minTranslate();
1891                            doBounce = true;
1892                            allowMomentumBounce = true;
1893                        }
1894                        else {
1895                            newPosition = s.minTranslate();
1896                        }
1897                    }
1898                    else if (s.params.freeModeSticky) {
1899                        var j = 0,
1900                            nextSlide;
1901                        for (j = 0; j < s.snapGrid.length; j += 1) {
1902                            if (s.snapGrid[j] > -newPosition) {
1903                                nextSlide = j;
1904                                break;
1905                            }
1906        
1907                        }
1908                        if (Math.abs(s.snapGrid[nextSlide] - newPosition) < Math.abs(s.snapGrid[nextSlide - 1] - newPosition) || s.swipeDirection === 'next') {
1909                            newPosition = s.snapGrid[nextSlide];
1910                        } else {
1911                            newPosition = s.snapGrid[nextSlide - 1];
1912                        }
1913                        if (!s.rtl) newPosition = - newPosition;
1914                    }
1915                    //Fix duration
1916                    if (s.velocity !== 0) {
1917                        if (s.rtl) {
1918                            momentumDuration = Math.abs((-newPosition - s.translate) / s.velocity);
1919                        }
1920                        else {
1921                            momentumDuration = Math.abs((newPosition - s.translate) / s.velocity);
1922                        }
1923                    }
1924                    else if (s.params.freeModeSticky) {
1925                        s.slideReset();
1926                        return;
1927                    }
1928        
1929                    if (s.params.freeModeMomentumBounce && doBounce) {
1930                        s.updateProgress(afterBouncePosition);
1931                        s.setWrapperTransition(momentumDuration);
1932                        s.setWrapperTranslate(newPosition);
1933                        s.onTransitionStart();
1934                        s.animating = true;
1935                        s.wrapper.transitionEnd(function () {
1936                            if (!s || !allowMomentumBounce) return;
1937                            s.emit('onMomentumBounce', s);
1938        
1939                            s.setWrapperTransition(s.params.speed);
1940                            s.setWrapperTranslate(afterBouncePosition);
1941                            s.wrapper.transitionEnd(function () {
1942                                if (!s) return;
1943                                s.onTransitionEnd();
1944                            });
1945                        });
1946                    } else if (s.velocity) {
1947                        s.updateProgress(newPosition);
1948                        s.setWrapperTransition(momentumDuration);
1949                        s.setWrapperTranslate(newPosition);
1950                        s.onTransitionStart();
1951                        if (!s.animating) {
1952                            s.animating = true;
1953                            s.wrapper.transitionEnd(function () {
1954                                if (!s) return;
1955                                s.onTransitionEnd();
1956                            });
1957                        }
1958        
1959                    } else {
1960                        s.updateProgress(newPosition);
1961                    }
1962        
1963                    s.updateActiveIndex();
1964                }
1965                if (!s.params.freeModeMomentum || timeDiff >= s.params.longSwipesMs) {
1966                    s.updateProgress();
1967                    s.updateActiveIndex();
1968                }
1969                return;
1970            }
1971        
1972            // Find current slide
1973            var i, stopIndex = 0, groupSize = s.slidesSizesGrid[0];
1974            for (i = 0; i < s.slidesGrid.length; i += s.params.slidesPerGroup) {
1975                if (typeof s.slidesGrid[i + s.params.slidesPerGroup] !== 'undefined') {
1976                    if (currentPos >= s.slidesGrid[i] && currentPos < s.slidesGrid[i + s.params.slidesPerGroup]) {
1977                        stopIndex = i;
1978                        groupSize = s.slidesGrid[i + s.params.slidesPerGroup] - s.slidesGrid[i];
1979                    }
1980                }
1981                else {
1982                    if (currentPos >= s.slidesGrid[i]) {
1983                        stopIndex = i;
1984                        groupSize = s.slidesGrid[s.slidesGrid.length - 1] - s.slidesGrid[s.slidesGrid.length - 2];
1985                    }
1986                }
1987            }
1988        
1989            // Find current slide size
1990            var ratio = (currentPos - s.slidesGrid[stopIndex]) / groupSize;
1991        
1992            if (timeDiff > s.params.longSwipesMs) {
1993                // Long touches
1994                if (!s.params.longSwipes) {
1995                    s.slideTo(s.activeIndex);
1996                    return;
1997                }
1998                if (s.swipeDirection === 'next') {
1999                    if (ratio >= s.params.longSwipesRatio) s.slideTo(stopIndex + s.params.slidesPerGroup);
2000                    else s.slideTo(stopIndex);
2001        
2002                }
2003                if (s.swipeDirection === 'prev') {
2004                    if (ratio > (1 - s.params.longSwipesRatio)) s.slideTo(stopIndex + s.params.slidesPerGroup);
2005                    else s.slideTo(stopIndex);
2006                }
2007            }
2008            else {
2009                // Short swipes
2010                if (!s.params.shortSwipes) {
2011                    s.slideTo(s.activeIndex);
2012                    return;
2013                }
2014                if (s.swipeDirection === 'next') {
2015                    s.slideTo(stopIndex + s.params.slidesPerGroup);
2016        
2017                }
2018                if (s.swipeDirection === 'prev') {
2019                    s.slideTo(stopIndex);
2020                }
2021            }
2022        };
2023        /*=========================
2024          Transitions
2025          ===========================*/
2026        s._slideTo = function (slideIndex, speed) {
2027            return s.slideTo(slideIndex, speed, true, true);
2028        };
2029        s.slideTo = function (slideIndex, speed, runCallbacks, internal) {
2030            if (typeof runCallbacks === 'undefined') runCallbacks = true;
2031            if (typeof slideIndex === 'undefined') slideIndex = 0;
2032            if (slideIndex < 0) slideIndex = 0;
2033            s.snapIndex = Math.floor(slideIndex / s.params.slidesPerGroup);
2034            if (s.snapIndex >= s.snapGrid.length) s.snapIndex = s.snapGrid.length - 1;
2035        
2036            var translate = - s.snapGrid[s.snapIndex];
2037            // Stop autoplay
2038            if (s.params.autoplay && s.autoplaying) {
2039                if (internal || !s.params.autoplayDisableOnInteraction) {
2040                    s.pauseAutoplay(speed);
2041                }
2042                else {
2043                    s.stopAutoplay();
2044                }
2045            }
2046            // Update progress
2047            s.updateProgress(translate);
2048        
2049            // Normalize slideIndex
2050            if(s.params.normalizeSlideIndex){
2051                for (var i = 0; i < s.slidesGrid.length; i++) {
2052                    if (- Math.floor(translate * 100) >= Math.floor(s.slidesGrid[i] * 100)) {
2053                        slideIndex = i;
2054                    }
2055                }
2056            }
2057        
2058            // Directions locks
2059            if (!s.params.allowSwipeToNext && translate < s.translate && translate < s.minTranslate()) {
2060                return false;
2061            }
2062            if (!s.params.allowSwipeToPrev && translate > s.translate && translate > s.maxTranslate()) {
2063                if ((s.activeIndex || 0) !== slideIndex ) return false;
2064            }
2065        
2066            // Update Index
2067            if (typeof speed === 'undefined') speed = s.params.speed;
2068            s.previousIndex = s.activeIndex || 0;
2069            s.activeIndex = slideIndex;
2070            s.updateRealIndex();
2071            if ((s.rtl && -translate === s.translate) || (!s.rtl && translate === s.translate)) {
2072                // Update Height
2073                if (s.params.autoHeight) {
2074                    s.updateAutoHeight();
2075                }
2076                s.updateClasses();
2077                if (s.params.effect !== 'slide') {
2078                    s.setWrapperTranslate(translate);
2079                }
2080                return false;
2081            }
2082            s.updateClasses();
2083            s.onTransitionStart(runCallbacks);
2084        
2085            if (speed === 0 || s.browser.lteIE9) {
2086                s.setWrapperTranslate(translate);
2087                s.setWrapperTransition(0);
2088                s.onTransitionEnd(runCallbacks);
2089            }
2090            else {
2091                s.setWrapperTranslate(translate);
2092                s.setWrapperTransition(speed);
2093                if (!s.animating) {
2094                    s.animating = true;
2095                    s.wrapper.transitionEnd(function () {
2096                        if (!s) return;
2097                        s.onTransitionEnd(runCallbacks);
2098                    });
2099                }
2100        
2101            }
2102        
2103            return true;
2104        };
2105        
2106        s.onTransitionStart = function (runCallbacks) {
2107            if (typeof runCallbacks === 'undefined') runCallbacks = true;
2108            if (s.params.autoHeight) {
2109                s.updateAutoHeight();
2110            }
2111            if (s.lazy) s.lazy.onTransitionStart();
2112            if (runCallbacks) {
2113                s.emit('onTransitionStart', s);
2114                if (s.activeIndex !== s.previousIndex) {
2115                    s.emit('onSlideChangeStart', s);
2116                    if (s.activeIndex > s.previousIndex) {
2117                        s.emit('onSlideNextStart', s);
2118                    }
2119                    else {
2120                        s.emit('onSlidePrevStart', s);
2121                    }
2122                }
2123        
2124            }
2125        };
2126        s.onTransitionEnd = function (runCallbacks) {
2127            s.animating = false;
2128            s.setWrapperTransition(0);
2129            if (typeof runCallbacks === 'undefined') runCallbacks = true;
2130            if (s.lazy) s.lazy.onTransitionEnd();
2131            if (runCallbacks) {
2132                s.emit('onTransitionEnd', s);
2133                if (s.activeIndex !== s.previousIndex) {
2134                    s.emit('onSlideChangeEnd', s);
2135                    if (s.activeIndex > s.previousIndex) {
2136                        s.emit('onSlideNextEnd', s);
2137                    }
2138                    else {
2139                        s.emit('onSlidePrevEnd', s);
2140                    }
2141                }
2142            }
2143            if (s.params.history && s.history) {
2144                s.history.setHistory(s.params.history, s.activeIndex);
2145            }
2146            if (s.params.hashnav && s.hashnav) {
2147                s.hashnav.setHash();
2148            }
2149        
2150        };
2151        s.slideNext = function (runCallbacks, speed, internal) {
2152            if (s.params.loop) {
2153                if (s.animating) return false;
2154                s.fixLoop();
2155                var clientLeft = s.container[0].clientLeft;
2156                return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal);
2157            }
2158            else return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal);
2159        };
2160        s._slideNext = function (speed) {
2161            return s.slideNext(true, speed, true);
2162        };
2163        s.slidePrev = function (runCallbacks, speed, internal) {
2164            if (s.params.loop) {
2165                if (s.animating) return false;
2166                s.fixLoop();
2167                var clientLeft = s.container[0].clientLeft;
2168                return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal);
2169            }
2170            else return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal);
2171        };
2172        s._slidePrev = function (speed) {
2173            return s.slidePrev(true, speed, true);
2174        };
2175        s.slideReset = function (runCallbacks, speed, internal) {
2176            return s.slideTo(s.activeIndex, speed, runCallbacks);
2177        };
2178        
2179        s.disableTouchControl = function () {
2180            s.params.onlyExternal = true;
2181            return true;
2182        };
2183        s.enableTouchControl = function () {
2184            s.params.onlyExternal = false;
2185            return true;
2186        };
2187        
2188        /*=========================
2189          Translate/transition helpers
2190          ===========================*/
2191        s.setWrapperTransition = function (duration, byController) {
2192            s.wrapper.transition(duration);
2193            if (s.params.effect !== 'slide' && s.effects[s.params.effect]) {
2194                s.effects[s.params.effect].setTransition(duration);
2195            }
2196            if (s.params.parallax && s.parallax) {
2197                s.parallax.setTransition(duration);
2198            }
2199            if (s.params.scrollbar && s.scrollbar) {
2200                s.scrollbar.setTransition(duration);
2201            }
2202            if (s.params.control && s.controller) {
2203                s.controller.setTransition(duration, byController);
2204            }
2205            s.emit('onSetTransition', s, duration);
2206        };
2207        s.setWrapperTranslate = function (translate, updateActiveIndex, byController) {
2208            var x = 0, y = 0, z = 0;
2209            if (s.isHorizontal()) {
2210                x = s.rtl ? -translate : translate;
2211            }
2212            else {
2213                y = translate;
2214            }
2215        
2216            if (s.params.roundLengths) {
2217                x = round(x);
2218                y = round(y);
2219            }
2220        
2221            if (!s.params.virtualTranslate) {
2222                if (s.support.transforms3d) s.wrapper.transform('translate3d(' + x + 'px, ' + y + 'px, ' + z + 'px)');
2223                else s.wrapper.transform('translate(' + x + 'px, ' + y + 'px)');
2224            }
2225        
2226            s.translate = s.isHorizontal() ? x : y;
2227        
2228            // Check if we need to update progress
2229            var progress;
2230            var translatesDiff = s.maxTranslate() - s.minTranslate();
2231            if (translatesDiff === 0) {
2232                progress = 0;
2233            }
2234            else {
2235                progress = (translate - s.minTranslate()) / (translatesDiff);
2236            }
2237            if (progress !== s.progress) {
2238                s.updateProgress(translate);
2239            }
2240        
2241            if (updateActiveIndex) s.updateActiveIndex();
2242            if (s.params.effect !== 'slide' && s.effects[s.params.effect]) {
2243                s.effects[s.params.effect].setTranslate(s.translate);
2244            }
2245            if (s.params.parallax && s.parallax) {
2246                s.parallax.setTranslate(s.translate);
2247            }
2248            if (s.params.scrollbar && s.scrollbar) {
2249                s.scrollbar.setTranslate(s.translate);
2250            }
2251            if (s.params.control && s.controller) {
2252                s.controller.setTranslate(s.translate, byController);
2253            }
2254            s.emit('onSetTranslate', s, s.translate);
2255        };
2256        
2257        s.getTranslate = function (el, axis) {
2258            var matrix, curTransform, curStyle, transformMatrix;
2259        
2260            // automatic axis detection
2261            if (typeof axis === 'undefined') {
2262                axis = 'x';
2263            }
2264        
2265            if (s.params.virtualTranslate) {
2266                return s.rtl ? -s.translate : s.translate;
2267            }
2268        
2269            curStyle = window.getComputedStyle(el, null);
2270            if (window.WebKitCSSMatrix) {
2271                curTransform = curStyle.transform || curStyle.webkitTransform;
2272                if (curTransform.split(',').length > 6) {
2273                    curTransform = curTransform.split(', ').map(function(a){
2274                        return a.replace(',','.');
2275                    }).join(', ');
2276                }
2277                // Some old versions of Webkit choke when 'none' is passed; pass
2278                // empty string instead in this case
2279                transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
2280            }
2281            else {
2282                transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform  || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
2283                matrix = transformMatrix.toString().split(',');
2284            }
2285        
2286            if (axis === 'x') {
2287                //Latest Chrome and webkits Fix
2288                if (window.WebKitCSSMatrix)
2289                    curTransform = transformMatrix.m41;
2290                //Crazy IE10 Matrix
2291                else if (matrix.length === 16)
2292                    curTransform = parseFloat(matrix[12]);
2293                //Normal Browsers
2294                else
2295                    curTransform = parseFloat(matrix[4]);
2296            }
2297            if (axis === 'y') {
2298                //Latest Chrome and webkits Fix
2299                if (window.WebKitCSSMatrix)
2300                    curTransform = transformMatrix.m42;
2301                //Crazy 
2301IE10 Matrix
2302                else if (matrix.length === 16)
2303                    curTransform = parseFloat(matrix[13]);
2304                //Normal Browsers
2305                else
2306                    curTransform = parseFloat(matrix[5]);
2307            }
2308            if (s.rtl && curTransform) curTransform = -curTransform;
2309            return curTransform || 0;
2310        };
2311        s.getWrapperTranslate = function (axis) {
2312            if (typeof axis === 'undefined') {
2313                axis = s.isHorizontal() ? 'x' : 'y';
2314            }
2315            return s.getTranslate(s.wrapper[0], axis);
2316        };
2317        
2318        /*=========================
2319          Observer
2320          ===========================*/
2321        s.observers = [];
2322        function initObserver(target, options) {
2323            options = options || {};
2324            // create an observer instance
2325            var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
2326            var observer = new ObserverFunc(function (mutations) {
2327                mutations.forEach(function (mutation) {
2328                    s.onResize(true);
2329                    s.emit('onObserverUpdate', s, mutation);
2330                });
2331            });
2332        
2333            observer.observe(target, {
2334                attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
2335                childList: typeof options.childList === 'undefined' ? true : options.childList,
2336                characterData: typeof options.characterData === 'undefined' ? true : options.characterData
2337            });
2338        
2339            s.observers.push(observer);
2340        }
2341        s.initObservers = function () {
2342            if (s.params.observeParents) {
2343                var containerParents = s.container.parents();
2344                for (var i = 0; i < containerParents.length; i++) {
2345                    initObserver(containerParents[i]);
2346                }
2347            }
2348        
2349            // Observe container
2350            initObserver(s.container[0], {childList: false});
2351        
2352            // Observe wrapper
2353            initObserver(s.wrapper[0], {attributes: false});
2354        };
2355        s.disconnectObservers = function () {
2356            for (var i = 0; i < s.observers.length; i++) {
2357                s.observers[i].disconnect();
2358            }
2359            s.observers = [];
2360        };
2361        /*=========================
2362          Loop
2363          ===========================*/
2364        // Create looped slides
2365        s.createLoop = function () {
2366            // Remove duplicated slides
2367            s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove();
2368        
2369            var slides = s.wrapper.children('.' + s.params.slideClass);
2370        
2371            if(s.params.slidesPerView === 'auto' && !s.params.loopedSlides) s.params.loopedSlides = slides.length;
2372        
2373            s.loopedSlides = parseInt(s.params.loopedSlides || s.params.slidesPerView, 10);
2374            s.loopedSlides = s.loopedSlides + s.params.loopAdditionalSlides;
2375            if (s.loopedSlides > slides.length) {
2376                s.loopedSlides = slides.length;
2377            }
2378        
2379            var prependSlides = [], appendSlides = [], i;
2380            slides.each(function (index, el) {
2381                var slide = $(this);
2382                if (index < s.loopedSlides) appendSlides.push(el);
2383                if (index < slides.length && index >= slides.length - s.loopedSlides) prependSlides.push(el);
2384                slide.attr('data-swiper-slide-index', index);
2385            });
2386            for (i = 0; i < appendSlides.length; i++) {
2387                s.wrapper.append($(appendSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass));
2388            }
2389            for (i = prependSlides.length - 1; i >= 0; i--) {
2390                s.wrapper.prepend($(prependSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass));
2391            }
2392        };
2393        s.destroyLoop = function () {
2394            s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove();
2395            s.slides.removeAttr('data-swiper-slide-index');
2396        };
2397        s.reLoop = function (updatePosition) {
2398            var oldIndex = s.activeIndex - s.loopedSlides;
2399            s.destroyLoop();
2400            s.createLoop();
2401            s.updateSlidesSize();
2402            if (updatePosition) {
2403                s.slideTo(oldIndex + s.loopedSlides, 0, false);
2404            }
2405        
2406        };
2407        s.fixLoop = function () {
2408            var newIndex;
2409            //Fix For Negative Oversliding
2410            if (s.activeIndex < s.loopedSlides) {
2411                newIndex = s.slides.length - s.loopedSlides * 3 + s.activeIndex;
2412                newIndex = newIndex + s.loopedSlides;
2413                s.slideTo(newIndex, 0, false, true);
2414            }
2415            //Fix For Positive Oversliding
2416            else if ((s.params.slidesPerView === 'auto' && s.activeIndex >= s.loopedSlides * 2) || (s.activeIndex > s.slides.length - s.params.slidesPerView * 2)) {
2417                newIndex = -s.slides.length + s.activeIndex + s.loopedSlides;
2418                newIndex = newIndex + s.loopedSlides;
2419                s.slideTo(newIndex, 0, false, true);
2420            }
2421        };
2422        /*=========================
2423          Append/Prepend/Remove Slides
2424          ===========================*/
2425        s.appendSlide = function (slides) {
2426            if (s.params.loop) {
2427                s.destroyLoop();
2428            }
2429            if (typeof slides === 'object' && slides.length) {
2430                for (var i = 0; i < slides.length; i++) {
2431                    if (slides[i]) s.wrapper.append(slides[i]);
2432                }
2433            }
2434            else {
2435                s.wrapper.append(slides);
2436            }
2437            if (s.params.loop) {
2438                s.createLoop();
2439            }
2440            if (!(s.params.observer && s.support.observer)) {
2441                s.update(true);
2442            }
2443        };
2444        s.prependSlide = function (slides) {
2445            if (s.params.loop) {
2446                s.destroyLoop();
2447            }
2448            var newActiveIndex = s.activeIndex + 1;
2449            if (typeof slides === 'object' && slides.length) {
2450                for (var i = 0; i < slides.length; i++) {
2451                    if (slides[i]) s.wrapper.prepend(slides[i]);
2452                }
2453                newActiveIndex = s.activeIndex + slides.length;
2454            }
2455            else {
2456                s.wrapper.prepend(slides);
2457            }
2458            if (s.params.loop) {
2459                s.createLoop();
2460            }
2461            if (!(s.params.observer && s.support.observer)) {
2462                s.update(true);
2463            }
2464            s.slideTo(newActiveIndex, 0, false);
2465        };
2466        s.removeSlide = function (slidesIndexes) {
2467            if (s.params.loop) {
2468                s.destroyLoop();
2469                s.slides = s.wrapper.children('.' + s.params.slideClass);
2470            }
2471            var newActiveIndex = s.activeIndex,
2472                indexToRemove;
2473            if (typeof slidesIndexes === 'object' && slidesIndexes.length) {
2474                for (var i = 0; i < slidesIndexes.length; i++) {
2475                    indexToRemove = slidesIndexes[i];
2476                    if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove();
2477                    if (indexToRemove < newActiveIndex) newActiveIndex--;
2478                }
2479                newActiveIndex = Math.max(newActiveIndex, 0);
2480            }
2481            else {
2482                indexToRemove = slidesIndexes;
2483                if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove();
2484                if (indexToRemove < newActiveIndex) newActiveIndex--;
2485                newActiveIndex = Math.max(newActiveIndex, 0);
2486            }
2487        
2488            if (s.params.loop) {
2489                s.createLoop();
2490            }
2491        
2492            if (!(s.params.observer && s.support.observer)) {
2493                s.update(true);
2494            }
2495            if (s.params.loop) {
2496                s.slideTo(newActiveIndex + s.loopedSlides, 0, false);
2497            }
2498            else {
2499                s.slideTo(newActiveIndex, 0, false);
2500            }
2501        
2502        };
2503        s.removeAllSlides = function () {
2504            var slidesIndexes = [];
2505            for (var i = 0; i < s.slides.length; i++) {
2506                slidesIndexes.push(i);
2507            }
2508            s.removeSlide(slidesIndexes);
2509        };
2510        
2511
2512        /*=========================
2513          Effects
2514          ===========================*/
2515        s.effects = {
2516            fade: {
2517                setTranslate: function () {
2518                    for (var i = 0; i < s.slides.length; i++) {
2519                        var slide = s.slides.eq(i);
2520                        var offset = slide[0].swiperSlideOffset;
2521                        var tx = -offset;
2522                        if (!s.params.virtualTranslate) tx = tx - s.translate;
2523                        var ty = 0;
2524                        if (!s.isHorizontal()) {
2525                            ty = tx;
2526                            tx = 0;
2527                        }
2528                        var slideOpacity = s.params.fade.crossFade ?
2529                                Math.max(1 - Math.abs(slide[0].progress), 0) :
2530                                1 + Math.min(Math.max(slide[0].progress, -1), 0);
2531                        slide
2532                            .css({
2533                                opacity: slideOpacity
2534                            })
2535                            .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px)');
2536        
2537                    }
2538        
2539                },
2540                setTransition: function (duration) {
2541                    s.slides.transition(duration);
2542                    if (s.params.virtualTranslate && duration !== 0) {
2543                        var eventTriggered = false;
2544                        s.slides.transitionEnd(function () {
2545                            if (eventTriggered) return;
2546                            if (!s) return;
2547                            eventTriggered = true;
2548                            s.animating = false;
2549                            var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'];
2550                            for (var i = 0; i < triggerEvents.length; i++) {
2551                                s.wrapper.trigger(triggerEvents[i]);
2552                            }
2553                        });
2554                    }
2555                }
2556            },
2557            flip: {
2558                setTranslate: function () {
2559                    for (var i = 0; i < s.slides.length; i++) {
2560                        var slide = s.slides.eq(i);
2561                        var progress = slide[0].progress;
2562                        if (s.params.flip.limitRotation) {
2563                            progress = Math.max(Math.min(slide[0].progress, 1), -1);
2564                        }
2565                        var offset = slide[0].swiperSlideOffset;
2566                        var rotate = -180 * progress,
2567                            rotateY = rotate,
2568                            rotateX = 0,
2569                            tx = -offset,
2570                            ty = 0;
2571                        if (!s.isHorizontal()) {
2572                            ty = tx;
2573                            tx = 0;
2574                            rotateX = -rotateY;
2575                            rotateY = 0;
2576                        }
2577                        else if (s.rtl) {
2578                            rotateY = -rotateY;
2579                        }
2580        
2581                        slide[0].style.zIndex = -Math.abs(Math.round(progress)) + s.slides.length;
2582        
2583                        if (s.params.flip.slideShadows) {
2584                            //Set shadows
2585                            var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top');
2586                            var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom');
2587                            if (shadowBefore.length === 0) {
2588                                shadowBefore = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '"></div>');
2589                                slide.append(shadowBefore);
2590                            }
2591                            if (shadowAfter.length === 0) {
2592                                shadowAfter = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '"></div>');
2593                                slide.append(shadowAfter);
2594                            }
2595                            if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);
2596                            if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);
2597                        }
2598        
2599                        slide
2600                            .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)');
2601                    }
2602                },
2603                setTransition: function (duration) {
2604                    s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
2605                    if (s.params.virtualTranslate && duration !== 0) {
2606                        var eventTriggered = false;
2607                        s.slides.eq(s.activeIndex).transitionEnd(function () {
2608                            if (eventTriggered) return;
2609                            if (!s) return;
2610                            if (!$(this).hasClass(s.params.slideActiveClass)) return;
2611                            eventTriggered = true;
2612                            s.animating = false;
2613                            var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'];
2614                            for (var i = 0; i < triggerEvents.length; i++) {
2615                                s.wrapper.trigger(triggerEvents[i]);
2616                            }
2617                        });
2618                    }
2619                }
2620            },
2621            cube: {
2622                setTranslate: function () {
2623                    var wrapperRotate = 0, cubeShadow;
2624                    if (s.params.cube.shadow) {
2625                        if (s.isHorizontal()) {
2626                            cubeShadow = s.wrapper.find('.swiper-cube-shadow');
2627                            if (cubeShadow.length === 0) {
2628                                cubeShadow = $('<div class="swiper-cube-shadow"></div>');
2629                                s.wrapper.append(cubeShadow);
2630                            }
2631                            cubeShadow.css({height: s.width + 'px'});
2632                        }
2633                        else {
2634                            cubeShadow = s.container.find('.swiper-cube-shadow');
2635                            if (cubeShadow.length === 0) {
2636                                cubeShadow = $('<div class="swiper-cube-shadow"></div>');
2637                                s.container.append(cubeShadow);
2638                            }
2639                        }
2640                    }
2641                    for (var i = 0; i < s.slides.length; i++) {
2642                        var slide = s.slides.eq(i);
2643                        var slideAngle = i * 90;
2644                        var round = Math.floor(slideAngle / 360);
2645                        if (s.rtl) {
2646                            slideAngle = -slideAngle;
2647                            round = Math.floor(-slideAngle / 360);
2648                        }
2649                        var progress = Math.max(Math.min(slide[0].progress, 1), -1);
2650                        var tx = 0, ty = 0, tz = 0;
2651                        if (i % 4 === 0) {
2652                            tx = - round * 4 * s.size;
2653                            tz = 0;
2654                        }
2655                        else if ((i - 1) % 4 === 0) {
2656                            tx = 0;
2657                            tz = - round * 4 * s.size;
2658                        }
2659                        else if ((i - 2) % 4 === 0) {
2660                            tx = s.size + round * 4 * s.size;
2661                            tz = s.size;
2662                        }
2663                        else if ((i - 3) % 4 === 0) {
2664                            tx = - s.size;
2665                            tz = 3 * s.size + s.size * 4 * round;
2666                        }
2667                        if (s.rtl) {
2668                            tx = -tx;
2669                        }
2670        
2671                        if (!s.isHorizontal()) {
2672                            ty = tx;
2673                            tx = 0;
2674                        }
2675        
2676                        var transform = 'rotateX(' + (s.isHorizontal() ? 0 : -slideAngle) + 'deg) rotateY(' + (s.isHorizontal() ? slideAngle : 0) + 'deg) translate3d(' + tx + 'px, ' + ty + 'px, ' + tz + 'px)';
2677                        if (progress <= 1 && progress > -1) {
2678                            wrapperRotate = i * 90 + progress * 90;
2679                            if (s.rtl) wrapperRotate = -i * 90 - progress * 90;
2680                        }
2681                        slide.transform(transform);
2682                        if (s.params.cube.slideShadows) {
2683                            //Set shadows
2684                            var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top');
2685                            var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom');
2686                            if (shadowBefore.length === 0) {
2687                                shadowBefore = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '"></div>');
2688                                slide.append(shadowBefore);
2689                            }
2690                            if (shadowAfter.length === 0) {
2691                                shadowAfter = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '"></div>');
2692                                slide.append(shadowAfter);
2693                            }
2694                            if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);
2695                            if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);
2696                        }
2697                    }
2698                    s.wrapper.css({
2699                        '-webkit-transform-origin': '50% 50% -' + (s.size / 2) + 'px',
2700                        '-moz-transform-origin': '50% 50% -' + (s.size / 2) + 'px',
2701                        '-ms-transform-origin': '50% 50% -' + (s.size / 2) + 'px',
2702                        'transform-origin': '50% 50% -' + (s.size / 2) + 'px'
2703                    });
2704        
2705                    if (s.params.cube.shadow) {
2706                        if (s.isHorizontal()) {
2707                            cubeShadow.transform('translate3d(0px, ' + (s.width / 2 + s.params.cube.shadowOffset) + 'px, ' + (-s.width / 2) + 'px) rotateX(90deg) rotateZ(0deg) scale(' + (s.params.cube.shadowScale) + ')');
2708                        }
2709                        else {
2710                            var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;
2711                            var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);
2712                            var scale1 = s.params.cube.shadowScale,
2713                                scale2 = s.params.cube.shadowScale / multiplier,
2714                                offset = s.params.cube.shadowOffset;
2715                            cubeShadow.transform('scale3d(' + scale1 + ', 1, ' + scale2 + ') translate3d(0px, ' + (s.height / 2 + offset) + 'px, ' + (-s.height / 2 / scale2) + 'px) rotateX(-90deg)');
2716                        }
2717                    }
2718                    var zFactor = (s.isSafari || s.isUiWebView) ? (-s.size / 2) : 0;
2719                    s.wrapper.transform('translate3d(0px,0,' + zFactor + 'px) rotateX(' + (s.isHorizontal() ? 0 : wrapperRotate) + 'deg) rotateY(' + (s.isHorizontal() ? -wrapperRotate : 0) + 'deg)');
2720                },
2721                setTransition: function (duration) {
2722                    s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
2723                    if (s.params.cube.shadow && !s.isHorizontal()) {
2724                        s.container.find('.swiper-cube-shadow').transition(duration);
2725                    }
2726                }
2727            },
2728            coverflow: {
2729                setTranslate: function () {
2730                    var transform = s.translate;
2731                    var center = s.isHorizontal() ? -transform + s.width / 2 : -transform + s.height / 2;
2732                    var rotate = s.isHorizontal() ? s.params.coverflow.rotate: -s.params.coverflow.rotate;
2733                    var translate = s.params.coverflow.depth;
2734                    //Each slide offset from center
2735                    for (var i = 0, length = s.slides.length; i < length; i++) {
2736                        var slide = s.slides.eq(i);
2737                        var slideSize = s.slidesSizesGrid[i];
2738                        var slideOffset = slide[0].swiperSlideOffset;
2739                        var offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * s.params.coverflow.modifier;
2740        
2741                        var rotateY = s.isHorizontal() ? rotate * offsetMultiplier : 0;
2742                        var rotateX = s.isHorizontal() ? 0 : rotate * offsetMultiplier;
2743                        // var rotateZ = 0
2744                        var translateZ = -translate * Math.abs(offsetMultiplier);
2745        
2746                        var translateY = s.isHorizontal() ? 0 : s.params.coverflow.stretch * (offsetMultiplier);
2747                        var translateX = s.isHorizontal() ? s.params.coverflow.stretch * (offsetMultiplier) : 0;
2748        
2749                        //Fix for ultra small values
2750                        if (Math.abs(translateX) < 0.001) translateX = 0;
2751                        if (Math.abs(translateY) < 0.001) translateY = 0;
2752                        if (Math.abs(translateZ) < 0.001) translateZ = 0;
2753                        if (Math.abs(rotateY) < 0.001) rotateY = 0;
2754                        if (Math.abs(rotateX) < 0.001) rotateX = 0;
2755        
2756                        var slideTransform = 'translate3d(' + translateX + 'px,' + translateY + 'px,' + translateZ + 'px)  rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)';
2757        
2758                        slide.transform(slideTransform);
2759                        slide[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
2760                        if (s.params.coverflow.slideShadows) {
2761                            //Set shadows
2762                            var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top');
2763                            var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom');
2764                            if (shadowBefore.length === 0) {
2765                                shadowBefore = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '"></div>');
2766                                slide.append(shadowBefore);
2767                            }
2768                            if (shadowAfter.length === 0) {
2769                                shadowAfter = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '"></div>');
2770                                slide.append(shadowAfter);
2771                            }
2772                            if (shadowBefore.length) shadowBefore[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;
2773                            if (shadowAfter.length) shadowAfter[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0;
2774                        }
2775                    }
2776        
2777                    //Set correct perspective for IE10
2778                    if (s.browser.ie) {
2779                        var ws = s.wrapper[0].style;
2780                        ws.perspectiveOrigin = center + 'px 50%';
2781                    }
2782                },
2783                setTransition: function (duration) {
2784                    s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
2785                }
2786            }
2787        };
2788        
2789
2790        /*=========================
2791          Images Lazy Loading
2792          ===========================*/
2793        s.lazy = {
2794            initialImageLoaded: false,
2795            loadImageInSlide: function (index, loadInDuplicate) {
2796                if (typeof index === 'undefined') return;
2797                if (typeof loadInDuplicate === 'undefined') loadInDuplicate = true;
2798                if (s.slides.length === 0) return;
2799        
2800                var slide = s.slides.eq(index);
2801                var img = slide.find('.' + s.params.lazyLoadingClass + ':not(.' + s.params.lazyStatusLoadedClass + '):not(.' + s.params.lazyStatusLoadingClass + ')');
2802                if (slide.hasClass(s.params.lazyLoadingClass) && !slide.hasClass(s.params.lazyStatusLoadedClass) && !slide.hasClass(s.params.lazyStatusLoadingClass)) {
2803                    img = img.add(slide[0]);
2804                }
2805                if (img.length === 0) return;
2806        
2807                img.each(function () {
2808                    var _img = $(this);
2809                    _img.addClass(s.params.lazyStatusLoadingClass);
2810                    var background = _img.attr('data-background');
2811                    var src = _img.attr('data-src'),
2812                        srcset = _img.attr('data-srcset'),
2813                        sizes = _img.attr('data-sizes');
2814                    s.loadImage(_img[0], (src || background), srcset, sizes, false, function () {
2815                        if (typeof s === 'undefined' || s === null || !s) return;
2816                        if (background) {
2817                            _img.css('background-image', 'url("' + background + '")');
2818                            _img.removeAttr('data-background');
2819                        }
2820                        else {
2821                            if (srcset) {
2822                                _img.attr('srcset', srcset);
2823                                _img.removeAttr('data-srcset');
2824                            }
2825                            if (sizes) {
2826                                _img.attr('sizes', sizes);
2827                                _img.removeAttr('data-sizes');
2828                            }
2829                            if (src) {
2830                                _img.attr('src', src);
2831                                _img.removeAttr('data-src');
2832                            }
2833        
2834                        }
2835        
2836                        _img.addClass(s.params.lazyStatusLoadedClass).removeClass(s.params.lazyStatusLoadingClass);
2837                        slide.find('.' + s.params.lazyPreloaderClass + ', .' + s.params.preloaderClass).remove();
2838                        if (s.params.loop && loadInDuplicate) {
2839                            var slideOriginalIndex = slide.attr('data-swiper-slide-index');
2840                            if (slide.hasClass(s.params.slideDuplicateClass)) {
2841                                var originalSlide = s.wrapper.children('[data-swiper-slide-index="' + slideOriginalIndex + '"]:not(.' + s.params.slideDuplicateClass + ')');
2842                                s.lazy.loadImageInSlide(originalSlide.index(), false);
2843                            }
2844                            else {
2845                                var duplicatedSlide = s.wrapper.children('.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + slideOriginalIndex + '"]');
2846                                s.lazy.loadImageInSlide(duplicatedSlide.index(), false);
2847                            }
2848                        }
2849                        s.emit('onLazyImageReady', s, slide[0], _img[0]);
2850                    });
2851        
2852                    s.emit('onLazyImageLoad', s, slide[0], _img[0]);
2853                });
2854        
2855            },
2856            load: function () {
2857                var i;
2858                var slidesPerView = s.params.slidesPerView;
2859                if (slidesPerView === 'auto') {
2860                    slidesPerView = 0;
2861                }
2862                if (!s.lazy.initialImageLoaded) s.lazy.initialImageLoaded = true;
2863                if (s.params.watchSlidesVisibility) {
2864                    s.wrapper.children('.' + s.params.slideVisibleClass).each(function () {
2865                        s.lazy.loadImageInSlide($(this).index());
2866                    });
2867                }
2868                else {
2869                    if (slidesPerView > 1) {
2870                        for (i = s.activeIndex; i < s.activeIndex + slidesPerView ; i++) {
2871                            if (s.slides[i]) s.lazy.loadImageInSlide(i);
2872                        }
2873                    }
2874                    else {
2875                        s.lazy.loadImageInSlide(s.activeIndex);
2876                    }
2877                }
2878                if (s.params.lazyLoadingInPrevNext) {
2879                    if (slidesPerView > 1 || (s.params.lazyLoadingInPrevNextAmount && s.params.lazyLoadingInPrevNextAmount > 1)) {
2880                        var amount = s.params.lazyLoadingInPrevNextAmount;
2881                        var spv = slidesPerView;
2882                        var maxIndex = Math.min(s.activeIndex + spv + Math.max(amount, spv), s.slides.length);
2883                        var minIndex = Math.max(s.activeIndex - Math.max(spv, amount), 0);
2884                        // Next Slides
2885                        for (i = s.activeIndex + slidesPerView; i < maxIndex; i++) {
2886                            if (s.slides[i]) s.lazy.loadImageInSlide(i);
2887                        }
2888                        // Prev Slides
2889                        for (i = minIndex; i < s.activeIndex ; i++) {
2890                            if (s.slides[i]) s.lazy.loadImageInSlide(i);
2891                        }
2892                    }
2893                    else {
2894                        var nextSlide = s.wrapper.children('.' + s.params.slideNextClass);
2895                        if (nextSlide.length > 0) s.lazy.loadImageInSlide(nextSlide.index());
2896        
2897                        var prevSlide = s.wrapper.children('.' + s.params.slidePrevClass);
2898                        if (prevSlide.length > 0) s.lazy.loadImageInSlide(prevSlide.index());
2899                    }
2900                }
2901            },
2902            onTransitionStart: function () {
2903                if (s.params.lazyLoading) {
2904                    if (s.params.lazyLoadingOnTransitionStart || (!s.params.lazyLoadingOnTransitionStart && !s.lazy.initialImageLoaded)) {
2905                        s.lazy.load();
2906                    }
2907                }
2908            },
2909            onTransitionEnd: function () {
2910                if (s.params.lazyLoading && !s.params.lazyLoadingOnTransitionStart) {
2911                    s.lazy.load();
2912                }
2913            }
2914        };
2915        
2916
2917        /*=========================
2918          Scrollbar
2919          ===========================*/
2920        s.scrollbar = {
2921            isTouched: false,
2922            setDragPosition: function (e) {
2923                var sb = s.scrollbar;
2924                var x = 0, y = 0;
2925                var translate;
2926                var pointerPosition = s.isHorizontal() ?
2927                    ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX) :
2928                    ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY) ;
2929                var position = (pointerPosition) - sb.track.offset()[s.isHorizontal() ? 'left' : 'top'] - sb.dragSize / 2;
2930                var positionMin = -s.minTranslate() * sb.moveDivider;
2931                var positionMax = -s.maxTranslate() * sb.moveDivider;
2932                if (position < positionMin) {
2933                    position = positionMin;
2934                }
2935                else if (position > positionMax) {
2936                    position = positionMax;
2937                }
2938                position = -position / sb.moveDivider;
2939                s.updateProgress(position);
2940                s.setWrapperTranslate(position, true);
2941            },
2942            dragStart: function (e) {
2943                var sb = s.scrollbar;
2944                sb.isTouched = true;
2945                e.preventDefault();
2946                e.stopPropagation();
2947        
2948                sb.setDragPosition(e);
2949                clearTimeout(sb.dragTimeout);
2950        
2951                sb.track.transition(0);
2952                if (s.params.scrollbarHide) {
2953                    sb.track.css('opacity', 1);
2954                }
2955                s.wrapper.transition(100);
2956                sb.drag.transition(100);
2957                s.emit('onScrollbarDragStart', s);
2958            },
2959            dragMove: function (e) {
2960                var sb = s.scrollbar;
2961                if (!sb.isTouched) return;
2962                if (e.preventDefault) e.preventDefault();
2963                else e.returnValue = false;
2964                sb.setDragPosition(e);
2965                s.wrapper.transition(0);
2966                sb.track.transition(0);
2967                sb.drag.transition(0);
2968                s.emit('onScrollbarDragMove', s);
2969            },
2970            dragEnd: function (e) {
2971                var sb = s.scrollbar;
2972                if (!sb.isTouched) return;
2973                sb.isTouched = false;
2974                if (s.params.scrollbarHide) {
2975                    clearTimeout(sb.dragTimeout);
2976                    sb.dragTimeout = setTimeout(function () {
2977                        sb.track.css('opacity', 0);
2978                        sb.track.transition(400);
2979                    }, 1000);
2980        
2981                }
2982                s.emit('onScrollbarDragEnd', s);
2983                if (s.params.scrollbarSnapOnRelease) {
2984                    s.slideReset();
2985                }
2986            },
2987            draggableEvents: (function () {
2988                if ((s.params.simulateTouch === false && !s.support.touch)) return s.touchEventsDesktop;
2989                else return s.touchEvents;
2990            })(),
2991            enableDraggable: function () {
2992                var sb = s.scrollbar;
2993                var target = s.support.touch ? sb.track : document;
2994                $(sb.track).on(sb.draggableEvents.start, sb.dragStart);
2995                $(target).on(sb.draggableEvents.move, sb.dragMove);
2996                $(target).on(sb.draggableEvents.end, sb.dragEnd);
2997            },
2998            disableDraggable: function () {
2999                var sb = s.scrollbar;
3000                var target = s.support.touch ? sb.track : document;
3001                $(sb.track).off(sb.draggableEvents.start, sb.dragStart);
3002                $(target).off(sb.draggableEvents.move, sb.dragMove);
3003                $(target).off(sb.draggableEvents.end, sb.dragEnd);
3004            },
3005            set: function () {
3006                if (!s.params.scrollbar) return;
3007                var sb = s.scrollbar;
3008                sb.track = $(s.params.scrollbar);
3009                if (s.params.uniqueNavElements && typeof s.params.scrollbar === 'string' && sb.track.length > 1 && s.container.find(s.params.scrollbar).length === 1) {
3010                    sb.track = s.container.find(s.params.scrollbar);
3011                }
3012                sb.drag = sb.track.find('.swiper-scrollbar-drag');
3013                if (sb.drag.length === 0) {
3014                    sb.drag = $('<div class="swiper-scrollbar-drag"></div>');
3015                    sb.track.append(sb.drag);
3016                }
3017                sb.drag[0].style.width = '';
3018                sb.drag[0].style.height = '';
3019                sb.trackSize = s.isHorizontal() ? sb.track[0].offsetWidth : sb.track[0].offsetHeight;
3020        
3021                sb.divider = s.size / s.virtualSize;
3022                sb.moveDivider = sb.divider * (sb.trackSize / s.size);
3023                sb.dragSize = sb.trackSize * sb.divider;
3024        
3025                if (s.isHorizontal()) {
3026                    sb.drag[0].style.width = sb.dragSize + 'px';
3027                }
3028                else {
3029                    sb.drag[0].style.height = sb.dragSize + 'px';
3030                }
3031        
3032                if (sb.divider >= 1) {
3033                    sb.track[0].style.display = 'none';
3034                }
3035                else {
3036                    sb.track[0].style.display = '';
3037                }
3038                if (s.params.scrollbarHide) {
3039                    sb.track[0].style.opacity = 0;
3040                }
3041            },
3042            setTranslate: function () {
3043                if (!s.params.scrollbar) return;
3044                var diff;
3045                var sb = s.scrollbar;
3046                var translate = s.translate || 0;
3047                var newPos;
3048        
3049                var newSize = sb.dragSize;
3050                newPos = (sb.trackSize - sb.dragSize) * s.progress;
3051                if (s.rtl && s.isHorizontal()) {
3052                    newPos = -newPos;
3053                    if (newPos > 0) {
3054                        newSize = sb.dragSize - newPos;
3055                        newPos = 0;
3056                    }
3057                    else if (-newPos + sb.dragSize > sb.trackSize) {
3058                        newSize = sb.trackSize + newPos;
3059                    }
3060                }
3061                else {
3062                    if (newPos < 0) {
3063                        newSize = sb.dragSize + newPos;
3064                        newPos = 0;
3065                    }
3066                    else if (newPos + sb.dragSize > sb.trackSize) {
3067                        newSize = sb.trackSize - newPos;
3068                    }
3069                }
3070                if (s.isHorizontal()) {
3071                    if (s.support.transforms3d) {
3072                        sb.drag.transform('translate3d(' + (newPos) + 'px, 0, 0)');
3073                    }
3074                    else {
3075                        sb.drag.transform('translateX(' + (newPos) + 'px)');
3076                    }
3077                    sb.drag[0].style.width = newSize + 'px';
3078                }
3079                else {
3080                    if (s.support.transforms3d) {
3081                        sb.drag.transform('translate3d(0px, ' + (newPos) + 'px, 0)');
3082                    }
3083                    else {
3084                        sb.drag.transform('translateY(' + (newPos) + 'px)');
3085                    }
3086                    sb.drag[0].style.height = newSize + 'px';
3087                }
3088                if (s.params.scrollbarHide) {
3089                    clearTimeout(sb.timeout);
3090                    sb.track[0].style.opacity = 1;
3091                    sb.timeout = setTimeout(function () {
3092                        sb.track[0].style.opacity = 0;
3093                        sb.track.transition(400);
3094                    }, 1000);
3095                }
3096            },
3097            setTransition: function (duration) {
3098                if (!s.params.scrollbar) return;
3099                s.scrollbar.drag.transition(duration);
3100            }
3101        };
3102        
3103
3104        /*=========================
3105          Controller
3106          ===========================*/
3107        s.controller = {
3108            LinearSpline: function (x, y) {
3109                var binarySearch = (function() {
3110                    var maxIndex, minIndex, guess;
3111                    return function(array, val) {
3112                        minIn
3112dex = -1;
3113                        maxIndex = array.length;
3114                        while (maxIndex - minIndex > 1)
3115                            if (array[guess = maxIndex + minIndex >> 1] <= val) {
3116                                minIndex = guess;
3117                            } else {
3118                                maxIndex = guess;
3119                            }
3120                        return maxIndex;
3121                    };
3122                })();
3123                this.x = x;
3124                this.y = y;
3125                this.lastIndex = x.length - 1;
3126                // Given an x value (x2), return the expected y2 value:
3127                // (x1,y1) is the known point before given value,
3128                // (x3,y3) is the known point after given value.
3129                var i1, i3;
3130                var l = this.x.length;
3131        
3132                this.interpolate = function (x2) {
3133                    if (!x2) return 0;
3134        
3135                    // Get the indexes of x1 and x3 (the array indexes before and after given x2):
3136                    i3 = binarySearch(this.x, x2);
3137                    i1 = i3 - 1;
3138        
3139                    // We have our indexes i1 & i3, so we can calculate already:
3140                    // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
3141                    return ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1];
3142                };
3143            },
3144            //xxx: for now i will just save one spline function to to
3145            getInterpolateFunction: function(c){
3146                if(!s.controller.spline) s.controller.spline = s.params.loop ?
3147                    new s.controller.LinearSpline(s.slidesGrid, c.slidesGrid) :
3148                    new s.controller.LinearSpline(s.snapGrid, c.snapGrid);
3149            },
3150            setTranslate: function (translate, byController) {
3151               var controlled = s.params.control;
3152               var multiplier, controlledTranslate;
3153               function setControlledTranslate(c) {
3154                    // this will create an Interpolate function based on the snapGrids
3155                    // x is the Grid of the scrolled scroller and y will be the controlled scroller
3156                    // it makes sense to create this only once and recall it for the interpolation
3157                    // the function does a lot of value caching for performance
3158                    translate = c.rtl && c.params.direction === 'horizontal' ? -s.translate : s.translate;
3159                    if (s.params.controlBy === 'slide') {
3160                        s.controller.getInterpolateFunction(c);
3161                        // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
3162                        // but it did not work out
3163                        controlledTranslate = -s.controller.spline.interpolate(-translate);
3164                    }
3165        
3166                    if(!controlledTranslate || s.params.controlBy === 'container'){
3167                        multiplier = (c.maxTranslate() - c.minTranslate()) / (s.maxTranslate() - s.minTranslate());
3168                        controlledTranslate = (translate - s.minTranslate()) * multiplier + c.minTranslate();
3169                    }
3170        
3171                    if (s.params.controlInverse) {
3172                        controlledTranslate = c.maxTranslate() - controlledTranslate;
3173                    }
3174                    c.updateProgress(controlledTranslate);
3175                    c.setWrapperTranslate(controlledTranslate, false, s);
3176                    c.updateActiveIndex();
3177               }
3178               if (Array.isArray(controlled)) {
3179                   for (var i = 0; i < controlled.length; i++) {
3180                       if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
3181                           setControlledTranslate(controlled[i]);
3182                       }
3183                   }
3184               }
3185               else if (controlled instanceof Swiper && byController !== controlled) {
3186        
3187                   setControlledTranslate(controlled);
3188               }
3189            },
3190            setTransition: function (duration, byController) {
3191                var controlled = s.params.control;
3192                var i;
3193                function setControlledTransition(c) {
3194                    c.setWrapperTransition(duration, s);
3195                    if (duration !== 0) {
3196                        c.onTransitionStart();
3197                        c.wrapper.transitionEnd(function(){
3198                            if (!controlled) return;
3199                            if (c.params.loop && s.params.controlBy === 'slide') {
3200                                c.fixLoop();
3201                            }
3202                            c.onTransitionEnd();
3203        
3204                        });
3205                    }
3206                }
3207                if (Array.isArray(controlled)) {
3208                    for (i = 0; i < controlled.length; i++) {
3209                        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
3210                            setControlledTransition(controlled[i]);
3211                        }
3212                    }
3213                }
3214                else if (controlled instanceof Swiper && byController !== controlled) {
3215                    setControlledTransition(controlled);
3216                }
3217            }
3218        };
3219        
3220
3221        /*=========================
3222          Hash Navigation
3223          ===========================*/
3224        s.hashnav = {
3225            onHashCange: function (e, a) {
3226                var newHash = document.location.hash.replace('#', '');
3227                var activeSlideHash = s.slides.eq(s.activeIndex).attr('data-hash');
3228                if (newHash !== activeSlideHash) {
3229                    s.slideTo(s.wrapper.children('.' + s.params.slideClass + '[data-hash="' + (newHash) + '"]').index());
3230                }
3231            },
3232            attachEvents: function (detach) {
3233                var action = detach ? 'off' : 'on';
3234                $(window)[action]('hashchange', s.hashnav.onHashCange);
3235            },
3236            setHash: function () {
3237                if (!s.hashnav.initialized || !s.params.hashnav) return;
3238                if (s.params.replaceState && window.history && window.history.replaceState) {
3239                    window.history.replaceState(null, null, ('#' + s.slides.eq(s.activeIndex).attr('data-hash') || ''));
3240                } else {
3241                    var slide = s.slides.eq(s.activeIndex);
3242                    var hash = slide.attr('data-hash') || slide.attr('data-history');
3243                    document.location.hash = hash || '';
3244                }
3245            },
3246            init: function () {
3247                if (!s.params.hashnav || s.params.history) return;
3248                s.hashnav.initialized = true;
3249                var hash = document.location.hash.replace('#', '');
3250                if (hash) {
3251                    var speed = 0;
3252                    for (var i = 0, length = s.slides.length; i < length; i++) {
3253                        var slide = s.slides.eq(i);
3254                        var slideHash = slide.attr('data-hash') || slide.attr('data-history');
3255                        if (slideHash === hash && !slide.hasClass(s.params.slideDuplicateClass)) {
3256                            var index = slide.index();
3257                            s.slideTo(index, speed, s.params.runCallbacksOnInit, true);
3258                        }
3259                    }
3260                }
3261                if (s.params.hashnavWatchState) s.hashnav.attachEvents();
3262            },
3263            destroy: function () {
3264                if (s.params.hashnavWatchState) s.hashnav.attachEvents(true);
3265            }
3266        };
3267        
3268
3269        /*=========================
3270          History Api with fallback to Hashnav
3271          ===========================*/
3272        s.history = {
3273            init: function () {
3274                if (!s.params.history) return;
3275                if (!window.history || !window.history.pushState) {
3276                    s.params.history = false;
3277                    s.params.hashnav = true;
3278                    return;
3279                }
3280                s.history.initialized = true;
3281                this.paths = this.getPathValues();
3282                if (!this.paths.key && !this.paths.value) return;
3283                this.scrollToSlide(0, this.paths.value, s.params.runCallbacksOnInit);
3284                if (!s.params.replaceState) {
3285                    window.addEventListener('popstate', this.setHistoryPopState);
3286                }
3287            },
3288            setHistoryPopState: function() {
3289                s.history.paths = s.history.getPathValues();
3290                s.history.scrollToSlide(s.params.speed, s.history.paths.value, false);
3291            },
3292            getPathValues: function() {
3293                var pathArray = window.location.pathname.slice(1).split('/');
3294                var total = pathArray.length;
3295                var key = pathArray[total - 2];
3296                var value = pathArray[total - 1];
3297                return { key: key, value: value };
3298            },
3299            setHistory: function (key, index) {
3300                if (!s.history.initialized || !s.params.history) return;
3301                var slide = s.slides.eq(index);
3302                var value = this.slugify(slide.attr('data-history'));
3303                if (!window.location.pathname.includes(key)) {
3304                    value = key + '/' + value;
3305                }
3306                if (s.params.replaceState) {
3307                    window.history.replaceState(null, null, value);
3308                } else {
3309                    window.history.pushState(null, null, value);
3310                }
3311            },
3312            slugify: function(text) {
3313                return text.toString().toLowerCase()
3314                    .replace(/\s+/g, '-')
3315                    .replace(/[^\w\-]+/g, '')
3316                    .replace(/\-\-+/g, '-')
3317                    .replace(/^-+/, '')
3318                    .replace(/-+$/, '');
3319            },
3320            scrollToSlide: function(speed, value, runCallbacks) {
3321                if (value) {
3322                    for (var i = 0, length = s.slides.length; i < length; i++) {
3323                        var slide = s.slides.eq(i);
3324                        var slideHistory = this.slugify(slide.attr('data-history'));
3325                        if (slideHistory === value && !slide.hasClass(s.params.slideDuplicateClass)) {
3326                            var index = slide.index();
3327                            s.slideTo(index, speed, runCallbacks);
3328                        }
3329                    }
3330                } else {
3331                    s.slideTo(0, speed, runCallbacks);
3332                }
3333            }
3334        };
3335        
3336
3337        /*=========================
3338          Keyboard Control
3339          ===========================*/
3340        function handleKeyboard(e) {
3341            if (e.originalEvent) e = e.originalEvent; //jquery fix
3342            var kc = e.keyCode || e.charCode;
3343            // Directions locks
3344            if (!s.params.allowSwipeToNext && (s.isHorizontal() && kc === 39 || !s.isHorizontal() && kc === 40)) {
3345                return false;
3346            }
3347            if (!s.params.allowSwipeToPrev && (s.isHorizontal() && kc === 37 || !s.isHorizontal() && kc === 38)) {
3348                return false;
3349            }
3350            if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
3351                return;
3352            }
3353            if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {
3354                return;
3355            }
3356            if (kc === 37 || kc === 39 || kc === 38 || kc === 40) {
3357                var inView = false;
3358                //Check that swiper should be inside of visible area of window
3359                if (s.container.parents('.' + s.params.slideClass).length > 0 && s.container.parents('.' + s.params.slideActiveClass).length === 0) {
3360                    return;
3361                }
3362                var windowScroll = {
3363                    left: window.pageXOffset,
3364                    top: window.pageYOffset
3365                };
3366                var windowWidth = window.innerWidth;
3367                var windowHeight = window.innerHeight;
3368                var swiperOffset = s.container.offset();
3369                if (s.rtl) swiperOffset.left = swiperOffset.left - s.container[0].scrollLeft;
3370                var swiperCoord = [
3371                    [swiperOffset.left, swiperOffset.top],
3372                    [swiperOffset.left + s.width, swiperOffset.top],
3373                    [swiperOffset.left, swiperOffset.top + s.height],
3374                    [swiperOffset.left + s.width, swiperOffset.top + s.height]
3375                ];
3376                for (var i = 0; i < swiperCoord.length; i++) {
3377                    var point = swiperCoord[i];
3378                    if (
3379                        point[0] >= windowScroll.left && point[0] <= windowScroll.left + windowWidth &&
3380                        point[1] >= windowScroll.top && point[1] <= windowScroll.top + windowHeight
3381                    ) {
3382                        inView = true;
3383                    }
3384        
3385                }
3386                if (!inView) return;
3387            }
3388            if (s.isHorizontal()) {
3389                if (kc === 37 || kc === 39) {
3390                    if (e.preventDefault) e.preventDefault();
3391                    else e.returnValue = false;
3392                }
3393                if ((kc === 39 && !s.rtl) || (kc === 37 && s.rtl)) s.slideNext();
3394                if ((kc === 37 && !s.rtl) || (kc === 39 && s.rtl)) s.slidePrev();
3395            }
3396            else {
3397                if (kc === 38 || kc === 40) {
3398                    if (e.preventDefault) e.preventDefault();
3399                    else e.returnValue = false;
3400                }
3401                if (kc === 40) s.slideNext();
3402                if (kc === 38) s.slidePrev();
3403            }
3404            s.emit('onKeyPress', s, kc);
3405        }
3406        s.disableKeyboardControl = function () {
3407            s.params.keyboardControl = false;
3408            $(document).off('keydown', handleKeyboard);
3409        };
3410        s.enableKeyboardControl = function () {
3411            s.params.keyboardControl = true;
3412            $(document).on('keydown', handleKeyboard);
3413        };
3414        
3415
3416        /*=========================
3417          Mousewheel Control
3418          ===========================*/
3419        s.mousewheel = {
3420            event: false,
3421            lastScrollTime: (new window.Date()).getTime()
3422        };
3423        function isEventSupported() {
3424            var eventName = 'onwheel';
3425            var isSupported = eventName in document;
3426        
3427            if (!isSupported) {
3428                var element = document.createElement('div');
3429                element.setAttribute(eventName, 'return;');
3430                isSupported = typeof element[eventName] === 'function';
3431            }
3432        
3433            if (!isSupported &&
3434                document.implementation &&
3435                document.implementation.hasFeature &&
3436                    // always returns true in newer browsers as per the standard.
3437                    // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
3438                document.implementation.hasFeature('', '') !== true ) {
3439                // This is the only way to test support for the `wheel` event in IE9+.
3440                isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
3441            }
3442        
3443            return isSupported;
3444        }
3445        /**
3446         * Mouse wheel (and 2-finger trackpad) support on the web sucks.  It is
3447         * complicated, thus this doc is long and (hopefully) detailed enough to answer
3448         * your questions.
3449         *
3450         * If you need to react to the mouse wheel in a predictable way, this code is
3451         * like your bestest friend. * hugs *
3452         *
3453         * As of today, there are 4 DOM event types you can listen to:
3454         *
3455         *   'wheel'                -- Chrome(31+), FF(17+), IE(9+)
3456         *   'mousewheel'           -- Chrome, IE(6+), Opera, Safari
3457         *   'MozMousePixelScroll'  -- FF(3.5 only!) (2010-2013) -- don't bother!
3458         *   'DOMMouseScroll'       -- FF(0.9.7+) since 2003
3459         *
3460         * So what to do?  The is the best:
3461         *
3462         *   normalizeWheel.getEventType();
3463         *
3464         * In your event callback, use this code to get sane interpretation of the
3465         * deltas.  This code will return an object with properties:
3466         *
3467         *   spinX   -- normalized spin speed (use for zoom) - x plane
3468         *   spinY   -- " - y plane
3469         *   pixelX  -- normalized distance (to pixels) - x plane
3470         *   pixelY  -- " - y plane
3471         *
3472         * Wheel values are provided by the browser assuming you are using the wheel to
3473         * scroll a web page by a number of lines or pixels (or pages).  Values can vary
3474         * significantly on different platforms and browsers, forgetting that you can
3475         * scroll at different speeds.  Some devices (like trackpads) emit more events
3476         * at smaller increments with fine granularity, and some emit massive jumps with
3477         * linear speed or acceleration.
3478         *
3479         * This code does its best to normalize the deltas for you:
3480         *
3481         *   - spin is trying to normalize how far the wheel was spun (or trackpad
3482         *     dragged).  This is super useful for zoom support where you want to
3483         *     throw away the chunky scroll steps on the PC and make those equal to
3484         *     the slow and smooth tiny steps on the Mac. Key data: This code tries to
3485         *     resolve a single slow step on a wheel to 1.
3486         *
3487         *   - pixel is normalizing the desired scroll delta in pixel units.  You'll
3488         *     get the crazy differences between browsers, but at least it'll be in
3489         *     pixels!
3490         *
3491         *   - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT.  This
3492         *     should translate to positive value zooming IN, negative zooming OUT.
3493         *     This matches the newer 'wheel' event.
3494         *
3495         * Why are there spinX, spinY (or pixels)?
3496         *
3497         *   - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn
3498         *     with a mouse.  It results in side-scrolling in the browser by default.
3499         *
3500         *   - spinY is what you expect -- it's the classic axis of a mouse wheel.
3501         *
3502         *   - I dropped spinZ/pixelZ.  It is supported by the DOM 3 'wheel' event and
3503         *     probably is by browsers in conjunction with fancy 3D controllers .. but
3504         *     you know.
3505         *
3506         * Implementation info:
3507         *
3508         * Examples of 'wheel' event if you scroll slowly (down) by one step with an
3509         * average mouse:
3510         *
3511         *   OS X + Chrome  (mouse)     -    4   pixel delta  (wheelDelta -120)
3512         *   OS X + Safari  (mouse)     -  N/A   pixel delta  (wheelDelta  -12)
3513         *   OS X + Firefox (mouse)     -    0.1 line  delta  (wheelDelta  N/A)
3514         *   Win8 + Chrome  (mouse)     -  100   pixel delta  (wheelDelta -120)
3515         *   Win8 + Firefox (mouse)     -    3   line  delta  (wheelDelta -120)
3516         *
3517         * On the trackpad:
3518         *
3519         *   OS X + Chrome  (trackpad)  -    2   pixel delta  (wheelDelta   -6)
3520         *   OS X + Firefox (trackpad)  -    1   pixel delta  (wheelDelta  N/A)
3521         *
3522         * On other/older browsers.. it's more complicated as there can be multiple and
3523         * also missing delta values.
3524         *
3525         * The 'wheel' event is more standard:
3526         *
3527         * http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
3528         *
3529         * The basics is that it includes a unit, deltaMode (pixels, lines, pages), and
3530         * deltaX, deltaY and deltaZ.  Some browsers provide other values to maintain
3531         * backward compatibility with older events.  Those other values help us
3532         * better normalize spin speed.  Example of what the browsers provide:
3533         *
3534         *                          | event.wheelDelta | event.detail
3535         *        ------------------+------------------+--------------
3536         *          Safari v5/OS X  |       -120       |       0
3537         *          Safari v5/Win7  |       -120       |       0
3538         *         Chrome v17/OS X  |       -120       |       0
3539         *         Chrome v17/Win7  |       -120       |       0
3540         *                IE9/Win7  |       -120       |   undefined
3541         *         Firefox v4/OS X  |     undefined    |       1
3542         *         Firefox v4/Win7  |     undefined    |       3
3543         *
3544         */
3545        function normalizeWheel( /*object*/ event ) /*object*/ {
3546            // Reasonable defaults
3547            var PIXEL_STEP = 10;
3548            var LINE_HEIGHT = 40;
3549            var PAGE_HEIGHT = 800;
3550        
3551            var sX = 0, sY = 0,       // spinX, spinY
3552                pX = 0, pY = 0;       // pixelX, pixelY
3553        
3554            // Legacy
3555            if( 'detail' in event ) {
3556                sY = event.detail;
3557            }
3558            if( 'wheelDelta' in event ) {
3559                sY = -event.wheelDelta / 120;
3560            }
3561            if( 'wheelDeltaY' in event ) {
3562                sY = -event.wheelDeltaY / 120;
3563            }
3564            if( 'wheelDeltaX' in event ) {
3565                sX = -event.wheelDeltaX / 120;
3566            }
3567        
3568            // side scrolling on FF with DOMMouseScroll
3569            if( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) {
3570                sX = sY;
3571                sY = 0;
3572            }
3573        
3574            pX = sX * PIXEL_STEP;
3575            pY = sY * PIXEL_STEP;
3576        
3577            if( 'deltaY' in event ) {
3578                pY = event.deltaY;
3579            }
3580            if( 'deltaX' in event ) {
3581                pX = event.deltaX;
3582            }
3583        
3584            if( (pX || pY) && event.deltaMode ) {
3585                if( event.deltaMode === 1 ) {          // delta in LINE units
3586                    pX *= LINE_HEIGHT;
3587                    pY *= LINE_HEIGHT;
3588                } else {                             // delta in PAGE units
3589                    pX *= PAGE_HEIGHT;
3590                    pY *= PAGE_HEIGHT;
3591                }
3592            }
3593        
3594            // Fall-back if spin cannot be determined
3595            if( pX && !sX ) {
3596                sX = (pX < 1) ? -1 : 1;
3597            }
3598            if( pY && !sY ) {
3599                sY = (pY < 1) ? -1 : 1;
3600            }
3601        
3602            return {
3603                spinX: sX,
3604                spinY: sY,
3605                pixelX: pX,
3606                pixelY: pY
3607            };
3608        }
3609        if (s.params.mousewheelControl) {
3610            /**
3611             * The best combination if you prefer spinX + spinY normalization.  It favors
3612             * the older DOMMouseScroll for Firefox, as FF does not include wheelDelta with
3613             * 'wheel' event, making spin speed determination impossible.
3614             */
3615            s.mousewheel.event = (navigator.userAgent.indexOf('firefox') > -1) ?
3616                'DOMMouseScroll' :
3617                isEventSupported() ?
3618                    'wheel' : 'mousewheel';
3619        }
3620        function handleMousewheel(e) {
3621            if (e.originalEvent) e = e.originalEvent; //jquery fix
3622            var delta = 0;
3623            var rtlFactor = s.rtl ? -1 : 1;
3624        
3625            var data = normalizeWheel( e );
3626        
3627            if (s.params.mousewheelForceToAxis) {
3628                if (s.isHorizontal()) {
3629                    if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = data.pixelX * rtlFactor;
3630                    else return;
3631                }
3632                else {
3633                    if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = data.pixelY;
3634                    else return;
3635                }
3636            }
3637            else {
3638                delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? - data.pixelX * rtlFactor : - data.pixelY;
3639            }
3640        
3641            if (delta === 0) return;
3642        
3643            if (s.params.mousewheelInvert) delta = -delta;
3644        
3645            if (!s.params.freeMode) {
3646                if ((new window.Date()).getTime() - s.mousewheel.lastScrollTime > 60) {
3647                    if (delta < 0) {
3648                        if ((!s.isEnd || s.params.loop) && !s.animating) {
3649                            s.slideNext();
3650                            s.emit('onScroll', s, e);
3651                        }
3652                        else if (s.params.mousewheelReleaseOnEdges) return true;
3653                    }
3654                    else {
3655                        if ((!s.isBeginning || s.params.loop) && !s.animating) {
3656                            s.slidePrev();
3657                            s.emit('onScroll', s, e);
3658                        }
3659                        else if (s.params.mousewheelReleaseOnEdges) return true;
3660                    }
3661                }
3662                s.mousewheel.lastScrollTime = (new window.Date()).getTime();
3663        
3664            }
3665            else {
3666                //Freemode or scrollContainer:
3667                var position = s.getWrapperTranslate() + delta * s.params.mousewheelSensitivity;
3668                var wasBeginning = s.isBeginning,
3669                    wasEnd = s.isEnd;
3670        
3671                if (position >= s.minTranslate()) position = s.minTranslate();
3672                if (position <= s.maxTranslate()) position = s.maxTranslate();
3673        
3674                s.setWrapperTransition(0);
3675                s.setWrapperTranslate(position);
3676                s.updateProgress();
3677                s.updateActiveIndex();
3678        
3679                if (!wasBeginning && s.isBeginning || !wasEnd && s.isEnd) {
3680                    s.updateClasses();
3681                }
3682        
3683                if (s.params.freeModeSticky) {
3684                    clearTimeout(s.mousewheel.timeout);
3685                    s.mousewheel.timeout = setTimeout(function () {
3686                        s.slideReset();
3687                    }, 300);
3688                }
3689                else {
3690                    if (s.params.lazyLoading && s.lazy) {
3691                        s.lazy.load();
3692                    }
3693                }
3694                // Emit event
3695                s.emit('onScroll', s, e);
3696        
3697                // Stop autoplay
3698                if (s.params.autoplay && s.params.autoplayDisableOnInteraction) s.stopAutoplay();
3699        
3700                // Return page scroll on edge positions
3701                if (position === 0 || position === s.maxTranslate()) return;
3702            }
3703        
3704            if (e.preventDefault) e.preventDefault();
3705            else e.returnValue = false;
3706            return false;
3707        }
3708        s.disableMousewheelControl = function () {
3709            if (!s.mousewheel.event) return false;
3710            var target = s.container;
3711            if (s.params.mousewheelEventsTarged !== 'container') {
3712                target = $(s.params.mousewheelEventsTarged);
3713            }
3714            target.off(s.mousewheel.event, handleMousewheel);
3715            s.params.mousewheelControl = false;
3716            return true;
3717        };
3718        
3719        s.enableMousewheelControl = function () {
3720            if (!s.mousewheel.event) return false;
3721            var target = s.container;
3722            if (s.params.mousewheelEventsTarged !== 'container') {
3723                target = $(s.params.mousewheelEventsTarged);
3724            }
3725            target.on(s.mousewheel.event, handleMousewheel);
3726            s.params.mousewheelControl = true;
3727            return true;
3728        };
3729        
3730
3731        /*=========================
3732          Parallax
3733          ===========================*/
3734        function setParallaxTransform(el, progress) {
3735            el = $(el);
3736            var p, pX, pY;
3737            var rtlFactor = s.rtl ? -1 : 1;
3738        
3739            p = el.attr('data-swiper-parallax') || '0';
3740            pX = el.attr('data-swiper-parallax-x');
3741            pY = el.attr('data-swiper-parallax-y');
3742            if (pX || pY) {
3743                pX = pX || '0';
3744                pY = pY || '0';
3745            }
3746            else {
3747                if (s.isHorizontal()) {
3748                    pX = p;
3749                    pY = '0';
3750                }
3751                else {
3752                    pY = p;
3753                    pX = '0';
3754                }
3755            }
3756        
3757            if ((pX).indexOf('%') >= 0) {
3758                pX = parseInt(pX, 10) * progress * rtlFactor + '%';
3759            }
3760            else {
3761                pX = pX * progress * rtlFactor + 'px' ;
3762            }
3763            if ((pY).indexOf('%') >= 0) {
3764                pY = parseInt(pY, 10) * progress + '%';
3765            }
3766            else {
3767                pY = pY * progress + 'px' ;
3768            }
3769        
3770            el.transform('translate3d(' + pX + ', ' + pY + ',0px)');
3771        }
3772        s.parallax = {
3773            setTranslate: function () {
3774                s.container.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){
3775                    setParallaxTransform(this, s.progress);
3776        
3777                });
3778                s.slides.each(function () {
3779                    var slide = $(this);
3780                    slide.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function () {
3781                        var progress = Math.min(Math.max(slide[0].progress, -1), 1);
3782                        setParallaxTransform(this, progress);
3783                    });
3784                });
3785            },
3786            setTransition: function (duration) {
3787                if (typeof duration === 'undefined') duration = s.params.speed;
3788                s.container.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){
3789                    var el = $(this);
3790                    var parallaxDuration = parseInt(el.attr('data-swiper-parallax-duration'), 10) || duration;
3791                    if (duration === 0) parallaxDuration = 0;
3792                    el.transition(parallaxDuration);
3793                });
3794            }
3795        };
3796        
3797
3798        /*=========================
3799          Zoom
3800          ===========================*/
3801        s.zoom = {
3802            // "Global" Props
3803            scale: 1,
3804            currentScale: 1,
3805            isScaling: false,
3806            gesture: {
3807                slide: undefined,
3808                slideWidth: undefined,
3809                slideHeight: undefined,
3810                image: undefined,
3811                imageWrap: undefined,
3812                zoomMax: s.params.zoomMax
3813            },
3814            image: {
3815                isTouched: undefined,
3816                isMoved: undefined,
3817                currentX: undefined,
3818                currentY: undefined,
3819                minX: undefined,
3820                minY: undefined,
3821                maxX: undefined,
3822                maxY: undefined,
3823                width: undefined,
3824                height: undefined,
3825                startX: undefined,
3826                startY: undefined,
3827                touchesStart: {},
3828                touchesCurrent: {}
3829            },
3830            velocity: {
3831                x: undefined,
3832                y: undefined,
3833                prevPositionX: undefined,
3834                prevPositionY: undefined,
3835                prevTime: undefined
3836            },
3837            // Calc Scale From Multi-touches
3838            getDistanceBetweenTouches: function (e) {
3839                if (e.targetTouches.length < 2) return 1;
3840                var x1 = e.targetTouches[0].pageX,
3841                    y1 = e.targetTouches[0].pageY,
3842                    x2 = e.targetTouches[1].pageX,
3843                    y2 = e.targetTouches[1].pageY;
3844                var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
3845                return distance;
3846            },
3847            // Events
3848            onGestureStart: function (e) {
3849                var z = s.zoom;
3850                if (!s.support.gestures) {
3851                    if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) {
3852                        return;
3853                    }
3854                    z.gesture.scaleStart = z.getDistanceBetweenTouches(e);
3855                }
3856                if (!z.gesture.slide || !z.gesture.slide.length) {
3857                    z.gesture.slide = $(this);
3858                    if (z.gesture.slide.length === 0) z.gesture.slide = s.slides.eq(s.activeIndex);
3859                    z.gesture.image = z.gesture.slide.find('img, svg, canvas');
3860                    z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass);
3861                    z.gesture.zoomMax = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax ;
3862                    if (z.gesture.imageWrap.length === 0) {
3863                        z.gesture.image = undefined;
3864                        return;
3865                    }
3866                }
3867                z.gesture.image.transition(0);
3868                z.isScaling = true;
3869            },
3870            onGestureChange: function (e) {
3871                var z = s.zoom;
3872                if (!s.support.gestures) {
3873                    if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) {
3874                        return;
3875                    }
3876                    z.gesture.scaleMove = z.getDistanceBetweenTouches(e);
3877                }
3878                if (!z.gesture.image || z.gesture.image.length === 0) return;
3879                if (s.support.gestures) {
3880                    z.scale = e.scale * z.currentScale;
3881                }
3882                else {
3883                    z.scale = (z.gesture.scaleMove / z.gesture.scaleStart) * z.currentScale;
3884                }
3885                if (z.scale > z.gesture.zoomMax) {
3886                    z.scale = z.gesture.zoomMax - 1 + Math.pow((z.scale - z.gesture.zoomMax + 1), 0.5);
3887                }
3888                if (z.scale < s.params.zoomMin) {
3889                    z.scale =  s.params.zoomMin + 1 - Math.pow((s.params.zoomMin - z.scale + 1), 0.5);
3890                }
vendor: 8,727 bytes, lines 3891-4037
3891                z.gesture.image.transform('translate3d(0,0,0) scale(' + z.scale + ')');
3892            },
3893            onGestureEnd: function (e) {
3894                var z = s.zoom;
3895                if (!s.support.gestures) {
3896                    if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2) {
3897                        return;
3898                    }
3899                }
3900                if (!z.gesture.image || z.gesture.image.length === 0) return;
3901                z.scale = Math.max(Math.min(z.scale, z.gesture.zoomMax), s.params.zoomMin);
3902                z.gesture.image.transition(s.params.speed).transform('translate3d(0,0,0) scale(' + z.scale + ')');
3903                z.currentScale = z.scale;
3904                z.isScaling = false;
3905                if (z.scale === 1) z.gesture.slide = undefined;
3906            },
3907            onTouchStart: function (s, e) {
3908                var z = s.zoom;
3909                if (!z.gesture.image || z.gesture.image.length === 0) return;
3910                if (z.image.isTouched) return;
3911                if (s.device.os === 'android') e.preventDefault();
3912                z.image.isTouched = true;
3913                z.image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
3914                z.image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
3915            },
3916            onTouchMove: function (e) {
3917                var z = s.zoom;
3918                if (!z.gesture.image || z.gesture.image.length === 0) return;
3919                s.allowClick = false;
3920                if (!z.image.isTouched || !z.gesture.slide) return;
3921        
3922                if (!z.image.isMoved) {
3923                    z.image.width = z.gesture.image[0].offsetWidth;
3924                    z.image.height = z.gesture.image[0].offsetHeight;
3925                    z.image.startX = s.getTranslate(z.gesture.imageWrap[0], 'x') || 0;
3926                    z.image.startY = s.getTranslate(z.gesture.imageWrap[0], 'y') || 0;
3927                    z.gesture.slideWidth = z.gesture.slide[0].offsetWidth;
3928                    z.gesture.slideHeight = z.gesture.slide[0].offsetHeight;
3929                    z.gesture.imageWrap.transition(0);
3930                    if (s.rtl) z.image.startX = -z.image.startX;
3931                    if (s.rtl) z.image.startY = -z.image.startY;
3932                }
3933                // Define if we need image drag
3934                var scaledWidth = z.image.width * z.scale;
3935                var scaledHeight = z.image.height * z.scale;
3936        
3937                if (scaledWidth < z.gesture.slideWidth && scaledHeight < z.gesture.slideHeight) return;
3938        
3939                z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0);
3940                z.image.maxX = -z.image.minX;
3941                z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0);
3942                z.image.maxY = -z.image.minY;
3943        
3944                z.image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
3945                z.image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
3946        
3947                if (!z.image.isMoved && !z.isScaling) {
3948                    if (s.isHorizontal() &&
3949                        (Math.floor(z.image.minX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x < z.image.touchesStart.x) ||
3950                        (Math.floor(z.image.maxX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x > z.image.touchesStart.x)
3951                        ) {
3952                        z.image.isTouched = false;
3953                        return;
3954                    }
3955                    else if (!s.isHorizontal() &&
3956                        (Math.floor(z.image.minY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y < z.image.touchesStart.y) ||
3957                        (Math.floor(z.image.maxY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y > z.image.touchesStart.y)
3958                        ) {
3959                        z.image.isTouched = false;
3960                        return;
3961                    }
3962                }
3963                e.preventDefault();
3964                e.stopPropagation();
3965        
3966                z.image.isMoved = true;
3967                z.image.currentX = z.image.touchesCurrent.x - z.image.touchesStart.x + z.image.startX;
3968                z.image.currentY = z.image.touchesCurrent.y - z.image.touchesStart.y + z.image.startY;
3969        
3970                if (z.image.currentX < z.image.minX) {
3971                    z.image.currentX =  z.image.minX + 1 - Math.pow((z.image.minX - z.image.currentX + 1), 0.8);
3972                }
3973                if (z.image.currentX > z.image.maxX) {
3974                    z.image.currentX = z.image.maxX - 1 + Math.pow((z.image.currentX - z.image.maxX + 1), 0.8);
3975                }
3976        
3977                if (z.image.currentY < z.image.minY) {
3978                    z.image.currentY =  z.image.minY + 1 - Math.pow((z.image.minY - z.image.currentY + 1), 0.8);
3979                }
3980                if (z.image.currentY > z.image.maxY) {
3981                    z.image.currentY = z.image.maxY - 1 + Math.pow((z.image.currentY - z.image.maxY + 1), 0.8);
3982                }
3983        
3984                //Velocity
3985                if (!z.velocity.prevPositionX) z.velocity.prevPositionX = z.image.touchesCurrent.x;
3986                if (!z.velocity.prevPositionY) z.velocity.prevPositionY = z.image.touchesCurrent.y;
3987                if (!z.velocity.prevTime) z.velocity.prevTime = Date.now();
3988                z.velocity.x = (z.image.touchesCurrent.x - z.velocity.prevPositionX) / (Date.now() - z.velocity.prevTime) / 2;
3989                z.velocity.y = (z.image.touchesCurrent.y - z.velocity.prevPositionY) / (Date.now() - z.velocity.prevTime) / 2;
3990                if (Math.abs(z.image.touchesCurrent.x - z.velocity.prevPositionX) < 2) z.velocity.x = 0;
3991                if (Math.abs(z.image.touchesCurrent.y - z.velocity.prevPositionY) < 2) z.velocity.y = 0;
3992                z.velocity.prevPositionX = z.image.touchesCurrent.x;
3993                z.velocity.prevPositionY = z.image.touchesCurrent.y;
3994                z.velocity.prevTime = Date.now();
3995        
3996                z.gesture.imageWrap.transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)');
3997            },
3998            onTouchEnd: function (s, e) {
3999                var z = s.zoom;
4000                if (!z.gesture.image || z.gesture.image.length === 0) return;
4001                if (!z.image.isTouched || !z.image.isMoved) {
4002                    z.image.isTouched = false;
4003                    z.image.isMoved = false;
4004                    return;
4005                }
4006                z.image.isTouched = false;
4007                z.image.isMoved = false;
4008                var momentumDurationX = 300;
4009                var momentumDurationY = 300;
4010                var momentumDistanceX = z.velocity.x * momentumDurationX;
4011                var newPositionX = z.image.currentX + momentumDistanceX;
4012                var momentumDistanceY = z.velocity.y * momentumDurationY;
4013                var newPositionY = z.image.currentY + momentumDistanceY;
4014        
4015                //Fix duration
4016                if (z.velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - z.image.currentX) / z.velocity.x);
4017                if (z.velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - z.image.currentY) / z.velocity.y);
4018                var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
4019        
4020                z.image.currentX = newPositionX;
4021                z.image.currentY = newPositionY;
4022        
4023                // Define if we need image drag
4024                var scaledWidth = z.image.width * z.scale;
4025                var scaledHeight = z.image.height * z.scale;
4026                z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0);
4027                z.image.maxX = -z.image.minX;
4028                z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0);
4029                z.image.maxY = -z.image.minY;
4030                z.image.currentX = Math.max(Math.min(z.image.currentX, z.image.maxX), z.image.minX);
4031                z.image.currentY = Math.max(Math.min(z.image.currentY, z.image.maxY), z.image.minY);
4032        
4033                z.gesture.imageWrap.transition(momentumDuration).transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)');
4034            },
4035            onTransitionEnd: function (s) {
4036                var z = s.zoom;
4037                if (z.gesture.slide && s.previousIndex !== s.activeIndex) {
4038                    z.gesture.image.transform('translate3d(0,0,0) scale(1)');
4039                    z.gesture.imageWrap.transform('translate3d(0,0,0)');
4040                    z.gesture.slide = z.gesture.image = z.gesture.imageWrap = undefined;
4041                    z.scale = z.currentScale = 1;
4042                }
4043            },
4044            // Toggle Zoom
4045            toggleZoom: function (s, e) {
4046                var z = s.zoom;
4047                if (!z.gesture.slide) {
4048                    z.gesture.slide = s.clickedSlide ? $(s.clickedSlide) : s.slides.eq(s.activeIndex);
4049                    z.gesture.image = z.gesture.slide.find('img, svg, canvas');
4050                    z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass);
4051                }
4052                if (!z.gesture.image || z.gesture.image.length === 0) return;
4053        
4054                var touchX, touchY, offsetX, offsetY, diffX, diffY, translateX, translateY, imageWidth, imageHeight, scaledWidth, scaledHeight, translateMinX, translateMinY, translateMaxX, translateMaxY, slideWidth, slideHeight;
4055        
4056                if (typeof z.image.touchesStart.x === 'undefined' && e) {
4057                    touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
4058                    touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
4059                }
4060                else {
4061                    touchX = z.image.touchesStart.x;
4062                    touchY = z.image.touchesStart.y;
4063                }
4064        
4065                if (z.scale && z.scale !== 1) {
4066                    // Zoom Out
4067                    z.scale = z.currentScale = 1;
4068                    z.gesture.imageWrap.transition(300).transform('translate3d(0,0,0)');
4069                    z.gesture.image.transition(300).transform('translate3d(0,0,0) scale(1)');
4070                    z.gesture.slide = undefined;
4071                }
4072                else {
4073                    // Zoom In
4074                    z.scale = z.currentScale = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax;
4075                    if (e) {
4076                        slideWidth = z.gesture.slide[0].offsetWidth;
4077                        slideHeight = z.gesture.slide[0].offsetHeight;
4078                        offsetX = z.gesture.slide.offset().left;
4079                        offsetY = z.gesture.slide.offset().top;
4080                        diffX = offsetX + slideWidth/2 - touchX;
4081                        diffY = offsetY + slideHeight/2 - touchY;
4082        
4083                        imageWidth = z.gesture.image[0].offsetWidth;
4084                        imageHeight = z.gesture.image[0].offsetHeight;
4085                        scaledWidth = imageWidth * z.scale;
4086                        scaledHeight = imageHeight * z.scale;
4087        
4088                        translateMinX = Math.min((slideWidth / 2 - scaledWidth / 2), 0);
4089                        translateMinY = Math.min((slideHeight / 2 - scaledHeight / 2), 0);
4090                        translateMaxX = -translateMinX;
4091                        translateMaxY = -translateMinY;
4092        
4093                        translateX = diffX * z.scale;
4094                        translateY = diffY * z.scale;
4095        
4096                        if (translateX < translateMinX) {
4097                            translateX =  translateMinX;
4098                        }
4099                        if (translateX > translateMaxX) {
4100                            translateX = translateMaxX;
4101                        }
4102        
4103                        if (translateY < translateMinY) {
4104                            translateY =  translateMinY;
4105                        }
4106                        if (translateY > translateMaxY) {
4107                            translateY = translateMaxY;
4108                        }
4109                    }
4110                    else {
4111                        translateX = 0;
4112                        translateY = 0;
4113                    }
4114                    z.gesture.imageWrap.transition(300).transform('translate3d(' + translateX + 'px, ' + translateY + 'px,0)');
4115                    z.gesture.image.transition(300).transform('translate3d(0,
41150,0) scale(' + z.scale + ')');
4116                }
4117            },
4118            // Attach/Detach Events
4119            attachEvents: function (detach) {
4120                var action = detach ? 'off' : 'on';
4121        
4122                if (s.params.zoom) {
4123                    var target = s.slides;
4124                    var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false;
4125                    // Scale image
4126                    if (s.support.gestures) {
4127                        s.slides[action]('gesturestart', s.zoom.onGestureStart, passiveListener);
4128                        s.slides[action]('gesturechange', s.zoom.onGestureChange, passiveListener);
4129                        s.slides[action]('gestureend', s.zoom.onGestureEnd, passiveListener);
4130                    }
4131                    else if (s.touchEvents.start === 'touchstart') {
4132                        s.slides[action](s.touchEvents.start, s.zoom.onGestureStart, passiveListener);
4133                        s.slides[action](s.touchEvents.move, s.zoom.onGestureChange, passiveListener);
4134                        s.slides[action](s.touchEvents.end, s.zoom.onGestureEnd, passiveListener);
4135                    }
4136        
4137                    // Move image
4138                    s[action]('touchStart', s.zoom.onTouchStart);
4139                    s.slides.each(function (index, slide){
4140                        if ($(slide).find('.' + s.params.zoomContainerClass).length > 0) {
4141                            $(slide)[action](s.touchEvents.move, s.zoom.onTouchMove);
4142                        }
4143                    });
4144                    s[action]('touchEnd', s.zoom.onTouchEnd);
4145        
4146                    // Scale Out
4147                    s[action]('transitionEnd', s.zoom.onTransitionEnd);
4148                    if (s.params.zoomToggle) {
4149                        s.on('doubleTap', s.zoom.toggleZoom);
4150                    }
4151                }
4152            },
4153            init: function () {
4154                s.zoom.attachEvents();
4155            },
4156            destroy: function () {
4157                s.zoom.attachEvents(true);
4158            }
4159        };
4160        
4161
4162        /*=========================
4163          Plugins API. Collect all and init all plugins
4164          ===========================*/
4165        s._plugins = [];
4166        for (var plugin in s.plugins) {
4167            var p = s.plugins[plugin](s, s.params[plugin]);
4168            if (p) s._plugins.push(p);
4169        }
4170        // Method to call all plugins event/method
4171        s.callPlugins = function (eventName) {
4172            for (var i = 0; i < s._plugins.length; i++) {
4173                if (eventName in s._plugins[i]) {
4174                    s._plugins[i][eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
4175                }
4176            }
4177        };
4178        
4179
4180        /*=========================
4181          Events/Callbacks/Plugins Emitter
4182          ===========================*/
4183        function normalizeEventName (eventName) {
4184            if (eventName.indexOf('on') !== 0) {
4185                if (eventName[0] !== eventName[0].toUpperCase()) {
4186                    eventName = 'on' + eventName[0].toUpperCase() + eventName.substring(1);
4187                }
4188                else {
4189                    eventName = 'on' + eventName;
4190                }
4191            }
4192            return eventName;
4193        }
4194        s.emitterEventListeners = {
4195        
4196        };
4197        s.emit = function (eventName) {
4198            // Trigger callbacks
4199            if (s.params[eventName]) {
4200                s.params[eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
4201            }
4202            var i;
4203            // Trigger events
4204            if (s.emitterEventListeners[eventName]) {
4205                for (i = 0; i < s.emitterEventListeners[eventName].length; i++) {
4206                    s.emitterEventListeners[eventName][i](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
4207                }
4208            }
4209            // Trigger plugins
4210            if (s.callPlugins) s.callPlugins(eventName, arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
4211        };
4212        s.on = function (eventName, handler) {
4213            eventName = normalizeEventName(eventName);
4214            if (!s.emitterEventListeners[eventName]) s.emitterEventListeners[eventName] = [];
4215            s.emitterEventListeners[eventName].push(handler);
4216            return s;
4217        };
4218        s.off = function (eventName, handler) {
4219            var i;
4220            eventName = normalizeEventName(eventName);
4221            if (typeof handler === 'undefined') {
4222                // Remove all handlers for such event
4223                s.emitterEventListeners[eventName] = [];
4224                return s;
4225            }
4226            if (!s.emitterEventListeners[eventName] || s.emitterEventListeners[eventName].length === 0) return;
4227            for (i = 0; i < s.emitterEventListeners[eventName].length; i++) {
4228                if(s.emitterEventListeners[eventName][i] === handler) s.emitterEventListeners[eventName].splice(i, 1);
4229            }
4230            return s;
4231        };
4232        s.once = function (eventName, handler) {
4233            eventName = normalizeEventName(eventName);
4234            var _handler = function () {
4235                handler(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
4236                s.off(eventName, _handler);
4237            };
4238            s.on(eventName, _handler);
4239            return s;
4240        };
4241        
4242
4243        // Accessibility tools
4244        s.a11y = {
4245            makeFocusable: function ($el) {
4246                $el.attr('tabIndex', '0');
4247                return $el;
4248            },
4249            addRole: function ($el, role) {
4250                $el.attr('role', role);
4251                return $el;
4252            },
4253        
4254            addLabel: function ($el, label) {
4255                $el.attr('aria-label', label);
4256                return $el;
4257            },
4258        
4259            disable: function ($el) {
4260                $el.attr('aria-disabled', true);
4261                return $el;
4262            },
4263        
4264            enable: function ($el) {
4265                $el.attr('aria-disabled', false);
4266                return $el;
4267            },
4268        
4269            onEnterKey: function (event) {
4270                if (event.keyCode !== 13) return;
4271                if ($(event.target).is(s.params.nextButton)) {
4272                    s.onClickNext(event);
4273                    if (s.isEnd) {
4274                        s.a11y.notify(s.params.lastSlideMessage);
4275                    }
4276                    else {
4277                        s.a11y.notify(s.params.nextSlideMessage);
4278                    }
4279                }
4280                else if ($(event.target).is(s.params.prevButton)) {
4281                    s.onClickPrev(event);
4282                    if (s.isBeginning) {
4283                        s.a11y.notify(s.params.firstSlideMessage);
4284                    }
4285                    else {
4286                        s.a11y.notify(s.params.prevSlideMessage);
4287                    }
4288                }
4289                if ($(event.target).is('.' + s.params.bulletClass)) {
4290                    $(event.target)[0].click();
4291                }
4292            },
4293        
4294            liveRegion: $('<span class="' + s.params.notificationClass + '" aria-live="assertive" aria-atomic="true"></span>'),
4295        
4296            notify: function (message) {
4297                var notification = s.a11y.liveRegion;
4298                if (notification.length === 0) return;
4299                notification.html('');
4300                notification.html(message);
4301            },
4302            init: function () {
4303                // Setup accessibility
4304                if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) {
4305                    s.a11y.makeFocusable(s.nextButton);
4306                    s.a11y.addRole(s.nextButton, 'button');
4307                    s.a11y.addLabel(s.nextButton, s.params.nextSlideMessage);
4308                }
4309                if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) {
4310                    s.a11y.makeFocusable(s.prevButton);
4311                    s.a11y.addRole(s.prevButton, 'button');
4312                    s.a11y.addLabel(s.prevButton, s.params.prevSlideMessage);
4313                }
4314        
4315                $(s.container).append(s.a11y.liveRegion);
4316            },
4317            initPagination: function () {
4318                if (s.params.pagination && s.params.paginationClickable && s.bullets && s.bullets.length) {
4319                    s.bullets.each(function () {
4320                        var bullet = $(this);
4321                        s.a11y.makeFocusable(bullet);
4322                        s.a11y.addRole(bullet, 'button');
4323                        s.a11y.addLabel(bullet, s.params.paginationBulletMessage.replace(/{{index}}/, bullet.index() + 1));
4324                    });
4325                }
4326            },
4327            destroy: function () {
4328                if (s.a11y.liveRegion && s.a11y.liveRegion.length > 0) s.a11y.liveRegion.remove();
4329            }
4330        };
4331        
4332
4333        /*=========================
4334          Init/Destroy
4335          ===========================*/
4336        s.init = function () {
4337            if (s.params.loop) s.createLoop();
4338            s.updateContainerSize();
4339            s.updateSlidesSize();
4340            s.updatePagination();
4341            if (s.params.scrollbar && s.scrollbar) {
4342                s.scrollbar.set();
4343                if (s.params.scrollbarDraggable) {
4344                    s.scrollbar.enableDraggable();
4345                }
4346            }
4347            if (s.params.effect !== 'slide' && s.effects[s.params.effect]) {
4348                if (!s.params.loop) s.updateProgress();
4349                s.effects[s.params.effect].setTranslate();
4350            }
4351            if (s.params.loop) {
4352                s.slideTo(s.params.initialSlide + s.loopedSlides, 0, s.params.runCallbacksOnInit);
4353            }
4354            else {
4355                s.slideTo(s.params.initialSlide, 0, s.params.runCallbacksOnInit);
4356                if (s.params.initialSlide === 0) {
4357                    if (s.parallax && s.params.parallax) s.parallax.setTranslate();
4358                    if (s.lazy && s.params.lazyLoading) {
4359                        s.lazy.load();
4360                        s.lazy.initialImageLoaded = true;
4361                    }
4362                }
4363            }
4364            s.attachEvents();
4365            if (s.params.observer && s.support.observer) {
4366                s.initObservers();
4367            }
4368            if (s.params.preloadImages && !s.params.lazyLoading) {
4369                s.preloadImages();
4370            }
4371            if (s.params.zoom && s.zoom) {
4372                s.zoom.init();
4373            }
4374            if (s.params.autoplay) {
4375                s.startAutoplay();
4376            }
4377            if (s.params.keyboardControl) {
4378                if (s.enableKeyboardControl) s.enableKeyboardControl();
4379            }
4380            if (s.params.mousewheelControl) {
4381                if (s.enableMousewheelControl) s.enableMousewheelControl();
4382            }
4383            // Deprecated hashnavReplaceState changed to replaceState for use in hashnav and history
4384            if (s.params.hashnavReplaceState) {
4385                s.params.replaceState = s.params.hashnavReplaceState;
4386            }
4387            if (s.params.history) {
4388                if (s.history) s.history.init();
4389            }
4390            if (s.params.hashnav) {
4391                if (s.hashnav) s.hashnav.init();
4392            }
4393            if (s.params.a11y && s.a11y) s.a11y.init();
4394            s.emit('onInit', s);
4395        };
4396        
4397        // Cleanup dynamic styles
4398        s.cleanupStyles = function () {
4399            // Container
4400            s.container.removeClass(s.classNames.join(' ')).removeAttr('style');
4401        
4402            // Wrapper
4403            s.wrapper.removeAttr('style');
4404        
4405            // Slides
4406            if (s.slides && s.slides.length) {
4407                s.slides
4408                    .removeClass([
4409                      s.params.slideVisibleClass,
4410                      s.params.slideActiveClass,
4411                      s.params.slideNextClass,
4412                      s.params.slidePrevClass
4413                    ].join(' '))
4414                    .removeAttr('style')
4415                    .removeAttr('data-swiper-column')
4416                    .removeAttr('data-swiper-row');
4417            }
4418        
4419            // Pagination/Bullets
4420            if (s.paginationContainer && s.paginationContainer.length) {
4421                s.paginationContainer.removeClass(s.params.paginationHiddenClass);
4422            }
4423            if (s.bullets && s.bullets.length) {
4424                s.bullets.removeClass(s.params.bulletActiveClass);
4425            }
4426        
4427            // Buttons
4428            if (s.params.prevButton) $(s.params.prevButton).removeClass(s.params.buttonDisabledClass);
4429            if (s.params.nextButton) $(s.params.nextButton).removeClass(s.params.buttonDisabledClass);
4430        
4431            // Scrollbar
4432            if (s.params.scrollbar && s.scrollbar) {
4433                if (s.scrollbar.track && s.scrollbar.track.length) s.scrollbar.track.removeAttr('style');
4434                if (s.scrollbar.drag && s.scrollbar.drag.length) s.scrollbar.drag.removeAttr('style');
4435            }
4436        };
4437        
4438        // Destroy
4439        s.destroy = function (deleteInstance, cleanupStyles) {
4440            // Detach evebts
4441            s.detachEvents();
4442            // Stop autoplay
4443            s.stopAutoplay();
4444            // Disable draggable
4445            if (s.params.scrollbar && s.scrollbar) {
4446                if (s.params.scrollbarDraggable) {
4447                    s.scrollbar.disableDraggable();
4448                }
4449            }
4450            // Destroy loop
4451            if (s.params.loop) {
4452                s.destroyLoop();
4453            }
4454            // Cleanup styles
4455            if (cleanupStyles) {
4456                s.cleanupStyles();
4457            }
4458            // Disconnect observer
4459            s.disconnectObservers();
4460        
4461            // Destroy zoom
4462            if (s.params.zoom && s.zoom) {
4463                s.zoom.destroy();
4464            }
4465            // Disable keyboard/mousewheel
4466            if (s.params.keyboardControl) {
4467                if (s.disableKeyboardControl) s.disableKeyboardControl();
4468            }
4469            if (s.params.mousewheelControl) {
4470                if (s.disableMousewheelControl) s.disableMousewheelControl();
4471            }
4472            // Disable a11y
4473            if (s.params.a11y && s.a11y) s.a11y.destroy();
4474            // Delete history popstate
4475            if (s.params.history && !s.params.replaceState) {
4476                window.removeEventListener('popstate', s.history.setHistoryPopState);
4477            }
4478            if (s.params.hashnav && s.hashnav)  {
4479                s.hashnav.destroy();
4480            }
4481            // Destroy callback
4482            s.emit('onDestroy');
4483            // Delete instance
4484            if (deleteInstance !== false) s = null;
4485        };
4486        
4487        s.init();
4488        
4489
4490    
4491        // Return swiper instance
4492        return s;
4493    };
4494    
4495
4496    /*==================================================
4497        Prototype
4498    ====================================================*/
4499    Swiper.prototype = {
4500        isSafari: (function () {
4501            var ua = window.navigator.userAgent.toLowerCase();
4502            return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);
4503        })(),
4504        isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),
4505        isArray: function (arr) {
4506            return Object.prototype.toString.apply(arr) === '[object Array]';
4507        },
4508        /*==================================================
4509        Browser
4510        ====================================================*/
4511        browser: {
4512            ie: window.navigator.pointerEnabled || window.navigator.msPointerEnabled,
4513            ieTouch: (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints > 1) || (window.navigator.pointerEnabled && window.navigator.maxTouchPoints > 1),
4514            lteIE9: (function() {
4515                // create temporary DIV
4516                var div = document.createElement('div');
4517                // add content to tmp DIV which is wrapped into the IE HTML conditional statement
4518                div.innerHTML = '<!--[if lte IE 9]><i></i><![endif]-->';
4519                // return true / false value based on what will browser render
4520                return div.getElementsByTagName('i').length === 1;
4521            })()
4522        },
4523        /*==================================================
4524        Devices
4525        ====================================================*/
4526        device: (function () {
4527            var ua = window.navigator.userAgent;
4528            var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/);
4529            var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
4530            var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
4531            var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
4532            return {
4533                ios: ipad || iphone || ipod,
4534                android: android
4535            };
4536        })(),
4537        /*==================================================
4538        Feature Detection
4539        ====================================================*/
4540        support: {
4541            touch : (window.Modernizr && Modernizr.touch === true) || (function () {
4542                return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch);
4543            })(),
4544    
4545            transforms3d : (window.Modernizr && Modernizr.csstransforms3d === true) || (function () {
4546                var div = document.createElement('div').style;
4547                return ('webkitPerspective' in div || 'MozPerspective' in div || 'OPerspective' in div || 'MsPerspective' in div || 'perspective' in div);
4548            })(),
4549    
4550            flexbox: (function () {
4551                var div = document.createElement('div').style;
4552                var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' ');
4553                for (var i = 0; i < styles.length; i++) {
4554                    if (styles[i] in div) return true;
4555                }
4556            })(),
4557    
4558            observer: (function () {
4559                return ('MutationObserver' in window || 'WebkitMutationObserver' in window);
4560            })(),
4561    
4562            passiveListener: (function () {
4563                var supportsPassive = false;
4564                try {
4565                    var opts = Object.defineProperty({}, 'passive', {
4566                        get: function() {
4567                            supportsPassive = true;
4568                        }
4569                    });
4570                    window.addEventListener('testPassiveListener', null, opts);
4571                } catch (e) {}
4572                return supportsPassive;
4573            })(),
4574    
4575            gestures: (function () {
4576                return 'ongesturestart' in window;
4577            })()
4578        },
4579        /*==================================================
4580        Plugins
4581        ====================================================*/
4582        plugins: {}
4583    };
4584    
4585
4586    /*===========================
4587    Dom7 Library
4588    ===========================*/
4589    var Dom7 = (function () {
4590        var Dom7 = function (arr) {
4591            var _this = this, i = 0;
4592            // Create array-like object
4593            for (i = 0; i < arr.length; i++) {
4594                _this[i] = arr[i];
4595            }
4596            _this.length = arr.length;
4597            // Return collection with methods
4598            return this;
4599        };
4600        var $ = function (selector, context) {
4601            var arr = [], i = 0;
4602            if (selector && !context) {
4603                if (selector instanceof Dom7) {
4604                    return selector;
4605                }
4606            }
4607            if (selector) {
4608                // String
4609                if (typeof selector === 'string') {
4610                    var els, tempParent, html = selector.trim();
4611                    if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
4612                        var toCreate = 'div';
4613                        if (html.indexOf('<li') === 0) toCreate = 'ul';
4614                        if (html.indexOf('<tr') === 0) toCreate = 'tbody';
4615                        if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';
4616                        if (html.indexOf('<tbody') === 0) toCreate = 'table';
4617                        if (html.indexOf('<option') === 0) toCreate = 'select';
4618                        tempParent = document.createElement(toCreate);
4619                        tempParent.innerHTML = selector;
4620                        for (i = 0; i < tempParent.childNodes.length; i++) {
4621                            arr.push(tempParent.childNodes[i]);
4622                        }
4623                    }
4624                    else {
4625                        if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
4626                            // Pure ID selector
4627                            els = [document.getElementById(selector.split('#')[1])];
4628                        }
4629                        else {
4630                            // Other selectors
4631                            els = (context || document).querySelectorAll(selector);
4632                        }
4633                        for (i = 0; i < els.length; i++) {
4634                            if (els[i]) arr.push(els[i]);
4635                        }
4636                    }
4637                }
4638                // Node/element
4639                else if (selector.nodeType || selector === window || selector === document) {
4640                    arr.push(selector);
4641                }
4642                //Array of elements or instance of Dom
4643                else if (selector.length > 0 && selector[0].nodeType) {
4644                    for (i = 0; i < selector.length; i++) {
4645                        arr.push(selector[i]);
4646                    }
4647                }
4648            }
4649            return new Dom7(arr);
4650        };
4651        Dom7.prototype = {
4652            // Classes and attriutes
4653            addClass: function (className) {
4654                if (typeof className === 'undefined') {
4655                    return this;
4656                }
4657                var classes = className.split(' ');
4658                for (var i = 0; i < classes.length; i++) {
4659                    for (var j = 0; j < this.length; j++) {
4660                        this[j].classList.add(classes[i]);
4661                    }
4662                }
4663                return this;
4664            },
4665            removeClass: function (className) {
4666                var classes = className.split(' ');
4667                for (var i = 0; i < classes.length; i++) {
4668                    for (var j = 0; j < this.length; j++) {
4669                        this[j].classList.remove(classes[i]);
4670                    }
4671                }
4672                return this;
4673            },
4674            hasClass: function (className) {
4675                if (!this[0]) return false;
4676                else return this[0].classList.contains(className);
4677            },
4678            toggleClass: function (className) {
4679                var classes = className.split(' ');
4680                for (var i = 0; i < classes.length; i++) {
4681                    for (var j = 0; j < this.length; j++) {
4682                        this[j].classList.toggle(classes[i]);
4683                    }
4684                }
4685                return this;
4686            },
4687            attr: function (attrs, value) {
4688                if (arguments.length === 1 && typeof attrs === 'string') {
4689                    // Get attr
4690                    if (this[0]) return this[0].getAttribute(attrs);
4691                    else return undefined;
4692                }
4693                else {
4694                    // Set attrs
4695                    for (var i = 0; i < this.length; i++) {
4696                        if (arguments.length === 2) {
4697                            // String
4698                            this[i].setAttribute(attrs, value);
4699                        }
4700                        else {
4701                            // Object
4702                            for (var attrName in attrs) {
4703                                this[i][attrName] = attrs[attrName];
4704                                this[i].setAttribute(attrName, attrs[attrName]);
4705                            }
4706                        }
4707                    }
4708                    return this;
4709                }
4710            },
4711            removeAttr: function (attr) {
4712                for (var i = 0; i < this.length; i++) {
4713                    this[i].removeAttribute(attr);
4714                }
4715                return this;
4716            },
4717            data: function (key, value) {
4718                if (typeof value === 'undefined') {
4719                    // Get value
4720                    if (this[0]) {
4721                        var dataKey = this[0].getAttribute('data-' + key);
4722                        if (dataKey) return dataKey;
4723                        else if (this[0].dom7ElementDataStorage && (key in this[0].dom7ElementDataStorage)) return this[0].dom7ElementDataStorage[key];
4724                        else return undefined;
4725                    }
4726                    else return undefined;
4727                }
4728                else {
4729                    // Set value
4730                    for (var i = 0; i < this.length; i++) {
4731                        var el = this[i];
4732                        if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};
4733                        el.dom7ElementDataStorage[key] = value;
4734                    }
4735                    return this;
4736                }
4737            },
4738            // Transforms
4739            transform : function (transform) {
4740                for (var i = 0; i < this.length; i++) {
4741                    var elStyle = this[i].style;
4742                    elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform;
4743                }
4744                return this;
4745            },
4746            transition: function (duration) {
4747                if (typeof duration !== 'string') {
4748                    duration = duration + 'ms';
4749                }
4750                for (var i = 0; i < this.length; i++) {
4751                    var elStyle = this[i].style;
4752                    elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration;
4753                }
4754                return this;
4755            },
4756            //Events
4757            on: function (eventName, targetSelector, listener, capture) {
4758                function handleLiveEvent(e) {
4759                    var target = e.target;
4760                    if ($(target).is(targetSelector)) listener.call(target, e);
4761                    else {
4762                        var parents = $(target).parents();
4763                        for (var k = 0; k < parents.length; k++) {
4764                            if ($(parents[k]).is(targetSelector)) listener.call(parents[k], e);
4765                        }
4766                    }
4767                }
4768                var events = eventName.split(' ');
4769                var i, j;
4770                for (i = 0; i < this.length; i++) {
4771                    if (typeof targetSelector === 'function' || targetSelector === false) {
4772                        // Usual events
4773                        if (typeof targetSelector === 'function') {
4774                            listener = arguments[1];
4775                            capture = arguments[2] || false;
4776                        }
4777                        for (j = 0; j < events.length; j++) {
4778                            this[i].addEventListener(events[j], listener, capture);
4779                        }
4780                    }
4781                    else {
4782                        //Live events
4783                        for (j = 0; j < events.length; j++) {
4784                            if (!this[i].dom7LiveListeners) this[i].dom7LiveListeners = [];
4785                            this[i].dom7LiveListeners.push({listener: listener, liveListener: handleLiveEvent});
4786                            this[i].addEventListener(events[j], handleLiveEvent, capture);
4787                        }
4788                    }
4789                }
4790    
4791                return this;
4792            },
4793            off: function (eventName, targetSelector, listener, capture) {
4794                var events = eventName.split(' ');
4795                for (var i = 0; i < events.length; i++) {
4796                    for (var j = 0; j < this.length; j++) {
4797                        if (typeof targetSelector === 'function' || targetSelector === false) {
4798                            // Usual events
4799                            if (typeof targetSelector === 'function') {
4800                                listener = arguments[1];
4801                                capture = arguments[2] || false;
4802                            }
4803                            this[j].removeEventListener(events[i], listener, capture);
4804                        }
4805                        else {
4806                            // Live event
4807                            if (this[j].dom7LiveListeners) {
4808                                for (var k = 0; k < this[j].dom7LiveListeners.length; k++) {
4809                                    if (this[j].dom7LiveListeners[k].listener === listener) {
4810                                        this[j].removeEventListener(events[i], this[j].dom7LiveListeners[k].liveListener, capture);
4811                                    }
4812                                }
4813                            }
4814                        }
4815                    }
4816                }
4817                return this;
4818            },
4819            once: function (eventName, targetSelector, listener, capture) {
4820                var dom = this;
4821                if (typeof targetSelector === 'function') {
4822                    targetSelector = false;
4823                    listener = arguments[1];
4824                    capture = arguments[2];
4825                }
4826                function proxy(e) {
4827                    listener(e);
4828                    dom.off(eventName, targetSelector, proxy, capture);
4829                }
4830                dom.on(eventName, targetSelector, proxy, capture);
4831            },
4832            trigger: function (eventName, eventData) {
4833                for (var i = 0; i < this.length; i++) {
4834                    var evt;
4835                    try {
4836                        evt = new window.CustomEvent(eventName, {detail: eventData, bubbles: true, cancelable: true});
4837                    }
4838                    catch (e) {
4839                        evt = document.createEvent('Event');
4840                        evt.initEvent(eventName, true, true);
4841                        evt.detail = eventData;
4842                    }
4843                    this[i].dispatchEvent(evt);
4844                }
4845                return this;
4846            },
4847            transitionEnd: function (callback) {
4848                var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'],
4849                    i, j, dom = this;
4850                function fireCallBack(e) {
4851                    /*jshint validthis:true */
4852                    if (e.target !== this) return;
4853                    callback.call(this, e);
4854                    for (i = 0; i < events.length; i++) {
4855                        dom.off(events[i], fireCallBack);
4856                    }
4857                }
4858                if (callback) {
4859                    for (i = 0; i < events.length; i++) {
4860                        dom.on(events[i], fireCallBack);
4861                    }
4862                }
4863                return this;
4864            },
4865            // Sizing/Styles
4866            width: function () {
4867                if (this[0] === window) {
4868                    return window.innerWidth;
4869                }
4870                else {
4871                    if (this.length > 0) {
4872                        return parseFloat(this.css('width'));
4873                    }
4874                    else {
4875                        return null;
4876                    }
4877                }
4878            },
4879            outerWidth: function (includeMargins) {
4880                if (this.length > 0) {
4881                    if (includeMargins)
4882                        return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left'));
4883                    else
4884                        return this[0].offsetWidth;
4885                }
4886                else return null;
4887            },
4888            height: function () {
4889                if (this[0] === window) {
4890                    return window.innerHeight;
4891                }
4892                else {
4893                    if (this.length > 0) {
4894                        return parseFloat(this.css('height'));
4895                    }
4896                    else {
4897                        return null;
4898                    }
4899                }
4900            },
4901            outerHeight: function (includeMargins) {
4902                if (this.length > 0) {
4903                    if (includeMargins)
4904                        return this[0].offsetHeight + parseFloat(this.css('margin-top')) + parseFloat(this.css('margin-bottom'));
4905                    else
4906                        return this[0].offsetHeight;
4907                }
4908                else return null;
4909            },
4910            offset: function () {
4911                if (this.length > 0) {
4912                    var el = this[0];
4913                    var box = el.getBoundingClientRect();
4914                    var body = document.body;
4915                    var clientTop  = el.clientTop  || body.clientTop  || 0;
4916                    var clientLeft = el.clientLeft || body.clientLeft || 0;
4917                    var scrollTop  = window.pageYOffset || el.scrollTop;
4918                    var scrollLeft = window.pageXOffset || el.scrollLeft;
4919                    return {
4920                        top: box.top  + scrollTop  - clientTop,
4921                        left: box.left + scrollLeft - clientLeft
4922                    };
4923                }
4924                else {
4925                    return null;
4926                }
4927            },
4928            css: function (props, value) {
4929                var i;
4930                if (arguments.length === 1) {
4931                    if (typeof props === 'string') {
4932                        if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);
4933                    }
4934                    else {
4935                        for (i = 0; i < this.length; i++) {
4936                            for (var prop in props) {
4937                                this[i].style[prop] = props[prop];
4938                            }
4939                        }
4940                        return this;
4941                    }
4942                }
4943                if (arguments.length === 2 && typeof props === 'string') {
4944                    for (i = 0; i < this.length; i++) {
4945                        this[i].style[props] = value;
4946                    }
4947                    return this;
4948                }
4949                return this;
4950            },
4951    
4952            //Dom manipulation
4953            each: function (callback) {
4954                for (var i = 0; i < this.length; i++) {
4955                    callback.call(this[i], i, this[i]);
4956                }
4957                return this;
4958            },
4959            html: function (html) {
4960                if (typeof html === 'undefined') {
4961                    return this[0] ? this[0].innerHTML : undefined;
4962                }
4963                else {
4964                    for (var i = 0; i < this.length; i++) {
4965                        this[i].innerHTML = html;
4966                    }
4967                    return this;
4968                }
4969            },
4970            text: function (text) {
4971                if (typeof text === 'undefined') {
4972                    if (this[0]) {
4973                        return this[0].textContent.trim();
4974                    }
4975                    else return null;
4976                }
4977                else {
4978                    for (var i = 0; i < this.length; i++) {
4979                        this[i].textContent = text;
4980                    }
4981                    return this;
4982                }
4983            },
4984            is: function (selector) {
4985                if (!this[0]) return false;
4986                var compareWith, i;
4987                if (typeof selector === 'string') {
4988                    var el = this[0];
4989                    if (el === document) return selector === document;
4990                    if (el === window) return selector === window;
4991    
4992                    if (el.matches) return el.matches(selector);
4993                    else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);
4994                    else if (el.mozMatchesSelector) return el.mozMatchesSelector(selector);
4995                    else if (el.msMatchesSelector) return el.msMatchesSelector(selector);
4996                    else {
4997                        compareWith = $(selector);
4998                        for (i = 0; i < compareWith.length; i++) {
4999                            if (compareWith[i] === this[0]) return true;
5000                        }
5001                        return false;
5002                    }
5003                }
5004                else if (selector === document) return this[0] === document;
5005                else if (selector === window) return this[0] === window;
5006                else {
5007                    if (selector.nodeType || selector instanceof Dom7) {
5008                        compareWith = selector.nodeType ? [selector] : selector;
5009                        for (i = 0; i < compareWith.length; i++) {
5010                            if (compareWith[i] === this[0]) return true;
5011                        }
5012                        return false;
5013                    }
5014                    return false;
5015                }
5016    
5017            },
5018            index: function () {
5019                if (this[0]) {
5020                    var child = this[0];
5021                    var i = 0;
5022                    while ((child = child.previousSibling) !== null) {
5023                        if (child.nodeType === 1) i++;
5024                    }
5025                    return i;
5026                }
5027                else return undefined;
5028            },
5029            eq: function (index) {
5030                if (typeof index === 'undefined') return this;
5031                var length = this.length;
5032                var returnIndex;
5033                if (index > length - 1) {
5034                    return new Dom7([]);
5035                }
5036                if (index < 0) {
5037                    returnIndex = length + index;
5038                    if (returnIndex < 0) return new Dom7([]);
5039                    else return new Dom7([this[returnIndex]]);
5040                }
5041                return new Dom7([this[index]]);
5042            },
5043            append: function (newChild) {
5044                var i, j;
5045                for (i = 0; i < this.length; i++) {
5046                    if (typeof newChild === 'string') {
5047                        var tempDiv = document.createElement('div');
5048                        tempDiv.innerHTML = newChild;
5049                        while (tempDiv.firstChild) {
5050                            this[i].appendChild(tempDiv.firstChild);
5051                        }
5052                    }
5053                    else if (newChild instanceof Dom7) {
5054                        for (j = 0; j < newChild.length; j++) {
5055                            this[i].appendChild(newChild[j]);
5056                        }
5057                    }
5058                    else {
5059                        this[i].appendChild(newChild);
5060                    }
5061                }
5062                return this;
5063            },
5064            prepend: function (newChild) {
5065                var i, j;
5066                for (i = 0; i < this.length; i++) {
5067                    if (typeof newChild === 'string') {
5068                        var tempDiv = document.createElement('div');
5069                        tempDiv.innerHTML = newChild;
5070                        for (j = tempDiv.childNodes.length - 1; j >= 0; j--) {
5071                            this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
5072                        }
5073                        // this[i].insertAdjacentHTML('afterbegin', newChild);
5074                    }
5075                    else if (newChild instanceof Dom7) {
5076                        for (j = 0; j < newChild.length; j++) {
5077                            this[i].insertBefore(newChild[j], this[i].childNodes[0]);
5078                        }
5079                    }
5080                    else {
5081                        this[i].insertBefore(newChild, this[i].childNodes[0]);
5082                    }
5083                }
5084                return this;
5085            },
5086            insertBefore: function (selector) {
5087                var before = $(selector);
5088                for (var i = 0; i < this.length; i++) {
5089                    if (before.length === 1) {
5090                        before[0].parentNode.insertBefore(this[i], before[0]);
5091                    }
5092                    else if (before.length > 1) {
5093                        for (var j = 0; j < before.length; j++) {
5094                            before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);
5095                        }
5096                    }
5097                }
5098            },
5099            insertAfter: function (selector) {
5100                var after = $(selector);
5101                for (var i = 0; i < this.length; i++) {
5102                    if (after.length === 1) {
5103                        after[0].parentNode.insertBefore(this[i], after[0].nextSibling);
5104                    }
5105                    else if (after.length > 1) {
5106                        for (var j = 0; j < after.length; j++) {
5107                            after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);
5108                        }
5109                    }
5110                }
5111            },
5112            next: function (selector) {
5113                if (this.length > 0) {
5114                    if (selector) {
5115                        if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) return new Dom7([this[0].nextElementSibling]);
5116                        else return new Dom7([]);
5117                    }
5118                    else {
5119                        if (this[0].nextElementSibling) return new Dom7([this[0].nextElementSibling]);
5120                        else return new Dom7([]);
5121                    }
5122                }
5123                else return new Dom7([]);
5124            },
5125            nextAll: function (selector) {
5126                var nextEls = [];
5127                var el = this[0];
5128                if (!el) return new Dom7([]);
5129                while (el.nextElementSibling) {
5130                    var next = el.nextElementSibling;
5131                    if (selector) {
5132                        if($(next).is(selector)) nextEls.push(next);
5133                    }
5134                    else nextEls.push(next);
5135                    el = next;
5136                }
5137                return new Dom7(nextEls);
5138            },
5139            prev: function (selector) {
5140                if (this.length > 0) {
5141                    if (selector) {
5142                        if (this[0].previousElementSibling && $(this[0].previousElementSibling).is(selector)) return new Dom7([this[0].previousElementSibling]);
5143                        else return new Dom7([]);
5144                    }
5145                    else {
5146                        if (this[0].previousElementSibling) return new Dom7([this[0].previousElementSibling]);
5147                        else return new Dom7([]);
5148                    }
5149                }
5150                else return new Dom7([]);
5151            },
5152            prevAll: function (selector) {
5153                var prevEls = [];
5154                var el = this[0];
5155                if (!el) return new Dom7([]);
5156                while (el.previousElementSibling) {
5157                    var prev = el.previousElementSibling;
5158                    if (selector) {
5159                        if($(prev).is(selector)) prevEls.push(prev);
5160                    }
5161                    else prevEls.push(prev);
5162                    el = prev;
5163                }
5164                return new Dom7(prevEls);
5165            },
5166            parent: function (selector) {
5167                var parents = [];
5168                for (var i = 0; i < this.length; i++) {
5169                    if (selector) {
5170                        if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);
5171                    }
5172                    else {
5173                        parents.push(this[i].parentNode);
5174                    }
5175                }
5176                return $($.unique(parents));
5177            },
5178            parents: function (selector) {
5179                var parents = [];
5180                for (var i = 0; i < this.length; i++) {
5181                    var parent = this[i].parentNode;
5182                    while (parent) {
5183                        if (selector) {
5184                            if ($(parent).is(selector)) parents.push(parent);
5185                        }
5186                        else {
5187                            parents.push(parent);
5188                        }
5189                        parent = parent.parentNode;
5190                    }
5191                }
5192                return $($.unique(parents));
5193            },
5194            find : function (selector) {
5195                var foundElements = [];
5196                for (var i = 0; i < this.length; i++) {
5197                    var found = this[i].querySelectorAll(selector);
5198                    for (var j = 0; j < found.length; j++) {
5199                        foundElements.push(found[j]);
5200                    }
5201                }
5202                return new Dom7(foundElements);
5203            },
5204            children: function (selector) {
5205                var children = [];
5206                for (var i = 0; i < this.length; i++) {
5207                    var childNodes = this[i].childNodes;
5208    
5209                    for (var j = 0; j < childNodes.length; j++) {
5210                        if (!selector) {
5211                            if (childNodes[j].nodeType === 1) children.push(childNodes[j]);
5212                        }
5213                        else {
5214                            if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) children.push(childNodes[j]);
5215                        }
5216                    }
5217                }
5218                return new Dom7($.unique(children));
5219            },
5220            remove: function () {
5221                for (var i = 0; i < this.length; i++) {
5222                    if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);
5223                }
5224                return this;
5225            },
5226            add: function () {
5227                var dom = this;
5228                var i, j;
5229                for (i = 0; i < arguments.length; i++) {
5230                    var toAdd = $(arguments[i]);
5231                    for (j = 0; j < toAdd.length; j++) {
5232                        dom[dom.length] = toAdd[j];
5233                        dom.length++;
5234                    }
5235                }
5236                return dom;
5237            }
5238        };
5239        $.fn = Dom7.prototype;
5240        $.unique = function (arr) {
5241            var unique = [];
5242            for (var i = 0; i < arr.length; i++) {
5243                if (unique.indexOf(arr[i]) === -1) unique.push(arr[i]);
5244            }
5245            return unique;
5246        };
5247    
5248        return $;
5249    })();
5250    
5251
5252    /*===========================
5253     Get Dom libraries
5254     ===========================*/
5255    var swiperDomPlugins = ['jQuery', 'Zepto', 'Dom7'];
5256    for (var i = 0; i < swiperDomPlugins.length; i++) {
5257    	if (window[swiperDomPlugins[i]]) {
5258    		addLibraryPlugin(window[swiperDomPlugins[i]]);
5259    	}
5260    }
5261    // Required DOM Plugins
5262    var domLib;
5263    if (typeof Dom7 === 'undefined') {
5264    	domLib = window.Dom7 || window.Zepto || window.jQuery;
5265    }
5266    else {
5267    	domLib = Dom7;
5268    }
5269    
5270
5271    /*===========================
5272    Add .swiper plugin from Dom libraries
5273    ===========================*/
5274    function addLibraryPlugin(lib) {
5275        lib.fn.swiper = function (params) {
5276            var firstInstance;
5277            lib(this).each(function () {
5278                var s = new Swiper(this, params);
5279                if (!firstInstance) firstInstance = s;
5280            });
5281            return firstInstance;
5282        };
5283    }
5284    
5285    if (domLib) {
5286        if (!('transitionEnd' in domLib.fn)) {
5287            domLib.fn.transitionEnd = function (callback) {
5288                var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'],
5289                    i, j, dom = this;
5290                function fireCallBack(e) {
5291                    /*jshint validthis:true */
5292                    if (e.target !== this) return;
5293                    callback.call(this, e);
5294                    for (i = 0; i < events.length; i++) {
5295                        dom.off(events[i], fireCallBack);
5296                    }
5297                }
5298                if (callback) {
5299                    for (i = 0; i < events.length; i++) {
5300                        dom.on(events[i], fireCallBack);
5301                    }
5302                }
5303                return this;
5304            };
5305        }
5306        if (!('transform' in domLib.fn)) {
5307            domLib.fn.transform = function (transform) {
5308                for (var i = 0; i < this.length; i++) {
5309                    var elStyle = this[i].style;
5310                    elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform;
5311                }
5312                return this;
5313            };
5314        }
5315        if (!('transition' in domLib.fn)) {
5316            domLib.fn.transition = function (duration) {
5317                if (typeof duration !== 'string') {
5318                    duration = duration + 'ms';
5319                }
5320                for (var i = 0; i < this.length; i++) {
5321                    var elStyle = this[i].style;
5322                    elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration;
5323                }
5324                return this;
5325            };
5326        }
5327        if (!('outerWidth' in domLib.fn)) {
5328            domLib.fn.outerWidth = function (includeMargins) {
5329                if (this.length > 0) {
5330                    if (includeMargins)
5331                        return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left'));
5332                    else
5333                        return this[0].offsetWidth;
5334                }
5335                else return null;
5336            };
5337        }
5338    }
5339    
5340
5341    window.Swiper = Swiper;
5342})();
5343
5344/*===========================
5345Swiper AMD Export
5346===========================*/
5347if (typeof(module) !== 'undefined')
5348{
5349    module.exports = window.Swiper;
5350}
5351else if (typeof define === 'function' && define.amd) {
5352    define([], function () {
5353        'use strict';
5354        return window.Swiper;
5355    });
5356}
5357
5358//# sourceMappingURL=maps/swiper.js.map
5359
5360// init
5361var swiper = new Swiper('.silde_banner', {
5362	setWrapperSize:true,
5363	speed:1300,
5364	width: 1100,
5365	slidesPerView: 'auto',
5366	autoHeight:true,
5367	autoplay: 3000,
5368	loop:true,
5369	autoplayDisableOnInteraction:false,
5370	pagination: '.swiper-pagination',
5371	paginationClickable: true,
5372	nextButton: '.swiper-button-next', 
5373	prevButton: '.swiper-button-prev'
5374});
5375
5376$('.swiper-button-next').on('mouseover', function() {
5377	$('.swiper-button-next').animate({"margin-right":"-625px"}, 500, "swing", function(){
5378		//$('.swiper-button-next').clearQueue();
5379	});
5380});
5381$('.swiper-button-next').on('mouseout', function() {
5382	$('.swiper-button-next').animate({"margin-right":"-605px"}, 500, "swing", function(){
5383		//$('.swiper-button-next').clearQueue();
5384	});
5385});
5386
5387$('.swiper-button-prev').on('mouseover', function() {
5388	$('.swiper-button-prev').animate({"margin-left":"-625px"}, 500, "swing", function(){
5389		//$('.swiper-button-prev').clearQueue();
5390	});
5391});
5392$('.swiper-button-prev').on('mouseout', function() {
5393	$('.swiper-button-prev').animate({"margin-left":"-605px"}, 500, "swing", function(){
5394		//$('.swiper-button-prev').clearQueue();
5395	});
5396});
5397
5398swiper.on('slideChangeStart', function () {
5399	var currentSlide = swiper.activeIndex - (swiper.slides.length / 3) + 1;
5400	if(currentSlide >= 0){
5401		if(currentSlide == (swiper.slides.length / 3 + 1)) currentSlide = 1;
5402		if(currentSlide == 0) currentSlide = swiper.slides.length / 3;
5403		//$("#banner_txt").attr("src", "image/main/banner" + currentSlide + "_txt.jpg");
5404		$("#banner_txt").fadeOut(300, function(){
5405			$(this).attr("src", "image/main/banner" + currentSlide + "_txt.jpg").fadeIn(300)
5406		});
5407		var href_index = ["html/business/civil.asp", "html/business/building.asp", "html/business/house.asp", "html/business/plant.asp", "html/business/abroad.asp"];
5408		$(".bannerbox_con a").attr("href", href_index[currentSlide - 1]);
5409
5410	}
5411	//console.log(currentSlide);
5412
5413
5414
5415
5416
5417});

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.