1/* 2 * RoyalSlider 3 * 4 * @version 9.4.8: 5 * 6 * Copyright 2011-2012, Dmitry Semenov 7 * 8 */ 9(function($) { 10 if(!$.rsModules) { 11 $.rsModules = {uid:0}; 12 } 13 14 15 function RoyalSlider(element, options) { 16 var i, 17 self = this, 18 ua = navigator.userAgent.toLowerCase(); 19 20 self.uid = $.rsModules.uid++; 21 self.ns = '.rs' + self.uid; // unique namespace for events 22 // feature detection, some ideas taken from Modernizr 23 var tempStyle = document.createElement('div').style, 24 vendors = ['webkit','Moz','ms','O'], 25 vendor = '', 26 lastTime = 0, 27 tempV; 28 29 for (i = 0; i < vendors.length; i++ ) { 30 tempV = vendors[i]; 31 if (!vendor && (tempV + 'Transform') in tempStyle ) { 32 vendor = tempV; 33 } 34 tempV = tempV.toLowerCase(); 35 36 if(!window.requestAnimationFrame) { 37 window.requestAnimationFrame = window[tempV+'RequestAnimationFrame']; 38 window.cancelAnimationFrame = window[tempV+'CancelAnimationFrame'] 39 || window[tempV+'CancelRequestAnimationFrame']; 40 } 41 } 42 43 // requestAnimationFrame polyfill by Erik Möller 44 // fixes from Paul Irish and Tino Zijdel 45 if (!window.requestAnimationFrame) { 46 window.requestAnimationFrame = function(callback, element) { 47 var currTime = new Date().getTime(), 48 timeToCall = Math.max(0, 16 - (currTime - lastTime)), 49 id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); 50 lastTime = currTime + timeToCall; 51 return id; 52 }; 53 } 54 if (!window.cancelAnimationFrame) 55 window.cancelAnimationFrame = function(id) { clearTimeout(id); }; 56 57 self.isIPAD = ua.match(/(ipad)/); 58 59 60 // browser UA sniffing, sadly still required 61 var uaMatch = function( ua ) { 62 var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || 63 /(webkit)[ \/]([\w.]+)/.exec( ua ) || 64 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || 65 /(msie) ([\w.]+)/.exec( ua ) || 66 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || 67 []; 68 69 return { 70 browser: match[ 1 ] || "", 71 version: match[ 2 ] || "0" 72 }; 73 }; 74 var matched = uaMatch( ua ); 75 var br = {}; 76 if ( matched.browser ) { 77 br[ matched.browser ] = true; 78 br.version = matched.version; 79 } 80 if(br.chrome) { br.webkit = true; }; 81 self._browser = br; 82 self.isAndroid = ua.indexOf("android") > -1; 83 84 85 86 self.slider = $(element); // DOM reference 87 self.ev = $(self); // event object 88 self._doc = $(document); 89 self.st = $.extend({}, $.fn.royalSlider.defaults, options); 90 self._currAnimSpeed = self.st.transitionSpeed; 91 self._minPosOffset = 0; 92 if(self.st.allowCSS3) { 93 if((!br.webkit || self.st.allowCSS3OnWebkit) ) { 94 var bT = vendor + (vendor ? 'T' : 't' ); 95 self._useCSS3Transitions = ( (bT + 'ransform') in tempStyle ) && ( (bT + 'ransition') in tempStyle ); 96 if(self._useCSS3Transitions) { 97 self._use3dTransform = (vendor + (vendor ? 'P' : 'p' ) + 'erspective') in tempStyle; 98 } 99 } 100 } 101 102 vendor = vendor.toLowerCase(); 103 self._vendorPref = '-'+vendor+'-'; 104 105 self._slidesHorizontal = (self.st.slidesOrientation === 'vertical') ? false : true; 106 self._reorderProp = self._slidesHorizontal ? 'left' : 'top'; 107 self._sizeProp = self._slidesHorizontal ? 'width' : 'height'; 108 self._prevNavItemId = -1; 109 self._isMove = (self.st.transitionType === 'fade') ? false : true; 110 if(!self._isMove) { 111 self.st.sliderDrag = false; 112 self._fadeZIndex = 10; 113 } 114 self._opacityCSS = 'z-index:0; display:none; opacity:0;'; 115 116 self._newSlideId = 0; 117 self._sPosition = 0; 118 self._nextSlidePos = 0; 119 120 // init modules 121 $.each($.rsModules, function (helper, opts) { 122 if(helper !== 'uid') 123 opts.call(self); 124 }); 125 126 // parse all slides 127 self.slides = []; 128 self._idCount = 0; 129 var returnVal; 130 var ts = self.st.slides ? $(self.st.slides) : self.slider.children().detach(); 131 132 ts.each(function() { 133 self._parseNode(this, true); 134 }); 135 136 if(self.st.randomizeSlides) { 137 self.slides.sort(function() { return 0.5 - Math.random() }); 138 } 139 self.numSlides = self.slides.length; 140 self._refreshNumPreloadImages(); 141 142 if(!self.st.startSlideId) { 143 self.st.startSlideId = 0; 144 } else if(self.st.startSlideId > self.numSlides - 1) { 145 self.st.startSlideId = self.numSlides - 1; 146 } 147 148 self._newSlideId = self.staticSlideId = self.currSlideId = self._realId = self.st.startSlideId; 149 self.currSlide = self.slides[self.currSlideId]; 150 151 self._accelerationPos = 0; 152 self.msTouch = false;
153 self.slider.addClass( (self._slidesHorizontal ? 'rsHor' : 'rsVer') + (self._isMove ? '' : ' rsFade') ); 154 155 var sliderHTML = '<div class="rsOverflow"><div class="rsContainer">'; 156 self.slidesSpacing = self.st.slidesSpacing; 157 self._slideSize = ( self._slidesHorizontal ? self.slider.width() : self.slider.height() ) + self.st.slidesSpacing; 158 159 self._preload = Boolean(self._numPreloadImages > 0); 160 161 if(self.numSlides <= 1) { 162 self._loop = false; 163 } 164 var loopHelpers = (self._loop && self._isMove) ? ( self.numSlides === 2 ? 1 : 2) : 0; 165 self._loopHelpers = loopHelpers; 166 167 self._maxImages = self.numSlides < 6 ? self.numSlides : 6; 168 self._currBlockIndex = 0; 169 170 171 self._idOffset = 0; 172 self.slidesJQ = []; 173 174 for(i =0; i < self.numSlides; i++) { 175 self.slidesJQ.push( $(createItemHTML(i)) ); 176 } 177 self._sliderOverflow = sliderHTML = $(sliderHTML + '</div></div>'); 178 179 180 var addCursors = function() { 181 if(self.st.sliderDrag) { 182 self._hasDrag = true; 183 if (br.msie || br.opera) { 184 self._grabCursor = self._grabbingCursor = "move"; 185 } else if(br.mozilla) { 186 self._grabCursor = "-moz-grab"; 187 self._grabbingCursor = "-moz-grabbing"; 188 } else if(br.webkit && (navigator.platform.indexOf("Mac")!=-1)) { 189 self._grabCursor = "-webkit-grab"; 190 self._grabbingCursor = "-webkit-grabbing"; 191 } 192 self._setGrabCursor(); 193 } 194 }; 195 var rsNS = self.ns; 196 var addEventNames = function(pref, down, move, up, cancel) { 197 self._downEvent = pref + down + rsNS; 198 self._moveEvent = pref + move + rsNS; 199 self._upEvent = pref + up + rsNS; 200 if(cancel) 201 self._cancelEvent = pref + cancel + rsNS; 202 }; 203 204 205 // ie10 206 self.msEnabled = window.navigator.msPointerEnabled; 207 208 if(self.msEnabled) { 209 self.msTouch = Boolean(window.navigator.msMaxTouchPoints > 1); 210 self.hasTouch = false; 211 self._lastItemFriction = 0.2; 212 213 addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel'); 214 } else { 215 addEventNames('mouse', 'down', 'move', 'up', 'up'); 216 217 if('ontouchstart' in window || 'createTouch' in document) { 218 self.hasTouch = true; 219 self._downEvent += ' touchstart' + rsNS; 220 self._moveEvent += ' touchmove' + rsNS; 221 self._upEvent += ' touchend' + rsNS; 222 self._cancelEvent += ' touchcancel' + rsNS; 223 self._lastItemFriction = 0.5; 224 if(self.st.sliderTouch) { 225 self._hasDrag = true; 226 } 227 } else { 228 self.hasTouch = false; 229 self._lastItemFriction = 0.2; 230 } 231 } 232 addCursors(); 233 234 self.slider.html(sliderHTML); 235 236 237 self._controlsContainer = self.st.controlsInside ? self._sliderOverflow : self.slider; 238 239 self._slidesContainer = self._sliderOverflow.children('.rsContainer'); 240 if(self.msEnabled) { 241 self._slidesContainer.css('-ms-touch-action', self._slidesHorizontal ? 'pan-y' : 'pan-x'); 242 } 243 self._preloader = $('<div class="rsPreloader"><svg class="fa-spinner" viewBox="0 0 48 48" ><path d="M23.98,0.04c-13.055,0-23.673,10.434-23.973,23.417C0.284,12.128,8.898,3.038,19.484,3.038c10.76,0,19.484,9.395,19.484,20.982c0,2.483,2.013,4.497,4.496,4.497c2.482,0,4.496-2.014,4.496-4.497C47.96,10.776,37.224,0.04,23.98,0.04z M23.98,48c13.055,0,23.673-10.434,23.972-23.417c-0.276,11.328-8.89,20.42-19.476,20.42 c-10.76,0-19.484-9.396-19.484-20.983c0-2.482-2.014-4.496-4.497-4.496C2.014,19.524,0,21.537,0,24.02C0,37.264,10.736,48,23.98,48z"/></svg></div>'); 244 var slides = self._slidesContainer.children('.rsSlide'); 245 246 self._currHolder = self.slidesJQ[self.currSlideId] 247 self._selectedSlideHolder = 0; 248 249 function createItemHTML(i, className) { 250 return '<div style="'+ (self._isMove ? '' : (i !== self.currSlideId ? self._opacityCSS : 'z-index:0;') ) +'" class="rsSlide '+ (className || '')+'"></div>'; 251 } 252 253 if(self._useCSS3Transitions) { 254 255 // some constants for CSS3 256 self._TP = 'transition-property'; 257 self._TD = 'transition-duration'; 258 self._TTF = 'transition-timing-function'; 259 260 self._yProp = self._xProp = self._vendorPref +'transform'; 261 262 if(self._use3dTransform) { 263 if(br.webkit && !br.chrome) { 264 self.slider.addClass('rsWebkit3d'); 265 } 266 267 self._tPref1 = 'translate3d('; 268 self._tPref2 = 'px, '; 269 self._tPref3 = 'px, 0px)'; 270 } else { 271 self._tPref1 = 'translate('; 272 self._tPref2 = 'px, '; 273 self._tPref3 = 'px)'; 274 } 275 if(!self._isMove) { 276 var animObj = {}; 277 animObj[(self._vendorPref + self._TP)] = 'opacity'; 278 animObj[(self._vendorPref + self._TD)] = self.st.transitionSpeed + 'ms'; 279 animObj[(self._vendorPref + self._TTF)] = self.st.css3easeInOut; 280 slides.css(animObj); 281 } else { 282 self._slidesContainer[(self._vendorPref + self._TP)] = (self._vendorPref + 'transform'); 283 } 284 285 286 } else { 287 self._xProp = 'left'; 288 self._yProp = 'top'; 289 } 290 291 292 293 // !Responsiveness (on window resize) 294 295 if (!self.st.disableResponsiveness) { 296 var resizeTimer; 297 $(window).on('resize'+self.ns, function() { 298 if(resizeTimer) { 299 clearTimeout(resizeTimer); 300 } 301 resizeTimer = setTimeout(function() { self.updateSliderSize(); }, 50); 302 }); 303 } 304 305 self.ev.trigger('rsAfterPropsSetup'); // navigation (bullets, thumbs...) are created here 306 307 self.updateSliderSize(); 308 309 310 // keyboard nav 311 if(self.st.keyboardNavEnabled) { 312 self._bindKeyboardNav(); 313 } 314 315 if(self.st.arrowsNavHideOnTouch && (self.hasTouch || self.msTouch) ) { 316 self.st.arrowsNav = false;
317 } 318 319 //Direction navigation (arrows) 320 if(self.st.arrowsNav) { 321 var rArr = 'rsArrow', 322 container = self._controlsContainer; 323 $('<div class="'+rArr+' '+rArr+'Left"><div class="'+rArr+'Icn"></div></div><div class="'+rArr+' '+rArr+'Right"><div class="'+rArr+'Icn"></div></div>').appendTo(container); 324 325 self._arrowLeft = container.children('.'+rArr+'Left').click(function(e) { 326 e.preventDefault(); 327 self.prev(); 328 }); 329 self._arrowRight = container.children('.'+rArr+'Right').click(function(e) { 330 e.preventDefault(); 331 self.next(); 332 }); 333 334 if(self.st.arrowsNavAutoHide && !self.hasTouch) { 335 self._arrowLeft.addClass('rsHidden'); 336 self._arrowRight.addClass('rsHidden'); 337 338 var hoverEl = container; 339 hoverEl.one("mousemove.arrowshover",function() { 340 self._arrowLeft.removeClass('rsHidden'); 341 self._arrowRight.removeClass('rsHidden'); 342 }); 343 344 345 hoverEl.hover( 346 function() { 347 if(!self._arrowsAutoHideLocked) { 348 self._arrowLeft.removeClass('rsHidden'); 349 self._arrowRight.removeClass('rsHidden'); 350 } 351 }, 352 function() { 353 if(!self._arrowsAutoHideLocked) { 354 self._arrowLeft.addClass('rsHidden'); 355 self._arrowRight.addClass('rsHidden'); 356 } 357 } 358 ); 359 } 360 self.ev.on('rsOnUpdateNav', function() { 361 self._updateArrowsNav(); 362 }); 363 self._updateArrowsNav(); 364 } 365 366 367 368 if( self._hasDrag ) { 369 self._slidesContainer.on(self._downEvent, function(e) { self._onDragStart(e); }); 370 } else { 371 self.dragSuccess = false; 372 } 373 var videoClasses = ['rsPlayBtnIcon', 'rsPlayBtn', 'rsCloseVideoBtn', 'rsCloseVideoIcn']; 374 self._slidesContainer.click(function(e) { 375 if(!self.dragSuccess) { 376 var t = $(e.target); 377 var tClass = t.attr('class'); 378 if( $.inArray(tClass, videoClasses) !== -1) { 379 if( self.toggleVideo() ) { 380 return false; 381 } 382 } 383 if(self.st.navigateByClick && !self._blockActions) { 384 if($(e.target).closest('.rsNoDrag', self._currHolder).length) { 385 return true; 386 } 387 self._mouseNext(e); 388 } 389 self.ev.trigger('rsSlideClick'); 390 } 391 }).on('click.rs', 'a', function(e) { 392 if(self.dragSuccess) { 393 return false; 394 } else { 395 self._blockActions = true; 396 //e.stopPropagation(); 397 //e.stopImmediatePropagation(); 398 setTimeout(function() { 399 self._blockActions = false; 400 }, 3); 401 } 402 }); 403 self.ev.trigger('rsAfterInit'); 404 } /* RoyalSlider Constructor End */ 405 406 /** 407 * 408 * RoyalSlider Core Prototype 409 * 410 */ 411 RoyalSlider.prototype = { 412 constructor: RoyalSlider, 413 _mouseNext: function(e) { 414 var self = this, 415 relativePos = e[self._slidesHorizontal ? 'pageX' : 'pageY'] - self._sliderOffset; 416 417 if(relativePos >= self._nextSlidePos) { 418 self.next(); 419 } else if(relativePos < 0) { 420 self.prev(); 421 } 422 }, 423 _refreshNumPreloadImages: function() { 424 var self = this, 425 n; 426 n = self.st.numImagesToPreload; 427 self._loop = self.st.loop; 428 429 if(self._loop) { 430 if(self.numSlides === 2) { 431 self._loop = false; 432 self.st.loopRewind = true; 433 } else if(self.numSlides < 2) { 434 self.st.loopRewind = self._loop = false; 435 } 436 437 } 438 if(self._loop && n > 0) { 439 if(self.numSlides <= 4) { 440 n = 1; 441 } else { 442 if(self.st.numImagesToPreload > (self.numSlides - 1) / 2 ) { 443 n = Math.floor( (self.numSlides - 1) / 2 ); 444 } 445 } 446 } 447 self._numPreloadImages = n; 448 }, 449 _parseNode: function(content, pushToSlides) { 450 var self = this, 451 hasImg, 452 isRoot, 453 hasCover, 454 obj = {}, 455 tempEl, 456 first = true; 457 content = $(content); 458 self._currContent = content; 459 self.ev.trigger('rsBeforeParseNode', [content, obj]); 460 if(obj.stopParsing) { 461 return; 462 } 463 content = self._currContent; 464 obj.id = self._idCount; 465 obj.contentAdded = false; 466 self._idCount++; 467 obj.images = []; 468 obj.isBig = false; 469 470 if(!obj.hasCover) { 471 if(content.hasClass('rsImg')) { 472 tempEl = content; 473 hasImg = true; 474 } else { 475 tempEl = content.find('.rsImg'); 476 if(tempEl.length) { 477 hasImg = true; 478 } 479 } 480 481 if(hasImg) { 482 obj.bigImage = tempEl.eq(0).attr('data-rsBigImg'); 483 tempEl.each(function() { 484 var item = $(this); 485 if(item.is('a')) { 486 parseEl(item, 'href'); 487 } else if(item.is('img')) { 488 parseEl(item, 'src'); 489 } else { 490 parseEl(item); 491 } 492 }); 493 } else if(content.is('img')) { 494 content.addClass('rsImg rsMainSlideImage'); 495 parseEl(content, 'src'); 496 } 497 } 498 tempEl = content.find('.rsCaption'); 499 if(tempEl.length) { 500 obj.caption = tempEl.remove(); 501 } 502 obj.content = content; 503 504 self.ev.trigger('rsAfterParseNode', [content, obj]); 505 function parseEl(el, s) { 506 if(s) { 507 obj.images.push( el.attr(s) ); 508 } else { 509 obj.images.push( el.text() ); 510 } 511 if(first) { 512 first = false;
513 obj.caption = (s === 'src') ? el.attr('alt') : el.contents(); 514 obj.image = obj.images[0]; 515 obj.videoURL = el.attr('data-rsVideo'); 516 517 518 var wAtt = el.attr('data-rsw'), 519 hAtt = el.attr('data-rsh'); 520 if (typeof wAtt !== 'undefined' && wAtt !== false && typeof hAtt !== 'undefined' && hAtt !== false ) { 521 obj.iW = parseInt(wAtt); 522 obj.iH = parseInt(hAtt); 523 } else if(self.st.imgWidth && self.st.imgHeight ) { 524 obj.iW = self.st.imgWidth; 525 obj.iH = self.st.imgHeight; 526 } 527 } 528 } 529 if(pushToSlides) { 530 self.slides.push(obj); 531 } 532 if(obj.images.length === 0) { 533 obj.isLoaded = true; 534 obj.isRendered = false; 535 obj.isLoading = false; 536 obj.images = null; 537 } 538 return obj; 539 }, 540 _bindKeyboardNav: function() { 541 var self = this, 542 interval, 543 keyCode, 544 onKeyboardAction = function (keyCode) { 545 if (keyCode === 37) { 546 self.prev(); 547 } else if (keyCode === 39) { 548 self.next(); 549 } 550 }; 551 552 self._doc.on('keydown' + self.ns, function(e) { 553 if(!self._isDragging) { 554 keyCode = e.keyCode; 555 if(keyCode === 37 || keyCode === 39) { 556 if(!interval) { 557 onKeyboardAction(keyCode); 558 interval = setInterval(function() { 559 onKeyboardAction(keyCode); 560 }, 700); 561 } 562 } 563 } 564 }).on('keyup' + self.ns, function(e) { 565 if(interval) { 566 clearInterval(interval); 567 interval = null; 568 } 569 }); 570 571 572 573 }, 574 575 576 577 578 goTo: function(id, notUserAction) { 579 var self = this; 580 if(id !== self.currSlideId) { 581 self._moveTo(id,self.st.transitionSpeed, true, !notUserAction); 582 } 583 }, 584 destroy: function(remove) { 585 var self = this; 586 self.ev.trigger('rsBeforeDestroy'); 587 self._doc.off('keydown' +self.ns+ ' keyup' + self.ns + ' ' + self._moveEvent +' '+ self._upEvent ); 588 self._slidesContainer.off(self._downEvent + ' click'); 589 self.slider.data('royalSlider', null); 590 $.removeData(self.slider, 'royalSlider'); 591 $(window).off('resize' + self.ns); 592 if(remove) { 593 self.slider.remove(); 594 } 595 self.slides = null; 596 self.slider = null; 597 self.ev = null; 598 }, 599 _updateBlocksContent: function(beforeTransition, getId) { 600 var self = this, 601 item, 602 i, 603 n, 604 pref, 605 group, 606 groupId, 607 slideCode, 608 loop = self._loop, 609 numSlides = self.numSlides; 610 if(!isNaN(getId) ) { 611 return getCorrectLoopedId(getId); 612 } 613 614 615 var id = self.currSlideId; 616 var groupOffset; 617 618 var itemsOnSide = beforeTransition ? (Math.abs(self._prevSlideId - self.currSlideId) >= self.numSlides - 1 ? 0 : 1) : self._numPreloadImages; 619 var itemsToCheck = Math.min(2, itemsOnSide); 620 621 var updateAfter = false; 622 var updateBefore = false; 623 var tempId; 624 625 626 627 for(i = id; i < id + 1 + itemsToCheck; i++) { 628 tempId = getCorrectLoopedId(i); 629 item = self.slides[tempId]; 630 if(item && (!item.isAdded || !item.positionSet) ) { 631 updateAfter = true; 632 break; 633 } 634 } 635 for(i = id - 1; i > id - 1 - itemsToCheck; i--) { 636 tempId = getCorrectLoopedId(i); 637 item = self.slides[tempId]; 638 if(item && (!item.isAdded || !item.positionSet) ) { 639 updateBefore = true; 640 break; 641 } 642 } 643 if(updateAfter) { 644 for(i = id; i < id + itemsOnSide + 1; i++) { 645 tempId = getCorrectLoopedId(i); 646 groupOffset = Math.floor( (self._realId - (id - i)) / self.numSlides) * self.numSlides; 647 item = self.slides[tempId]; 648 if(item) { 649 updateItem(item, tempId); 650 } 651 } 652 } 653 if(updateBefore) { 654 for(i = id - 1; i > id - 1 - itemsOnSide; i--) { 655 tempId = getCorrectLoopedId(i); 656 groupOffset = Math.floor( (self._realId - (id - i) ) / numSlides) * numSlides; 657 item = self.slides[tempId]; 658 if(item) { 659 updateItem(item, tempId); 660 } 661 } 662 } 663 if(!beforeTransition) { 664 var start = id; 665 var distance = itemsOnSide; 666 var min = getCorrectLoopedId(id - itemsOnSide); 667 var max = getCorrectLoopedId(id + itemsOnSide); 668 669 var nmin = min > max ? 0 : min; 670 671 for (i = 0; i < numSlides; i++) { 672 if(min > max) { 673 if(i > min - 1) { 674 continue; 675 } 676 } 677 if(i < nmin || i > max) { 678 item = self.slides[i]; 679 if(item && item.holder) { 680 681 //slideCode = self.slidesJQ[i]; 682 //if(typeof slideCode !== "string") { 683 item.holder.detach(); 684 item.isAdded = false;
685 //} 686 } 687 } 688 } 689 } 690 691 692 693 694 695 function updateItem(item , i, slideCode) { 696 697 if(!item.isAdded) { 698 if(!slideCode) 699 slideCode = self.slidesJQ[i]; 700 701 if(!item.holder) { 702 slideCode = self.slidesJQ[i] = $(slideCode); 703 item.holder = slideCode; 704 } else { 705 slideCode = item.holder; 706 } 707 708 item.appendOnLoaded = false; 709 710 711 updatePos(i, item, slideCode); 712 addContent(i, item); 713 self._addBlockToContainer(item, slideCode, beforeTransition); 714 item.isAdded = true; 715 appended = true; 716 } else { 717 addContent(i, item); 718 updatePos(i, item); 719 } 720 } 721 function addContent(i, item) { 722 if(!item.contentAdded) { 723 self.setItemHtml(item, beforeTransition); 724 if(!beforeTransition) { 725 item.contentAdded = true; 726 } 727 728 } 729 } 730 function updatePos(i, item, slideCode) { 731 if(self._isMove) { 732 if(!slideCode) { 733 slideCode = self.slidesJQ[i]; 734 } 735 736 slideCode.css(self._reorderProp, (i + self._idOffset + groupOffset) * self._slideSize); 737 } 738 } 739 function getCorrectLoopedId(index) { 740 var changed = false; 741 if(loop) { 742 if(index > numSlides - 1) { 743 return getCorrectLoopedId(index - numSlides); 744 } else if(index < 0) { 745 return getCorrectLoopedId(numSlides + index); 746 } 747 } 748 return index; 749 } 750 751 }, 752 753 /** 754 * Sets or loads HTML for specified slide 755 * @param {Object} currSlideObject holds data about curr slide (read about rsAfterParseNode for more info) 756 * @param {Boolean} beforeTransition determines if setItemHTML method is called before or after transition 757 */ 758 setItemHtml: function(currSlideObject, beforeTransition) { 759 760 var self = this; 761 762 if(currSlideObject.isLoaded) { 763 appendContent(); 764 return; 765 } else { 766 if(beforeTransition) { 767 waitForTransition(); 768 } else { 769 parseDataAndLoad(); 770 } 771 } 772 773 function parseDataAndLoad() { 774 if(!currSlideObject.images) { 775 currSlideObject.isRendered = true; 776 currSlideObject.isLoaded = true; 777 currSlideObject.isLoading = false; 778 appendContent(true); 779 return; 780 } 781 if(currSlideObject.isLoading) { 782 return; 783 } 784 785 var el, 786 isRoot; 787 if(currSlideObject.content.hasClass('rsImg') ) { 788 el = currSlideObject.content; 789 isRoot = true; 790 } else { 791 el = currSlideObject.content.find('.rsImg:not(img)') 792 } 793 if(el && !el.is('img')) { 794 el.each(function() { 795 var item = $(this), 796 newEl = '<img class="rsImg" src="'+ ( item.is('a') ? item.attr('href') : item.text() ) +'" />'; 797 798 if(!isRoot) { 799 item.replaceWith( newEl ); 800 } else { 801 currSlideObject.content = $(newEl); 802 } 803 }); 804 } 805 806 el = isRoot ? currSlideObject.content : currSlideObject.content.find('img.rsImg'); 807 setPreloader(); 808 809 el.eq(0).addClass('rsMainSlideImage'); 810 if(currSlideObject.iW && currSlideObject.iH) { 811 if(!currSlideObject.isLoaded) { 812 self._resizeImage( currSlideObject ); 813 } 814 appendContent(); 815 } 816 817 currSlideObject.isLoading = true; 818 var newEl; 819 820 if(currSlideObject.isBig) { 821 $('<img />').on('load.rs error.rs', function(e){ 822 onLoad( [this], true ); 823 }).attr('src', currSlideObject.image); 824 } else { 825 currSlideObject.loaded = []; 826 currSlideObject.imgLoaders = []; 827 for(var i = 0; i < currSlideObject.images.length; i++) { 828 var image = $('<img />'); 829 830 currSlideObject.imgLoaders.push( this ); 831 image.on('load.rs error.rs', function(e){ 832 currSlideObject.loaded.push( this ); 833 if(currSlideObject.loaded.length === currSlideObject.imgLoaders.length) { 834 onLoad( currSlideObject.loaded, false ); 835 } 836 }).attr('src', currSlideObject.images[i]); 837 } 838 } 839 840 // old images loading 841 // el.imagesLoaded( function( $images, $proper, $broken ) { 842 // if($broken.length) { 843 // currSlideObject.isLoading = false; 844 // var img = $images[0], 845 // src = img.src; 846 // if(src && src.indexOf(currSlideObject.image) === -1 ) { 847 // return; 848 // } 849 // if(!currSlideObject.tryAgainCount) { currSlideObject.tryAgainCount = 0; } 850 // if(currSlideObject.tryAgainCount < 3) { 851 // currSlideObject.tryAgainCount++; 852 // self.setItemHtml(currSlideObject, beforeTransition); 853 // return; 854 // } 855 // } 856 // onLoad($images); 857 // }); 858 } 859 function onLoad($images, isBig) { 860 if($images.length) { 861 var img = $images[0], 862 src = img.src; 863 864 if(isBig !== currSlideObject.isBig) { 865 var c = currSlideObject.holder.children(); 866 if(c && c.length > 1) { 867 removePreloader(); 868 } 869 return; 870 } 871 872 if(currSlideObject.iW && currSlideObject.iH) { 873 imageLoadingComplete(); 874 return; 875 } 876 currSlideObject.iW = img.width;
877 currSlideObject.iH = img.height; 878 if(currSlideObject.iW && currSlideObject.iH) { 879 imageLoadingComplete(); 880 return; 881 } else { 882 // if no size, try again 883 var loader = new Image(); 884 loader.onload = function() { 885 if(loader.width) { 886 currSlideObject.iW = loader.width; 887 currSlideObject.iH = loader.height; 888 imageLoadingComplete(); 889 } else { 890 setTimeout(function() { 891 if(loader.width) { 892 currSlideObject.iW = loader.width; 893 currSlideObject.iH = loader.height; 894 } 895 896 // failed to get size on last tier, just output image 897 imageLoadingComplete(); 898 }, 1000); 899 } 900 }; 901 loader.src = img.src; 902 } 903 } else { 904 imageLoadingComplete(); 905 } 906 } 907 function imageLoadingComplete() { 908 currSlideObject.isLoaded = true; 909 currSlideObject.isLoading = false; 910 911 appendContent(); 912 removePreloader(); 913 triggerLoaded(); 914 } 915 function waitForTransition() { 916 if(!self._isMove && currSlideObject.images && currSlideObject.iW && currSlideObject.iH) { 917 parseDataAndLoad(); 918 return; 919 } 920 currSlideObject.holder.isWaiting = true; 921 setPreloader(); 922 currSlideObject.holder.slideId = -99; 923 } 924 925 function appendContent() { 926 if(!currSlideObject.isAppended) { 927 928 var visibleNearby = self.st.visibleNearby, 929 bId = currSlideObject.id - self._newSlideId; 930 if(!beforeTransition && !currSlideObject.appendOnLoaded && self.st.fadeinLoadedSlide && ( bId === 0 || ( (visibleNearby || self._isAnimating || self._isDragging) && (bId === -1 || bId === 1) ) ) ) { 931 var css = { 932 visibility: 'visible', 933 opacity: 0 934 }; 935 css[self._vendorPref + 'transition'] = 'opacity 400ms ease-in-out'; 936 currSlideObject.content.css(css); 937 938 setTimeout(function() { 939 currSlideObject.content.css('opacity', 1); 940 }, 16); 941 } 942 943 if(currSlideObject.holder.find('.rsPreloader').length) { 944 currSlideObject.holder.append( currSlideObject.content ); 945 } else { 946 currSlideObject.holder.html( currSlideObject.content ); 947 } 948 949 950 currSlideObject.isAppended = true; 951 if(currSlideObject.isLoaded) { 952 self._resizeImage(currSlideObject); 953 triggerLoaded(); 954 } 955 if(!currSlideObject.sizeReady) { 956 currSlideObject.sizeReady = true; 957 setTimeout(function() { 958 // triggers after content is added, usually is true when page is refreshed from cache 959 self.ev.trigger('rsMaybeSizeReady', currSlideObject); 960 }, 100); 961 } 962 963 } 964 } 965 function triggerLoaded() { 966 if(!currSlideObject.loadedTriggered) { 967 currSlideObject.isLoaded = currSlideObject.loadedTriggered = true; 968 currSlideObject.holder.trigger('rsAfterContentSet'); 969 self.ev.trigger('rsAfterContentSet', currSlideObject); 970 } 971 } 972 function setPreloader() { 973 if(self.st.usePreloader) 974 currSlideObject.holder.html(self._preloader.clone()); 975 } 976 function removePreloader(now) { 977 if(self.st.usePreloader) { 978 var preloader = currSlideObject.holder.find('.rsPreloader'); 979 if(preloader.length) { 980 preloader.remove(); 981 } 982 } 983 } 984 985 }, 986 _addBlockToContainer: function(slideObject, content, dontFade) { 987 var self = this; 988 var holder = slideObject.holder; 989 var bId = slideObject.id - self._newSlideId; 990 991 var visibleNearby = false; 992 // if(self._isMove && !dontFade && self.st.fadeinLoadedSlide && ( bId === 0 || ( (visibleNearby || self._isAnimating || self._isDragging) && (bId === -1 || bId === 1) ) ) ) { 993 // var content = slideObject.content; 994 // content.css(self._vendorPref + 'transition', 'opacity 400ms ease-in-out').css({visibility: 'visible', opacity: 0}); 995 // //holder.css('opacity', 0); 996 // self._slidesContainer.append(holder); 997 // setTimeout(function() { 998 // content.css('opacity', 1); 999 // //self.ev.trigger('rsAfterContentSet', holder); 1000 // }, 6); 1001 // } else { 1002 self._slidesContainer.append(holder); 1003 //} 1004 slideObject.appendOnLoaded = false;
1005 }, 1006 1007 _onDragStart:function(e, isThumbs) { 1008 var self = this, 1009 point, 1010 wasAnimating, 1011 isTouch = (e.type === 'touchstart'); 1012 1013 self._isTouchGesture = isTouch; 1014 1015 self.ev.trigger('rsDragStart'); 1016 if($(e.target).closest('.rsNoDrag', self._currHolder).length) { 1017 self.dragSuccess = false; 1018 return true; 1019 } 1020 1021 1022 1023 if(!isThumbs) { 1024 if(self._isAnimating) { 1025 self._wasAnimating = true; 1026 1027 self._stopAnimation(); 1028 } 1029 } 1030 self.dragSuccess = false; 1031 if(self._isDragging) { 1032 if(isTouch) { 1033 self._multipleTouches = true; 1034 } 1035 return; 1036 } else { 1037 if(isTouch) { 1038 self._multipleTouches = false; 1039 } 1040 } 1041 1042 self._setGrabbingCursor(); 1043 1044 if(isTouch) { 1045 //parsing touch event 1046 var touches = e.originalEvent.touches; 1047 if(touches && touches.length > 0) { 1048 point = touches[0]; 1049 if(touches.length > 1) { 1050 self._multipleTouches = true; 1051 } 1052 } 1053 else { 1054 return; 1055 } 1056 } else { 1057 e.preventDefault(); 1058 point = e; 1059 if(self.msEnabled) point = point.originalEvent; 1060 } 1061 1062 self._isDragging = true; 1063 self._doc.on(self._moveEvent, function(e) { self._onDragMove(e, isThumbs); }) 1064 .on(self._upEvent, function(e) { self._onDragRelease(e, isThumbs); }); 1065 1066 self._currMoveAxis = ''; 1067 self._hasMoved = false; 1068 self._pageX = point.pageX; 1069 self._pageY = point.pageY; 1070 self._startPagePos = self._accelerationPos = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal) ? point.pageX : point.pageY; 1071 1072 self._horDir = 0; 1073 self._verDir = 0; 1074 1075 1076 self._currRenderPosition = !isThumbs ? self._sPosition : self._thumbsPosition; 1077 1078 self._startTime = new Date().getTime(); 1079 if(isTouch) { 1080 self._sliderOverflow.on(self._cancelEvent, function(e) { self._onDragRelease(e, isThumbs); }); 1081 } 1082 }, 1083 _renderMovement:function(point, isThumbs) { 1084 var self = this; 1085 if(self._checkedAxis) { 1086 1087 var timeStamp = self._renderMoveTime, 1088 deltaX = point.pageX - self._pageX, 1089 deltaY = point.pageY - self._pageY, 1090 newX = self._currRenderPosition + deltaX, 1091 newY = self._currRenderPosition + deltaY, 1092 isHorizontal = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal), 1093 newPos = isHorizontal ? newX : newY, 1094 mAxis = self._currMoveAxis; 1095 1096 self._hasMoved = true; 1097 self._pageX = point.pageX; 1098 self._pageY = point.pageY; 1099 1100 if(mAxis === 'x' && deltaX !== 0) { 1101 self._horDir = deltaX > 0 ? 1 : -1; 1102 } else if(mAxis === 'y' && deltaY !== 0) { 1103 self._verDir = deltaY > 0 ? 1 : -1; 1104 } 1105
1106 var pointPos = isHorizontal ? self._pageX : self._pageY, 1107 deltaPos = isHorizontal ? deltaX : deltaY; 1108 if(!isThumbs) { 1109 if(!self._loop) { 1110 if(self.currSlideId <= 0) { 1111 if(pointPos - self._startPagePos > 0) { 1112 newPos = self._currRenderPosition + deltaPos * self._lastItemFriction; 1113 } 1114 } 1115 if(self.currSlideId >= self.numSlides - 1) { 1116 if(pointPos - self._startPagePos < 0) { 1117 newPos = self._currRenderPosition + deltaPos * self._lastItemFriction ; 1118 } 1119 } 1120 } 1121 } else { 1122 if(newPos > self._thumbsMinPosition) { 1123 newPos = self._currRenderPosition + deltaPos * self._lastItemFriction; 1124 } else if(newPos < self._thumbsMaxPosition) { 1125 newPos = self._currRenderPosition + deltaPos * self._lastItemFriction ; 1126 } 1127 } 1128 1129 self._currRenderPosition = newPos; 1130 1131 if (timeStamp - self._startTime > 200) { 1132 self._startTime = timeStamp; 1133 self._accelerationPos = pointPos; 1134 } 1135 1136 if(!isThumbs) { 1137 if(self._isMove) { 1138 self._setPosition(self._currRenderPosition); 1139 } 1140 } else { 1141 self._setThumbsPosition(self._currRenderPosition); 1142 } 1143 } 1144 1145 }, 1146 _onDragMove:function(e, isThumbs) { 1147 var self = this, 1148 point, 1149 isTouch = (e.type === 'touchmove'); 1150 1151 if(self._isTouchGesture && !isTouch) { 1152 return; 1153 } 1154 1155 if(isTouch) { 1156 if(self._lockAxis) { 1157 return; 1158 } 1159 var touches = e.originalEvent.touches; 1160 if(touches) { 1161 if(touches.length > 1) { 1162 return; 1163 } else { 1164 point = touches[0]; 1165 } 1166 } else { 1167 return; 1168 } 1169 } else { 1170 point = e; 1171 if(self.msEnabled) point = point.originalEvent; 1172 } 1173 1174 1175 if(!self._hasMoved) { 1176 if(self._useCSS3Transitions) { 1177 (!isThumbs ? self._slidesContainer : self._thumbsContainer).css((self._vendorPref + self._TD), '0s'); 1178 } 1179 (function animloop(){ 1180 if(self._isDragging) { 1181 self._animFrame = requestAnimationFrame(animloop); 1182 if(self._renderMoveEvent) 1183 self._renderMovement(self._renderMoveEvent, isThumbs); 1184 } 1185 1186 })(); 1187 } 1188 1189 if(!self._checkedAxis) { 1190 1191 var dir = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal), 1192 diff = (Math.abs(point.pageX - self._pageX) - Math.abs(point.pageY - self._pageY) ) - (dir ? -7 : 7); 1193 1194 if(diff > 7) { 1195 // hor movement 1196 if(dir) { 1197 e.preventDefault(); 1198 self._currMoveAxis = 'x'; 1199 } else if(isTouch) { 1200 self._completeGesture(); 1201 return; 1202 } 1203 self._checkedAxis = true; 1204 } else if(diff < -7) { 1205 // ver movement 1206 if(!dir) { 1207 e.preventDefault(); 1208 self._currMoveAxis = 'y'; 1209 } else if(isTouch) { 1210 self._completeGesture(); 1211 return; 1212 } 1213 self._checkedAxis = true; 1214 } 1215 return; 1216 } 1217 1218 e.preventDefault(); 1219 self._renderMoveTime = new Date().getTime(); 1220 self._renderMoveEvent = point; 1221 }, 1222 _completeGesture: function() { 1223 var self = this; 1224 self._lockAxis = true; 1225 self._hasMoved = self._isDragging = false; 1226 self._onDragRelease(); 1227 }, 1228 _onDragRelease:function(e, isThumbs) { 1229 var self = this, 1230 totalMoveDist, 1231 accDist, 1232 duration, 1233 v0, 1234 newPos, 1235 newDist, 1236 newDuration, 1237 blockLink, 1238 isTouch = (e.type === 'touchend' || e.type === 'touchcancel'); 1239 1240 1241 if(self._isTouchGesture && !isTouch) { 1242 return; 1243 } 1244 self._isTouchGesture = false; 1245 self.ev.trigger('rsDragRelease'); 1246 1247 self._renderMoveEvent = null; 1248 self._isDragging = false; 1249 self._lockAxis = false; 1250 self._checkedAxis = false; 1251 self._renderMoveTime = 0; 1252 cancelAnimationFrame(self._animFrame); 1253 if(self._hasMoved) { 1254 if(!isThumbs) { 1255 if(self._isMove) { 1256 self._setPosition(self._currRenderPosition); 1257 } 1258 } else { 1259 self._setThumbsPosition(self._currRenderPosition); 1260 } 1261 } 1262 1263 1264 self._doc.off(self._moveEvent).off(self._upEvent); 1265 1266 if(isTouch) { 1267 self._sliderOverflow.off(self._cancelEvent); 1268 } 1269 1270 1271 self._setGrabCursor(); 1272 if (!self._hasMoved && !self._multipleTouches) { 1273 if(isThumbs && self._thumbsEnabled) { 1274 var item = $(e.target).closest('.rsNavItem'); 1275 if(item.length) { 1276 self.goTo(item.index()); 1277 } 1278 return; 1279 } 1280 } 1281 var orient = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal);
1282 if(!self._hasMoved || (self._currMoveAxis === 'y' && orient) || (self._currMoveAxis === 'x' && !orient) ) { 1283 if(!isThumbs && self._wasAnimating) { 1284 self._wasAnimating = false; 1285 if(!self.st.navigateByClick) { 1286 self.dragSuccess = true; 1287 } else { 1288 self._mouseNext( (self.msEnabled ? e.originalEvent : e) ); 1289 self.dragSuccess = true; 1290 return; 1291 } 1292 } else { 1293 self._wasAnimating = false; 1294 self.dragSuccess = false; 1295 return; 1296 } 1297 1298 } else { 1299 self.dragSuccess = true; 1300 } 1301 1302 self._wasAnimating = false; 1303 1304 1305 self._currMoveAxis = ''; 1306 1307 1308 function getCorrectSpeed(newSpeed) { 1309 if(newSpeed < 100) { 1310 return 100; 1311 } else if(newSpeed > 500) { 1312 return 500; 1313 } 1314 return newSpeed; 1315 } 1316 function returnToCurrent(isSlow, v0) { 1317 if(self._isMove || isThumbs) { 1318 1319 newPos = (-self._realId - self._idOffset) * self._slideSize; 1320 newDist = Math.abs(self._sPosition - newPos); 1321 self._currAnimSpeed = newDist / v0; 1322 if(isSlow) { 1323 self._currAnimSpeed += 250; 1324 } 1325 self._currAnimSpeed = getCorrectSpeed(self._currAnimSpeed); 1326 1327 self._animateTo(newPos, false); 1328 } 1329 } 1330 1331 var snapDist = self.st.minSlideOffset, 1332 point = isTouch ? e.originalEvent.changedTouches[0] : (self.msEnabled ? e.originalEvent : e), 1333 pPos = orient ? point.pageX : point.pageY, 1334 sPos = self._startPagePos, 1335 axPos = self._accelerationPos, 1336 axCurrItem = self.currSlideId, 1337 axNumItems = self.numSlides, 1338 dir = orient ? self._horDir : self._verDir, 1339 loop = self._loop, 1340 changeHash = false, 1341 distOffset = 0; 1342 1343 totalMoveDist = Math.abs(pPos - sPos); 1344 accDist = pPos - axPos; 1345 1346 1347 duration = (new Date().getTime()) - self._startTime; 1348 v0 = Math.abs(accDist) / duration; 1349 1350 if(dir === 0 || axNumItems <= 1) { 1351 returnToCurrent(true, v0); 1352 return; 1353 } 1354 1355 if(!loop && !isThumbs) { 1356 if(axCurrItem <= 0) { 1357 if(dir > 0) { 1358 returnToCurrent(true, v0); 1359 return; 1360 } 1361 } else if(axCurrItem >= axNumItems - 1) { 1362 if(dir < 0) { 1363 returnToCurrent(true, v0); 1364 return; 1365 } 1366 } 1367 } 1368 1369 if(!isThumbs) { 1370 if(sPos + snapDist < pPos) { 1371 if(dir < 0) { 1372 returnToCurrent(false, v0); 1373 return; 1374 } 1375 self._moveTo('prev', getCorrectSpeed(Math.abs(self._sPosition - (-self._realId - self._idOffset + 1) * self._slideSize) / v0), changeHash, true, true); 1376 } else if(sPos - snapDist > pPos) { 1377 if(dir > 0) { 1378 returnToCurrent(false, v0); 1379 return; 1380 } 1381 self._moveTo('next', getCorrectSpeed(Math.abs(self._sPosition - (-self._realId - self._idOffset - 1) * self._slideSize) / v0), changeHash, true, true); 1382 } else { 1383 returnToCurrent(false, v0); 1384 } 1385 } else { 1386 var newPos = self._thumbsPosition; 1387 var transitionSpeed; 1388 1389 if(newPos > self._thumbsMinPosition) { 1390 newPos = self._thumbsMinPosition; 1391 } else if(newPos < self._thumbsMaxPosition) { 1392 newPos = self._thumbsMaxPosition; 1393 } else { 1394 var friction = 0.003, 1395 S = (v0 * v0) / (friction * 2), 1396 minXDist = -self._thumbsPosition, 1397 maxXDist = self._thumbsContainerSize - self._thumbsViewportSize + self._thumbsPosition; 1398 1399 if (accDist > 0 && S > minXDist) { 1400 minXDist = minXDist + self._thumbsViewportSize / (15 / (S / v0 * friction)); 1401 v0 = v0 * minXDist / S; 1402 S = minXDist; 1403 } else if (accDist < 0 && S > maxXDist) { 1404 maxXDist = maxXDist + self._thumbsViewportSize / (15 / (S / v0 * friction)); 1405 v0 = v0 * maxXDist / S; 1406 S = maxXDist; 1407 } 1408 1409 1410 1411 1412 transitionSpeed = Math.max(Math.round(v0 / friction), 50); 1413 newPos = newPos + S * (accDist < 0 ? -1 : 1); 1414 1415 1416 if(newPos > self._thumbsMinPosition) { 1417 self._animateThumbsTo(newPos, transitionSpeed, true, self._thumbsMinPosition, 200); 1418 return; 1419 } else if(newPos < self._thumbsMaxPosition) { 1420 self._animateThumbsTo( newPos, transitionSpeed, true, self._thumbsMaxPosition, 200); 1421 return; 1422 } 1423 } 1424 1425 self._animateThumbsTo(newPos, transitionSpeed, true); 1426 1427 } 1428 }, 1429 _setPosition: function(pos) { 1430 var self = this; 1431 pos = self._sPosition = pos; 1432 if(self._useCSS3Transitions) { 1433 self._slidesContainer.css(self._xProp, self._tPref1 + ( self._slidesHorizontal ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 ); 1434 } else { 1435 self._slidesContainer.css(self._slidesHorizontal ? self._xProp : self._yProp, pos); 1436 } 1437 }, 1438 1439 1440 updateSliderSize: function(force) { 1441 var self = this, 1442 newWidth, 1443 newHeight; 1444 1445 if(self.st.autoScaleSlider) { 1446 var asw = self.st.autoScaleSliderWidth, 1447 ash = self.st.autoScaleSliderHeight; 1448 1449 if(self.st.autoScaleHeight) { 1450 newWidth = self.slider.width(); 1451 if(newWidth != self.width) { 1452 self.slider.css("height", newWidth * (ash / asw) ); 1453 newWidth = self.slider.width(); 1454 } 1455 newHeight = self.slider.height(); 1456 } else { 1457 newHeight = self.slider.height(); 1458 if(newHeight != self.height) { 1459 self.slider.css("width", newHeight * (asw / ash)); 1460 newHeight = self.slider.height(); 1461 } 1462 newWidth = self.slider.width(); 1463 } 1464 1465 } else { 1466 newWidth = self.slider.width(); 1467 newHeight = self.slider.height(); 1468 } 1469 1470 1471 1472 if(force || newWidth != self.width || newHeight != self.height) { 1473 self.width = newWidth; 1474 self.height = newHeight; 1475 1476 self._wrapWidth = newWidth; 1477 self._wrapHeight = newHeight; 1478 1479 self.ev.trigger('rsBeforeSizeSet'); 1480 self.ev.trigger('rsAfterSizePropSet'); 1481 1482 self._sliderOverflow.css({ 1483 width: self._wrapWidth, 1484 height: self._wrapHeight 1485 }); 1486 1487 1488 self._slideSize = (self._slidesHorizontal ? self._wrapWidth : self._wrapHeight) + self.st.slidesSpacing; 1489 1490 1491 self._imagePadding = self.st.imageScalePadding; 1492 var item, 1493 slideItem, 1494 i, 1495 img; 1496 for(i = 0; i < self.slides.length; i++) { 1497 item = self.slides[i]; 1498 item.positionSet = false;
1499 1500 if(item && item.images && item.isLoaded) { 1501 item.isRendered = false; 1502 self._resizeImage(item); 1503 } 1504 } 1505 if(self._cloneHolders) { 1506 for(i = 0; i < self._cloneHolders.length; i++) { 1507 item = self._cloneHolders[i]; 1508 item.holder.css(self._reorderProp, (item.id + self._idOffset) * self._slideSize); 1509 } 1510 } 1511 1512 self._updateBlocksContent(); 1513 1514 if(self._isMove) { 1515 if(self._useCSS3Transitions) { 1516 self._slidesContainer.css(self._vendorPref + 'transition-duration', '0s'); 1517 } 1518 self._setPosition( (-self._realId - self._idOffset) * self._slideSize); 1519 } 1520 self.ev.trigger('rsOnUpdateNav'); 1521 } 1522 self._sliderOffset = self._sliderOverflow.offset(); 1523 self._sliderOffset = self._sliderOffset[self._reorderProp]; 1524 1525 1526 }, 1527 //setSlidesOrientation: function(orient) { 1528 // TODO 1529 // var self = this, 1530 // newHor = Boolean(orient === 'horizontal'); 1531 // if(self._slidesHorizontal !== newHor) { 1532 // self._setPosition(0); 1533 // if(self._isMove) { 1534 // for(var i = 0; i < self._slideHolders.length; i++) { 1535 // self._slideHolders[i].block.css(self._reorderProp, ''); 1536 // } 1537 // } 1538 // self.slider.removeClass(self._slidesHorizontal ? 'rsHor' : 'rsVer').addClass(newHor ? 'rsHor' : 'rsVer'); 1539 // self._slidesHorizontal = newHor; 1540 // self._reorderProp = newHor ? 'left' : 'top'; 1541 // self.updateSliderSize(true); 1542 // } 1543 //}, 1544 /** 1545 * Adds slide 1546 * @param {jQuery object or raw HTML} htmltext 1547 * @param {int} index (optional) Index where item should be added (last item is removed of not specified) 1548 */ 1549 appendSlide: function(htmltext, index) { 1550 var self = this, 1551 parsedSlide = self._parseNode(htmltext); 1552 1553 if(isNaN(index) || index > self.numSlides) { 1554 index = self.numSlides; 1555 } 1556 self.slides.splice(index, 0, parsedSlide); 1557 self.slidesJQ.splice(index, 0, '<div style="'+ (self._isMove ? 'position:absolute;' : self._opacityCSS ) +'" class="rsSlide"></div>'); 1558 1559 if(index < self.currSlideId) { 1560 self.currSlideId++; 1561 } 1562 self.ev.trigger('rsOnAppendSlide', [parsedSlide, index]); 1563 1564 self._refreshSlides(index); 1565 1566 if(index === self.currSlideId) { 1567 self.ev.trigger('rsAfterSlideChange'); 1568 } 1569 }, 1570 1571 /** 1572 * Removes slide 1573 * @param {int} Index of item that should be removed 1574 */ 1575 removeSlide: function(index) { 1576 var self = this, 1577 slideToRemove = self.slides[index]; 1578 1579 if(slideToRemove) { 1580 if(slideToRemove.holder) { 1581 slideToRemove.holder.remove(); 1582 } 1583 if(index < self.currSlideId) { 1584 self.currSlideId--; 1585 } 1586 self.slides.splice(index, 1); 1587 self.slidesJQ.splice(index, 1); 1588 1589 self.ev.trigger('rsOnRemoveSlide', [index]); 1590 self._refreshSlides(index); 1591 1592 if(index === self.currSlideId) { 1593 self.ev.trigger('rsAfterSlideChange'); 1594 } 1595 } 1596 }, 1597 _refreshSlides: function(refreshIndex) { 1598 1599 // todo: optimize this stuff 1600 var self = this; 1601 1602 var oldNumSlides = self.numSlides; 1603 var numLoops = self._realId <= 0 ? 0 : Math.floor(self._realId / oldNumSlides); 1604 1605 self.numSlides = self.slides.length; 1606 if(self.numSlides === 0) { 1607 self.currSlideId = self._idOffset = self._realId = 0; 1608 self.currSlide = self._oldHolder = null; 1609 } else { 1610 self._realId = numLoops * self.numSlides + self.currSlideId; 1611 } 1612 1613 for(var i = 0; i < self.numSlides; i++) { 1614 self.slides[i].id = i; 1615 } 1616 1617 self.currSlide = self.slides[self.currSlideId]; 1618 self._currHolder = self.slidesJQ[self.currSlideId]; 1619 1620 if(self.currSlideId >= self.numSlides) { 1621 self.goTo(self.numSlides - 1); 1622 } else if(self.currSlideId < 0) { 1623 self.goTo(0); 1624 } 1625 1626 self._refreshNumPreloadImages(); 1627 1628 if(self._isMove && self._loop) { 1629 self._slidesContainer.css((self._vendorPref + self._TD), '0ms'); 1630 } 1631 if(self._refreshSlidesTimeout) { 1632 clearTimeout(self._refreshSlidesTimeout); 1633 } 1634 1635 1636 self._refreshSlidesTimeout = setTimeout(function() { 1637 if(self._isMove) { 1638 self._setPosition( (-self._realId - self._idOffset) * self._slideSize); 1639 } 1640 self._updateBlocksContent(); 1641 if(!self._isMove) { 1642 self._currHolder.css({ 1643 display: 'block', 1644 opacity: 1 1645 }); 1646 } 1647 1648 }, 14); 1649 self.ev.trigger('rsOnUpdateNav'); 1650 }, 1651 _setGrabCursor:function() { 1652 var self = this; 1653 if(self._hasDrag && self._isMove) { 1654 if(self._grabCursor) { 1655 self._sliderOverflow.css('cursor', self._grabCursor); 1656 } else { 1657 self._sliderOverflow.removeClass('grabbing-cursor'); 1658 self._sliderOverflow.addClass('grab-cursor'); 1659 } 1660 } 1661 }, 1662 _setGrabbingCursor:function() { 1663 var self = this; 1664 if(self._hasDrag && self._isMove) { 1665 if(self._grabbingCursor) { 1666 self._sliderOverflow.css('cursor', self._grabbingCursor); 1667 } else { 1668 self._sliderOverflow.removeClass('grab-cursor'); 1669 self._sliderOverflow.addClass('grabbing-cursor'); 1670 } 1671 } 1672 }, 1673 next: function(notUserAction) { 1674 var self = this; 1675 self._moveTo('next', self.st.transitionSpeed, true, !notUserAction); 1676 }, 1677 prev: function(notUserAction) { 1678 var self = this; 1679 self._moveTo('prev', self.st.transitionSpeed, true, !notUserAction); 1680 }, 1681 _moveTo:function(type, speed, inOutEasing, userAction, fromSwipe) { 1682 var self = this, 1683 newPos, 1684 difference, 1685 i; 1686 1687 1688 self.ev.trigger('rsBeforeMove', [type, userAction]); 1689 if(type === 'next') { 1690 newItemId = self.currSlideId+1; 1691 } else if(type === 'prev') { 1692 newItemId = self.currSlideId-1; 1693 } else { 1694 newItemId = type = parseInt(type, 10); 1695 } 1696 1697 if(!self._loop) { 1698 if(newItemId < 0) { 1699 self._doBackAndForthAnim('left', !userAction); 1700 return; 1701 } else if(newItemId >= self.numSlides ) { 1702 self._doBackAndForthAnim('right', !userAction); 1703 return; 1704 } 1705 } 1706 1707 if(self._isAnimating) { 1708 self._stopAnimation(true); 1709 inOutEasing = false;
1710 } 1711 1712 difference = newItemId - self.currSlideId; 1713 1714 1715 1716 self._prevSlideId = self.currSlideId; 1717 var prevId = self.currSlideId; 1718 var id = self.currSlideId + difference; 1719 var realId = self._realId; 1720 var temp; 1721 var delayed; 1722 if(self._loop) { 1723 id = self._updateBlocksContent(false, id); 1724 realId += difference; 1725 } else { 1726 realId = id; 1727 } 1728 self._newSlideId = id; 1729 1730 self._oldHolder = self.slidesJQ[self.currSlideId]; 1731 1732 1733 self._realId = realId; 1734 self.currSlideId = self._newSlideId; 1735 1736 self.currSlide = self.slides[self.currSlideId]; 1737 self._currHolder = self.slidesJQ[self.currSlideId]; 1738 1739 1740 var checkDist = self.st.slidesDiff; 1741 var next = Boolean(difference > 0); 1742 var absDiff = Math.abs(difference); 1743 var g1 = Math.floor( prevId / self._numPreloadImages); 1744 var g2 = Math.floor( ( prevId + (next ? checkDist : -checkDist ) ) / self._numPreloadImages); 1745 var biggest = next ? Math.max(g1,g2) : Math.min(g1,g2); 1746 var biggestId = biggest * self._numPreloadImages + ( next ? (self._numPreloadImages - 1) : 0 ); 1747 if(biggestId > self.numSlides - 1) { 1748 biggestId = self.numSlides - 1; 1749 } else if(biggestId < 0) { 1750 biggestId = 0; 1751 } 1752 var toLast = next ? (biggestId - prevId) : (prevId - biggestId); 1753 if(toLast > self._numPreloadImages) { 1754 toLast = self._numPreloadImages; 1755 } 1756 if(absDiff > toLast + checkDist) { 1757 self._idOffset += ( absDiff - (toLast + checkDist) ) * ( next ? -1 : 1 ); 1758 speed = speed * 1.4; 1759 for(i = 0; i < self.numSlides; i++) { 1760 self.slides[i].positionSet = false; 1761 } 1762 } 1763 self._currAnimSpeed = speed; 1764 1765 self._updateBlocksContent(true); 1766 if(!fromSwipe) { 1767 delayed = true; 1768 } 1769 1770 1771 newPos = (-realId - self._idOffset) * self._slideSize; 1772 1773 1774 1775 if(delayed) { 1776 setTimeout(function() { 1777 self._isWorking = false; 1778 self._animateTo(newPos, type, false, inOutEasing); 1779 self.ev.trigger('rsOnUpdateNav'); 1780 }, 0); 1781 } else { 1782 self._animateTo(newPos, type, false, inOutEasing); 1783 self.ev.trigger('rsOnUpdateNav'); 1784 } 1785 1786 1787 function isSetToCurrent(testId) { 1788 if(testId < 0) { 1789 testId = self.numSlides + testId; 1790 } else if(testId > self.numSlides - 1) { 1791 testId = testId - self.numSlides; 1792 } 1793 if(testId !== self.currSlideId) { 1794 return false; 1795 } 1796 return true; 1797 } 1798 1799 }, 1800 _updateArrowsNav: function() { 1801 var self = this, 1802 arrDisClass = 'rsArrowDisabled'; 1803 if(self.st.arrowsNav) { 1804 if(self.numSlides <= 1) { 1805 self._arrowLeft.css('display', 'none'); 1806 self._arrowRight.css('display', 'none'); 1807 return; 1808 } else { 1809 self._arrowLeft.css('display', 'block'); 1810 self._arrowRight.css('display', 'block'); 1811 } 1812 if(!self._loop && !self.st.loopRewind) { 1813 if(self.currSlideId === 0) { 1814 self._arrowLeft.addClass(arrDisClass); 1815 } else { 1816 self._arrowLeft.removeClass(arrDisClass); 1817 } 1818 if(self.currSlideId === self.numSlides - 1) { 1819 self._arrowRight.addClass(arrDisClass); 1820 } else { 1821 self._arrowRight.removeClass(arrDisClass); 1822 } 1823 } 1824 } 1825 }, 1826 _animateTo:function(pos, dir, loadAll, inOutEasing, customComplete) { 1827 var self = this, 1828 moveProp, 1829 oldBlock, 1830 animBlock; 1831 1832 var animObj = {}; 1833 if(isNaN(self._currAnimSpeed)) { 1834 self._currAnimSpeed = 400; 1835 } 1836 1837 1838 1839 self._sPosition = self._currRenderPosition = pos; 1840 1841 self.ev.trigger('rsBeforeAnimStart'); 1842 1843 if(!self._useCSS3Transitions) { 1844 if(self._isMove) { 1845 animObj[self._slidesHorizontal ? self._xProp : self._yProp] = pos + 'px'; 1846 1847 1848 self._slidesContainer.animate(animObj, self._currAnimSpeed, /*'easeOutQuart'*/ inOutEasing ? self.st.easeInOut : self.st.easeOut); 1849 } else { 1850 oldBlock = self._oldHolder; 1851 animBlock = self._currHolder; 1852 1853 animBlock.stop(true, true).css({ 1854 opacity: 0, 1855 display: 'block', 1856 zIndex: self._fadeZIndex 1857 }); 1858 self._currAnimSpeed = self.st.transitionSpeed; 1859 animBlock.animate({opacity: 1}, self._currAnimSpeed, self.st.easeInOut); 1860 1861 1862 clearTimeouts(); 1863 if(oldBlock) { 1864 oldBlock.data('rsTimeout', setTimeout(function() { 1865 oldBlock.stop(true, true).css({ 1866 opacity: 0, 1867 display: 'none', 1868 zIndex: 0 1869 }); 1870 }, self._currAnimSpeed + 60) ); 1871 } 1872 } 1873 1874 } else { 1875 if(self._isMove) { 1876 1877 1878 1879 self._currAnimSpeed = parseInt(self._currAnimSpeed); 1880 var td = self._vendorPref + self._TD; 1881 var ttf = self._vendorPref + self._TTF; 1882 1883 animObj[td] = self._currAnimSpeed+'ms'; 1884 animObj[ttf] = inOutEasing ? $.rsCSS3Easing[self.st.easeInOut] : $.rsCSS3Easing[self.st.easeOut]; 1885 1886 self._slidesContainer.css(animObj); 1887 if(inOutEasing || !self.hasTouch) { 1888 setTimeout(function() { 1889 self._setPosition(pos); 1890 }, 5); 1891 } else { 1892 self._setPosition(pos); 1893 } 1894 1895 1896 1897 } else { 1898 //self._currAnimSpeed = 10 1899 self._currAnimSpeed = self.st.transitionSpeed; 1900 oldBlock = self._oldHolder; 1901 animBlock = self._currHolder; 1902 if(animBlock.data('rsTimeout')) { 1903 animBlock.css('opacity', 0); 1904 } 1905 clearTimeouts(); 1906 if(oldBlock) { 1907 //if(oldBlock) 1908 oldBlock.data('rsTimeout', setTimeout(function() { 1909 animObj[self._vendorPref + self._TD] = '0ms'; 1910 animObj.zIndex = 0; 1911 animObj.display = 'none'; 1912 oldBlock.data('rsTimeout', ''); 1913 oldBlock.css(animObj); 1914 setTimeout(function() { 1915 oldBlock.css('opacity', 0); 1916 }, 16); 1917 }, self._currAnimSpeed + 60) ); 1918 } 1919 1920 animObj.display = 'block'; 1921 animObj.zIndex = self._fadeZIndex; 1922 animObj.opacity = 0; 1923 animObj[self._vendorPref + self._TD] = '0ms'; 1924 animObj[self._vendorPref + self._TTF] = $.rsCSS3Easing[self.st.easeInOut]; 1925 animBlock.css(animObj); 1926 animBlock.data('rsTimeout', setTimeout(function() { 1927 //animBlock.css('opacity', 0); 1928 animBlock.css(self._vendorPref + self._TD, self._currAnimSpeed+'ms'); 1929 1930 //oldBlock.css(self._vendorPref + self._TD, '0ms'); 1931 animBlock.data('rsTimeout', setTimeout(function() { 1932 animBlock.css('opacity', 1); 1933 animBlock.data('rsTimeout', ''); 1934 }, 20) ); 1935 }, 20) ); 1936 } 1937 } 1938 self._isAnimating = true; 1939 if(self.loadingTimeout) { 1940 clearTimeout(self.loadingTimeout); 1941 } 1942 if(customComplete) { 1943 self.loadingTimeout = setTimeout(function() { 1944 self.loadingTimeout = null; 1945 customComplete.call(); 1946 1947 }, self._currAnimSpeed + 60); 1948 } else { 1949 self.loadingTimeout = setTimeout(function() { 1950 self.loadingTimeout = null; 1951 self._animationComplete(dir); 1952 }, self._currAnimSpeed + 60); 1953 } 1954 1955 function clearTimeouts() { 1956 var t; 1957 if(oldBlock) { 1958 t = oldBlock.data('rsTimeout'); 1959 if(t) { 1960 if(oldBlock !== animBlock) { 1961 oldBlock.css({ 1962 opacity: 0, 1963 display: 'none', 1964 zIndex: 0 1965 }); 1966 } 1967 clearTimeout(t); 1968 oldBlock.data('rsTimeout', ''); 1969 } 1970 } 1971 1972 t = animBlock.data('rsTimeout'); 1973 if(t) { 1974 clearTimeout(t); 1975 animBlock.data('rsTimeout', ''); 1976 } 1977 } 1978 }, 1979 _stopAnimation: function(noCSS3) { 1980 var self = this; 1981 self._isAnimating = false;
1982 clearTimeout(self.loadingTimeout); 1983 if(self._isMove) { 1984 1985 if(!self._useCSS3Transitions) { 1986 self._slidesContainer.stop(true); 1987 self._sPosition = parseInt(self._slidesContainer.css(self._xProp), 10); 1988 } else if (!noCSS3) { 1989 var oldPos = self._sPosition; 1990 var newPos = self._currRenderPosition = self._getTransformProp(); 1991 self._slidesContainer.css((self._vendorPref + self._TD), '0ms'); 1992 if(oldPos !==newPos) { 1993 self._setPosition(newPos); 1994 } 1995 } 1996 } else { 1997 // kung fu 1998 if(self._fadeZIndex > 20) { 1999 self._fadeZIndex = 10; 2000 } else { 2001 self._fadeZIndex++; 2002 } 2003 } 2004 2005 2006 }, 2007 // Thanks to @benpbarnett 2008 _getTransformProp:function(){ 2009 var self = this, 2010 transform = window.getComputedStyle(self._slidesContainer.get(0), null).getPropertyValue(self._vendorPref + 'transform'), 2011 explodedMatrix = transform.replace(/^matrix\(/i, '').split(/, |\)$/g), 2012 isMatrix3d = (explodedMatrix[0].indexOf('matrix3d') === 0); 2013 return parseInt(explodedMatrix[(self._slidesHorizontal ? (isMatrix3d ? 12 : 4) : (isMatrix3d ? 13 : 5) )], 10); 2014 }, 2015 _getCSS3Prop: function(pos, hor) { 2016 var self = this; 2017 return self._useCSS3Transitions ? self._tPref1 + ( hor ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 : pos; 2018 }, 2019 _animationComplete: function(dir) { 2020 var self = this; 2021 if(!self._isMove) { 2022 self._currHolder.css('z-index', 0); 2023 self._fadeZIndex = 10; 2024 } 2025 self._isAnimating = false; 2026 2027 self.staticSlideId = self.currSlideId; 2028 self._updateBlocksContent(); 2029 2030 2031 self._slidesMoved = false; 2032 2033 self.ev.trigger('rsAfterSlideChange'); 2034 }, 2035 _doBackAndForthAnim:function(type, userAction) { 2036 var self = this, 2037 newPos = (-self._realId - self._idOffset) * self._slideSize; 2038 2039 if(self.numSlides === 0 || self._isAnimating) { 2040 return; 2041 } 2042 if(self.st.loopRewind) { 2043 self.goTo(type === 'left' ? self.numSlides - 1 : 0, userAction); 2044 return; 2045 } 2046 2047 if(self._isMove) { 2048 self._currAnimSpeed = 200; 2049 2050 function allAnimComplete() { 2051 self._isAnimating = false; 2052 } 2053 function firstAnimComplete() { 2054 self._isAnimating = false; 2055 self._animateTo(newPos, '', false, true, allAnimComplete); 2056 } 2057 self._animateTo(newPos + (type === 'left' ? 30 : -30),'', false, true, firstAnimComplete); 2058 } 2059 2060 }, 2061 _resizeImage:function(slideObject, useClone) { 2062
2063 var isRoot = true; 2064 if(slideObject.isRendered) { 2065 return; 2066 } 2067 var img = slideObject.content; 2068 var classToFind = 'rsMainSlideImage'; 2069 var isVideo; 2070 var self = this, 2071 imgAlignCenter = self.st.imageAlignCenter, 2072 imgScaleMode = self.st.imageScaleMode, 2073 tempEl; 2074 2075 if(slideObject.videoURL) { 2076 classToFind = 'rsVideoContainer'; 2077 if(imgScaleMode !== 'fill') { 2078 isVideo = true; 2079 } else { 2080 tempEl = img; 2081 if(!tempEl.hasClass(classToFind)) { 2082 tempEl = tempEl.find('.'+classToFind); 2083 } 2084 tempEl.css({width:'100%',height: '100%'}); 2085 classToFind = 'rsMainSlideImage'; 2086 } 2087 } 2088 if(!img.hasClass(classToFind)) { 2089 isRoot = false; 2090 img = img.find('.'+classToFind); 2091 } 2092 if(!img) { 2093 return; 2094 } 2095 2096 var baseImageWidth = slideObject.iW, 2097 baseImageHeight = slideObject.iH; 2098 2099 slideObject.isRendered = true; 2100 if(imgScaleMode === 'none' && !imgAlignCenter) { 2101 return; 2102 } 2103 if(imgScaleMode !== 'fill') { 2104 bMargin = self._imagePadding; 2105 } else { 2106 bMargin = 0; 2107 } 2108 //var block = img.parent('.block-inside').css('margin', bMargin); 2109 var containerWidth = self._wrapWidth - bMargin * 2, 2110 containerHeight = self._wrapHeight - bMargin * 2, 2111 hRatio, 2112 vRatio, 2113 ratio, 2114 nWidth, 2115 nHeight, 2116 cssObj = {}; 2117 2118 if(imgScaleMode === 'fit-if-smaller') { 2119 if(baseImageWidth > containerWidth || baseImageHeight > containerHeight) { 2120 imgScaleMode = 'fit'; 2121 } 2122 } 2123 if(imgScaleMode === 'fill' || imgScaleMode === 'fit') { 2124 hRatio = containerWidth / baseImageWidth; 2125 vRatio = containerHeight / baseImageHeight; 2126 2127 if (imgScaleMode == "fill") { 2128 ratio = hRatio > vRatio ? hRatio : vRatio; 2129 } else if (imgScaleMode == "fit") { 2130 ratio = hRatio < vRatio ? hRatio : vRatio; 2131 } else { 2132 ratio = 1; 2133 } 2134 2135 nWidth = Math.ceil(baseImageWidth * ratio, 10); 2136 nHeight = Math.ceil(baseImageHeight * ratio, 10); 2137 } else { 2138 nWidth = baseImageWidth; 2139 nHeight = baseImageHeight; 2140 } 2141 if(imgScaleMode !== 'none') { 2142 cssObj.width = nWidth; 2143 cssObj.height = nHeight; 2144 if(isVideo) { 2145 img.find('.rsImg').css({width: '100%', height:'100%'}); 2146 } 2147 } 2148 if (imgAlignCenter) { 2149 cssObj.marginLeft = Math.floor((containerWidth - nWidth) / 2) + bMargin; 2150 cssObj.marginTop = Math.floor((containerHeight - nHeight) / 2) + bMargin; 2151 } 2152 img.css(cssObj); 2153 } 2154 }; /* RoyalSlider core prototype end */ 2155 $.rsProto = RoyalSlider.prototype; 2156 2157 $.fn.royalSlider = function(options) { 2158 var args = arguments; 2159 return this.each(function(){ 2160 var self = $(this); 2161 if (typeof options === "object" || !options) { 2162 if( !self.data('royalSlider') ) { 2163 self.data('royalSlider', new RoyalSlider(self, options)); 2164 } 2165 } else { 2166 var royalSlider = self.data('royalSlider'); 2167 if (royalSlider && royalSlider[options]) { 2168 return royalSlider[options].apply(royalSlider, Array.prototype.slice.call(args, 1)); 2169 } 2170 } 2171 }); 2172 }; 2173 2174 $.fn.royalSlider.defaults = { 2175 slidesSpacing: 8, 2176 startSlideId: 0, 2177 loop: false, 2178 loopRewind: false, 2179 numImagesToPreload: 4, 2180 fadeinLoadedSlide: true, 2181 slidesOrientation: 'horizontal', 2182 transitionType: 'move', 2183 transitionSpeed: 600, 2184 controlNavigation: 'bullets', 2185 controlsInside: true, 2186 arrowsNav: true, 2187 arrowsNavAutoHide: true, 2188 navigateByClick: true, 2189 randomizeSlides: false, 2190 sliderDrag: true, 2191 sliderTouch: true, 2192 keyboardNavEnabled: false, 2193 fadeInAfterLoaded: true, 2194 2195 allowCSS3: true, 2196 allowCSS3OnWebkit: true, 2197 2198 2199 addActiveClass: false, 2200 autoHeight: false, 2201 2202 easeOut: 'easeOutSine', 2203 easeInOut: 'easeInOutSine', 2204 2205 minSlideOffset: 10, 2206 2207 imageScaleMode:"fit-if-smaller", 2208 imageAlignCenter:true, 2209 imageScalePadding: 4, 2210 usePreloader: true, 2211 2212 autoScaleSlider: false, 2213 2214 autoScaleSliderWidth: 800, 2215 autoScaleSliderHeight: 400, 2216 2217 autoScaleHeight: true, 2218 2219 arrowsNavHideOnTouch: false, 2220 globalCaption: false, 2221 2222 slidesDiff: 2, 2223 2224 disableResponsiveness: false // !disable responsiveness option 2225 }; /* default options end */ 2226 2227 $.rsCSS3Easing = { 2228 easeOutSine: 'cubic-bezier(0.390, 0.575, 0.565, 1.000)', 2229 easeInOutSine: 'cubic-bezier(0.445, 0.050, 0.550, 0.950)' 2230 }; 2231 2232 $.extend(jQuery.easing, { 2233 easeInOutSine: function (x, t, b, c, d) {
2234 return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; 2235 }, 2236 easeOutSine: function (x, t, b, c, d) { 2237 return c * Math.sin(t/d * (Math.PI/2)) + b; 2238 }, 2239 easeOutCubic: function (x, t, b, c, d) { 2240 return c*((t=t/d-1)*t*t + 1) + b; 2241 } 2242 }); 2243 2244 /****************************************************************************************************************/ 2245 /** 2246 * 2247 * RoyalSlider fullscreen module 2248 * @version 1.0.5: 2249 * 2250 * 1.0.1: 2251 * - Added rsEnterFullscreen and rsExitFullscreen events 2252 * 2253 * 1.0.2 2254 * - Added window scroll detection 2255 * 2256 * 1.0.3 2257 * - Fullscreen button now is added to _controlsContainer element 2258 * 2259 * 1.0.4 2260 * - Fixed issue that could cause small image be loaded in fullscreen 2261 * 2262 * 1.0.5 2263 * - Fix "false" native fullscreen on Android 2264 * 2265 */ 2266 $.extend($.rsProto, { 2267 _initFullscreen: function() { 2268 var self = this; 2269 2270 self._fullscreenDefaults = { 2271 enabled: false, 2272 keyboardNav: true, 2273 buttonFS: true, 2274 nativeFS: false, 2275 doubleTap: true 2276 }; 2277 self.st.fullscreen = $.extend({}, self._fullscreenDefaults, self.st.fullscreen); 2278 2279 if(self.st.fullscreen.enabled) { 2280 self.ev.one('rsBeforeSizeSet', function() { 2281 self._setupFullscreen(); 2282 }); 2283 } 2284 }, 2285 _setupFullscreen: function() { 2286 var self = this; 2287 self._fsKeyboard = (!self.st.keyboardNavEnabled && self.st.fullscreen.keyboardNav); 2288 2289 if(self.st.fullscreen.nativeFS) { 2290 // Thanks to John Dyer http://j.hn/ 2291 self._fullScreenApi = { 2292 supportsFullScreen: false, 2293 isFullScreen: function() { return false; }, 2294 requestFullScreen: function() {}, 2295 cancelFullScreen: function() {}, 2296 fullScreenEventName: '', 2297 prefix: '' 2298 }; 2299 var browserPrefixes = 'webkit moz o ms khtml'.split(' '); 2300 // check for native support 2301 if(!self.isAndroid) { 2302 2303 if (typeof document.cancelFullScreen != 'undefined') { 2304 self._fullScreenApi.supportsFullScreen = true; 2305 } else { 2306 // check for fullscreen support by vendor prefix 2307 for (var i = 0; i < browserPrefixes.length; i++ ) { 2308 self._fullScreenApi.prefix = browserPrefixes[i]; 2309 2310 if (typeof document[ self._fullScreenApi.prefix + 'CancelFullScreen' ] != 'undefined' ) { 2311 self._fullScreenApi.supportsFullScreen = true; 2312 2313 break; 2314 } 2315 } 2316 } 2317 2318 } 2319 2320 // update methods to do something useful 2321 if ( self._fullScreenApi.supportsFullScreen) { 2322 self.nativeFS = true; 2323 self._fullScreenApi.fullScreenEventName = self._fullScreenApi.prefix + 'fullscreenchange' + self.ns; 2324 2325 self._fullScreenApi.isFullScreen = function() { 2326 switch (this.prefix) { 2327 case '': 2328 return document.fullScreen; 2329 case 'webkit': 2330 return document.webkitIsFullScreen; 2331 default: 2332 return document[this.prefix + 'FullScreen']; 2333 } 2334 }; 2335 self._fullScreenApi.requestFullScreen = function(el) { 2336 return (this.prefix === '') ? el.requestFullScreen() : el[this.prefix + 'RequestFullScreen'](); 2337 }; 2338 self._fullScreenApi.cancelFullScreen = function(el) { 2339 return (this.prefix === '') ? document.cancelFullScreen() : document[this.prefix + 'CancelFullScreen'](); 2340 }; 2341 } else { 2342 self._fullScreenApi = false; 2343 } 2344 } 2345 2346 2347 if(self.st.fullscreen.buttonFS) { 2348 self._fsBtn = $('<div class="rsFullscreenBtn"><div class="rsFullscreenIcn"></div></div>') 2349 .appendTo(self._controlsContainer) 2350 .on('click.rs', function() { 2351 if(self.isFullscreen) { 2352 self.exitFullscreen(); 2353 } else { 2354 2355 self.enterFullscreen(); 2356 } 2357 }); 2358 } 2359 }, 2360 enterFullscreen: function(preventNative) { 2361 var self = this; 2362 if( self._fullScreenApi ) { 2363 if(!preventNative) { 2364 self._doc.on( self._fullScreenApi.fullScreenEventName, function(e) { 2365 if(!self._fullScreenApi.isFullScreen()) { 2366 self.exitFullscreen(true); 2367 } else { 2368 self.enterFullscreen(true); 2369 } 2370 }); 2371 self._fullScreenApi.requestFullScreen($('html')[0]); 2372 return; 2373 } else { 2374 self._fullScreenApi.requestFullScreen($('html')[0]); 2375 } 2376 } 2377 2378 if(self._isFullscreenUpdating) { 2379 return; 2380 } 2381 self._isFullscreenUpdating = true; 2382 2383 self._doc.on('keyup' + self.ns + 'fullscreen', function(e) { 2384 if(e.keyCode === 27) { 2385 self.exitFullscreen(); 2386 } 2387 }); 2388 if(self._fsKeyboard) { 2389 self._bindKeyboardNav(); 2390 } 2391 2392 var win = $(window); 2393 self._fsScrollTopOnEnter = win.scrollTop(); 2394 self._fsScrollLeftOnEnter = win.scrollLeft(); 2395 2396 self._htmlStyle = $('html').attr('style'); 2397 self._bodyStyle = $('body').attr('style'); 2398 self._sliderStyle = self.slider.attr('style'); 2399 2400 $('body, html').css({ 2401 overflow: 'hidden', 2402 height: '100%', 2403 width: '100%', 2404 margin: '0', 2405 padding: '0' 2406 }); 2407 2408 self.slider.addClass('rsFullscreen'); 2409 2410 2411 var item, 2412 i; 2413 for(i = 0; i < self.numSlides; i++) { 2414 item = self.slides[i]; 2415 2416 item.isRendered = false;
2417 if(item.bigImage) { 2418 item.isBig = true; 2419 item.isMedLoaded = item.isLoaded; 2420 item.isMedLoading = item.isLoading; 2421 item.medImage = item.image; 2422 item.medIW = item.iW; 2423 item.medIH = item.iH; 2424 item.slideId = -99; 2425 2426 if(item.bigImage !== item.medImage) { 2427 item.sizeType = 'big'; 2428 } 2429 2430 item.isLoaded = item.isBigLoaded; 2431 item.isLoading = false; 2432 item.image = item.bigImage; 2433 item.images[0] = item.bigImage; 2434 item.iW = item.bigIW; 2435 item.iH = item.bigIH; 2436 2437 item.isAppended = item.contentAdded = false; 2438 self._updateItemSrc(item); 2439 } 2440 2441 } 2442 2443 2444 self.isFullscreen = true; 2445 2446 self._isFullscreenUpdating = false; 2447 self.updateSliderSize(); 2448 self.ev.trigger('rsEnterFullscreen'); 2449 2450 }, 2451 exitFullscreen: function(preventNative) { 2452 var self = this; 2453 2454 if( self._fullScreenApi ) { 2455 if(!preventNative) { 2456 self._fullScreenApi.cancelFullScreen($('html')[0]); 2457 return; 2458 } 2459 self._doc.off( self._fullScreenApi.fullScreenEventName ); 2460 } 2461 if(self._isFullscreenUpdating) { 2462 return; 2463 } 2464 self._isFullscreenUpdating = true; 2465 2466 self._doc.off('keyup' + self.ns + 'fullscreen'); 2467 if(self._fsKeyboard) { 2468 self._doc.off('keydown' + self.ns); 2469 } 2470 2471 $('html').attr('style', self._htmlStyle || ''); 2472 $('body').attr('style', self._bodyStyle || ''); 2473 2474 2475 2476 var item, 2477 i; 2478 for(i = 0; i < self.numSlides; i++) { 2479 item = self.slides[i]; 2480 2481 2482 item.isRendered = false; 2483 if(item.bigImage) { 2484 item.isBig = false; 2485 item.slideId = -99; 2486 item.isBigLoaded = item.isLoaded; 2487 item.isBigLoading = item.isLoading; 2488 item.bigImage = item.image; 2489 item.bigIW = item.iW; 2490 item.bigIH = item.iH; 2491 item.isLoaded = item.isMedLoaded; 2492 item.isLoading = false; 2493 item.image = item.medImage; 2494 item.images[0] = item.medImage; 2495 item.iW = item.medIW; 2496 item.iH = item.medIH; 2497 2498 item.isAppended = item.contentAdded = false; 2499 2500 self._updateItemSrc(item, true); 2501 2502 2503 if(item.bigImage !== item.medImage) { 2504 item.sizeType = 'med'; 2505 } 2506 } 2507 } 2508 2509 self.isFullscreen = false; 2510 2511 var win = $(window); 2512 win.scrollTop( self._fsScrollTopOnEnter ); 2513 win.scrollLeft( self._fsScrollLeftOnEnter ); 2514 2515 self._isFullscreenUpdating = false; 2516 self.slider.removeClass('rsFullscreen'); 2517 2518 self.updateSliderSize(); 2519 // fix overflow bug 2520 setTimeout(function() { 2521 self.updateSliderSize(); 2522 },1); 2523 self.ev.trigger('rsExitFullscreen'); 2524 }, 2525 _updateItemSrc: function(item, exit) { 2526 var newHTML = (!item.isLoaded && !item.isLoading) ? '<a class="rsImg rsMainSlideImage" href="'+item.image+'"></a>' : '<img class="rsImg rsMainSlideImage" src="'+item.image+'"/>'; 2527 2528 if(item.content.hasClass('rsImg')) { 2529 item.content = $(newHTML); 2530 } else { 2531 item.content.find('.rsImg').eq(0).replaceWith(newHTML); 2532 } 2533 if(!item.isLoaded && !item.isLoading && item.holder) { 2534 item.holder.html(item.content); 2535 } 2536 } 2537 }); 2538 $.rsModules.fullscreen = $.rsProto._initFullscreen; 2539 2540 /****************************************************************************************************************/ 2541 2542 /** 2543 * 2544 * RoyalSlider bullets module 2545 * @version 1.0.1: 2546 * 2547 * 1.0.1 2548 * - Minor optimizations 2549 * 2550 */ 2551 $.extend($.rsProto, { 2552 _initBullets: function() { 2553 var self = this; 2554 if(self.st.controlNavigation === 'bullets') { 2555 var itemHTML = '<div class="rsNavItem rsBullet"><span></span></div>'; 2556 self.ev.one('rsAfterPropsSetup', function() { 2557 2558 self._controlNavEnabled = true; 2559 self.slider.addClass('rsWithBullets'); 2560 var out = '<div class="rsNav rsBullets">'; 2561 for(var i = 0; i < self.numSlides; i++) { 2562 out += itemHTML; 2563 } 2564 self._controlNav = out = $(out + '</div>'); 2565 self._controlNavItems = out.appendTo(self.slider).children(); 2566 2567 self._controlNav.on('click.rs','.rsNavItem',function(e) { 2568 if(!self._thumbsDrag ) { 2569 self.goTo( $(this).index() ); 2570 } 2571 }); 2572 }); 2573 2574 self.ev.on('rsOnAppendSlide', function(e, parsedSlide, index) { 2575 if(index >= self.numSlides) { 2576 self._controlNav.append(itemHTML); 2577 } else { 2578 self._controlNavItems.eq(index).before(itemHTML); 2579 } 2580 self._controlNavItems = self._controlNav.children(); 2581 }); 2582 self.ev.on('rsOnRemoveSlide', function(e, index) { 2583 var itemToRemove = self._controlNavItems.eq(index); 2584 if(itemToRemove && itemToRemove.length) { 2585 itemToRemove.remove(); 2586 self._controlNavItems = self._controlNav.children(); 2587 } 2588 2589 }); 2590 2591 self.ev.on('rsOnUpdateNav', function() { 2592 var id = self.currSlideId, 2593 currItem, 2594 prevItem; 2595 if(self._prevNavItem) { 2596 self._prevNavItem.removeClass('rsNavSelected'); 2597 } 2598 currItem = self._controlNavItems.eq(id); 2599 2600 currItem.addClass('rsNavSelected'); 2601 self._prevNavItem = currItem; 2602 }); 2603 } 2604 } 2605 }); 2606 $.rsModules.bullets = $.rsProto._initBullets; 2607 2608 /****************************************************************************************************************/ 2609 /** 2610 * 2611 * RoyalSlider auto height module 2612 * @version 1.0.2: 2613 * 2614 * 1.0.2 2615 * - Changed "on" to "one" in afterInit event listener 2616 * - Removed id="clear" 2617 */ 2618 $.extend($.rsProto, { 2619 _initAutoHeight: function() { 2620 var self = this; 2621 if(self.st.autoHeight) { 2622 var holder, 2623 tH, 2624 currSlide, 2625 currHeight, 2626 updHeight = function(animate) { 2627 currSlide = self.slides[self.currSlideId]; 2628 holder = currSlide.holder; 2629 2630 if(holder) { 2631 tH = holder.height(); 2632 if(tH && tH !== currHeight) { 2633 self._wrapHeight = tH; 2634 if(self._useCSS3Transitions || !animate) { 2635 self._sliderOverflow.css('height', tH); 2636 } else { 2637 self._sliderOverflow.stop(true,true).animate({height: tH}, self.st.transitionSpeed); 2638 } 2639 } 2640 } 2641 }; 2642 2643 self.ev.on('rsMaybeSizeReady.rsAutoHeight', function(e, slideObject) { 2644 if(currSlide === slideObject) { 2645 updHeight(); 2646 } 2647 }); 2648 2649 self.ev.on('rsAfterContentSet.rsAutoHeight', function(e, slideObject) { 2650 if(currSlide === slideObject) { 2651 updHeight(); 2652 } 2653 }); 2654 2655 2656 2657 self.slider.addClass('rsAutoHeight'); 2658 self.ev.one('rsAfterInit', function() { 2659 setTimeout(function() { 2660 updHeight(false); 2661 setTimeout(function() { 2662 self.slider.append('<div style="clear:both; float: none;"></div>'); 2663 if(self._useCSS3Transitions) { 2664 self._sliderOverflow.css(self._vendorPref + 'transition', 'height ' + self.st.transitionSpeed + 'ms ease-in-out'); 2665 } 2666 }, 16); 2667 }, 16); 2668 }); 2669 self.ev.on('rsBeforeAnimStart', function() { 2670 updHeight(true); 2671 }); 2672 self.ev.on('rsBeforeSizeSet' , function() { 2673 setTimeout(function() { 2674 updHeight(false); 2675 }, 16); 2676 }); 2677 } 2678 2679 } 2680 }); 2681 $.rsModules.autoHeight = $.rsProto._initAutoHeight; 2682 2683 /****************************************************************************************************************/ 2684 2685 /** 2686 * 2687 * RoyalSlider video module 2688 * @version 1.1.0: 2689 * 2690 * 1.0.3: 2691 * - Added rsOnDestroyVideoElement event 2692 * 2693 * 1.0.4: 2694 * - Added wmode=transparent to default YouTube video embed code 2695 * 2696 * 1.0.5 2697 * - Fixed bug: HTMl5 YouTube player sometimes keeps playing in ie9 after closing 2698 * 2699 * 1.0.6 2700 * - A bit lightened Vimeo and YouTube regex 2701 * 2702 * 1.0.7 2703 * - Minor optimizations 2704 * - Added autoHideCaption option 2705 * 2706 * 1.0.9 2707 * - Fixed error that could appear if updateSliderSize method is called directly after video close 2708 * 2709 * 1.1.0 2710 * - Video is now removed in rsAfterSlideChange event to avoid transition lag
2711 * - Fixed bug that could cause appearing of arrows with auto-hide 2712 */ 2713 $.extend($.rsProto, { 2714 _initVideo: function() { 2715 var self = this; 2716 self._videoDefaults = { 2717 autoHideArrows: true, 2718 autoHideControlNav: false, 2719 autoHideBlocks: false, 2720 autoHideCaption: false, 2721 youTubeCode: '<iframe src="http://www.youtube.com/embed/%id%?rel=1&autoplay=1&showinfo=0&autoplay=1&wmode=transparent" frameborder="no"></iframe>', 2722 vimeoCode: '<iframe src="http://player.vimeo.com/video/%id%?byline=0&portrait=0&autoplay=1" frameborder="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>' 2723 }; 2724 2725 self.st.video = $.extend({}, self._videoDefaults, self.st.video); 2726 2727 self.ev.on('rsBeforeSizeSet', function() { 2728 if(self._isVideoPlaying) { 2729 setTimeout(function() { 2730 var content = self._currHolder; 2731 content = content.hasClass('rsVideoContainer') ? content : content.find('.rsVideoContainer'); 2732 if(self._videoFrameHolder) { 2733 self._videoFrameHolder.css({ 2734 width: content.width(), 2735 height: content.height() 2736 }); 2737 } 2738 }, 32); 2739 } 2740 }); 2741 var isFF = self._browser.mozilla; 2742 self.ev.on('rsAfterParseNode', function(e, content, obj) { 2743 var jqcontent = $(content), 2744 tempEl, 2745 hasVideo; 2746 2747 if(obj.videoURL) { 2748 if(!hasVideo && isFF) { 2749 hasVideo = true; 2750 self._useCSS3Transitions = self._use3dTransform = false; 2751 } 2752 var wrap = $('<div class="rsVideoContainer"></div>'), 2753 playBtn = $('<div class="rsBtnCenterer"><div class="rsPlayBtn"><div class="rsPlayBtnIcon"></div></div></div>'); 2754 if(jqcontent.hasClass('rsImg')) { 2755 obj.content = wrap.append(jqcontent).append(playBtn); 2756 } else { 2757 obj.content.find('.rsImg').wrap(wrap).after(playBtn); 2758 } 2759 } 2760 }); 2761 2762 self.ev.on('rsAfterSlideChange', function() { 2763 self.stopVideo(); 2764 }); 2765 2766 }, 2767 toggleVideo: function() { 2768 var self = this; 2769 if(!self._isVideoPlaying) { 2770 return self.playVideo(); 2771 } else { 2772 return self.stopVideo(); 2773 } 2774 }, 2775 playVideo: function() { 2776 var self = this; 2777 if(!self._isVideoPlaying) { 2778 var currSlide = self.currSlide; 2779 if(!currSlide.videoURL) { 2780 return false; 2781 } 2782 2783 2784 var content = self._currVideoContent = currSlide.content; 2785 var url = currSlide.videoURL, 2786 videoId, 2787 regExp, 2788 match; 2789 2790 if( url.match(/youtu\.be/i) || url.match(/youtube\.com/i) ) { 2791 2792 regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; 2793 2794 2795 match = url.match(regExp); 2796 if (match && match[7].length==11){ 2797 videoId = match[7]; 2798 } 2799 2800 if(videoId !== undefined) { 2801 self._videoFrameHolder = self.st.video.youTubeCode.replace("%id%", videoId); 2802 } 2803 } else if(url.match(/vimeo\.com/i)) { 2804 regExp = /(www\.)?vimeo.com\/(\d+)($|\/)/; 2805 match = url.match(regExp); 2806 if(match) { 2807 videoId = match[2]; 2808 } 2809 if(videoId !== undefined) { 2810 self._videoFrameHolder = self.st.video.vimeoCode.replace("%id%", videoId); 2811 } 2812 } 2813 self.videoObj = $(self._videoFrameHolder); 2814 2815 self.ev.trigger('rsOnCreateVideoElement', [url]); 2816 2817 2818 if(self.videoObj.length) { 2819 self._videoFrameHolder = $('<div class="rsVideoFrameHolder"><div class="rsPreloader"></div><div class="rsCloseVideoBtn"><div class="rsCloseVideoIcn"></div></div></div>'); 2820 self._videoFrameHolder.find('.rsPreloader').after(self.videoObj); 2821 content = content.hasClass('rsVideoContainer') ? content : content.find('.rsVideoContainer'); 2822 self._videoFrameHolder.css({ 2823 width: content.width(), 2824 height: content.height() 2825 }).find('.rsCloseVideoBtn').off('click.rsv').on('click.rsv', function(e) { 2826 self.stopVideo(); 2827 e.preventDefault(); 2828 e.stopPropagation(); 2829 return false; 2830 }); 2831 content.append(self._videoFrameHolder); 2832 if(self.isIPAD) { 2833 content.addClass('rsIOSVideo'); 2834 } 2835 2836 self._toggleHiddenClass(false); 2837 2838 setTimeout(function() { 2839 self._videoFrameHolder.addClass('rsVideoActive'); 2840 }, 10); 2841 self.ev.trigger('rsVideoPlay'); 2842 self._isVideoPlaying = true; 2843 } 2844 return true; 2845 } 2846 return false;
2847 }, 2848 stopVideo: function() { 2849 var self = this; 2850 if(self._isVideoPlaying) { 2851 if(self.isIPAD) { 2852 self.slider.find('.rsCloseVideoBtn').remove(); 2853 } 2854 2855 self._toggleHiddenClass(true); 2856 2857 setTimeout(function() { 2858 self.ev.trigger('rsOnDestroyVideoElement', [self.videoObj]); 2859 var ifr = self._videoFrameHolder.find('iframe'); 2860 if(ifr.length) { 2861 try { 2862 ifr.attr('src', ""); 2863 } catch(ex) { } 2864 } 2865 self._videoFrameHolder.remove(); 2866 self._videoFrameHolder = null; 2867 }, 16); 2868 self.ev.trigger('rsVideoStop'); 2869 self._isVideoPlaying = false; 2870 return true; 2871 } 2872 return false; 2873 }, 2874 _toggleHiddenClass: function(remove) { 2875 var arr = [], 2876 self = this, 2877 vst = self.st.video; 2878 if(vst.autoHideArrows) { 2879 if(self._arrowLeft) { 2880 arr.push(self._arrowLeft, self._arrowRight); 2881 self._arrowsAutoHideLocked = !remove; 2882 } 2883 if(self._fsBtn) { 2884 arr.push(self._fsBtn); 2885 } 2886 } 2887 if(vst.autoHideControlNav && self._controlNav) { 2888 arr.push(self._controlNav); 2889 } 2890 if(vst.autoHideBlocks && self.currSlide.animBlocks) { 2891 arr.push(self.currSlide.animBlocks); 2892 } 2893 if(vst.autoHideCaption && self.globalCaption) { 2894 arr.push(self.globalCaption); 2895 } 2896 2897 if(arr.length) { 2898 for(var i = 0; i < arr.length; i++) { 2899 if(!remove) { 2900 arr[i].addClass('rsHidden'); 2901 } else { 2902 arr[i].removeClass('rsHidden'); 2903 } 2904 } 2905 } 2906 } 2907 }); 2908 $.rsModules.video = $.rsProto._initVideo; 2909 2910 /****************************************************************************************************************/ 2911 2912 /** 2913 * 2914 * RoyalSlider auto play module 2915 * @version 1.0.5: 2916 * 2917 * 1.0.3: 2918 * - added support for 'autoplay' property name. 2919 * 2920 * 1.0.4 2921 * - added toggleAutoPlay public method 2922 * 2923 * 1.0.5 2924 * - Fixed issue when autoPlay may not pause when switching browser tabs 2925 */ 2926 $.extend($.rsProto, { 2927 _initAutoplay: function() { 2928 var self = this, 2929 del; 2930 2931 self._autoPlayDefaults = { 2932 enabled: false, 2933 stopAtAction: true, 2934 pauseOnHover: true, 2935 delay: 2000 2936 }; 2937 2938 // fix deprecated name 2939 if(!self.st.autoPlay && self.st.autoplay) { 2940 self.st.autoPlay = self.st.autoplay; 2941 } 2942 self.st.autoPlay = $.extend({}, self._autoPlayDefaults, self.st.autoPlay); 2943 2944 if(self.st.autoPlay.enabled) { 2945 self.ev.on('rsBeforeParseNode', function(e, content, obj) { 2946 content = $(content); 2947 del = content.attr('data-rsDelay'); 2948 if(del) { 2949 obj.customDelay = parseInt(del, 10); 2950 } 2951 }); 2952 self.ev.one('rsAfterInit', function() { 2953 self._setupAutoPlay(); 2954 }); 2955 self.ev.on('rsBeforeDestroy', function() { 2956 self.stopAutoPlay(); 2957 $(window).off('blur'+self.ns + ' focus' + self.ns); 2958 }); 2959 2960 } 2961 }, 2962 _setupAutoPlay: function() { 2963 var self = this; 2964 2965 self.startAutoPlay(); 2966 2967 self.ev.on('rsAfterContentSet', function(e, slideObject) { 2968 if(!self._isDragging && !self._isAnimating && self._autoPlayEnabled && slideObject === self.currSlide ) { 2969 self._play(); 2970 } 2971 }); 2972 self.ev.on('rsDragRelease', function() { 2973 if(self._autoPlayEnabled && self._autoPlayPaused) { 2974 self._autoPlayPaused = false; 2975 self._play(); 2976 } 2977 }); 2978 self.ev.on('rsAfterSlideChange', function() { 2979 if(self._autoPlayEnabled) { 2980 if(self._autoPlayPaused) { 2981 self._autoPlayPaused = false; 2982 2983 if(self.currSlide.isLoaded) { 2984 self._play(); 2985 } 2986 } 2987 } 2988 }); 2989 self.ev.on('rsDragStart', function() { 2990 if(self._autoPlayEnabled) { 2991 if(self.st.autoPlay.stopAtAction) { 2992 self.stopAutoPlay(); 2993 } else { 2994 self._autoPlayPaused = true; 2995 self._pause(); 2996 } 2997 } 2998 }); 2999 self.ev.on('rsBeforeMove', function(e, type, userAction) { 3000 if(self._autoPlayEnabled) { 3001 if(userAction && self.st.autoPlay.stopAtAction) { 3002 self.stopAutoPlay(); 3003 } else { 3004 self._autoPlayPaused = true; 3005 self._pause(); 3006 } 3007 } 3008 }); 3009 3010 self._pausedByVideo = false; 3011 self.ev.on('rsVideoStop', function() { 3012 if(self._autoPlayEnabled) { 3013 self._pausedByVideo = false; 3014 self._play(); 3015 } 3016 }); 3017 self.ev.on('rsVideoPlay', function() { 3018 if(self._autoPlayEnabled) { 3019 self._autoPlayPaused = false;
3020 self._pause(); 3021 self._pausedByVideo = true; 3022 } 3023 }); 3024 3025 $(window).on('blur'+self.ns, function(){ 3026 if(self._autoPlayEnabled) { 3027 self._autoPlayPaused = true; 3028 self._pause(); 3029 } 3030 }).on('focus'+self.ns, function(){ 3031 if(self._autoPlayEnabled && self._autoPlayPaused) { 3032 self._autoPlayPaused = false; 3033 self._play(); 3034 } 3035 }); 3036 3037 if(self.st.autoPlay.pauseOnHover) { 3038 self._pausedByHover = false; 3039 self.slider.hover( 3040 function() { 3041 if(self._autoPlayEnabled) { 3042 self._autoPlayPaused = false; 3043 self._pause(); 3044 self._pausedByHover = true; 3045 } 3046 }, 3047 function() { 3048 if(self._autoPlayEnabled) { 3049 self._pausedByHover = false; 3050 self._play(); 3051 } 3052 } 3053 ); 3054 } 3055 3056 }, 3057 toggleAutoPlay: function() { 3058 var self = this; 3059 if(self._autoPlayEnabled) { 3060 self.stopAutoPlay(); 3061 } else { 3062 self.startAutoPlay(); 3063 } 3064 }, 3065 startAutoPlay: function() { 3066 var self = this; 3067 self._autoPlayEnabled = true; 3068 if(self.currSlide.isLoaded) { 3069 self._play(); 3070 } 3071 }, 3072 stopAutoPlay: function() { 3073 var self = this; 3074 self._pausedByVideo = self._pausedByHover = self._autoPlayPaused = self._autoPlayEnabled = false; 3075 self._pause(); 3076 }, 3077 _play: function() { 3078 var self = this; 3079 self.ev.trigger('autoPlayPlay'); 3080 3081 if(!self._pausedByHover && !self._pausedByVideo) { 3082 self._autoPlayRunning = true; 3083 if(self._autoPlayTimeout) { 3084 clearTimeout(self._autoPlayTimeout); 3085 } 3086 self._autoPlayTimeout = setTimeout(function() { 3087 var changed; 3088 if(!self._loop && !self.st.loopRewind) { 3089 changed = true; 3090 self.st.loopRewind = true; 3091 } 3092 self.next(true); 3093 if(changed) { 3094 changed = false; 3095 self.st.loopRewind = false; 3096 } 3097 }, !self.currSlide.customDelay ? self.st.autoPlay.delay : self.currSlide.customDelay); 3098 } 3099 3100 }, 3101 _pause: function() { 3102 var self = this; 3103 self.ev.trigger('autoPlayPause'); 3104 3105 if(!self._pausedByHover && !self._pausedByVideo) { 3106 self._autoPlayRunning = false; 3107 if(self._autoPlayTimeout) { 3108 clearTimeout(self._autoPlayTimeout); 3109 self._autoPlayTimeout = null; 3110 } 3111 } 3112 } 3113 }); 3114 $.rsModules.autoplay = $.rsProto._initAutoplay; 3115 3116 /****************************************************************************************************************/ 3117 3118 /** 3119 * 3120 * RoyalSlider animated blocks module 3121 * @version 1.0.6: 3122 * 3123 * 1.0.2: 3124 * - Fixed mistake from prev fix :/ 3125 * 3126 * 1.0.3: 3127 * - Fixed animated block appearing in Firefox 3128 * 3129 * 1.0.4 3130 * - Fixed bug that could cause incorrect block when randomizeSlides is enabled 3131 * 3132 * 1.0.5 3133 * - moveEffect:none' bug 3134 * 3135 * 1.0.6 3136 * - Fixed issue that could cause incorrect position of blocks in IE 3137 */ 3138 $.extend($.rsProto, { 3139 _initAnimatedBlocks: function() { 3140 var self = this, 3141 i; 3142 3143 self._blockDefaults = { 3144 fadeEffect: true, 3145 moveEffect: 'top', 3146 moveOffset:20, 3147 speed:400, 3148 easing:'easeOutSine', 3149 delay:200 3150 }; 3151 self.st.block = $.extend({}, self._blockDefaults, self.st.block); 3152 3153 self._blockAnimProps = []; 3154 self._animatedBlockTimeouts = []; 3155 3156 self.ev.on('rsAfterInit', function() { 3157 runBlocks(); 3158 }); 3159 3160 self.ev.on('rsBeforeParseNode', function(e, content, obj) { 3161 content = $(content); 3162 3163 obj.animBlocks = content.find('.rsABlock').css('display', 'none'); 3164 if(!obj.animBlocks.length) { 3165 if(content.hasClass('rsABlock')) { 3166 obj.animBlocks = content.css('display', 'none'); 3167 } else { 3168 obj.animBlocks = false; 3169 } 3170 } 3171 }); 3172 self.ev.on('rsAfterContentSet', function(e, slideObject) { 3173 var currId = self.slides[self.currSlideId].id; 3174 if(slideObject.id === currId) { 3175 setTimeout(function() { 3176 runBlocks(); 3177 }, self.st.fadeinLoadedSlide ? 300 : 0); 3178 } 3179 }); 3180 3181 self.ev.on('rsAfterSlideChange', function() { 3182 runBlocks(); 3183 }); 3184 function runBlocks() { 3185 var slide = self.currSlide; 3186 if(!self.currSlide || !self.currSlide.isLoaded) { 3187 return; 3188 } 3189 3190 // clear previous animations 3191 if(self._slideWithBlocks !== slide) { 3192 if(self._animatedBlockTimeouts.length > 0) { 3193 for(i = 0; i < self._animatedBlockTimeouts.length; i++) { 3194 clearTimeout(self._animatedBlockTimeouts[i]); 3195 } 3196 self._animatedBlockTimeouts = []; 3197 } 3198 3199 if(self._blockAnimProps.length > 0) { 3200 var cItemTemp; 3201 for(i = 0; i < self._blockAnimProps.length; i++) { 3202 cItemTemp = self._blockAnimProps[i]; 3203 if(cItemTemp) { 3204 if(!self._useCSS3Transitions) { 3205 // if(cItemTemp.running) { 3206 // cItemTemp.block.stop(true, true); 3207 // } else { 3208 cItemTemp.block.stop(true).css(cItemTemp.css); 3209 //} 3210 } else { 3211 cItemTemp.block.css(self._vendorPref + self._TD, '0s'); 3212 cItemTemp.block.css(cItemTemp.css); 3213 } 3214 self._slideWithBlocks = null; 3215 slide.animBlocksDisplayed = false;
3216 } 3217 } 3218 self._blockAnimProps = []; 3219 } 3220 if(slide.animBlocks) { 3221 slide.animBlocksDisplayed = true; 3222 self._slideWithBlocks = slide; 3223 self._animateBlocks(slide.animBlocks); 3224 } 3225 } 3226 } 3227 }, 3228 _updateAnimBlockProps: function(obj, props) { 3229 setTimeout(function() { 3230 obj.css(props); 3231 }, 6); 3232 }, 3233 _animateBlocks: function(animBlocks) { 3234 var self = this, 3235 item, 3236 animObj, 3237 newPropObj, 3238 transitionData; 3239 3240 var currItem, 3241 fadeEnabled, 3242 moveEnabled, 3243 effectName, 3244 effectsObject, 3245 moveEffectProperty, 3246 currEffects, 3247 newEffectObj, 3248 moveOffset, 3249 delay, 3250 speed, 3251 easing, 3252 moveProp, 3253 i; 3254 3255 self._animatedBlockTimeouts = []; 3256 3257 animBlocks.each(function(index) { 3258 3259 item = $(this); 3260 3261 3262 animObj = {}; 3263 newPropObj = {}; 3264 transitionData = null; 3265 3266 var moveOffset = item.data('move-offset'); 3267 if(isNaN(moveOffset)) { 3268 moveOffset = self.st.block.moveOffset; 3269 } 3270 3271 if(moveOffset > 0) { 3272 var moveEffect = item.data('move-effect'); 3273 if(moveEffect) { 3274 moveEffect = moveEffect.toLowerCase(); 3275 if(moveEffect === 'none') { 3276 moveEffect = false; 3277 } else if(moveEffect !== 'left' && moveEffect !== 'top' && moveEffect !== 'bottom' && moveEffect !== 'right') { 3278 moveEffect = self.st.block.moveEffect; 3279 if(moveEffect === 'none') { 3280 moveEffect = false; 3281 } 3282 } 3283 } else { 3284 moveEffect = self.st.block.moveEffect; 3285 } 3286 if(moveEffect && moveEffect !== 'none') { 3287 var moveHorizontal; 3288 if(moveEffect === 'right' || moveEffect === 'left') { 3289 moveHorizontal = true; 3290 } else { 3291 moveHorizontal = false; 3292 } 3293 var currPos, 3294 moveProp, 3295 startPos; 3296 3297 isOppositeProp = false; 3298 3299 if(self._useCSS3Transitions) { 3300 currPos = 0; 3301 moveProp = self._xProp; 3302 } else { 3303 if(moveHorizontal) { 3304 if( !isNaN( parseInt(item.css('right'), 10) ) ) { 3305 moveProp = 'right'; 3306 isOppositeProp = true; 3307 } else { 3308 moveProp = 'left'; 3309 } 3310 } else { 3311 3312 if( !isNaN( parseInt(item.css('bottom'), 10) ) ) { 3313 moveProp = 'bottom'; 3314 isOppositeProp = true; 3315 } else { 3316 moveProp = 'top'; 3317 } 3318 } 3319 moveProp = 'margin-'+moveProp; 3320 if(isOppositeProp) { 3321 moveOffset = -moveOffset; 3322 } 3323 3324 if(!self._useCSS3Transitions) { 3325 currPos = item.data('rs-start-move-prop'); 3326 if( currPos === undefined ) { 3327 currPos = parseInt(item.css(moveProp), 10); 3328 item.data('rs-start-move-prop', currPos); 3329 } 3330 } else { 3331 currPos = parseInt(item.css(moveProp), 10); 3332 } 3333 3334 3335 } 3336 3337 if(moveEffect === 'top' || moveEffect === 'left') { 3338 startPos = currPos - moveOffset; 3339 } else { 3340 startPos = currPos + moveOffset; 3341 } 3342 3343 newPropObj[moveProp] = self._getCSS3Prop(startPos, moveHorizontal); 3344 animObj[moveProp] = self._getCSS3Prop(currPos, moveHorizontal); 3345 3346 } 3347 } 3348 3349 3350 var fadeEffect = item.attr('data-fade-effect'); 3351 if(!fadeEffect) { 3352 fadeEffect = self.st.block.fadeEffect; 3353 } else if(fadeEffect.toLowerCase() === 'none' || fadeEffect.toLowerCase() === 'false') { 3354 fadeEffect = false; 3355 } 3356 if(fadeEffect) { 3357 newPropObj.opacity = 0; 3358 animObj.opacity = 1; 3359 } 3360 3361 if(fadeEffect || moveEffect) { 3362 transitionData = {}; 3363 transitionData.hasFade = Boolean(fadeEffect); 3364 if(Boolean(moveEffect)) { 3365 transitionData.moveProp = moveProp; 3366 transitionData.hasMove = true; 3367 } 3368 3369 transitionData.speed = item.data('speed'); 3370 if(isNaN(transitionData.speed)) { 3371 transitionData.speed = self.st.block.speed; 3372 } 3373 transitionData.easing = item.data('easing'); 3374 if(!transitionData.easing) { 3375 transitionData.easing = self.st.block.easing; 3376 } 3377 transitionData.css3Easing = $.rsCSS3Easing[transitionData.easing]; 3378 3379 transitionData.delay = item.data('delay'); 3380 if(isNaN(transitionData.delay)) { 3381 transitionData.delay = self.st.block.delay * index; 3382 } 3383 3384 } 3385 3386 var blockPropsObj = {}; 3387 if(self._useCSS3Transitions) { 3388 blockPropsObj[(self._vendorPref + self._TD)] = '0ms'; 3389 } 3390 blockPropsObj.moveProp = animObj.moveProp; 3391 blockPropsObj.opacity = animObj.opacity; 3392 blockPropsObj.display = 'none'; 3393 3394 3395 self._blockAnimProps.push({block:item, css:blockPropsObj}); 3396 3397 self._updateAnimBlockProps(item, newPropObj); 3398
3399 // animate caption 3400 self._animatedBlockTimeouts.push(setTimeout((function (cItem, animateData, transitionData, index) { 3401 return function() { 3402 cItem.css('display', 'block'); 3403 if(transitionData) { 3404 var animObj = {}; 3405 if(!self._useCSS3Transitions) { 3406 setTimeout(function() { 3407 cItem.animate(animateData, transitionData.speed, transitionData.easing); 3408 }, 16); 3409 } else { 3410 var prop = ''; 3411 if(transitionData.hasMove) { 3412 prop += transitionData.moveProp; 3413 } 3414 if(transitionData.hasFade) { 3415 if(transitionData.hasMove) { 3416 prop += ', '; 3417 } 3418 prop += 'opacity'; 3419 } 3420 animObj[(self._vendorPref + self._TP)] = prop; 3421 animObj[(self._vendorPref + self._TD)] = transitionData.speed + 'ms'; 3422 animObj[(self._vendorPref + self._TTF)] = transitionData.css3Easing; 3423 cItem.css(animObj); 3424 setTimeout(function() { 3425 cItem.css(animateData); 3426 }, 24); 3427 } 3428 } 3429 3430 delete self._animatedBlockTimeouts[index]; 3431 }; 3432 })(item, animObj, transitionData, index), transitionData.delay <= 6 ? 12 : transitionData.delay)); 3433 //} 3434 3435 3436 3437 }); 3438 } 3439 }); 3440 $.rsModules.animatedBlocks = $.rsProto._initAnimatedBlocks; 3441 3442 /****************************************************************************************************************/ 3443 3444 /** 3445 * 3446 * RoyalSlider porthole-thumbnails module by Miroslav Varsky (from Dream-Theme.com) 3447 * @version 1.0.b: 3448 * 3449 */ 3450 $.extend($.rsProto, { 3451 _initThumbs: function() { 3452 var self = this; 3453 if(self.st.controlNavigation === 'porthole') { 3454 3455 self._thumbsDefaults = { 3456 drag: false, 3457 touch: false, 3458 orientation: 'vertical', 3459 navigation: true, 3460 spacing: 10, 3461 appendSpan: false, 3462 transitionSpeed:600, 3463 autoCenter: true, 3464 fitInViewport: true, 3465 firstMargin: true, 3466 paddingTop: 0, 3467 paddingBottom: 0 3468 }; 3469 3470 self.st.thumbs = $.extend({}, self._thumbsDefaults, self.st.thumbs); 3471 self._firstThumbMoved = true; 3472 if(self.st.thumbs.firstMargin === false) { self.st.thumbs.firstMargin = 0; } 3473 else if(self.st.thumbs.firstMargin === true) { self.st.thumbs.firstMargin = self.st.thumbs.spacing; } 3474 3475 self.ev.on('rsBeforeParseNode', function(e, content, obj) { 3476 content = $(content); 3477 obj.thumbnail = content.find('.rsTmb').remove(); 3478 if(!obj.thumbnail.length) { 3479 obj.thumbnail = content.attr('data-rsTmb'); 3480 if(!obj.thumbnail) { 3481 obj.thumbnail = content.find('.rsImg').attr('data-rsTmb'); 3482 } 3483 if(!obj.thumbnail) { 3484 obj.thumbnail = ''; 3485 } else { 3486 obj.thumbnail = '<img src="'+obj.thumbnail+'" width="150" height="150" />'; 3487 } 3488 } else { 3489 obj.thumbnail = $(document.createElement('div')).append(obj.thumbnail).html(); 3490 } 3491 }); 3492 3493 self.ev.one('rsAfterPropsSetup', function() { 3494 self._createThumbs(); 3495 }); 3496 3497 self._prevNavItem = null; 3498 3499 self.ev.on('rsOnUpdateNav', function() { 3500 3501 //self._controlNavItems.attr('class', 'rsNavItem rsThumb'); 3502 3503 var currItem = $(self._controlNavItems[self.currSlideId]); 3504 if(currItem === self._prevNavItem) { 3505 return; 3506 } 3507 if(self._prevNavItem) { 3508 self._prevNavItem = null; 3509 } 3510 if(self._thumbsNavigation) { 3511 self._setCurrentThumb(self.currSlideId); 3512 } 3513 3514 self._prevNavItem = currItem; 3515 3516 self._controlNavItems.each(function() { 3517 if (self._prevNavItem[0]===this) { 3518 $(this).attr('class', 'rsNavItem rsThumb rsNavSelected'); 3519 } 3520 else if (self._prevNavItem.prev().prev()[0]===this || self._prevNavItem.next().next()[0]===this) { 3521 $(this).attr('class', 'rsNavItem rsThumb rsNavVis'); 3522 } 3523 else if (self._prevNavItem.prev()[0]===this) { 3524 $(this).attr('class', 'rsNavItem rsThumb rsNavPrev'); 3525 } 3526 else if (self._prevNavItem.next()[0]===this) { 3527 $(this).attr('class', 'rsNavItem rsThumb rsNavNext'); 3528 } 3529 else { 3530 $(this).attr('class', 'rsNavItem rsThumb'); 3531 } 3532 }); 3533 3534 3535 }); 3536 3537 self.ev.on('rsOnAppendSlide', function(e, parsedSlide, index) { 3538 var html = '<div'+self._thumbsMargin+' class="rsNavItem rsThumb">'+self._addThumbHTML+parsedSlide.thumbnail+'</div>'; 3539 if(index >= self.numSlides) { 3540 self._thumbsContainer.append(html); 3541 } else { 3542 self._controlNavItems.eq(index).before(html); 3543 } 3544 self._controlNavItems = self._thumbsContainer.children(); 3545 self.updateThumbsSize(); 3546 }); 3547 self.ev.on('rsOnRemoveSlide', function(e, index) { 3548 var itemToRemove = self._controlNavItems.eq(index); 3549 if(itemToRemove) { 3550 itemToRemove.remove(); 3551 self._controlNavItems = self._thumbsContainer.children(); 3552 self.updateThumbsSize(); 3553 } 3554 }); 3555 3556 3557 } 3558 }, 3559 _createThumbs: function() { 3560 var self = this, 3561 tText = 'rsThumbs', 3562 thumbSt = self.st.thumbs, 3563 out = '', 3564 style, 3565 item, 3566 spacing = thumbSt.spacing; 3567 3568 self._controlNavEnabled = true; 3569 self._thumbsHorizontal = (thumbSt.orientation === 'vertical') ? false : true; 3570 3571 self._thumbsMargin = style = spacing ? ' style="margin-' + (self._thumbsHorizontal ? 'right' : 'bottom') + ':'+ spacing+'px;"' : ''; 3572 3573 self._thumbsPosition = 0; 3574 self._isThumbsAnimating = false;
3575 self._thumbsDrag = false; 3576 self._thumbsNavigation = false; 3577 3578 var pl = (self._thumbsHorizontal ? 'Hor' : 'Ver'); 3579 self.slider.addClass('rsWithThumbs' + ' rsWithThumbs'+ pl ); 3580 3581 out += '<div class="rsNav rsThumbs rsThumbs'+pl +'"><div class="'+tText+'Container">'; 3582 self._addThumbHTML = thumbSt.appendSpan ? '<span class="thumbIco"></span>' : ''; 3583 for(var i = 0; i < self.numSlides; i++) { 3584 item = self.slides[i]; 3585 out += '<div'+style+' class="rsNavItem rsThumb">'+item.thumbnail+self._addThumbHTML+'</div>'; 3586 } 3587 out = $(out +'</div></div>'); 3588 3589 var o = {}; 3590 if(thumbSt.paddingTop) { 3591 o[self._thumbsHorizontal ? 'paddingTop' : 'paddingLeft'] = thumbSt.paddingTop; 3592 } 3593 if(thumbSt.paddingBottom) { 3594 o[self._thumbsHorizontal ? 'paddingBottom' : 'paddingRight'] = thumbSt.paddingBottom; 3595 } 3596 out.css(o); 3597 3598 self._thumbsContainer = $(out).find('.' + tText + 'Container'); 3599 3600 3601 3602 self._controlNav = out; 3603 self._controlNavItems = self._thumbsContainer.children(); 3604 3605 3606 if(self.msEnabled && self.st.thumbs.navigation) { 3607 self._thumbsContainer.css('-ms-touch-action', self._thumbsHorizontal ? 'pan-y' : 'pan-x'); 3608 } 3609 3610 self.slider.append(out); 3611 3612 self._thumbsEnabled = true; 3613 self._thumbsSpacing = spacing; 3614 3615 3616 if(thumbSt.navigation) { 3617 if(self._useCSS3Transitions) { 3618 self._thumbsContainer.css(self._vendorPref + 'transition-property', self._vendorPref + 'transform'); 3619 } 3620 } 3621 3622 self._controlNav.on('click.rs','.rsNavItem',function(e) { 3623 if(!self._thumbsDrag ) { 3624 self.goTo( $(this).index() ); 3625 } 3626 }); 3627 3628 self.ev.off('rsBeforeSizeSet.thumbs').on('rsBeforeSizeSet.thumbs', function() { 3629 self._realWrapSize = self._thumbsHorizontal ? self._wrapHeight : self._wrapWidth; 3630 self.updateThumbsSize(true); 3631 3632 }); 3633 3634 3635 // fix deprecated name 3636 if(!self.st.autoPlay && self.st.autoplay) { 3637 self.st.autoPlay = self.st.autoplay; 3638 } 3639 3640 if (self.st.autoPlay.enabled) { 3641 self._thumbsContainer.after('<div class="progress-wrapper"><div class="progress-controls"></div></div>'); 3642 self.progressWrap = self._thumbsContainer.next(); 3643 self.progressHtml = '<div class="progress-mask"><div class="progress-spinner-left" style="'+self._vendorPref+'animation-duration: '+self.st.autoPlay.delay+'ms;"></div></div><div class="progress-mask"><div class="progress-spinner-right" style="'+self._vendorPref+'animation-duration: '+self.st.autoPlay.delay+'ms;"></div></div>'; 3644 3645 self.ev.on("autoPlayPlay", function() { 3646 if (self.progressWrap.find(".progress-mask").length < 1) { 3647 self.progressWrap.prepend(self.progressHtml); 3648 } 3649 self.progressWrap.removeClass("paused"); 3650 }); 3651 3652 self.ev.on("autoPlayPause", function() { 3653 self.progressWrap.find(".progress-mask").remove(); 3654 if (!self._autoPlayEnabled) { 3655 self.progressWrap.addClass("paused"); 3656 } 3657 }); 3658 3659 self.ev.on('rsAfterSlideChange', function() { 3660 self.progressWrap.removeClass("blurred"); 3661 }); 3662 3663 self.ev.on('rsBeforeAnimStart', function() { 3664 self.progressWrap.addClass("blurred"); 3665 }); 3666 3667 self.ev.on('rsVideoPlay', function() { 3668 $("body").addClass("hide-thumbnails"); 3669 if (!self.slider.parent().hasClass("fixed")) $("body").addClass("video-playing"); 3670 }); 3671 self.ev.on('rsVideoStop', function() { 3672 $("body").removeClass("video-playing").removeClass("hide-thumbnails"); 3673 }); 3674 3675 self.progressWrap.on("click", function() { 3676 self.toggleAutoPlay(); 3677 }); 3678 } 3679 }, 3680 updateThumbsSize: function(isResize) { 3681 var self = this, 3682 firstThumb = self._controlNavItems.first(), 3683 cssObj = {}; 3684 3685 var numItems = self._controlNavItems.length; 3686 self._thumbSize = ( self._thumbsHorizontal ? firstThumb.outerWidth() : firstThumb.outerHeight() ) + self._thumbsSpacing; 3687 self._thumbsContainerSize = self._thumbsContainer.outerHeight(); // numItems * self._thumbSize - self._thumbsSpacing; 3688 //cssObj[self._thumbsHorizontal ? 'width' : 'height'] = self._thumbsContainerSize + self._thumbsSpacing; 3689 self._thumbsViewportSize = self._thumbsHorizontal ? self._controlNav.width() : self._controlNav.height(); 3690 self._thumbsMaxPosition = -(self._thumbsContainerSize - self._thumbsViewportSize) - (self.st.thumbs.firstMargin); 3691 self._thumbsMinPosition = self.st.thumbs.firstMargin; 3692 self._visibleThumbsPerView = Math.floor(self._thumbsViewportSize / self._thumbSize); // 1; 3693 3694 if(self.st.thumbs.navigation && !self._thumbsNavigation) { 3695 self._thumbsNavigation = true; 3696 if( (!self.hasTouch && self.st.thumbs.drag) || (self.hasTouch && self.st.thumbs.touch)) { 3697 self._thumbsDrag = true; 3698 self._controlNav.on(self._downEvent, function(e) { self._onDragStart(e, true); }); 3699 } 3700 } 3701 3702 if(self._useCSS3Transitions) { 3703 cssObj[(self._vendorPref + 'transition-duration')] = '0ms'; 3704 } 3705 3706 self._thumbsContainer.css(cssObj); 3707 }, 3708 setThumbsOrientation: function(newPlacement, dontUpdateSize) { 3709 var self = this; 3710 if(self._thumbsEnabled) { 3711 self.st.thumbs.orientation = newPlacement; 3712 self._controlNav.remove(); 3713 self.slider.removeClass('rsWithThumbsHor rsWithThumbsVer'); 3714 self._createThumbs(); 3715 self._controlNav.off(self._downEvent); 3716 if(!dontUpdateSize) { 3717 self.updateSliderSize(true); 3718 } 3719 } 3720 }, 3721 _setThumbsPosition: function(pos) { 3722 var self = this; 3723 self._thumbsPosition = pos; 3724 if(self._useCSS3Transitions) { 3725 self._thumbsContainer.css(self._xProp, self._tPref1 + ( self._thumbsHorizontal ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 ); 3726 } else { 3727 self._thumbsContainer.css(self._thumbsHorizontal ? self._xProp : self._yProp, pos); 3728 } 3729 }, 3730 _animateThumbsTo: function(pos, speed, outEasing, bounceAnimPosition, bounceAnimSpeed) { 3731 3732 var self = this; 3733 if(!self._thumbsNavigation) { 3734 return; 3735 } 3736 if(!speed) { 3737 speed = self.st.thumbs.transitionSpeed; 3738 } 3739 self._thumbsPosition = pos; 3740 if(self._thumbsAnimTimeout) { 3741 clearTimeout(self._thumbsAnimTimeout); 3742 } 3743 if(self._isThumbsAnimating) { 3744 if(!self._useCSS3Transitions) { 3745 self._thumbsContainer.stop(); 3746 } 3747 outEasing = true; 3748 } 3749 var animObj = {}; 3750 self._isThumbsAnimating = true; 3751 if(!self._useCSS3Transitions) { 3752 animObj[self._thumbsHorizontal ? self._xProp : self._yProp] = pos + 'px'; 3753 self._thumbsContainer.animate(animObj, speed, outEasing ? 'easeOutCubic' : self.st.easeInOut); 3754 } else { 3755 animObj[(self._vendorPref + 'transition-duration')] = speed+'ms'; 3756 animObj[(self._vendorPref + 'transition-timing-function')] = outEasing ? $.rsCSS3Easing[self.st.easeOut] : $.rsCSS3Easing[self.st.easeInOut]; 3757 self._thumbsContainer.css(animObj); 3758 self._setThumbsPosition(pos); 3759 } 3760 if(bounceAnimPosition) { 3761 self._thumbsPosition = bounceAnimPosition; 3762 } 3763 3764 self._thumbsAnimTimeout = setTimeout(function() { 3765 self._isThumbsAnimating = false;
3766 if(bounceAnimSpeed) { 3767 self._animateThumbsTo(bounceAnimPosition, bounceAnimSpeed, true); 3768 bounceAnimSpeed = null; 3769 } 3770 }, speed); 3771 }, 3772 _setCurrentThumb: function(id, justSet) { 3773 var self = this, 3774 newPos = -id * 40; 3775 3776 if (newPos == 0) { 3777 newPos = 20; 3778 } 3779 3780 if(!self._thumbsNavigation) { 3781 return; 3782 } 3783 3784 if(self._firstThumbMoved) { 3785 justSet = true; 3786 self._firstThumbMoved = false; 3787 } 3788 3789 if(newPos !== self._thumbsPosition) { 3790 if(!justSet) { 3791 self._animateThumbsTo(newPos); 3792 } else { 3793 self._setThumbsPosition(newPos); 3794 } 3795 } 3796 3797/* 3798 if ($("#header").hasClass("overlap") && !$("#main-slideshow").hasClass("fixed")) { 3799 self._controlNav.css({ 3800 "margin-top": -185 + $("#header").outerHeight() / 2 3801 }) 3802 } else if ($("#header").hasClass("overlap") && $("#main-slideshow").hasClass("fixed")) { 3803 self.slider.css({ 3804 "margin-top": $("#header").outerHeight() 3805 }); 3806 } 3807*/ 3808 3809 } 3810 }); 3811 $.rsModules.thumbnails = $.rsProto._initThumbs; 3812})(jQuery, window);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.