12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864 |
- var Swiper = function (selector, params) {
- 'use strict';
- /*=========================
- A little bit dirty but required part for IE8 and old FF support
- ===========================*/
- if (!document.body.outerHTML && document.body.__defineGetter__) {
- if (HTMLElement) {
- var element = HTMLElement.prototype;
- if (element.__defineGetter__) {
- element.__defineGetter__('outerHTML', function () { return new XMLSerializer().serializeToString(this); });
- }
- }
- }
- if (!window.getComputedStyle) {
- window.getComputedStyle = function (el, pseudo) {
- this.el = el;
- this.getPropertyValue = function (prop) {
- var re = /(\-([a-z]){1})/g;
- if (prop === 'float') prop = 'styleFloat';
- if (re.test(prop)) {
- prop = prop.replace(re, function () {
- return arguments[2].toUpperCase();
- });
- }
- return el.currentStyle[prop] ? el.currentStyle[prop] : null;
- };
- return this;
- };
- }
- if (!Array.prototype.indexOf) {
- Array.prototype.indexOf = function (obj, start) {
- for (var i = (start || 0), j = this.length; i < j; i++) {
- if (this[i] === obj) { return i; }
- }
- return -1;
- };
- }
- if (!document.querySelectorAll) {
- if (!window.jQuery) return;
- }
- function $$(selector, context) {
- if (document.querySelectorAll)
- return (context || document).querySelectorAll(selector);
- else
- return jQuery(selector, context);
- }
- /*=========================
- Check for correct selector
- ===========================*/
- if (typeof selector === 'undefined') return;
- if (!(selector.nodeType)) {
- if ($$(selector).length === 0) return;
- }
- /*=========================
- _this
- ===========================*/
- var _this = this;
- /*=========================
- Default Flags and vars
- ===========================*/
- _this.touches = {
- start: 0,
- startX: 0,
- startY: 0,
- current: 0,
- currentX: 0,
- currentY: 0,
- diff: 0,
- abs: 0
- };
- _this.positions = {
- start: 0,
- abs: 0,
- diff: 0,
- current: 0
- };
- _this.times = {
- start: 0,
- end: 0
- };
- _this.id = (new Date()).getTime();
- _this.container = (selector.nodeType) ? selector : $$(selector)[0];
- _this.isTouched = false;
- _this.isMoved = false;
- _this.activeIndex = 0;
- _this.centerIndex = 0;
- _this.activeLoaderIndex = 0;
- _this.activeLoopIndex = 0;
- _this.previousIndex = null;
- _this.velocity = 0;
- _this.snapGrid = [];
- _this.slidesGrid = [];
- _this.imagesToLoad = [];
- _this.imagesLoaded = 0;
- _this.wrapperLeft = 0;
- _this.wrapperRight = 0;
- _this.wrapperTop = 0;
- _this.wrapperBottom = 0;
- _this.isAndroid = navigator.userAgent.toLowerCase().indexOf('android') >= 0;
- var wrapper, slideSize, wrapperSize, direction, isScrolling, containerSize;
- /*=========================
- Default Parameters
- ===========================*/
- var defaults = {
- eventTarget: 'wrapper', // or 'container'
- mode : 'horizontal', // or 'vertical'
- touchRatio : 1,
- speed : 300,
- freeMode : false,
- freeModeFluid : false,
- momentumRatio: 1,
- momentumBounce: true,
- momentumBounceRatio: 1,
- slidesPerView : 1,
- slidesPerGroup : 1,
- slidesPerViewFit: true, //Fit to slide when spv "auto" and slides larger than container
- simulateTouch : true,
- followFinger : true,
- shortSwipes : true,
- longSwipesRatio: 0.5,
- moveStartThreshold: false,
- onlyExternal : false,
- createPagination : true,
- pagination : false,
- paginationElement: 'span',
- paginationClickable: false,
- paginationAsRange: true,
- resistance : true, // or false or 100%
- scrollContainer : false,
- preventLinks : true,
- preventLinksPropagation: false,
- noSwiping : false, // or class
- noSwipingClass : 'swiper-no-swiping', //:)
- initialSlide: 0,
- keyboardControl: false,
- mousewheelControl : false,
- mousewheelControlForceToAxis : false,
- useCSS3Transforms : true,
- // Autoplay
- autoplay: false,
- autoplayDisableOnInteraction: true,
- autoplayStopOnLast: false,
- //Loop mode
- loop: false,
- loopAdditionalSlides: 0,
- // Round length values
- roundLengths: false,
- //Auto Height
- calculateHeight: false,
- //Apply CSS for width and/or height
- cssWidthAndHeight: false, // or true or 'width' or 'height'
- //Images Preloader
- updateOnImagesReady : true,
- //Form elements
- releaseFormElements : true,
- //Watch for active slide, useful when use effects on different slide states
- watchActiveIndex: false,
- //Slides Visibility Fit
- visibilityFullFit : false,
- //Slides Offset
- offsetPxBefore : 0,
- offsetPxAfter : 0,
- offsetSlidesBefore : 0,
- offsetSlidesAfter : 0,
- centeredSlides: false,
- //Queue callbacks
- queueStartCallbacks : false,
- queueEndCallbacks : false,
- //Auto Resize
- autoResize : true,
- resizeReInit : false,
- //DOMAnimation
- DOMAnimation : true,
- //Slides Loader
- loader: {
- slides: [], //array with slides
- slidesHTMLType: 'inner', // or 'outer'
- surroundGroups: 1, //keep preloaded slides groups around view
- logic: 'reload', //or 'change'
- loadAllSlides: false
- },
- // One way swipes
- swipeToPrev: true,
- swipeToNext: true,
- //Namespace
- slideElement: 'div',
- slideClass: 'swiper-slide',
- slideActiveClass: 'swiper-slide-active',
- slideVisibleClass: 'swiper-slide-visible',
- slideDuplicateClass: 'swiper-slide-duplicate',
- wrapperClass: 'swiper-wrapper',
- paginationElementClass: 'swiper-pagination-switch',
- paginationActiveClass: 'swiper-active-switch',
- paginationVisibleClass: 'swiper-visible-switch'
- };
- params = params || {};
- for (var prop in defaults) {
- if (prop in params && typeof params[prop] === 'object') {
- for (var subProp in defaults[prop]) {
- if (! (subProp in params[prop])) {
- params[prop][subProp] = defaults[prop][subProp];
- }
- }
- }
- else if (! (prop in params)) {
- params[prop] = defaults[prop];
- }
- }
- _this.params = params;
- if (params.scrollContainer) {
- params.freeMode = true;
- params.freeModeFluid = true;
- }
- if (params.loop) {
- params.resistance = '100%';
- }
- var isH = params.mode === 'horizontal';
- /*=========================
- Define Touch Events
- ===========================*/
- var desktopEvents = ['mousedown', 'mousemove', 'mouseup'];
- if (_this.browser.ie10) desktopEvents = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp'];
- if (_this.browser.ie11) desktopEvents = ['pointerdown', 'pointermove', 'pointerup'];
- _this.touchEvents = {
- touchStart : _this.support.touch || !params.simulateTouch ? 'touchstart' : desktopEvents[0],
- touchMove : _this.support.touch || !params.simulateTouch ? 'touchmove' : desktopEvents[1],
- touchEnd : _this.support.touch || !params.simulateTouch ? 'touchend' : desktopEvents[2]
- };
- /*=========================
- Wrapper
- ===========================*/
- for (var i = _this.container.childNodes.length - 1; i >= 0; i--) {
- if (_this.container.childNodes[i].className) {
- var _wrapperClasses = _this.container.childNodes[i].className.split(/\s+/);
- for (var j = 0; j < _wrapperClasses.length; j++) {
- if (_wrapperClasses[j] === params.wrapperClass) {
- wrapper = _this.container.childNodes[i];
- }
- }
- }
- }
- _this.wrapper = wrapper;
- /*=========================
- Slide API
- ===========================*/
- _this._extendSwiperSlide = function (el) {
- el.append = function () {
- if (params.loop) {
- el.insertAfter(_this.slides.length - _this.loopedSlides);
- }
- else {
- _this.wrapper.appendChild(el);
- _this.reInit();
- }
- return el;
- };
- el.prepend = function () {
- if (params.loop) {
- _this.wrapper.insertBefore(el, _this.slides[_this.loopedSlides]);
- _this.removeLoopedSlides();
- _this.calcSlides();
- _this.createLoop();
- }
- else {
- _this.wrapper.insertBefore(el, _this.wrapper.firstChild);
- }
- _this.reInit();
- return el;
- };
- el.insertAfter = function (index) {
- if (typeof index === 'undefined') return false;
- var beforeSlide;
- if (params.loop) {
- beforeSlide = _this.slides[index + 1 + _this.loopedSlides];
- if (beforeSlide) {
- _this.wrapper.insertBefore(el, beforeSlide);
- }
- else {
- _this.wrapper.appendChild(el);
- }
- _this.removeLoopedSlides();
- _this.calcSlides();
- _this.createLoop();
- }
- else {
- beforeSlide = _this.slides[index + 1];
- _this.wrapper.insertBefore(el, beforeSlide);
- }
- _this.reInit();
- return el;
- };
- el.clone = function () {
- return _this._extendSwiperSlide(el.cloneNode(true));
- };
- el.remove = function () {
- _this.wrapper.removeChild(el);
- _this.reInit();
- };
- el.html = function (html) {
- if (typeof html === 'undefined') {
- return el.innerHTML;
- }
- else {
- el.innerHTML = html;
- return el;
- }
- };
- el.index = function () {
- var index;
- for (var i = _this.slides.length - 1; i >= 0; i--) {
- if (el === _this.slides[i]) index = i;
- }
- return index;
- };
- el.isActive = function () {
- if (el.index() === _this.activeIndex) return true;
- else return false;
- };
- if (!el.swiperSlideDataStorage) el.swiperSlideDataStorage = {};
- el.getData = function (name) {
- return el.swiperSlideDataStorage[name];
- };
- el.setData = function (name, value) {
- el.swiperSlideDataStorage[name] = value;
- return el;
- };
- el.data = function (name, value) {
- if (typeof value === 'undefined') {
- return el.getAttribute('data-' + name);
- }
- else {
- el.setAttribute('data-' + name, value);
- return el;
- }
- };
- el.getWidth = function (outer, round) {
- return _this.h.getWidth(el, outer, round);
- };
- el.getHeight = function (outer, round) {
- return _this.h.getHeight(el, outer, round);
- };
- el.getOffset = function () {
- return _this.h.getOffset(el);
- };
- return el;
- };
- //Calculate information about number of slides
- _this.calcSlides = function (forceCalcSlides) {
- var oldNumber = _this.slides ? _this.slides.length : false;
- _this.slides = [];
- _this.displaySlides = [];
- for (var i = 0; i < _this.wrapper.childNodes.length; i++) {
- if (_this.wrapper.childNodes[i].className) {
- var _className = _this.wrapper.childNodes[i].className;
- var _slideClasses = _className.split(/\s+/);
- for (var j = 0; j < _slideClasses.length; j++) {
- if (_slideClasses[j] === params.slideClass) {
- _this.slides.push(_this.wrapper.childNodes[i]);
- }
- }
- }
- }
- for (i = _this.slides.length - 1; i >= 0; i--) {
- _this._extendSwiperSlide(_this.slides[i]);
- }
- if (oldNumber === false) return;
- if (oldNumber !== _this.slides.length || forceCalcSlides) {
- // Number of slides has been changed
- removeSlideEvents();
- addSlideEvents();
- _this.updateActiveSlide();
- if (_this.params.pagination) _this.createPagination();
- _this.callPlugins('numberOfSlidesChanged');
- }
- };
- //Create Slide
- _this.createSlide = function (html, slideClassList, el) {
- slideClassList = slideClassList || _this.params.slideClass;
- el = el || params.slideElement;
- var newSlide = document.createElement(el);
- newSlide.innerHTML = html || '';
- newSlide.className = slideClassList;
- return _this._extendSwiperSlide(newSlide);
- };
- //Append Slide
- _this.appendSlide = function (html, slideClassList, el) {
- if (!html) return;
- if (html.nodeType) {
- return _this._extendSwiperSlide(html).append();
- }
- else {
- return _this.createSlide(html, slideClassList, el).append();
- }
- };
- _this.prependSlide = function (html, slideClassList, el) {
- if (!html) return;
- if (html.nodeType) {
- return _this._extendSwiperSlide(html).prepend();
- }
- else {
- return _this.createSlide(html, slideClassList, el).prepend();
- }
- };
- _this.insertSlideAfter = function (index, html, slideClassList, el) {
- if (typeof index === 'undefined') return false;
- if (html.nodeType) {
- return _this._extendSwiperSlide(html).insertAfter(index);
- }
- else {
- return _this.createSlide(html, slideClassList, el).insertAfter(index);
- }
- };
- _this.removeSlide = function (index) {
- if (_this.slides[index]) {
- if (params.loop) {
- if (!_this.slides[index + _this.loopedSlides]) return false;
- _this.slides[index + _this.loopedSlides].remove();
- _this.removeLoopedSlides();
- _this.calcSlides();
- _this.createLoop();
- }
- else _this.slides[index].remove();
- return true;
- }
- else return false;
- };
- _this.removeLastSlide = function () {
- if (_this.slides.length > 0) {
- if (params.loop) {
- _this.slides[_this.slides.length - 1 - _this.loopedSlides].remove();
- _this.removeLoopedSlides();
- _this.calcSlides();
- _this.createLoop();
- }
- else _this.slides[_this.slides.length - 1].remove();
- return true;
- }
- else {
- return false;
- }
- };
- _this.removeAllSlides = function () {
- var num = _this.slides.length;
- for (var i = _this.slides.length - 1; i >= 0; i--) {
- _this.slides[i].remove();
- if (i === num - 1) {
- _this.setWrapperTranslate(0);
- }
- }
- };
- _this.getSlide = function (index) {
- return _this.slides[index];
- };
- _this.getLastSlide = function () {
- return _this.slides[_this.slides.length - 1];
- };
- _this.getFirstSlide = function () {
- return _this.slides[0];
- };
- //Currently Active Slide
- _this.activeSlide = function () {
- return _this.slides[_this.activeIndex];
- };
- /*=========================
- Wrapper for Callbacks : Allows additive callbacks via function arrays
- ===========================*/
- _this.fireCallback = function () {
- var callback = arguments[0];
- if (Object.prototype.toString.call(callback) === '[object Array]') {
- for (var i = 0; i < callback.length; i++) {
- if (typeof callback[i] === 'function') {
- callback[i](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
- }
- }
- } else if (Object.prototype.toString.call(callback) === '[object String]') {
- if (params['on' + callback]) _this.fireCallback(params['on' + callback], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
- } else {
- callback(arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
- }
- };
- function isArray(obj) {
- if (Object.prototype.toString.apply(obj) === '[object Array]') return true;
- return false;
- }
- /**
- * Allows user to add callbacks, rather than replace them
- * @param callback
- * @param func
- * @return {*}
- */
- _this.addCallback = function (callback, func) {
- var _this = this, tempFunc;
- if (_this.params['on' + callback]) {
- if (isArray(this.params['on' + callback])) {
- return this.params['on' + callback].push(func);
- } else if (typeof this.params['on' + callback] === 'function') {
- tempFunc = this.params['on' + callback];
- this.params['on' + callback] = [];
- this.params['on' + callback].push(tempFunc);
- return this.params['on' + callback].push(func);
- }
- } else {
- this.params['on' + callback] = [];
- return this.params['on' + callback].push(func);
- }
- };
- _this.removeCallbacks = function (callback) {
- if (_this.params['on' + callback]) {
- _this.params['on' + callback] = null;
- }
- };
- /*=========================
- Plugins API
- ===========================*/
- var _plugins = [];
- for (var plugin in _this.plugins) {
- if (params[plugin]) {
- var p = _this.plugins[plugin](_this, params[plugin]);
- if (p) _plugins.push(p);
- }
- }
- _this.callPlugins = function (method, args) {
- if (!args) args = {};
- for (var i = 0; i < _plugins.length; i++) {
- if (method in _plugins[i]) {
- _plugins[i][method](args);
- }
- }
- };
- /*=========================
- Windows Phone 8 Fix
- ===========================*/
- if ((_this.browser.ie10 || _this.browser.ie11) && !params.onlyExternal) {
- _this.wrapper.classList.add('swiper-wp8-' + (isH ? 'horizontal' : 'vertical'));
- }
- /*=========================
- Free Mode Class
- ===========================*/
- if (params.freeMode) {
- _this.container.className += ' swiper-free-mode';
- }
- /*==================================================
- Init/Re-init/Resize Fix
- ====================================================*/
- _this.initialized = false;
- _this.init = function (force, forceCalcSlides) {
- var _width = _this.h.getWidth(_this.container, false, params.roundLengths);
- var _height = _this.h.getHeight(_this.container, false, params.roundLengths);
- if (_width === _this.width && _height === _this.height && !force) return;
- _this.width = _width;
- _this.height = _height;
- var slideWidth, slideHeight, slideMaxHeight, wrapperWidth, wrapperHeight, slideLeft;
- var i; // loop index variable to avoid JSHint W004 / W038
- containerSize = isH ? _width : _height;
- var wrapper = _this.wrapper;
- if (force) {
- _this.calcSlides(forceCalcSlides);
- }
- if (params.slidesPerView === 'auto') {
- //Auto mode
- var slidesWidth = 0;
- var slidesHeight = 0;
- //Unset Styles
- if (params.slidesOffset > 0) {
- wrapper.style.paddingLeft = '';
- wrapper.style.paddingRight = '';
- wrapper.style.paddingTop = '';
- wrapper.style.paddingBottom = '';
- }
- wrapper.style.width = '';
- wrapper.style.height = '';
- if (params.offsetPxBefore > 0) {
- if (isH) _this.wrapperLeft = params.offsetPxBefore;
- else _this.wrapperTop = params.offsetPxBefore;
- }
- if (params.offsetPxAfter > 0) {
- if (isH) _this.wrapperRight = params.offsetPxAfter;
- else _this.wrapperBottom = params.offsetPxAfter;
- }
- if (params.centeredSlides) {
- if (isH) {
- _this.wrapperLeft = (containerSize - this.slides[0].getWidth(true, params.roundLengths)) / 2;
- _this.wrapperRight = (containerSize - _this.slides[_this.slides.length - 1].getWidth(true, params.roundLengths)) / 2;
- }
- else {
- _this.wrapperTop = (containerSize - _this.slides[0].getHeight(true, params.roundLengths)) / 2;
- _this.wrapperBottom = (containerSize - _this.slides[_this.slides.length - 1].getHeight(true, params.roundLengths)) / 2;
- }
- }
- if (isH) {
- if (_this.wrapperLeft >= 0) wrapper.style.paddingLeft = _this.wrapperLeft + 'px';
- if (_this.wrapperRight >= 0) wrapper.style.paddingRight = _this.wrapperRight + 'px';
- }
- else {
- if (_this.wrapperTop >= 0) wrapper.style.paddingTop = _this.wrapperTop + 'px';
- if (_this.wrapperBottom >= 0) wrapper.style.paddingBottom = _this.wrapperBottom + 'px';
- }
- slideLeft = 0;
- var centeredSlideLeft = 0;
- _this.snapGrid = [];
- _this.slidesGrid = [];
- slideMaxHeight = 0;
- for (i = 0; i < _this.slides.length; i++) {
- slideWidth = _this.slides[i].getWidth(true, params.roundLengths);
- slideHeight = _this.slides[i].getHeight(true, params.roundLengths);
- if (params.calculateHeight) {
- slideMaxHeight = Math.max(slideMaxHeight, slideHeight);
- }
- var _slideSize = isH ? slideWidth : slideHeight;
- if (params.centeredSlides) {
- var nextSlideWidth = i === _this.slides.length - 1 ? 0 : _this.slides[i + 1].getWidth(true, params.roundLengths);
- var nextSlideHeight = i === _this.slides.length - 1 ? 0 : _this.slides[i + 1].getHeight(true, params.roundLengths);
- var nextSlideSize = isH ? nextSlideWidth : nextSlideHeight;
- if (_slideSize > containerSize) {
- if (params.slidesPerViewFit) {
- _this.snapGrid.push(slideLeft + _this.wrapperLeft);
- _this.snapGrid.push(slideLeft + _slideSize - containerSize + _this.wrapperLeft);
- }
- else {
- for (var j = 0; j <= Math.floor(_slideSize / (containerSize + _this.wrapperLeft)); j++) {
- if (j === 0) _this.snapGrid.push(slideLeft + _this.wrapperLeft);
- else _this.snapGrid.push(slideLeft + _this.wrapperLeft + containerSize * j);
- }
- }
- _this.slidesGrid.push(slideLeft + _this.wrapperLeft);
- }
- else {
- _this.snapGrid.push(centeredSlideLeft);
- _this.slidesGrid.push(centeredSlideLeft);
- }
- centeredSlideLeft += _slideSize / 2 + nextSlideSize / 2;
- }
- else {
- if (_slideSize > containerSize) {
- if (params.slidesPerViewFit) {
- _this.snapGrid.push(slideLeft);
- _this.snapGrid.push(slideLeft + _slideSize - containerSize);
- }
- else {
- if (containerSize !== 0) {
- for (var k = 0; k <= Math.floor(_slideSize / containerSize); k++) {
- _this.snapGrid.push(slideLeft + containerSize * k);
- }
- }
- else {
- _this.snapGrid.push(slideLeft);
- }
- }
- }
- else {
- _this.snapGrid.push(slideLeft);
- }
- _this.slidesGrid.push(slideLeft);
- }
- slideLeft += _slideSize;
- slidesWidth += slideWidth;
- slidesHeight += slideHeight;
- }
- if (params.calculateHeight) _this.height = slideMaxHeight;
- if (isH) {
- wrapperSize = slidesWidth + _this.wrapperRight + _this.wrapperLeft;
- if(!params.cssWidthAndHeight || params.cssWidthAndHeight === 'height') {
- wrapper.style.width = (slidesWidth) + 'px';
- }
- if(!params.cssWidthAndHeight || params.cssWidthAndHeight === 'width') {
- wrapper.style.height = (_this.height) + 'px';
- }
- }
- else {
- if(!params.cssWidthAndHeight || params.cssWidthAndHeight === 'height') {
- wrapper.style.width = (_this.width) + 'px';
- }
- if(!params.cssWidthAndHeight || params.cssWidthAndHeight === 'width') {
- wrapper.style.height = (slidesHeight) + 'px';
- }
- wrapperSize = slidesHeight + _this.wrapperTop + _this.wrapperBottom;
- }
- }
- else if (params.scrollContainer) {
- //Scroll Container
- wrapper.style.width = '';
- wrapper.style.height = '';
- wrapperWidth = _this.slides[0].getWidth(true, params.roundLengths);
- wrapperHeight = _this.slides[0].getHeight(true, params.roundLengths);
- wrapperSize = isH ? wrapperWidth : wrapperHeight;
- wrapper.style.width = wrapperWidth + 'px';
- wrapper.style.height = wrapperHeight + 'px';
- slideSize = isH ? wrapperWidth : wrapperHeight;
- }
- else {
- //For usual slides
- if (params.calculateHeight) {
- slideMaxHeight = 0;
- wrapperHeight = 0;
- //ResetWrapperSize
- if (!isH) _this.container.style.height = '';
- wrapper.style.height = '';
- for (i = 0; i < _this.slides.length; i++) {
- //ResetSlideSize
- _this.slides[i].style.height = '';
- slideMaxHeight = Math.max(_this.slides[i].getHeight(true), slideMaxHeight);
- if (!isH) wrapperHeight += _this.slides[i].getHeight(true);
- }
- slideHeight = slideMaxHeight;
- _this.height = slideHeight;
- if (isH) wrapperHeight = slideHeight;
- else {
- containerSize = slideHeight;
- _this.container.style.height = containerSize + 'px';
- }
- }
- else {
- slideHeight = isH ? _this.height : _this.height / params.slidesPerView;
- if (params.roundLengths) slideHeight = Math.ceil(slideHeight);
- wrapperHeight = isH ? _this.height : _this.slides.length * slideHeight;
- }
- slideWidth = isH ? _this.width / params.slidesPerView : _this.width;
- if (params.roundLengths) slideWidth = Math.ceil(slideWidth);
- wrapperWidth = isH ? _this.slides.length * slideWidth : _this.width;
- slideSize = isH ? slideWidth : slideHeight;
- if (params.offsetSlidesBefore > 0) {
- if (isH) _this.wrapperLeft = slideSize * params.offsetSlidesBefore;
- else _this.wrapperTop = slideSize * params.offsetSlidesBefore;
- }
- if (params.offsetSlidesAfter > 0) {
- if (isH) _this.wrapperRight = slideSize * params.offsetSlidesAfter;
- else _this.wrapperBottom = slideSize * params.offsetSlidesAfter;
- }
- if (params.offsetPxBefore > 0) {
- if (isH) _this.wrapperLeft = params.offsetPxBefore;
- else _this.wrapperTop = params.offsetPxBefore;
- }
- if (params.offsetPxAfter > 0) {
- if (isH) _this.wrapperRight = params.offsetPxAfter;
- else _this.wrapperBottom = params.offsetPxAfter;
- }
- if (params.centeredSlides) {
- if (isH) {
- _this.wrapperLeft = (containerSize - slideSize) / 2;
- _this.wrapperRight = (containerSize - slideSize) / 2;
- }
- else {
- _this.wrapperTop = (containerSize - slideSize) / 2;
- _this.wrapperBottom = (containerSize - slideSize) / 2;
- }
- }
- if (isH) {
- if (_this.wrapperLeft > 0) wrapper.style.paddingLeft = _this.wrapperLeft + 'px';
- if (_this.wrapperRight > 0) wrapper.style.paddingRight = _this.wrapperRight + 'px';
- }
- else {
- if (_this.wrapperTop > 0) wrapper.style.paddingTop = _this.wrapperTop + 'px';
- if (_this.wrapperBottom > 0) wrapper.style.paddingBottom = _this.wrapperBottom + 'px';
- }
- wrapperSize = isH ? wrapperWidth + _this.wrapperRight + _this.wrapperLeft : wrapperHeight + _this.wrapperTop + _this.wrapperBottom;
- if (parseFloat(wrapperWidth) > 0 && (!params.cssWidthAndHeight || params.cssWidthAndHeight === 'height')) {
- wrapper.style.width = wrapperWidth + 'px';
- }
- if (parseFloat(wrapperHeight) > 0 && (!params.cssWidthAndHeight || params.cssWidthAndHeight === 'width')) {
- wrapper.style.height = wrapperHeight + 'px';
- }
- slideLeft = 0;
- _this.snapGrid = [];
- _this.slidesGrid = [];
- for (i = 0; i < _this.slides.length; i++) {
- _this.snapGrid.push(slideLeft);
- _this.slidesGrid.push(slideLeft);
- slideLeft += slideSize;
- if (parseFloat(slideWidth) > 0 && (!params.cssWidthAndHeight || params.cssWidthAndHeight === 'height')) {
- _this.slides[i].style.width = slideWidth + 'px';
- }
- if (parseFloat(slideHeight) > 0 && (!params.cssWidthAndHeight || params.cssWidthAndHeight === 'width')) {
- _this.slides[i].style.height = slideHeight + 'px';
- }
- }
- }
- if (!_this.initialized) {
- _this.callPlugins('onFirstInit');
- if (params.onFirstInit) _this.fireCallback(params.onFirstInit, _this);
- }
- else {
- _this.callPlugins('onInit');
- if (params.onInit) _this.fireCallback(params.onInit, _this);
- }
- _this.initialized = true;
- };
- _this.reInit = function (forceCalcSlides) {
- _this.init(true, forceCalcSlides);
- };
- _this.resizeFix = function (reInit) {
- _this.callPlugins('beforeResizeFix');
- _this.init(params.resizeReInit || reInit);
- // swipe to active slide in fixed mode
- if (!params.freeMode) {
- _this.swipeTo((params.loop ? _this.activeLoopIndex : _this.activeIndex), 0, false);
- // Fix autoplay
- if (params.autoplay) {
- if (_this.support.transitions && typeof autoplayTimeoutId !== 'undefined') {
- if (typeof autoplayTimeoutId !== 'undefined') {
- clearTimeout(autoplayTimeoutId);
- autoplayTimeoutId = undefined;
- _this.startAutoplay();
- }
- }
- else {
- if (typeof autoplayIntervalId !== 'undefined') {
- clearInterval(autoplayIntervalId);
- autoplayIntervalId = undefined;
- _this.startAutoplay();
- }
- }
- }
- }
- // move wrapper to the beginning in free mode
- else if (_this.getWrapperTranslate() < -maxWrapperPosition()) {
- _this.setWrapperTransition(0);
- _this.setWrapperTranslate(-maxWrapperPosition());
- }
- _this.callPlugins('afterResizeFix');
- };
- /*==========================================
- Max and Min Positions
- ============================================*/
- function maxWrapperPosition() {
- var a = (wrapperSize - containerSize);
- if (params.freeMode) {
- a = wrapperSize - containerSize;
- }
- // if (params.loop) a -= containerSize;
- if (params.slidesPerView > _this.slides.length && !params.centeredSlides) {
- a = 0;
- }
- if (a < 0) a = 0;
- return a;
- }
- /*==========================================
- Event Listeners
- ============================================*/
- function initEvents() {
- var bind = _this.h.addEventListener;
- var eventTarget = params.eventTarget === 'wrapper' ? _this.wrapper : _this.container;
- //Touch Events
- if (! (_this.browser.ie10 || _this.browser.ie11)) {
- if (_this.support.touch) {
- bind(eventTarget, 'touchstart', onTouchStart);
- bind(eventTarget, 'touchmove', onTouchMove);
- bind(eventTarget, 'touchend', onTouchEnd);
- }
- if (params.simulateTouch) {
- bind(eventTarget, 'mousedown', onTouchStart);
- bind(document, 'mousemove', onTouchMove);
- bind(document, 'mouseup', onTouchEnd);
- }
- }
- else {
- bind(eventTarget, _this.touchEvents.touchStart, onTouchStart);
- bind(document, _this.touchEvents.touchMove, onTouchMove);
- bind(document, _this.touchEvents.touchEnd, onTouchEnd);
- }
- //Resize Event
- if (params.autoResize) {
- bind(window, 'resize', _this.resizeFix);
- }
- //Slide Events
- addSlideEvents();
- //Mousewheel
- _this._wheelEvent = false;
- if (params.mousewheelControl) {
- if (document.onmousewheel !== undefined) {
- _this._wheelEvent = 'mousewheel';
- }
- if (!_this._wheelEvent) {
- try {
- new WheelEvent('wheel');
- _this._wheelEvent = 'wheel';
- } catch (e) {}
- }
- if (!_this._wheelEvent) {
- _this._wheelEvent = 'DOMMouseScroll';
- }
- if (_this._wheelEvent) {
- bind(_this.container, _this._wheelEvent, handleMousewheel);
- }
- }
- //Keyboard
- function _loadImage(src) {
- var image = new Image();
- image.onload = function () {
- if (typeof _this === 'undefined' || _this === null) return;
- if (_this.imagesLoaded !== undefined) _this.imagesLoaded++;
- if (_this.imagesLoaded === _this.imagesToLoad.length) {
- _this.reInit();
- if (params.onImagesReady) _this.fireCallback(params.onImagesReady, _this);
- }
- };
- image.src = src;
- }
- if (params.keyboardControl) {
- bind(document, 'keydown', handleKeyboardKeys);
- }
- if (params.updateOnImagesReady) {
- _this.imagesToLoad = $$('img', _this.container);
- for (var i = 0; i < _this.imagesToLoad.length; i++) {
- _loadImage(_this.imagesToLoad[i].getAttribute('src'));
- }
- }
- }
- //Remove Event Listeners
- _this.destroy = function (removeStyles) {
- var unbind = _this.h.removeEventListener;
- var eventTarget = params.eventTarget === 'wrapper' ? _this.wrapper : _this.container;
- //Touch Events
- if (! (_this.browser.ie10 || _this.browser.ie11)) {
- if (_this.support.touch) {
- unbind(eventTarget, 'touchstart', onTouchStart);
- unbind(eventTarget, 'touchmove', onTouchMove);
- unbind(eventTarget, 'touchend', onTouchEnd);
- }
- if (params.simulateTouch) {
- unbind(eventTarget, 'mousedown', onTouchStart);
- unbind(document, 'mousemove', onTouchMove);
- unbind(document, 'mouseup', onTouchEnd);
- }
- }
- else {
- unbind(eventTarget, _this.touchEvents.touchStart, onTouchStart);
- unbind(document, _this.touchEvents.touchMove, onTouchMove);
- unbind(document, _this.touchEvents.touchEnd, onTouchEnd);
- }
- //Resize Event
- if (params.autoResize) {
- unbind(window, 'resize', _this.resizeFix);
- }
- //Init Slide Events
- removeSlideEvents();
- //Pagination
- if (params.paginationClickable) {
- removePaginationEvents();
- }
- //Mousewheel
- if (params.mousewheelControl && _this._wheelEvent) {
- unbind(_this.container, _this._wheelEvent, handleMousewheel);
- }
- //Keyboard
- if (params.keyboardControl) {
- unbind(document, 'keydown', handleKeyboardKeys);
- }
- //Stop autoplay
- if (params.autoplay) {
- _this.stopAutoplay();
- }
- // Remove styles
- if (removeStyles) {
- _this.wrapper.removeAttribute('style');
- for (var i = 0; i < _this.slides.length; i++) {
- _this.slides[i].removeAttribute('style');
- }
- }
- // Plugins
- _this.callPlugins('onDestroy');
- // Check jQuery/Zepto data
- if (window.jQuery && window.jQuery(_this.container).data('swiper')) {
- window.jQuery(_this.container).removeData('swiper');
- }
- if (window.Zepto && window.Zepto(_this.container).data('swiper')) {
- window.Zepto(_this.container).removeData('swiper');
- }
- //Destroy variable
- _this = null;
- };
- function addSlideEvents() {
- var bind = _this.h.addEventListener,
- i;
- //Prevent Links Events
- if (params.preventLinks) {
- var links = $$('a', _this.container);
- for (i = 0; i < links.length; i++) {
- bind(links[i], 'click', preventClick);
- }
- }
- //Release Form Elements
- if (params.releaseFormElements) {
- var formElements = $$('input, textarea, select', _this.container);
- for (i = 0; i < formElements.length; i++) {
- bind(formElements[i], _this.touchEvents.touchStart, releaseForms, true);
- if (_this.support.touch && params.simulateTouch) {
- bind(formElements[i], 'mousedown', releaseForms, true);
- }
- }
- }
- //Slide Clicks & Touches
- if (params.onSlideClick) {
- for (i = 0; i < _this.slides.length; i++) {
- bind(_this.slides[i], 'click', slideClick);
- }
- }
- if (params.onSlideTouch) {
- for (i = 0; i < _this.slides.length; i++) {
- bind(_this.slides[i], _this.touchEvents.touchStart, slideTouch);
- }
- }
- }
- function removeSlideEvents() {
- var unbind = _this.h.removeEventListener,
- i;
- //Slide Clicks & Touches
- if (params.onSlideClick) {
- for (i = 0; i < _this.slides.length; i++) {
- unbind(_this.slides[i], 'click', slideClick);
- }
- }
- if (params.onSlideTouch) {
- for (i = 0; i < _this.slides.length; i++) {
- unbind(_this.slides[i], _this.touchEvents.touchStart, slideTouch);
- }
- }
- //Release Form Elements
- if (params.releaseFormElements) {
- var formElements = $$('input, textarea, select', _this.container);
- for (i = 0; i < formElements.length; i++) {
- unbind(formElements[i], _this.touchEvents.touchStart, releaseForms, true);
- if (_this.support.touch && params.simulateTouch) {
- unbind(formElements[i], 'mousedown', releaseForms, true);
- }
- }
- }
- //Prevent Links Events
- if (params.preventLinks) {
- var links = $$('a', _this.container);
- for (i = 0; i < links.length; i++) {
- unbind(links[i], 'click', preventClick);
- }
- }
- }
- /*==========================================
- Keyboard Control
- ============================================*/
- function handleKeyboardKeys(e) {
- var kc = e.keyCode || e.charCode;
- if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) return;
- if (kc === 37 || kc === 39 || kc === 38 || kc === 40) {
- var inView = false;
- //Check that swiper should be inside of visible area of window
- var swiperOffset = _this.h.getOffset(_this.container);
- var scrollLeft = _this.h.windowScroll().left;
- var scrollTop = _this.h.windowScroll().top;
- var windowWidth = _this.h.windowWidth();
- var windowHeight = _this.h.windowHeight();
- var swiperCoord = [
- [swiperOffset.left, swiperOffset.top],
- [swiperOffset.left + _this.width, swiperOffset.top],
- [swiperOffset.left, swiperOffset.top + _this.height],
- [swiperOffset.left + _this.width, swiperOffset.top + _this.height]
- ];
- for (var i = 0; i < swiperCoord.length; i++) {
- var point = swiperCoord[i];
- if (
- point[0] >= scrollLeft && point[0] <= scrollLeft + windowWidth &&
- point[1] >= scrollTop && point[1] <= scrollTop + windowHeight
- ) {
- inView = true;
- }
- }
- if (!inView) return;
- }
- if (isH) {
- if (kc === 37 || kc === 39) {
- if (e.preventDefault) e.preventDefault();
- else e.returnValue = false;
- }
- if (kc === 39) _this.swipeNext();
- if (kc === 37) _this.swipePrev();
- }
- else {
- if (kc === 38 || kc === 40) {
- if (e.preventDefault) e.preventDefault();
- else e.returnValue = false;
- }
- if (kc === 40) _this.swipeNext();
- if (kc === 38) _this.swipePrev();
- }
- }
- _this.disableKeyboardControl = function () {
- params.keyboardControl = false;
- _this.h.removeEventListener(document, 'keydown', handleKeyboardKeys);
- };
- _this.enableKeyboardControl = function () {
- params.keyboardControl = true;
- _this.h.addEventListener(document, 'keydown', handleKeyboardKeys);
- };
- /*==========================================
- Mousewheel Control
- ============================================*/
- var lastScrollTime = (new Date()).getTime();
- function handleMousewheel(e) {
- var we = _this._wheelEvent;
- var delta = 0;
- //Opera & IE
- if (e.detail) delta = -e.detail;
- //WebKits
- else if (we === 'mousewheel') {
- if (params.mousewheelControlForceToAxis) {
- if (isH) {
- if (Math.abs(e.wheelDeltaX) > Math.abs(e.wheelDeltaY)) delta = e.wheelDeltaX;
- else return;
- }
- else {
- if (Math.abs(e.wheelDeltaY) > Math.abs(e.wheelDeltaX)) delta = e.wheelDeltaY;
- else return;
- }
- }
- else {
- delta = e.wheelDelta;
- }
- }
- //Old FireFox
- else if (we === 'DOMMouseScroll') delta = -e.detail;
- //New FireFox
- else if (we === 'wheel') {
- if (params.mousewheelControlForceToAxis) {
- if (isH) {
- if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) delta = -e.deltaX;
- else return;
- }
- else {
- if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) delta = -e.deltaY;
- else return;
- }
- }
- else {
- delta = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? - e.deltaX : - e.deltaY;
- }
- }
- if (!params.freeMode) {
- if ((new Date()).getTime() - lastScrollTime > 60) {
- if (delta < 0) _this.swipeNext();
- else _this.swipePrev();
- }
- lastScrollTime = (new Date()).getTime();
- }
- else {
- //Freemode or scrollContainer:
- var position = _this.getWrapperTranslate() + delta;
- if (position > 0) position = 0;
- if (position < -maxWrapperPosition()) position = -maxWrapperPosition();
- _this.setWrapperTransition(0);
- _this.setWrapperTranslate(position);
- _this.updateActiveSlide(position);
- // Return page scroll on edge positions
- if (position === 0 || position === -maxWrapperPosition()) return;
- }
- if (params.autoplay) _this.stopAutoplay(true);
- if (e.preventDefault) e.preventDefault();
- else e.returnValue = false;
- return false;
- }
- _this.disableMousewheelControl = function () {
- if (!_this._wheelEvent) return false;
- params.mousewheelControl = false;
- _this.h.removeEventListener(_this.container, _this._wheelEvent, handleMousewheel);
- return true;
- };
- _this.enableMousewheelControl = function () {
- if (!_this._wheelEvent) return false;
- params.mousewheelControl = true;
- _this.h.addEventListener(_this.container, _this._wheelEvent, handleMousewheel);
- return true;
- };
- /*=========================
- Grab Cursor
- ===========================*/
- if (params.grabCursor) {
- var containerStyle = _this.container.style;
- containerStyle.cursor = 'move';
- containerStyle.cursor = 'grab';
- containerStyle.cursor = '-moz-grab';
- containerStyle.cursor = '-webkit-grab';
- }
- /*=========================
- Slides Events Handlers
- ===========================*/
- _this.allowSlideClick = true;
- function slideClick(event) {
- if (_this.allowSlideClick) {
- setClickedSlide(event);
- _this.fireCallback(params.onSlideClick, _this, event);
- }
- }
- function slideTouch(event) {
- setClickedSlide(event);
- _this.fireCallback(params.onSlideTouch, _this, event);
- }
- function setClickedSlide(event) {
- // IE 6-8 support
- if (!event.currentTarget) {
- var element = event.srcElement;
- do {
- if (element.className.indexOf(params.slideClass) > -1) {
- break;
- }
- element = element.parentNode;
- } while (element);
- _this.clickedSlide = element;
- }
- else {
- _this.clickedSlide = event.currentTarget;
- }
- _this.clickedSlideIndex = _this.slides.indexOf(_this.clickedSlide);
- _this.clickedSlideLoopIndex = _this.clickedSlideIndex - (_this.loopedSlides || 0);
- }
- _this.allowLinks = true;
- function preventClick(e) {
- if (!_this.allowLinks) {
- if (e.preventDefault) e.preventDefault();
- else e.returnValue = false;
- if (params.preventLinksPropagation && 'stopPropagation' in e) {
- e.stopPropagation();
- }
- return false;
- }
- }
- function releaseForms(e) {
- if (e.stopPropagation) e.stopPropagation();
- else e.returnValue = false;
- return false;
- }
- /*==================================================
- Event Handlers
- ====================================================*/
- var isTouchEvent = false;
- var allowThresholdMove;
- var allowMomentumBounce = true;
- function onTouchStart(event) {
- if (params.preventLinks) _this.allowLinks = true;
- //Exit if slider is already was touched
- if (_this.isTouched || params.onlyExternal) {
- return false;
- }
- // Blur active elements
- var eventTarget = event.target || event.srcElement;
- if (document.activeElement) {
- if (document.activeElement !== eventTarget) document.activeElement.blur();
- }
- // Form tag names
- var formTagNames = ('input select textarea').split(' ');
- // Check for no swiping
- if (params.noSwiping && (eventTarget) && noSwipingSlide(eventTarget)) return false;
- allowMomentumBounce = false;
- //Check For Nested Swipers
- _this.isTouched = true;
- isTouchEvent = event.type === 'touchstart';
- // prevent user enter with right and the swiper move (needs isTouchEvent)
- if (!isTouchEvent && 'which' in event && event.which === 3) {
- _this.isTouched = false;
- return false;
- }
- if (!isTouchEvent || event.targetTouches.length === 1) {
- _this.callPlugins('onTouchStartBegin');
- if (!isTouchEvent && !_this.isAndroid && formTagNames.indexOf(eventTarget.tagName.toLowerCase()) < 0) {
- if (event.preventDefault) event.preventDefault();
- else event.returnValue = false;
- }
- var pageX = isTouchEvent ? event.targetTouches[0].pageX : (event.pageX || event.clientX);
- var pageY = isTouchEvent ? event.targetTouches[0].pageY : (event.pageY || event.clientY);
- //Start Touches to check the scrolling
- _this.touches.startX = _this.touches.currentX = pageX;
- _this.touches.startY = _this.touches.currentY = pageY;
- _this.touches.start = _this.touches.current = isH ? pageX : pageY;
- //Set Transition Time to 0
- _this.setWrapperTransition(0);
- //Get Start Translate Position
- _this.positions.start = _this.positions.current = _this.getWrapperTranslate();
- //Set Transform
- _this.setWrapperTranslate(_this.positions.start);
- //TouchStartTime
- _this.times.start = (new Date()).getTime();
- //Unset Scrolling
- isScrolling = undefined;
- //Set Treshold
- if (params.moveStartThreshold > 0) {
- allowThresholdMove = false;
- }
- //CallBack
- if (params.onTouchStart) _this.fireCallback(params.onTouchStart, _this, event);
- _this.callPlugins('onTouchStartEnd');
- }
- }
- var velocityPrevPosition, velocityPrevTime;
- function onTouchMove(event) {
- // If slider is not touched - exit
- if (!_this.isTouched || params.onlyExternal) return;
- if (isTouchEvent && event.type === 'mousemove') return;
- var pageX = isTouchEvent ? event.targetTouches[0].pageX : (event.pageX || event.clientX);
- var pageY = isTouchEvent ? event.targetTouches[0].pageY : (event.pageY || event.clientY);
- //check for scrolling
- if (typeof isScrolling === 'undefined' && isH) {
- isScrolling = !!(isScrolling || Math.abs(pageY - _this.touches.startY) > Math.abs(pageX - _this.touches.startX));
- }
- if (typeof isScrolling === 'undefined' && !isH) {
- isScrolling = !!(isScrolling || Math.abs(pageY - _this.touches.startY) < Math.abs(pageX - _this.touches.startX));
- }
- if (isScrolling) {
- _this.isTouched = false;
- return;
- }
- // One way swipes
- if (isH) {
- if ((!params.swipeToNext && pageX < _this.touches.startX) || ((!params.swipeToPrev && pageX > _this.touches.startX))) {
- return;
- }
- }
- else {
- if ((!params.swipeToNext && pageY < _this.touches.startY) || ((!params.swipeToPrev && pageY > _this.touches.startY))) {
- return;
- }
- }
- //Check For Nested Swipers
- if (event.assignedToSwiper) {
- _this.isTouched = false;
- return;
- }
- event.assignedToSwiper = true;
- //Block inner links
- if (params.preventLinks) {
- _this.allowLinks = false;
- }
- if (params.onSlideClick) {
- _this.allowSlideClick = false;
- }
- //Stop AutoPlay if exist
- if (params.autoplay) {
- _this.stopAutoplay(true);
- }
- if (!isTouchEvent || event.touches.length === 1) {
- //Moved Flag
- if (!_this.isMoved) {
- _this.callPlugins('onTouchMoveStart');
- if (params.loop) {
- _this.fixLoop();
- _this.positions.start = _this.getWrapperTranslate();
- }
- if (params.onTouchMoveStart) _this.fireCallback(params.onTouchMoveStart, _this);
- }
- _this.isMoved = true;
- // cancel event
- if (event.preventDefault) event.preventDefault();
- else event.returnValue = false;
- _this.touches.current = isH ? pageX : pageY;
- _this.positions.current = (_this.touches.current - _this.touches.start) * params.touchRatio + _this.positions.start;
- //Resistance Callbacks
- if (_this.positions.current > 0 && params.onResistanceBefore) {
- _this.fireCallback(params.onResistanceBefore, _this, _this.positions.current);
- }
- if (_this.positions.current < -maxWrapperPosition() && params.onResistanceAfter) {
- _this.fireCallback(params.onResistanceAfter, _this, Math.abs(_this.positions.current + maxWrapperPosition()));
- }
- //Resistance
- if (params.resistance && params.resistance !== '100%') {
- var resistance;
- //Resistance for Negative-Back sliding
- if (_this.positions.current > 0) {
- resistance = 1 - _this.positions.current / containerSize / 2;
- if (resistance < 0.5)
- _this.positions.current = (containerSize / 2);
- else
- _this.positions.current = _this.positions.current * resistance;
- }
- //Resistance for After-End Sliding
- if (_this.positions.current < -maxWrapperPosition()) {
- var diff = (_this.touches.current - _this.touches.start) * params.touchRatio + (maxWrapperPosition() + _this.positions.start);
- resistance = (containerSize + diff) / (containerSize);
- var newPos = _this.positions.current - diff * (1 - resistance) / 2;
- var stopPos = -maxWrapperPosition() - containerSize / 2;
- if (newPos < stopPos || resistance <= 0)
- _this.positions.current = stopPos;
- else
- _this.positions.current = newPos;
- }
- }
- if (params.resistance && params.resistance === '100%') {
- //Resistance for Negative-Back sliding
- if (_this.positions.current > 0 && !(params.freeMode && !params.freeModeFluid)) {
- _this.positions.current = 0;
- }
- //Resistance for After-End Sliding
- if (_this.positions.current < -maxWrapperPosition() && !(params.freeMode && !params.freeModeFluid)) {
- _this.positions.current = -maxWrapperPosition();
- }
- }
- //Move Slides
- if (!params.followFinger) return;
- if (!params.moveStartThreshold) {
- _this.setWrapperTranslate(_this.positions.current);
- }
- else {
- if (Math.abs(_this.touches.current - _this.touches.start) > params.moveStartThreshold || allowThresholdMove) {
- if (!allowThresholdMove) {
- allowThresholdMove = true;
- _this.touches.start = _this.touches.current;
- return;
- }
- _this.setWrapperTranslate(_this.positions.current);
- }
- else {
- _this.positions.current = _this.positions.start;
- }
- }
- if (params.freeMode || params.watchActiveIndex) {
- _this.updateActiveSlide(_this.positions.current);
- }
- //Grab Cursor
- if (params.grabCursor) {
- _this.container.style.cursor = 'move';
- _this.container.style.cursor = 'grabbing';
- _this.container.style.cursor = '-moz-grabbin';
- _this.container.style.cursor = '-webkit-grabbing';
- }
- //Velocity
- if (!velocityPrevPosition) velocityPrevPosition = _this.touches.current;
- if (!velocityPrevTime) velocityPrevTime = (new Date()).getTime();
- _this.velocity = (_this.touches.current - velocityPrevPosition) / ((new Date()).getTime() - velocityPrevTime) / 2;
- if (Math.abs(_this.touches.current - velocityPrevPosition) < 2) _this.velocity = 0;
- velocityPrevPosition = _this.touches.current;
- velocityPrevTime = (new Date()).getTime();
- //Callbacks
- _this.callPlugins('onTouchMoveEnd');
- if (params.onTouchMove) _this.fireCallback(params.onTouchMove, _this, event);
- return false;
- }
- }
- function onTouchEnd(event) {
- //Check For scrolling
- if (isScrolling) {
- _this.swipeReset();
- }
- // If slider is not touched exit
- if (params.onlyExternal || !_this.isTouched) return;
- _this.isTouched = false;
- //Return Grab Cursor
- if (params.grabCursor) {
- _this.container.style.cursor = 'move';
- _this.container.style.cursor = 'grab';
- _this.container.style.cursor = '-moz-grab';
- _this.container.style.cursor = '-webkit-grab';
- }
- //Check for Current Position
- if (!_this.positions.current && _this.positions.current !== 0) {
- _this.positions.current = _this.positions.start;
- }
- //For case if slider touched but not moved
- if (params.followFinger) {
- _this.setWrapperTranslate(_this.positions.current);
- }
- // TouchEndTime
- _this.times.end = (new Date()).getTime();
- //Difference
- _this.touches.diff = _this.touches.current - _this.touches.start;
- _this.touches.abs = Math.abs(_this.touches.diff);
- _this.positions.diff = _this.positions.current - _this.positions.start;
- _this.positions.abs = Math.abs(_this.positions.diff);
- var diff = _this.positions.diff;
- var diffAbs = _this.positions.abs;
- var timeDiff = _this.times.end - _this.times.start;
- if (diffAbs < 5 && (timeDiff) < 300 && _this.allowLinks === false) {
- if (!params.freeMode && diffAbs !== 0) _this.swipeReset();
- //Release inner links
- if (params.preventLinks) {
- _this.allowLinks = true;
- }
- if (params.onSlideClick) {
- _this.allowSlideClick = true;
- }
- }
- setTimeout(function () {
- //Release inner links
- if (typeof _this === 'undefined' || _this === null) return;
- if (params.preventLinks) {
- _this.allowLinks = true;
- }
- if (params.onSlideClick) {
- _this.allowSlideClick = true;
- }
- }, 100);
- var maxPosition = maxWrapperPosition();
- //Not moved or Prevent Negative Back Sliding/After-End Sliding
- if (!_this.isMoved && params.freeMode) {
- _this.isMoved = false;
- if (params.onTouchEnd) _this.fireCallback(params.onTouchEnd, _this, event);
- _this.callPlugins('onTouchEnd');
- return;
- }
- if (!_this.isMoved || _this.positions.current > 0 || _this.positions.current < -maxPosition) {
- _this.swipeReset();
- if (params.onTouchEnd) _this.fireCallback(params.onTouchEnd, _this, event);
- _this.callPlugins('onTouchEnd');
- return;
- }
- _this.isMoved = false;
- //Free Mode
- if (params.freeMode) {
- if (params.freeModeFluid) {
- var momentumDuration = 1000 * params.momentumRatio;
- var momentumDistance = _this.velocity * momentumDuration;
- var newPosition = _this.positions.current + momentumDistance;
- var doBounce = false;
- var afterBouncePosition;
- var bounceAmount = Math.abs(_this.velocity) * 20 * params.momentumBounceRatio;
- if (newPosition < -maxPosition) {
- if (params.momentumBounce && _this.support.transitions) {
- if (newPosition + maxPosition < -bounceAmount) newPosition = -maxPosition - bounceAmount;
- afterBouncePosition = -maxPosition;
- doBounce = true;
- allowMomentumBounce = true;
- }
- else newPosition = -maxPosition;
- }
- if (newPosition > 0) {
- if (params.momentumBounce && _this.support.transitions) {
- if (newPosition > bounceAmount) newPosition = bounceAmount;
- afterBouncePosition = 0;
- doBounce = true;
- allowMomentumBounce = true;
- }
- else newPosition = 0;
- }
- //Fix duration
- if (_this.velocity !== 0) momentumDuration = Math.abs((newPosition - _this.positions.current) / _this.velocity);
- _this.setWrapperTranslate(newPosition);
- _this.setWrapperTransition(momentumDuration);
- if (params.momentumBounce && doBounce) {
- _this.wrapperTransitionEnd(function () {
- if (!allowMomentumBounce) return;
- if (params.onMomentumBounce) _this.fireCallback(params.onMomentumBounce, _this);
- _this.callPlugins('onMomentumBounce');
- _this.setWrapperTranslate(afterBouncePosition);
- _this.setWrapperTransition(300);
- });
- }
- _this.updateActiveSlide(newPosition);
- }
- if (!params.freeModeFluid || timeDiff >= 300) _this.updateActiveSlide(_this.positions.current);
- if (params.onTouchEnd) _this.fireCallback(params.onTouchEnd, _this, event);
- _this.callPlugins('onTouchEnd');
- return;
- }
- //Direction
- direction = diff < 0 ? 'toNext' : 'toPrev';
- //Short Touches
- if (direction === 'toNext' && (timeDiff <= 300)) {
- if (diffAbs < 30 || !params.shortSwipes) _this.swipeReset();
- else _this.swipeNext(true, true);
- }
- if (direction === 'toPrev' && (timeDiff <= 300)) {
- if (diffAbs < 30 || !params.shortSwipes) _this.swipeReset();
- else _this.swipePrev(true, true);
- }
- //Long Touches
- var targetSlideSize = 0;
- if (params.slidesPerView === 'auto') {
- //Define current slide's width
- var currentPosition = Math.abs(_this.getWrapperTranslate());
- var slidesOffset = 0;
- var _slideSize;
- for (var i = 0; i < _this.slides.length; i++) {
- _slideSize = isH ? _this.slides[i].getWidth(true, params.roundLengths) : _this.slides[i].getHeight(true, params.roundLengths);
- slidesOffset += _slideSize;
- if (slidesOffset > currentPosition) {
- targetSlideSize = _slideSize;
- break;
- }
- }
- if (targetSlideSize > containerSize) targetSlideSize = containerSize;
- }
- else {
- targetSlideSize = slideSize * params.slidesPerView;
- }
- if (direction === 'toNext' && (timeDiff > 300)) {
- if (diffAbs >= targetSlideSize * params.longSwipesRatio) {
- _this.swipeNext(true, true);
- }
- else {
- _this.swipeReset();
- }
- }
- if (direction === 'toPrev' && (timeDiff > 300)) {
- if (diffAbs >= targetSlideSize * params.longSwipesRatio) {
- _this.swipePrev(true, true);
- }
- else {
- _this.swipeReset();
- }
- }
- if (params.onTouchEnd) _this.fireCallback(params.onTouchEnd, _this, event);
- _this.callPlugins('onTouchEnd');
- }
- /*==================================================
- noSwiping Bubble Check by Isaac Strack
- ====================================================*/
- function noSwipingSlide(el) {
- /*This function is specifically designed to check the parent elements for the noSwiping class, up to the wrapper.
- We need to check parents because while onTouchStart bubbles, _this.isTouched is checked in onTouchStart, which stops the bubbling.
- So, if a text box, for example, is the initial target, and the parent slide container has the noSwiping class, the _this.isTouched
- check will never find it, and what was supposed to be noSwiping is able to be swiped.
- This function will iterate up and check for the noSwiping class in parents, up through the wrapperClass.*/
- // First we create a truthy variable, which is that swiping is allowd (noSwiping = false)
- var noSwiping = false;
- // Now we iterate up (parentElements) until we reach the node with the wrapperClass.
- do {
- // Each time, we check to see if there's a 'swiper-no-swiping' class (noSwipingClass).
- if (el.className.indexOf(params.noSwipingClass) > -1)
- {
- noSwiping = true; // If there is, we set noSwiping = true;
- }
- el = el.parentElement; // now we iterate up (parent node)
- } while (!noSwiping && el.parentElement && el.className.indexOf(params.wrapperClass) === -1); // also include el.parentElement truthy, just in case.
- // because we didn't check the wrapper itself, we do so now, if noSwiping is false:
- if (!noSwiping && el.className.indexOf(params.wrapperClass) > -1 && el.className.indexOf(params.noSwipingClass) > -1)
- noSwiping = true; // if the wrapper has the noSwipingClass, we set noSwiping = true;
- return noSwiping;
- }
- function addClassToHtmlString(klass, outerHtml) {
- var par = document.createElement('div');
- var child;
- par.innerHTML = outerHtml;
- child = par.firstChild;
- child.className += ' ' + klass;
- return child.outerHTML;
- }
- /*==================================================
- Swipe Functions
- ====================================================*/
- _this.swipeNext = function (runCallbacks, internal) {
- if (typeof runCallbacks === 'undefined') runCallbacks = true;
- if (!internal && params.loop) _this.fixLoop();
- if (!internal && params.autoplay) _this.stopAutoplay(true);
- _this.callPlugins('onSwipeNext');
- var currentPosition = _this.getWrapperTranslate().toFixed(2);
- var newPosition = currentPosition;
- if (params.slidesPerView === 'auto') {
- for (var i = 0; i < _this.snapGrid.length; i++) {
- if (-currentPosition >= _this.snapGrid[i].toFixed(2) && -currentPosition < _this.snapGrid[i + 1].toFixed(2)) {
- newPosition = -_this.snapGrid[i + 1];
- break;
- }
- }
- }
- else {
- var groupSize = slideSize * params.slidesPerGroup;
- newPosition = -(Math.floor(Math.abs(currentPosition) / Math.floor(groupSize)) * groupSize + groupSize);
- }
- if (newPosition < -maxWrapperPosition()) {
- newPosition = -maxWrapperPosition();
- }
- if (newPosition === currentPosition) return false;
- swipeToPosition(newPosition, 'next', {runCallbacks: runCallbacks});
- return true;
- };
- _this.swipePrev = function (runCallbacks, internal) {
- if (typeof runCallbacks === 'undefined') runCallbacks = true;
- if (!internal && params.loop) _this.fixLoop();
- if (!internal && params.autoplay) _this.stopAutoplay(true);
- _this.callPlugins('onSwipePrev');
- var currentPosition = Math.ceil(_this.getWrapperTranslate());
- var newPosition;
- if (params.slidesPerView === 'auto') {
- newPosition = 0;
- for (var i = 1; i < _this.snapGrid.length; i++) {
- if (-currentPosition === _this.snapGrid[i]) {
- newPosition = -_this.snapGrid[i - 1];
- break;
- }
- if (-currentPosition > _this.snapGrid[i] && -currentPosition < _this.snapGrid[i + 1]) {
- newPosition = -_this.snapGrid[i];
- break;
- }
- }
- }
- else {
- var groupSize = slideSize * params.slidesPerGroup;
- newPosition = -(Math.ceil(-currentPosition / groupSize) - 1) * groupSize;
- }
- if (newPosition > 0) newPosition = 0;
- if (newPosition === currentPosition) return false;
- swipeToPosition(newPosition, 'prev', {runCallbacks: runCallbacks});
- return true;
- };
- _this.swipeReset = function (runCallbacks) {
- if (typeof runCallbacks === 'undefined') runCallbacks = true;
- _this.callPlugins('onSwipeReset');
- var currentPosition = _this.getWrapperTranslate();
- var groupSize = slideSize * params.slidesPerGroup;
- var newPosition;
- var maxPosition = -maxWrapperPosition();
- if (params.slidesPerView === 'auto') {
- newPosition = 0;
- for (var i = 0; i < _this.snapGrid.length; i++) {
- if (-currentPosition === _this.snapGrid[i]) return;
- if (-currentPosition >= _this.snapGrid[i] && -currentPosition < _this.snapGrid[i + 1]) {
- if (_this.positions.diff > 0) newPosition = -_this.snapGrid[i + 1];
- else newPosition = -_this.snapGrid[i];
- break;
- }
- }
- if (-currentPosition >= _this.snapGrid[_this.snapGrid.length - 1]) newPosition = -_this.snapGrid[_this.snapGrid.length - 1];
- if (currentPosition <= -maxWrapperPosition()) newPosition = -maxWrapperPosition();
- }
- else {
- newPosition = currentPosition < 0 ? Math.round(currentPosition / groupSize) * groupSize : 0;
- if (currentPosition <= -maxWrapperPosition()) newPosition = -maxWrapperPosition();
- }
- if (params.scrollContainer) {
- newPosition = currentPosition < 0 ? currentPosition : 0;
- }
- if (newPosition < -maxWrapperPosition()) {
- newPosition = -maxWrapperPosition();
- }
- if (params.scrollContainer && (containerSize > slideSize)) {
- newPosition = 0;
- }
- if (newPosition === currentPosition) return false;
- swipeToPosition(newPosition, 'reset', {runCallbacks: runCallbacks});
- return true;
- };
- _this.swipeTo = function (index, speed, runCallbacks) {
- index = parseInt(index, 10);
- _this.callPlugins('onSwipeTo', {index: index, speed: speed});
- if (params.loop) index = index + _this.loopedSlides;
- var currentPosition = _this.getWrapperTranslate();
- if (index > (_this.slides.length - 1) || index < 0) return;
- var newPosition;
- if (params.slidesPerView === 'auto') {
- newPosition = -_this.slidesGrid[index];
- }
- else {
- newPosition = -index * slideSize;
- }
- if (newPosition < - maxWrapperPosition()) {
- newPosition = - maxWrapperPosition();
- }
- if (newPosition === currentPosition) return false;
- if (typeof runCallbacks === 'undefined') runCallbacks = true;
- swipeToPosition(newPosition, 'to', {index: index, speed: speed, runCallbacks: runCallbacks});
- return true;
- };
- function swipeToPosition(newPosition, action, toOptions) {
- var speed = (action === 'to' && toOptions.speed >= 0) ? toOptions.speed : params.speed;
- var timeOld = + new Date();
- function anim() {
- var timeNew = + new Date();
- var time = timeNew - timeOld;
- currentPosition += animationStep * time / (1000 / 60);
- condition = direction === 'toNext' ? currentPosition > newPosition : currentPosition < newPosition;
- if (condition) {
- _this.setWrapperTranslate(Math.ceil(currentPosition));
- _this._DOMAnimating = true;
- window.setTimeout(function () {
- anim();
- }, 1000 / 60);
- }
- else {
- if (params.onSlideChangeEnd) {
- if (action === 'to') {
- if (toOptions.runCallbacks === true) _this.fireCallback(params.onSlideChangeEnd, _this, direction);
- }
- else {
- _this.fireCallback(params.onSlideChangeEnd, _this, direction);
- }
- }
- _this.setWrapperTranslate(newPosition);
- _this._DOMAnimating = false;
- }
- }
- if (_this.support.transitions || !params.DOMAnimation) {
- _this.setWrapperTranslate(newPosition);
- _this.setWrapperTransition(speed);
- }
- else {
- //Try the DOM animation
- var currentPosition = _this.getWrapperTranslate();
- var animationStep = Math.ceil((newPosition - currentPosition) / speed * (1000 / 60));
- var direction = currentPosition > newPosition ? 'toNext' : 'toPrev';
- var condition = direction === 'toNext' ? currentPosition > newPosition : currentPosition < newPosition;
- if (_this._DOMAnimating) return;
- anim();
- }
- //Update Active Slide Index
- _this.updateActiveSlide(newPosition);
- //Callbacks
- if (params.onSlideNext && action === 'next' && toOptions.runCallbacks === true) {
- _this.fireCallback(params.onSlideNext, _this, newPosition);
- }
- if (params.onSlidePrev && action === 'prev' && toOptions.runCallbacks === true) {
- _this.fireCallback(params.onSlidePrev, _this, newPosition);
- }
- //'Reset' Callback
- if (params.onSlideReset && action === 'reset' && toOptions.runCallbacks === true) {
- _this.fireCallback(params.onSlideReset, _this, newPosition);
- }
- //'Next', 'Prev' and 'To' Callbacks
- if ((action === 'next' || action === 'prev' || action === 'to') && toOptions.runCallbacks === true)
- slideChangeCallbacks(action);
- }
- /*==================================================
- Transition Callbacks
- ====================================================*/
- //Prevent Multiple Callbacks
- _this._queueStartCallbacks = false;
- _this._queueEndCallbacks = false;
- function slideChangeCallbacks(direction) {
- //Transition Start Callback
- _this.callPlugins('onSlideChangeStart');
- if (params.onSlideChangeStart) {
- if (params.queueStartCallbacks && _this.support.transitions) {
- if (_this._queueStartCallbacks) return;
- _this._queueStartCallbacks = true;
- _this.fireCallback(params.onSlideChangeStart, _this, direction);
- _this.wrapperTransitionEnd(function () {
- _this._queueStartCallbacks = false;
- });
- }
- else _this.fireCallback(params.onSlideChangeStart, _this, direction);
- }
- //Transition End Callback
- if (params.onSlideChangeEnd) {
- if (_this.support.transitions) {
- if (params.queueEndCallbacks) {
- if (_this._queueEndCallbacks) return;
- _this._queueEndCallbacks = true;
- _this.wrapperTransitionEnd(function (swiper) {
- _this.fireCallback(params.onSlideChangeEnd, swiper, direction);
- });
- }
- else {
- _this.wrapperTransitionEnd(function (swiper) {
- _this.fireCallback(params.onSlideChangeEnd, swiper, direction);
- });
- }
- }
- else {
- if (!params.DOMAnimation) {
- setTimeout(function () {
- _this.fireCallback(params.onSlideChangeEnd, _this, direction);
- }, 10);
- }
- }
- }
- }
- /*==================================================
- Update Active Slide Index
- ====================================================*/
- _this.updateActiveSlide = function (position) {
- if (!_this.initialized) return;
- if (_this.slides.length === 0) return;
- _this.previousIndex = _this.activeIndex;
- if (typeof position === 'undefined') position = _this.getWrapperTranslate();
- if (position > 0) position = 0;
- var i;
- if (params.slidesPerView === 'auto') {
- var slidesOffset = 0;
- _this.activeIndex = _this.slidesGrid.indexOf(-position);
- if (_this.activeIndex < 0) {
- for (i = 0; i < _this.slidesGrid.length - 1; i++) {
- if (-position > _this.slidesGrid[i] && -position < _this.slidesGrid[i + 1]) {
- break;
- }
- }
- var leftDistance = Math.abs(_this.slidesGrid[i] + position);
- var rightDistance = Math.abs(_this.slidesGrid[i + 1] + position);
- if (leftDistance <= rightDistance) _this.activeIndex = i;
- else _this.activeIndex = i + 1;
- }
- }
- else {
- _this.activeIndex = Math[params.visibilityFullFit ? 'ceil' : 'round'](-position / slideSize);
- }
- if (_this.activeIndex === _this.slides.length) _this.activeIndex = _this.slides.length - 1;
- if (_this.activeIndex < 0) _this.activeIndex = 0;
- // Check for slide
- if (!_this.slides[_this.activeIndex]) return;
- // Calc Visible slides
- _this.calcVisibleSlides(position);
- // Mark visible and active slides with additonal classes
- if (_this.support.classList) {
- var slide;
- for (i = 0; i < _this.slides.length; i++) {
- slide = _this.slides[i];
- slide.classList.remove(params.slideActiveClass);
- if (_this.visibleSlides.indexOf(slide) >= 0) {
- slide.classList.add(params.slideVisibleClass);
- } else {
- slide.classList.remove(params.slideVisibleClass);
- }
- }
- _this.slides[_this.activeIndex].classList.add(params.slideActiveClass);
- } else {
- var activeClassRegexp = new RegExp('\\s*' + params.slideActiveClass);
- var inViewClassRegexp = new RegExp('\\s*' + params.slideVisibleClass);
- for (i = 0; i < _this.slides.length; i++) {
- _this.slides[i].className = _this.slides[i].className.replace(activeClassRegexp, '').replace(inViewClassRegexp, '');
- if (_this.visibleSlides.indexOf(_this.slides[i]) >= 0) {
- _this.slides[i].className += ' ' + params.slideVisibleClass;
- }
- }
- _this.slides[_this.activeIndex].className += ' ' + params.slideActiveClass;
- }
- //Update loop index
- if (params.loop) {
- var ls = _this.loopedSlides;
- _this.activeLoopIndex = _this.activeIndex - ls;
- if (_this.activeLoopIndex >= _this.slides.length - ls * 2) {
- _this.activeLoopIndex = _this.slides.length - ls * 2 - _this.activeLoopIndex;
- }
- if (_this.activeLoopIndex < 0) {
- _this.activeLoopIndex = _this.slides.length - ls * 2 + _this.activeLoopIndex;
- }
- if (_this.activeLoopIndex < 0) _this.activeLoopIndex = 0;
- }
- else {
- _this.activeLoopIndex = _this.activeIndex;
- }
- //Update Pagination
- if (params.pagination) {
- _this.updatePagination(position);
- }
- };
- /*==================================================
- Pagination
- ====================================================*/
- _this.createPagination = function (firstInit) {
- if (params.paginationClickable && _this.paginationButtons) {
- removePaginationEvents();
- }
- _this.paginationContainer = params.pagination.nodeType ? params.pagination : $$(params.pagination)[0];
- if (params.createPagination) {
- var paginationHTML = '';
- var numOfSlides = _this.slides.length;
- var numOfButtons = numOfSlides;
- if (params.loop) numOfButtons -= _this.loopedSlides * 2;
- for (var i = 0; i < numOfButtons; i++) {
- paginationHTML += '<' + params.paginationElement + ' class="' + params.paginationElementClass + '"></' + params.paginationElement + '>';
- }
- _this.paginationContainer.innerHTML = paginationHTML;
- }
- _this.paginationButtons = $$('.' + params.paginationElementClass, _this.paginationContainer);
- if (!firstInit) _this.updatePagination();
- _this.callPlugins('onCreatePagination');
- if (params.paginationClickable) {
- addPaginationEvents();
- }
- };
- function removePaginationEvents() {
- var pagers = _this.paginationButtons;
- if (pagers) {
- for (var i = 0; i < pagers.length; i++) {
- _this.h.removeEventListener(pagers[i], 'click', paginationClick);
- }
- }
- }
- function addPaginationEvents() {
- var pagers = _this.paginationButtons;
- if (pagers) {
- for (var i = 0; i < pagers.length; i++) {
- _this.h.addEventListener(pagers[i], 'click', paginationClick);
- }
- }
- }
- function paginationClick(e) {
- var index;
- var target = e.target || e.srcElement;
- var pagers = _this.paginationButtons;
- for (var i = 0; i < pagers.length; i++) {
- if (target === pagers[i]) index = i;
- }
- if (params.autoplay) _this.stopAutoplay(true);
- _this.swipeTo(index);
- }
- _this.updatePagination = function (position) {
- if (!params.pagination) return;
- if (_this.slides.length < 1) return;
- var activePagers = $$('.' + params.paginationActiveClass, _this.paginationContainer);
- if (!activePagers) return;
- //Reset all Buttons' class to not active
- var pagers = _this.paginationButtons;
- if (pagers.length === 0) return;
- for (var i = 0; i < pagers.length; i++) {
- pagers[i].className = params.paginationElementClass;
- }
- var indexOffset = params.loop ? _this.loopedSlides : 0;
- if (params.paginationAsRange) {
- if (!_this.visibleSlides) _this.calcVisibleSlides(position);
- //Get Visible Indexes
- var visibleIndexes = [];
- var j; // lopp index - avoid JSHint W004 / W038
- for (j = 0; j < _this.visibleSlides.length; j++) {
- var visIndex = _this.slides.indexOf(_this.visibleSlides[j]) - indexOffset;
- if (params.loop && visIndex < 0) {
- visIndex = _this.slides.length - _this.loopedSlides * 2 + visIndex;
- }
- if (params.loop && visIndex >= _this.slides.length - _this.loopedSlides * 2) {
- visIndex = _this.slides.length - _this.loopedSlides * 2 - visIndex;
- visIndex = Math.abs(visIndex);
- }
- visibleIndexes.push(visIndex);
- }
- for (j = 0; j < visibleIndexes.length; j++) {
- if (pagers[visibleIndexes[j]]) pagers[visibleIndexes[j]].className += ' ' + params.paginationVisibleClass;
- }
- if (params.loop) {
- if (pagers[_this.activeLoopIndex] !== undefined) {
- pagers[_this.activeLoopIndex].className += ' ' + params.paginationActiveClass;
- }
- }
- else {
- if (pagers[_this.activeIndex]) pagers[_this.activeIndex].className += ' ' + params.paginationActiveClass;
- }
- }
- else {
- if (params.loop) {
- if (pagers[_this.activeLoopIndex]) pagers[_this.activeLoopIndex].className += ' ' + params.paginationActiveClass + ' ' + params.paginationVisibleClass;
- }
- else {
- if (pagers[_this.activeIndex]) pagers[_this.activeIndex].className += ' ' + params.paginationActiveClass + ' ' + params.paginationVisibleClass;
- }
- }
- };
- _this.calcVisibleSlides = function (position) {
- var visibleSlides = [];
- var _slideLeft = 0, _slideSize = 0, _slideRight = 0;
- if (isH && _this.wrapperLeft > 0) position = position + _this.wrapperLeft;
- if (!isH && _this.wrapperTop > 0) position = position + _this.wrapperTop;
- for (var i = 0; i < _this.slides.length; i++) {
- _slideLeft += _slideSize;
- if (params.slidesPerView === 'auto')
- _slideSize = isH ? _this.h.getWidth(_this.slides[i], true, params.roundLengths) : _this.h.getHeight(_this.slides[i], true, params.roundLengths);
- else _slideSize = slideSize;
- _slideRight = _slideLeft + _slideSize;
- var isVisibile = false;
- if (params.visibilityFullFit) {
- if (_slideLeft >= -position && _slideRight <= -position + containerSize) isVisibile = true;
- if (_slideLeft <= -position && _slideRight >= -position + containerSize) isVisibile = true;
- }
- else {
- if (_slideRight > -position && _slideRight <= ((-position + containerSize))) isVisibile = true;
- if (_slideLeft >= -position && _slideLeft < ((-position + containerSize))) isVisibile = true;
- if (_slideLeft < -position && _slideRight > ((-position + containerSize))) isVisibile = true;
- }
- if (isVisibile) visibleSlides.push(_this.slides[i]);
- }
- if (visibleSlides.length === 0) visibleSlides = [_this.slides[_this.activeIndex]];
- _this.visibleSlides = visibleSlides;
- };
- /*==========================================
- Autoplay
- ============================================*/
- var autoplayTimeoutId, autoplayIntervalId;
- _this.startAutoplay = function () {
- if (_this.support.transitions) {
- if (typeof autoplayTimeoutId !== 'undefined') return false;
- if (!params.autoplay) return;
- _this.callPlugins('onAutoplayStart');
- if (params.onAutoplayStart) _this.fireCallback(params.onAutoplayStart, _this);
- autoplay();
- }
- else {
- if (typeof autoplayIntervalId !== 'undefined') return false;
- if (!params.autoplay) return;
- _this.callPlugins('onAutoplayStart');
- if (params.onAutoplayStart) _this.fireCallback(params.onAutoplayStart, _this);
- autoplayIntervalId = setInterval(function () {
- if (params.loop) {
- _this.fixLoop();
- _this.swipeNext(true, true);
- }
- else if (!_this.swipeNext(true, true)) {
- if (!params.autoplayStopOnLast) _this.swipeTo(0);
- else {
- clearInterval(autoplayIntervalId);
- autoplayIntervalId = undefined;
- }
- }
- }, params.autoplay);
- }
- };
- _this.stopAutoplay = function (internal) {
- if (_this.support.transitions) {
- if (!autoplayTimeoutId) return;
- if (autoplayTimeoutId) clearTimeout(autoplayTimeoutId);
- autoplayTimeoutId = undefined;
- if (internal && !params.autoplayDisableOnInteraction) {
- _this.wrapperTransitionEnd(function () {
- autoplay();
- });
- }
- _this.callPlugins('onAutoplayStop');
- if (params.onAutoplayStop) _this.fireCallback(params.onAutoplayStop, _this);
- }
- else {
- if (autoplayIntervalId) clearInterval(autoplayIntervalId);
- autoplayIntervalId = undefined;
- _this.callPlugins('onAutoplayStop');
- if (params.onAutoplayStop) _this.fireCallback(params.onAutoplayStop, _this);
- }
- };
- function autoplay() {
- autoplayTimeoutId = setTimeout(function () {
- if (params.loop) {
- _this.fixLoop();
- _this.swipeNext(true, true);
- }
- else if (!_this.swipeNext(true, true)) {
- if (!params.autoplayStopOnLast) _this.swipeTo(0);
- else {
- clearTimeout(autoplayTimeoutId);
- autoplayTimeoutId = undefined;
- }
- }
- _this.wrapperTransitionEnd(function () {
- if (typeof autoplayTimeoutId !== 'undefined') autoplay();
- });
- }, params.autoplay);
- }
- /*==================================================
- Loop
- ====================================================*/
- _this.loopCreated = false;
- _this.removeLoopedSlides = function () {
- if (_this.loopCreated) {
- for (var i = 0; i < _this.slides.length; i++) {
- if (_this.slides[i].getData('looped') === true) _this.wrapper.removeChild(_this.slides[i]);
- }
- }
- };
- _this.createLoop = function () {
- if (_this.slides.length === 0) return;
- if (params.slidesPerView === 'auto') {
- _this.loopedSlides = params.loopedSlides || 1;
- }
- else {
- _this.loopedSlides = params.slidesPerView + params.loopAdditionalSlides;
- }
- if (_this.loopedSlides > _this.slides.length) {
- _this.loopedSlides = _this.slides.length;
- }
- var slideFirstHTML = '',
- slideLastHTML = '',
- i;
- var slidesSetFullHTML = '';
- /**
- loopedSlides is too large if loopAdditionalSlides are set.
- Need to divide the slides by maximum number of slides existing.
- @author Tomaz Lovrec <tomaz.lovrec@blanc-noir.at>
- */
- var numSlides = _this.slides.length;
- var fullSlideSets = Math.floor(_this.loopedSlides / numSlides);
- var remainderSlides = _this.loopedSlides % numSlides;
- // assemble full sets of slides
- for (i = 0; i < (fullSlideSets * numSlides); i++) {
- var j = i;
- if (i >= numSlides) {
- var over = Math.floor(i / numSlides);
- j = i - (numSlides * over);
- }
- slidesSetFullHTML += _this.slides[j].outerHTML;
- }
- // assemble remainder slides
- // assemble remainder appended to existing slides
- for (i = 0; i < remainderSlides;i++) {
- slideLastHTML += addClassToHtmlString(params.slideDuplicateClass, _this.slides[i].outerHTML);
- }
- // assemble slides that get preppended to existing slides
- for (i = numSlides - remainderSlides; i < numSlides;i++) {
- slideFirstHTML += addClassToHtmlString(params.slideDuplicateClass, _this.slides[i].outerHTML);
- }
- // assemble all slides
- var slides = slideFirstHTML + slidesSetFullHTML + wrapper.innerHTML + slidesSetFullHTML + slideLastHTML;
- // set the slides
- wrapper.innerHTML = slides;
- _this.loopCreated = true;
- _this.calcSlides();
- //Update Looped Slides with special class
- for (i = 0; i < _this.slides.length; i++) {
- if (i < _this.loopedSlides || i >= _this.slides.length - _this.loopedSlides) _this.slides[i].setData('looped', true);
- }
- _this.callPlugins('onCreateLoop');
- };
- _this.fixLoop = function () {
- var newIndex;
- //Fix For Negative Oversliding
- if (_this.activeIndex < _this.loopedSlides) {
- newIndex = _this.slides.length - _this.loopedSlides * 3 + _this.activeIndex;
- _this.swipeTo(newIndex, 0, false);
- }
- //Fix For Positive Oversliding
- else if ((params.slidesPerView === 'auto' && _this.activeIndex >= _this.loopedSlides * 2) || (_this.activeIndex > _this.slides.length - params.slidesPerView * 2)) {
- newIndex = -_this.slides.length + _this.activeIndex + _this.loopedSlides;
- _this.swipeTo(newIndex, 0, false);
- }
- };
- /*==================================================
- Slides Loader
- ====================================================*/
- _this.loadSlides = function () {
- var slidesHTML = '';
- _this.activeLoaderIndex = 0;
- var slides = params.loader.slides;
- var slidesToLoad = params.loader.loadAllSlides ? slides.length : params.slidesPerView * (1 + params.loader.surroundGroups);
- for (var i = 0; i < slidesToLoad; i++) {
- if (params.loader.slidesHTMLType === 'outer') slidesHTML += slides[i];
- else {
- slidesHTML += '<' + params.slideElement + ' class="' + params.slideClass + '" data-swiperindex="' + i + '">' + slides[i] + '</' + params.slideElement + '>';
- }
- }
- _this.wrapper.innerHTML = slidesHTML;
- _this.calcSlides(true);
- //Add permanent transitionEnd callback
- if (!params.loader.loadAllSlides) {
- _this.wrapperTransitionEnd(_this.reloadSlides, true);
- }
- };
- _this.reloadSlides = function () {
- var slides = params.loader.slides;
- var newActiveIndex = parseInt(_this.activeSlide().data('swiperindex'), 10);
- if (newActiveIndex < 0 || newActiveIndex > slides.length - 1) return; //<-- Exit
- _this.activeLoaderIndex = newActiveIndex;
- var firstIndex = Math.max(0, newActiveIndex - params.slidesPerView * params.loader.surroundGroups);
- var lastIndex = Math.min(newActiveIndex + params.slidesPerView * (1 + params.loader.surroundGroups) - 1, slides.length - 1);
- //Update Transforms
- if (newActiveIndex > 0) {
- var newTransform = -slideSize * (newActiveIndex - firstIndex);
- _this.setWrapperTranslate(newTransform);
- _this.setWrapperTransition(0);
- }
- var i; // loop index
- //New Slides
- if (params.loader.logic === 'reload') {
- _this.wrapper.innerHTML = '';
- var slidesHTML = '';
- for (i = firstIndex; i <= lastIndex; i++) {
- slidesHTML += params.loader.slidesHTMLType === 'outer' ? slides[i] : '<' + params.slideElement + ' class="' + params.slideClass + '" data-swiperindex="' + i + '">' + slides[i] + '</' + params.slideElement + '>';
- }
- _this.wrapper.innerHTML = slidesHTML;
- }
- else {
- var minExistIndex = 1000;
- var maxExistIndex = 0;
- for (i = 0; i < _this.slides.length; i++) {
- var index = _this.slides[i].data('swiperindex');
- if (index < firstIndex || index > lastIndex) {
- _this.wrapper.removeChild(_this.slides[i]);
- }
- else {
- minExistIndex = Math.min(index, minExistIndex);
- maxExistIndex = Math.max(index, maxExistIndex);
- }
- }
- for (i = firstIndex; i <= lastIndex; i++) {
- var newSlide;
- if (i < minExistIndex) {
- newSlide = document.createElement(params.slideElement);
- newSlide.className = params.slideClass;
- newSlide.setAttribute('data-swiperindex', i);
- newSlide.innerHTML = slides[i];
- _this.wrapper.insertBefore(newSlide, _this.wrapper.firstChild);
- }
- if (i > maxExistIndex) {
- newSlide = document.createElement(params.slideElement);
- newSlide.className = params.slideClass;
- newSlide.setAttribute('data-swiperindex', i);
- newSlide.innerHTML = slides[i];
- _this.wrapper.appendChild(newSlide);
- }
- }
- }
- //reInit
- _this.reInit(true);
- };
- /*==================================================
- Make Swiper
- ====================================================*/
- function makeSwiper() {
- _this.calcSlides();
- if (params.loader.slides.length > 0 && _this.slides.length === 0) {
- _this.loadSlides();
- }
- if (params.loop) {
- _this.createLoop();
- }
- _this.init();
- initEvents();
- if (params.pagination) {
- _this.createPagination(true);
- }
- if (params.loop || params.initialSlide > 0) {
- _this.swipeTo(params.initialSlide, 0, false);
- }
- else {
- _this.updateActiveSlide(0);
- }
- if (params.autoplay) {
- _this.startAutoplay();
- }
- /**
- * Set center slide index.
- *
- * @author Tomaz Lovrec <tomaz.lovrec@gmail.com>
- */
- _this.centerIndex = _this.activeIndex;
- // Callbacks
- if (params.onSwiperCreated) _this.fireCallback(params.onSwiperCreated, _this);
- _this.callPlugins('onSwiperCreated');
- }
- makeSwiper();
- };
- Swiper.prototype = {
- plugins : {},
- /*==================================================
- Wrapper Operations
- ====================================================*/
- wrapperTransitionEnd : function (callback, permanent) {
- 'use strict';
- var a = this,
- el = a.wrapper,
- events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'],
- i;
- function fireCallBack(e) {
- if (e.target !== el) return;
- callback(a);
- if (a.params.queueEndCallbacks) a._queueEndCallbacks = false;
- if (!permanent) {
- for (i = 0; i < events.length; i++) {
- a.h.removeEventListener(el, events[i], fireCallBack);
- }
- }
- }
- if (callback) {
- for (i = 0; i < events.length; i++) {
- a.h.addEventListener(el, events[i], fireCallBack);
- }
- }
- },
- getWrapperTranslate : function (axis) {
- 'use strict';
- var el = this.wrapper,
- matrix, curTransform, curStyle, transformMatrix;
- // automatic axis detection
- if (typeof axis === 'undefined') {
- axis = this.params.mode === 'horizontal' ? 'x' : 'y';
- }
- if (this.support.transforms && this.params.useCSS3Transforms) {
- curStyle = window.getComputedStyle(el, null);
- if (window.WebKitCSSMatrix) {
- // Some old versions of Webkit choke when 'none' is passed; pass
- // empty string instead in this case
- transformMatrix = new WebKitCSSMatrix(curStyle.webkitTransform === 'none' ? '' : curStyle.webkitTransform);
- }
- else {
- transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
- matrix = transformMatrix.toString().split(',');
- }
- if (axis === 'x') {
- //Latest Chrome and webkits Fix
- if (window.WebKitCSSMatrix)
- curTransform = transformMatrix.m41;
- //Crazy IE10 Matrix
- else if (matrix.length === 16)
- curTransform = parseFloat(matrix[12]);
- //Normal Browsers
- else
- curTransform = parseFloat(matrix[4]);
- }
- if (axis === 'y') {
- //Latest Chrome and webkits Fix
- if (window.WebKitCSSMatrix)
- curTransform = transformMatrix.m42;
- //Crazy IE10 Matrix
- else if (matrix.length === 16)
- curTransform = parseFloat(matrix[13]);
- //Normal Browsers
- else
- curTransform = parseFloat(matrix[5]);
- }
- }
- else {
- if (axis === 'x') curTransform = parseFloat(el.style.left, 10) || 0;
- if (axis === 'y') curTransform = parseFloat(el.style.top, 10) || 0;
- }
- return curTransform || 0;
- },
- setWrapperTranslate : function (x, y, z) {
- 'use strict';
- var es = this.wrapper.style,
- coords = {x: 0, y: 0, z: 0},
- translate;
- // passed all coordinates
- if (arguments.length === 3) {
- coords.x = x;
- coords.y = y;
- coords.z = z;
- }
- // passed one coordinate and optional axis
- else {
- if (typeof y === 'undefined') {
- y = this.params.mode === 'horizontal' ? 'x' : 'y';
- }
- coords[y] = x;
- }
- if (this.support.transforms && this.params.useCSS3Transforms) {
- translate = this.support.transforms3d ? 'translate3d(' + coords.x + 'px, ' + coords.y + 'px, ' + coords.z + 'px)' : 'translate(' + coords.x + 'px, ' + coords.y + 'px)';
- es.webkitTransform = es.MsTransform = es.msTransform = es.MozTransform = es.OTransform = es.transform = translate;
- }
- else {
- es.left = coords.x + 'px';
- es.top = coords.y + 'px';
- }
- this.callPlugins('onSetWrapperTransform', coords);
- if (this.params.onSetWrapperTransform) this.fireCallback(this.params.onSetWrapperTransform, this, coords);
- },
- setWrapperTransition : function (duration) {
- 'use strict';
- var es = this.wrapper.style;
- es.webkitTransitionDuration = es.MsTransitionDuration = es.msTransitionDuration = es.MozTransitionDuration = es.OTransitionDuration = es.transitionDuration = (duration / 1000) + 's';
- this.callPlugins('onSetWrapperTransition', {duration: duration});
- if (this.params.onSetWrapperTransition) this.fireCallback(this.params.onSetWrapperTransition, this, duration);
- },
- /*==================================================
- Helpers
- ====================================================*/
- h : {
- getWidth: function (el, outer, round) {
- 'use strict';
- var width = window.getComputedStyle(el, null).getPropertyValue('width');
- var returnWidth = parseFloat(width);
- //IE Fixes
- if (isNaN(returnWidth) || width.indexOf('%') > 0 || returnWidth < 0) {
- returnWidth = el.offsetWidth - parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-left')) - parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-right'));
- }
- if (outer) returnWidth += parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-left')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-right'));
- if (round) return Math.ceil(returnWidth);
- else return returnWidth;
- },
- getHeight: function (el, outer, round) {
- 'use strict';
- if (outer) return el.offsetHeight;
- var height = window.getComputedStyle(el, null).getPropertyValue('height');
- var returnHeight = parseFloat(height);
- //IE Fixes
- if (isNaN(returnHeight) || height.indexOf('%') > 0 || returnHeight < 0) {
- returnHeight = el.offsetHeight - parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-top')) - parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-bottom'));
- }
- if (outer) returnHeight += parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-bottom'));
- if (round) return Math.ceil(returnHeight);
- else return returnHeight;
- },
- getOffset: function (el) {
- 'use strict';
- var box = el.getBoundingClientRect();
- var body = document.body;
- var clientTop = el.clientTop || body.clientTop || 0;
- var clientLeft = el.clientLeft || body.clientLeft || 0;
- var scrollTop = window.pageYOffset || el.scrollTop;
- var scrollLeft = window.pageXOffset || el.scrollLeft;
- if (document.documentElement && !window.pageYOffset) {
- //IE7-8
- scrollTop = document.documentElement.scrollTop;
- scrollLeft = document.documentElement.scrollLeft;
- }
- return {
- top: box.top + scrollTop - clientTop,
- left: box.left + scrollLeft - clientLeft
- };
- },
- windowWidth : function () {
- 'use strict';
- if (window.innerWidth) return window.innerWidth;
- else if (document.documentElement && document.documentElement.clientWidth) return document.documentElement.clientWidth;
- },
- windowHeight : function () {
- 'use strict';
- if (window.innerHeight) return window.innerHeight;
- else if (document.documentElement && document.documentElement.clientHeight) return document.documentElement.clientHeight;
- },
- windowScroll : function () {
- 'use strict';
- if (typeof pageYOffset !== 'undefined') {
- return {
- left: window.pageXOffset,
- top: window.pageYOffset
- };
- }
- else if (document.documentElement) {
- return {
- left: document.documentElement.scrollLeft,
- top: document.documentElement.scrollTop
- };
- }
- },
- addEventListener : function (el, event, listener, useCapture) {
- 'use strict';
- if (typeof useCapture === 'undefined') {
- useCapture = false;
- }
- if (el.addEventListener) {
- el.addEventListener(event, listener, useCapture);
- }
- else if (el.attachEvent) {
- el.attachEvent('on' + event, listener);
- }
- },
- removeEventListener : function (el, event, listener, useCapture) {
- 'use strict';
- if (typeof useCapture === 'undefined') {
- useCapture = false;
- }
- if (el.removeEventListener) {
- el.removeEventListener(event, listener, useCapture);
- }
- else if (el.detachEvent) {
- el.detachEvent('on' + event, listener);
- }
- }
- },
- setTransform : function (el, transform) {
- 'use strict';
- var es = el.style;
- es.webkitTransform = es.MsTransform = es.msTransform = es.MozTransform = es.OTransform = es.transform = transform;
- },
- setTranslate : function (el, translate) {
- 'use strict';
- var es = el.style;
- var pos = {
- x : translate.x || 0,
- y : translate.y || 0,
- z : translate.z || 0
- };
- var transformString = this.support.transforms3d ? 'translate3d(' + (pos.x) + 'px,' + (pos.y) + 'px,' + (pos.z) + 'px)' : 'translate(' + (pos.x) + 'px,' + (pos.y) + 'px)';
- es.webkitTransform = es.MsTransform = es.msTransform = es.MozTransform = es.OTransform = es.transform = transformString;
- if (!this.support.transforms) {
- es.left = pos.x + 'px';
- es.top = pos.y + 'px';
- }
- },
- setTransition : function (el, duration) {
- 'use strict';
- var es = el.style;
- es.webkitTransitionDuration = es.MsTransitionDuration = es.msTransitionDuration = es.MozTransitionDuration = es.OTransitionDuration = es.transitionDuration = duration + 'ms';
- },
- /*==================================================
- Feature Detection
- ====================================================*/
- support: {
- touch : (window.Modernizr && Modernizr.touch === true) || (function () {
- 'use strict';
- return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch);
- })(),
- transforms3d : (window.Modernizr && Modernizr.csstransforms3d === true) || (function () {
- 'use strict';
- var div = document.createElement('div').style;
- return ('webkitPerspective' in div || 'MozPerspective' in div || 'OPerspective' in div || 'MsPerspective' in div || 'perspective' in div);
- })(),
- transforms : (window.Modernizr && Modernizr.csstransforms === true) || (function () {
- 'use strict';
- var div = document.createElement('div').style;
- return ('transform' in div || 'WebkitTransform' in div || 'MozTransform' in div || 'msTransform' in div || 'MsTransform' in div || 'OTransform' in div);
- })(),
- transitions : (window.Modernizr && Modernizr.csstransitions === true) || (function () {
- 'use strict';
- var div = document.createElement('div').style;
- return ('transition' in div || 'WebkitTransition' in div || 'MozTransition' in div || 'msTransition' in div || 'MsTransition' in div || 'OTransition' in div);
- })(),
- classList : (function () {
- 'use strict';
- var div = document.createElement('div');
- return 'classList' in div;
- })()
- },
- browser : {
- ie8 : (function () {
- 'use strict';
- var rv = -1; // Return value assumes failure.
- if (navigator.appName === 'Microsoft Internet Explorer') {
- var ua = navigator.userAgent;
- var re = new RegExp(/MSIE ([0-9]{1,}[\.0-9]{0,})/);
- if (re.exec(ua) !== null)
- rv = parseFloat(RegExp.$1);
- }
- return rv !== -1 && rv < 9;
- })(),
- ie10 : window.navigator.msPointerEnabled,
- ie11 : window.navigator.pointerEnabled
- }
- };
- /*=========================
- jQuery & Zepto Plugins
- ===========================*/
- if (window.jQuery || window.Zepto) {
- (function ($) {
- 'use strict';
- $.fn.swiper = function (params) {
- var firstInstance;
- this.each(function (i) {
- var that = $(this);
- var s = new Swiper(that[0], params);
- if (!i) firstInstance = s;
- that.data('swiper', s);
- });
- return firstInstance;
- };
- })(window.jQuery || window.Zepto);
- }
- // component
- if (typeof(module) !== 'undefined')
- {
- module.exports = Swiper;
- }
- // requirejs support
- if (typeof define === 'function' && define.amd) {
- define([], function () {
- 'use strict';
- return Swiper;
- });
- }
|