1/* 2 * iosSlider - http://iosscripts.com/iosslider/ 3 * 4 * Touch Enabled, Responsive jQuery Horizontal Content Slider/Carousel/Image Gallery Plugin 5 * 6 * A jQuery plugin which allows you to integrate a customizable, cross-browser 7 * content slider into your web presence. Designed for use as a content slider, carousel, 8 * scrolling website banner, or image gallery. 9 * 10 * Copyright (c) 2013 Marc Whitbread 11 * 12 * Version: v1.3.16 (09/24/2013) 13 * Minimum requirements: jQuery v1.4+ 14 * 15 * Advanced requirements: 16 * 1) jQuery bind() click event override on slide requires jQuery v1.6+ 17 * 18 * Terms of use: 19 * 20 * 1) iosSlider is licensed under the Creative Commons â Attribution-NonCommercial 3.0 License. 21 * 2) You may use iosSlider free for personal or non-profit purposes, without restriction. 22 * Attribution is not required but always appreciated. For commercial projects, you 23 * must purchase a license. You may download and play with the script before deciding to 24 * fully implement it in your project. Making sure you are satisfied, and knowing iosSlider 25 * is the right script for your project is paramount. 26 * 3) You are not permitted to make the resources found on iosscripts.com available for 27 * distribution elsewhere "as is" without prior consent. If you would like to feature 28 * iosSlider on your site, please do not link directly to the resource zip files. Please 29 * link to the appropriate page on iosscripts.com where users can find the download. 30 * 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 32 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 33 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 34 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 35 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 36 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 37 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 38 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 39 * OF THE POSSIBILITY OF SUCH DAMAGE. 40 */ 41 42;(function($) { 43 44 /* global variables */ 45 var scrollbarNumber = 0; 46 var xScrollDistance = 0; 47 var yScrollDistance = 0; 48 var scrollIntervalTime = 10; 49 var scrollbarDistance = 0; 50 var isTouch = 'ontouchstart' in window; 51 var supportsOrientationChange = 'onorientationchange' in window; 52 var isWebkit = false; 53 var has3DTransform = false; 54 var isIe7 = false; 55 var isIe8 = false; 56 var isIe9 = false; 57 var isIe = false;
58 var isGecko = false; 59 var grabOutCursor = 'pointer'; 60 var grabInCursor = 'pointer'; 61 var onChangeEventLastFired = new Array(); 62 var autoSlideTimeouts = new Array(); 63 var iosSliders = new Array(); 64 var iosSliderSettings = new Array(); 65 var isEventCleared = new Array(); 66 var slideTimeouts = new Array(); 67 var activeChildOffsets = new Array(); 68 var activeChildInfOffsets = new Array(); 69 var infiniteSliderOffset = new Array(); 70 var sliderMin = new Array(); 71 var sliderMax = new Array(); 72 var sliderAbsMax = new Array(); 73 var touchLocks = new Array(); 74 75 /* private functions */ 76 var helpers = { 77 78 showScrollbar: function(settings, scrollbarClass) { 79 80 if(settings.scrollbarHide) { 81 $('.' + scrollbarClass).css({ 82 opacity: settings.scrollbarOpacity, 83 filter: 'alpha(opacity:' + (settings.scrollbarOpacity * 100) + ')' 84 }); 85 } 86 87 }, 88 89 hideScrollbar: function(settings, scrollTimeouts, j, distanceOffsetArray, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber) { 90 91 if(settings.scrollbar && settings.scrollbarHide) { 92 93 for(var i = j; i < j+25; i++) { 94 95 scrollTimeouts[scrollTimeouts.length] = helpers.hideScrollbarIntervalTimer(scrollIntervalTime * i, distanceOffsetArray[j], ((j + 24) - i) / 24, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber, settings); 96 97 } 98 99 } 100 101 }, 102 103 hideScrollbarInterval: function(newOffset, opacity, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber, settings) { 104 105 scrollbarDistance = (newOffset * -1) / (sliderMax[sliderNumber]) * (stageWidth - scrollMargin - scrollBorder - scrollbarWidth); 106 107 helpers.setSliderOffset('.' + scrollbarClass, scrollbarDistance); 108 109 $('.' + scrollbarClass).css({ 110 opacity: settings.scrollbarOpacity * opacity, 111 filter: 'alpha(opacity:' + (settings.scrollbarOpacity * opacity * 100) + ')' 112 }); 113 114 }, 115 116 slowScrollHorizontalInterval: function(node, slideNodes, newOffset, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, activeChildOffset, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, endOffset, settings) { 117 118 if(settings.infiniteSlider) { 119 120 if(newOffset <= (sliderMax[sliderNumber] * -1)) { 121 122 var scrollerWidth = $(node).width(); 123 124 if(newOffset <= (sliderAbsMax[sliderNumber] * -1)) { 125 126 var sum = originalOffsets[0] * -1; 127 $(slideNodes).each(function(i) { 128 129 helpers.setSliderOffset($(slideNodes)[i], sum + centeredSlideOffset); 130 if(i < childrenOffsets.length) { 131 childrenOffsets[i] = sum * -1; 132 } 133 sum = sum + slideNodeOuterWidths[i]; 134 135 }); 136 137 newOffset = newOffset + childrenOffsets[0] * -1; 138 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 139 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 140 infiniteSliderOffset[sliderNumber] = 0; 141 142 } else { 143 144 var lowSlideNumber = 0; 145 var lowSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 146 $(slideNodes).each(function(i) { 147 148 if(helpers.getSliderOffset(this, 'x') < lowSlideOffset) { 149 lowSlideOffset = helpers.getSliderOffset(this, 'x'); 150 lowSlideNumber = i; 151 } 152 153 }); 154 155 var tempOffset = sliderMin[sliderNumber] + scrollerWidth; 156 helpers.setSliderOffset($(slideNodes)[lowSlideNumber], tempOffset); 157 158 sliderMin[sliderNumber] = childrenOffsets[1] * -1 + centeredSlideOffset; 159 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 160 161 childrenOffsets.splice(0, 1); 162 childrenOffsets.splice(childrenOffsets.length, 0, tempOffset * -1 + centeredSlideOffset); 163 164 infiniteSliderOffset[sliderNumber]++; 165 166 } 167 168 } 169 170 if((newOffset >= (sliderMin[sliderNumber] * -1)) || (newOffset >= 0)) { 171 172 var scrollerWidth = $(node).width(); 173 174 if(newOffset >= 0) { 175 176 var sum = originalOffsets[0] * -1; 177 $(slideNodes).each(function(i) { 178 179 helpers.setSliderOffset($(slideNodes)[i], sum + centeredSlideOffset); 180 if(i < childrenOffsets.length) { 181 childrenOffsets[i] = sum * -1; 182 } 183 sum = sum + slideNodeOuterWidths[i]; 184 185 }); 186 187 newOffset = newOffset - childrenOffsets[0] * -1; 188 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 189 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 190 infiniteSliderOffset[sliderNumber] = numberOfSlides; 191 192 while(((childrenOffsets[0] * -1 - scrollerWidth + centeredSlideOffset) > 0)) { 193 194 var highSlideNumber = 0; 195 var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 196 $(slideNodes).each(function(i) { 197 198 if(helpers.getSliderOffset(this, 'x') > highSlideOffset) { 199 highSlideOffset = helpers.getSliderOffset(this, 'x'); 200 highSlideNumber = i; 201 } 202 203 }); 204 205 var tempOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber]; 206 helpers.setSliderOffset($(slideNodes)[highSlideNumber], tempOffset); 207 208 childrenOffsets.splice(0, 0, tempOffset * -1 + centeredSlideOffset); 209 childrenOffsets.splice(childrenOffsets.length-1, 1); 210 211 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 212 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 213 214 infiniteSliderOffset[sliderNumber]--; 215 activeChildOffsets[sliderNumber]++; 216 217 } 218 219 } 220 221 if(newOffset < 0) { 222 223 var highSlideNumber = 0; 224 var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 225 $(slideNodes).each(function(i) { 226 227 if(helpers.getSliderOffset(this, 'x') > highSlideOffset) { 228 highSlideOffset = helpers.getSliderOffset(this, 'x'); 229 highSlideNumber = i; 230 } 231 232 }); 233 234 var tempOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber]; 235 helpers.setSliderOffset($(slideNodes)[highSlideNumber], tempOffset); 236 237 childrenOffsets.splice(0, 0, tempOffset * -1 + centeredSlideOffset); 238 childrenOffsets.splice(childrenOffsets.length-1, 1); 239 240 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 241 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 242 243 infiniteSliderOffset[sliderNumber]--; 244 245 } 246 247 } 248 249 } 250 251 var slideChanged = false;
252 var newChildOffset = helpers.calcActiveOffset(settings, newOffset, childrenOffsets, stageWidth, infiniteSliderOffset[sliderNumber], numberOfSlides, activeChildOffset, sliderNumber); 253 var tempOffset = (newChildOffset + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 254 255 if(settings.infiniteSlider) { 256 257 if(tempOffset != activeChildInfOffsets[sliderNumber]) slideChanged = true; 258 259 } else { 260 261 if(newChildOffset != activeChildOffsets[sliderNumber]) slideChanged = true; 262 263 } 264 265 if(slideChanged) { 266 267 var args = new helpers.args('change', settings, node, $(node).children(':eq(' + tempOffset + ')'), tempOffset, endOffset); 268 $(node).parent().data('args', args); 269 270 if(settings.onSlideChange != '') { 271 272 settings.onSlideChange(args); 273 274 } 275 276 } 277 278 activeChildOffsets[sliderNumber] = newChildOffset; 279 activeChildInfOffsets[sliderNumber] = tempOffset; 280 281 newOffset = Math.floor(newOffset); 282 283 helpers.setSliderOffset(node, newOffset); 284 285 if(settings.scrollbar) { 286 287 scrollbarDistance = Math.floor((newOffset * -1 - sliderMin[sliderNumber] + centeredSlideOffset) / (sliderMax[sliderNumber] - sliderMin[sliderNumber] + centeredSlideOffset) * (scrollbarStageWidth - scrollMargin - scrollbarWidth)); 288 var width = scrollbarWidth - scrollBorder; 289 290 if(newOffset >= (sliderMin[sliderNumber] * -1 + centeredSlideOffset)) { 291 292 width = scrollbarWidth - scrollBorder - (scrollbarDistance * -1); 293 294 helpers.setSliderOffset($('.' + scrollbarClass), 0); 295 296 $('.' + scrollbarClass).css({ 297 width: width + 'px' 298 }); 299 300 } else if(newOffset <= ((sliderMax[sliderNumber] * -1) + 1)) { 301 302 width = scrollbarStageWidth - scrollMargin - scrollBorder - scrollbarDistance; 303 304 helpers.setSliderOffset($('.' + scrollbarClass), scrollbarDistance); 305 306 $('.' + scrollbarClass).css({ 307 width: width + 'px' 308 }); 309 310 } else { 311 312 helpers.setSliderOffset($('.' + scrollbarClass), scrollbarDistance); 313 314 $('.' + scrollbarClass).css({ 315 width: width + 'px' 316 }); 317 318 } 319 320 } 321 322 }, 323 324 slowScrollHorizontal: function(node, slideNodes, scrollTimeouts, scrollbarClass, xScrollDistance, yScrollDistance, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, currentEventNode, snapOverride, centeredSlideOffset, settings) { 325 326 var nodeOffset = helpers.getSliderOffset(node, 'x'); 327 var distanceOffsetArray = new Array(); 328 var xScrollDistanceArray = new Array(); 329 var snapDirection = 0; 330 var maxSlideVelocity = 25 / 1024 * stageWidth; 331 var changeSlideFired = false; 332 frictionCoefficient = settings.frictionCoefficient; 333 elasticFrictionCoefficient = settings.elasticFrictionCoefficient; 334 snapFrictionCoefficient = settings.snapFrictionCoefficient; 335 336 if((xScrollDistance > settings.snapVelocityThreshold) && settings.snapToChildren && !snapOverride) { 337 snapDirection = 1; 338 } else if((xScrollDistance < (settings.snapVelocityThreshold * -1)) && settings.snapToChildren && !snapOverride) { 339 snapDirection = -1; 340 } 341 342 if(xScrollDistance < (maxSlideVelocity * -1)) { 343 xScrollDistance = maxSlideVelocity * -1; 344 } else if(xScrollDistance > maxSlideVelocity) { 345 xScrollDistance = maxSlideVelocity; 346 } 347 348 if(!($(node)[0] === $(currentEventNode)[0])) { 349 snapDirection = snapDirection * -1; 350 xScrollDistance = xScrollDistance * -2; 351 } 352 353 var tempInfiniteSliderOffset = infiniteSliderOffset[sliderNumber]; 354 355 if(settings.infiniteSlider) { 356 357 var tempSliderMin = sliderMin[sliderNumber]; 358 var tempSliderMax = sliderMax[sliderNumber]; 359 360 } 361 362 var tempChildrenOffsets = new Array(); 363 var tempSlideNodeOffsets = new Array(); 364 365 for(var i = 0; i < childrenOffsets.length; i++) { 366 367 tempChildrenOffsets[i] = childrenOffsets[i]; 368 369 if(i < slideNodes.length) { 370 tempSlideNodeOffsets[i] = helpers.getSliderOffset($(slideNodes[i]), 'x'); 371 } 372 373 } 374 375 while((xScrollDistance > 1) || (xScrollDistance < -1)) { 376 377 xScrollDistance = xScrollDistance * frictionCoefficient; 378 nodeOffset = nodeOffset + xScrollDistance; 379 380 if(((nodeOffset > (sliderMin[sliderNumber] * -1)) || (nodeOffset < (sliderMax[sliderNumber] * -1))) && !sett
380ings.infiniteSlider) { 381 xScrollDistance = xScrollDistance * elasticFrictionCoefficient; 382 nodeOffset = nodeOffset + xScrollDistance; 383 } 384 385 if(settings.infiniteSlider) { 386 387 if(nodeOffset <= (tempSliderMax * -1)) { 388 389 var scrollerWidth = $(node).width(); 390 391 var lowSlideNumber = 0; 392 var lowSlideOffset = tempSlideNodeOffsets[0]; 393 for(var i = 0; i < tempSlideNodeOffsets.length; i++) { 394 395 if(tempSlideNodeOffsets[i] < lowSlideOffset) { 396 lowSlideOffset = tempSlideNodeOffsets[i]; 397 lowSlideNumber = i; 398 } 399 400 } 401 402 var newOffset = tempSliderMin + scrollerWidth; 403 tempSlideNodeOffsets[lowSlideNumber] = newOffset; 404 405 tempSliderMin = tempChildrenOffsets[1] * -1 + centeredSlideOffset; 406 tempSliderMax = tempSliderMin + scrollerWidth - stageWidth; 407 408 tempChildrenOffsets.splice(0, 1); 409 tempChildrenOffsets.splice(tempChildrenOffsets.length, 0, newOffset * -1 + centeredSlideOffset); 410 411 tempInfiniteSliderOffset++; 412 413 } 414 415 if(nodeOffset >= (tempSliderMin * -1)) { 416 417 var scrollerWidth = $(node).width(); 418 419 var highSlideNumber = 0; 420 var highSlideOffset = tempSlideNodeOffsets[0]; 421 for(var i = 0; i < tempSlideNodeOffsets.length; i++) { 422 423 if(tempSlideNodeOffsets[i] > highSlideOffset) { 424 highSlideOffset = tempSlideNodeOffsets[i]; 425 highSlideNumber = i; 426 } 427 428 } 429 430 var newOffset = tempSliderMin - slideNodeOuterWidths[highSlideNumber]; 431 tempSlideNodeOffsets[highSlideNumber] = newOffset; 432 433 tempChildrenOffsets.splice(0, 0, newOffset * -1 + centeredSlideOffset); 434 tempChildrenOffsets.splice(tempChildrenOffsets.length-1, 1); 435 436 tempSliderMin = tempChildrenOffsets[0] * -1 + centeredSlideOffset; 437 tempSliderMax = tempSliderMin + scrollerWidth - stageWidth; 438 439 tempInfiniteSliderOffset--; 440 441 } 442 443 } 444 445 distanceOffsetArray[distanceOffsetArray.length] = nodeOffset; 446 xScrollDistanceArray[xScrollDistanceArray.length] = xScrollDistance; 447 448 } 449 450 var slideChanged = false; 451 var newChildOffset = helpers.calcActiveOffset(settings, nodeOffset, tempChildrenOffsets, stageWidth, tempInfiniteSliderOffset, numberOfSlides, activeChildOffsets[sliderNumber], sliderNumber); 452 453 var tempOffset = (newChildOffset + tempInfiniteSliderOffset + numberOfSlides)%numberOfSlides; 454 455 if(settings.snapToChildren) { 456 457 if(settings.infiniteSlider) { 458 459 if(tempOffset != activeChildInfOffsets[sliderNumber]) { 460 slideChanged = true; 461 } 462 463 } else { 464 465 if(newChildOffset != activeChildOffsets[sliderNumber]) { 466 slideChanged = true; 467 } 468 469 } 470 471 if((snapDirection < 0) && !slideChanged) { 472 473 newChildOffset++; 474 475 if((newChildOffset >
475= childrenOffsets.length) && !settings.infiniteSlider) newChildOffset = childrenOffsets.length - 1; 476 477 } else if((snapDirection > 0) && !slideChanged) { 478 479 newChildOffset--; 480 481 if((newChildOffset < 0) && !settings.infiniteSlider) newChildOffset = 0; 482 483 } 484 485 } 486 487 if(settings.snapToChildren || (((nodeOffset > (sliderMin[sliderNumber] * -1)) || (nodeOffset < (sliderMax[sliderNumber] * -1))) && !settings.infiniteSlider)) { 488 489 if(((nodeOffset > (sliderMin[sliderNumber] * -1)) || (nodeOffset < (sliderMax[sliderNumber] * -1))) && !settings.infiniteSlider) { 490 distanceOffsetArray.splice(0, distanceOffsetArray.length); 491 } else { 492 distanceOffsetArray.splice(distanceOffsetArray.length * 0.10, distanceOffsetArray.length); 493 nodeOffset = (distanceOffsetArray.length > 0) ? distanceOffsetArray[distanceOffsetArray.length-1] : nodeOffset; 494 } 495 496 while((nodeOffset < (tempChildrenOffsets[newChildOffset] - 0.5)) || (nodeOffset > (tempChildrenOffsets[newChildOffset] + 0.5))) { 497 498 nodeOffset = ((nodeOffset - (tempChildrenOffsets[newChildOffset])) * snapFrictionCoefficient) + (tempChildrenOffsets[newChildOffset]); 499 distanceOffsetArray[distanceOffsetArray.length] = nodeOffset; 500 501 } 502 503 distanceOffsetArray[distanceOffsetArray.length] = tempChildrenOffsets[newChildOffset]; 504 } 505 506 var jStart = 1; 507 if((distanceOffsetArray.length%2) != 0) { 508 jStart = 0; 509 } 510 511 var lastTimeoutRegistered = 0; 512 var count = 0; 513 514 for(var j = 0; j < scrollTimeouts.length; j++) { 515 clearTimeout(scrollTimeouts[j]); 516 } 517 518 var endOffset = (newChildOffset + tempInfiniteSliderOffset + numberOfSlides)%numberOfSlides; 519 520 var lastCheckOffset = 0; 521 for(var j = jStart; j < distanceOffsetArray.length; j = j + 2) { 522 523 if((j == jStart) || (Math.abs(distanceOffsetArray[j] - lastCheckOffset) > 1) || (j >= (distanceOffsetArray.length - 2))) { 524 525 lastCheckOffset = distanceOffsetArray[j]; 526 527 scrollTimeouts[scrollTimeouts.length] = helpers.slowScrollHorizontalIntervalTimer(scrollIntervalTime * j, node, slideNodes, distanceOffsetArray[j], scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, newChildOffset, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, endOffset, settings); 528 529 } 530 531 } 532 533 var slideChanged = false; 534 var tempOffset = (newChildOffset + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 535 536 if(settings.infiniteSlider) { 537 538 if(tempOffset != activeChildInfOffsets[sliderNumber]) { 539 slideChanged = true; 540 } 541 542 } else { 543 544 if(newChildOffset != activeChildOffsets[sliderNumber]) { 545 slideChanged = true; 546 } 547 548 } 549 550 if(settings.onSlideComplete != '' && (distanceOffsetArray.length > 1)) { 551 552 scrollTimeouts[scrollTimeouts.length] = helpers.onSlideCompleteTimer(scrollIntervalTime * (j + 1), settings, node, $(node).children(':eq(' + tempOffset + ')'), endOffset, sliderNumber); 553 554 } 555 556 slideTimeouts[sliderNumber] = scrollTimeouts; 557 558 helpers.hideScrollbar(settings, scrollTimeouts, j, distanceOffsetArray, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber); 559 560 }, 561 562 onSlideComplete: function(settings, node, slideNode, newChildOffset, sliderNumber) { 563 564 var isChanged = (onChangeEventLastFired[sliderNumber] != newChildOffset) ? true : false; 565 var args = new helpers.args('complete', settings, $(node), slideNode, newChildOffset, newChildOffset); 566 $(node).parent().data('args', args); 567 568 if(settings.onSlideComplete != '') { 569 settings.onSlideComplete(args); 570 571 } 572 573 onChangeEventLastFired[sliderNumber] = newChildOffset; 574 575 }, 576 577 getSliderOffset: function(node, xy) { 578 579 var sliderOffset = 0; 580 xy = (xy == 'x') ? 4 : 5; 581 582 if(has3DTransform && !isIe7 && !isIe8) { 583 584 var transforms = new Array('-webkit-transform', '-moz-transform', 'transform'); 585 var transformArray; 586 587 for(var i = 0; i < transforms.length; i++) { 588 589 if($(node).css(transforms[i]) != undefined) { 590 591 if($(node).css(transforms[i]).length > 0) { 592 593 transformArray = $(node).css(transforms[i]).split(','); 594 595 break; 596 597 } 598 599 } 600 601 } 602 603 sliderOffset = (transformArray[xy] == undefined) ? 0 : parseInt(transformArray[xy], 10); 604 605 } else { 606 607 sliderOffset = parseInt($(node).css('left'), 10); 608 609 } 610 611 return sliderOffset; 612 613 }, 614 615 setSliderOffset: function(node, sliderOffset) { 616 617 sliderOffset = parseInt(sliderOffset, 10); 618 619 if(has3DTransform && !isIe7 && !isIe8) { 620 621 $(node).css({ 622 'webkitTransform': 'matrix(1,0,0,1,' + sliderOffset + ',0)', 623 'MozTransform': 'matrix(1,0,0,1,' + sliderOffset + ',0)', 624 'transform': 'matrix(1,0,0,1,' + sliderOffset + ',0)' 625 }); 626 627 } else { 628 629 $(node).css({ 630 left: sliderOffset + 'px' 631 }); 632 633 } 634 635 }, 636 637 setBrowserInfo: function() { 638 639 if(navigator.userAgent.match('WebKit') != null) { 640 isWebkit = true; 641 grabOutCursor = '-webkit-grab'; 642 grabInCursor = '-webkit-grabbing'; 643 } else if(navigator.userAgent.match('Gecko') != null) { 644 isGecko = true; 645 grabOutCursor = 'move'; 646 grabInCursor = '-moz-grabbing'; 647 } else if(navigator.userAgent.match('MSIE 7') != null) { 648 isIe7 = true; 649 isIe = true; 650 } else if(navigator.userAgent.match('MSIE 8') != null) { 651 isIe8 = true; 652 isIe = true; 653 } else if(navigator.userAgent.match('MSIE 9') != null) { 654 isIe9 = true; 655 isIe = true; 656 } 657 658 }, 659 660 has3DTransform: function() { 661 662 var has3D = false;
663 664 var testElement = $('<div />').css({ 665 'webkitTransform': 'matrix(1,1,1,1,1,1)', 666 'MozTransform': 'matrix(1,1,1,1,1,1)', 667 'transform': 'matrix(1,1,1,1,1,1)' 668 }); 669 670 if(testElement.attr('style') == '') { 671 has3D = false; 672 } else if(isGecko && !isTouch && (parseInt(navigator.userAgent.split('/')[3], 10) >= 21)) { 673 //bug in v21+ which does not render slides properly in 3D 674 has3D = false; 675 } else if(testElement.attr('style') != undefined) { 676 has3D = true; 677 } 678 679 return has3D; 680 681 }, 682 683 getSlideNumber: function(slide, sliderNumber, numberOfSlides) { 684 685 return (slide - infiniteSliderOffset[sliderNumber] + numberOfSlides) % numberOfSlides; 686 687 }, 688 689 calcActiveOffset: function(settings, offset, childrenOffsets, stageWidth, infiniteSliderOffset, numberOfSlides, activeChildOffset, sliderNumber) { 690 691 var isFirst = false; 692 var arrayOfOffsets = new Array(); 693 var newChildOffset; 694 695 if(offset > childrenOffsets[0]) newChildOffset = 0; 696 if(offset < (childrenOffsets[childrenOffsets.length-1])) newChildOffset = numberOfSlides - 1; 697 698 for(var i = 0; i < childrenOffsets.length; i++) { 699 700 if((childrenOffsets[i] <= offset) && (childrenOffsets[i] > (offset - stageWidth))) { 701 702 if(!isFirst && (childrenOffsets[i] != offset)) { 703 704 arrayOfOffsets[arrayOfOffsets.length] = childrenOffsets[i-1]; 705 706 } 707 708 arrayOfOffsets[arrayOfOffsets.length] = childrenOffsets[i]; 709 710 isFirst = true; 711 712 } 713 714 } 715 716 if(arrayOfOffsets.length == 0) { 717 arrayOfOffsets[0] = childrenOffsets[childrenOffsets.length - 1]; 718 } 719 720 var distance = stageWidth; 721 var closestChildOffset = 0; 722 723 for(var i = 0; i < arrayOfOffsets.length; i++) { 724 725 var newDistance = Math.abs(offset - arrayOfOffsets[i]); 726 727 if(newDistance < distance) { 728 closestChildOffset = arrayOfOffsets[i]; 729 distance = newDistance; 730 } 731 732 } 733 734 for(var i = 0; i < childrenOffsets.length; i++) { 735 736 if(closestChildOffset == childrenOffsets[i]) { 737 newChildOffset = i; 738 739 } 740 741 } 742 743 return newChildOffset; 744 745 }, 746 747 changeSlide: function(slide, node, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings) { 748 749 helpers.autoSlidePause(sliderNumber); 750 751 for(var j = 0; j < scrollTimeouts.length; j++) { 752 clearTimeout(scrollTimeouts[j]); 753 } 754 755 var steps = Math.ceil(settings.autoSlideTransTimer / 10) + 1; 756 var startOffset = helpers.getSliderOffset(node, 'x'); 757 var endOffset = childrenOffsets[slide]; 758 var offsetDiff = endOffset - startOffset; 759 var direction = slide - (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 760 761 if(settings.infiniteSlider) { 762 763 slide = (slide - infiniteSliderOffset[sliderNumber] + numberOfSlides * 2)%numberOfSlides; 764 765 var appendArray = false; 766 if((slide == 0) && (numberOfSlides == 2)) { 767 768 slide = numberOfSlides; 769 childrenOffsets[slide] = childrenOffsets[slide-1] - $(slideNodes).eq(0).outerWidth(true); 770 appendArray = true; 771 772 } 773 774 endOffset = childrenOffsets[slide]; 775 offsetDiff = endOffset - startOffset; 776 777 var offsets = new Array(childrenOffsets[slide] - $(node).width(), childrenOffsets[slide] + $(node).width()); 778 779 if(appendArray) { 780 childrenOffsets.splice(childrenOffsets.length-1, 1); 781 } 782 783 for(var i = 0; i < offsets.length; i++) { 784 785 if(Math.abs(offsets[i] - startOffset) < Math.abs(offsetDiff)) { 786 offsetDiff = (offsets[i] - startOffset); 787 } 788 789 } 790 791 } 792 793 var stepArray = new Array(); 794 var t; 795 var nextStep; 796 797 helpers.showScrollbar(settings, scrollbarClass); 798 799 for(var i = 0; i <= steps; i++) { 800 801 t = i; 802 t /= steps; 803 t--; 804 nextStep = startOffset + offsetDiff*(Math.pow(t,5) + 1); 805 806 stepArray[stepArray.length] = nextStep; 807 808 } 809 810 var tempOffset = (slide + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 811 812 var lastCheckOffset = 0; 813 for(var i = 0; i < stepArray.length; i++) { 814 815 if((i == 0) || (Math.abs(stepArray[i] - lastCheckOffset) > 1) || (i >= (stepArray.length - 2))) { 816 817 lastCheckOffset = stepArray[i]; 818 819 scrollTimeouts[i] = helpers.slowScrollHorizontalIntervalTimer(scrollIntervalTime * (i + 1), node, slideNo
819des, stepArray[i], scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, slide, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, tempOffset, settings); 820 821 } 822 823 if((i == 0) && (settings.onSlideStart != '')) { 824 825 var tempOffset2 = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 826 settings.onSlideStart(new helpers.args('start', settings, node, $(node).children(':eq(' + tempOffset2 + ')'), tempOffset2, slide)); 827 828 } 829 830 } 831 832 var slideChanged = false; 833 834 if(settings.infiniteSlider) { 835 836 if(tempOffset != activeChildInfOffsets[sliderNumber]) { 837 slideChanged = true; 838 } 839 840 } else { 841 842 if(slide != activeChildOffsets[sliderNumber]) { 843 slideChanged = true; 844 } 845 846 } 847 848 if(slideChanged && (settings.onSlideComplete != '')) { 849 850 scrollTimeouts[scrollTimeouts.length] = helpers.onSlideCompleteTimer(scrollIntervalTime * (i + 1), settings, node, $(node).children(':eq(' + tempOffset + ')'), tempOffset, sliderNumber); 851 852 } 853 854 /*scrollTimeouts[scrollTimeouts.length] = setTimeout(function() { 855 activeChildOffsets[sliderNumber] = activeChildOffsets[sliderNumber]; 856 }, scrollIntervalTime * (i + 1));*/ 857 858 slideTimeouts[sliderNumber] = scrollTimeouts; 859 860 helpers.hideScrollbar(settings, scrollTimeouts, i, stepArray, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber); 861 862 helpers.autoSlide(node, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 863 864 }, 865 866 autoSlide: function(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings) { 867 868 if(!iosSliderSettings[sliderNumber].autoSlide) return false; 869 870 helpers.autoSlidePause(sliderNumber); 871 872 autoSlideTimeouts[sliderNumber] = setTimeout(function() { 873 874 if(!settings.infiniteSlider && (activeChildOffsets[sliderNumber] > childrenOffsets.length-1)) { 875 activeChildOffsets[sliderNumber] = activeChildOffsets[sliderNumber] - numberOfSlides; 876 } 877 878 var nextSlide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + childrenOffsets.length + 1)%childrenOffsets.length; 879 880 helpers.changeSlide(nextSlide, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 881 882 helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 883 884 }, settings.autoSlideTimer + settings.autoSlideTransTimer); 885 886 }, 887 888 autoSlidePause: function(sliderNumber) { 889 890 clearTimeout(autoSlideTimeouts[sliderNumber]); 891 892 }, 893 894 isUnselectable: function(node, settings) { 895 896 if(settings.unselectableSelector != '') { 897 if($(node).closest(settings.unselectableSelector).length == 1) return true; 898 } 899 900 return false; 901 902 }, 903 904 /* timers */ 905 slowScrollHorizontalIntervalTimer: function(scrollIntervalTime, node, slideNodes, step, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, slide, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, endOffset, settings) { 906 907 var scrollTimeout = setTimeout(function() {
908 helpers.slowScrollHorizontalInterval(node, slideNodes, step, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, slide, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, endOffset, settings); 909 }, scrollIntervalTime); 910 911 return scrollTimeout; 912 913 }, 914 915 onSlideCompleteTimer: function(scrollIntervalTime, settings, node, slideNode, slide, scrollbarNumber) { 916 917 var scrollTimeout = setTimeout(function() { 918 helpers.onSlideComplete(settings, node, slideNode, slide, scrollbarNumber); 919 }, scrollIntervalTime); 920 921 return scrollTimeout; 922 923 }, 924 925 hideScrollbarIntervalTimer: function(scrollIntervalTime, newOffset, opacity, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber, settings) { 926 927 var scrollTimeout = setTimeout(function() { 928 helpers.hideScrollbarInterval(newOffset, opacity, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber, settings); 929 }, scrollIntervalTime); 930 931 return scrollTimeout; 932 933 }, 934 935 args: function(func, settings, node, activeSlideNode, newChildOffset, targetSlideOffset) { 936 937 this.prevSlideNumber = ($(node).parent().data('args') == undefined) ? undefined : $(node).parent().data('args').prevSlideNumber; 938 this.prevSlideObject = ($(node).parent().data('args') == undefined) ? undefined : $(node).parent().data('args').prevSlideObject; 939 this.targetSlideNumber = targetSlideOffset + 1; 940 this.targetSlideObject = $(node).children(':eq(' + targetSlideOffset + ')'); 941 this.slideChanged = false; 942 943 if(func == 'load') { 944 this.targetSlideNumber = undefined; 945 this.targetSlideObject = undefined; 946 } else if(func == 'start') { 947 this.targetSlideNumber = undefined; 948 this.targetSlideObject = undefined; 949 } else if(func == 'change') { 950 this.slideChanged = true; 951 this.prevSlideNumber = ($(node).parent().data('args') == undefined) ? settings.startAtSlide : $(node).parent().data('args').currentSlideNumber; 952 this.prevSlideObject = $(node).children(':eq(' + this.prevSlideNumber + ')'); 953 } else if(func == 'complete') { 954 this.slideChanged = $(node).parent().data('args').slideChanged; 955 } 956 957 this.settings = settings; 958 this.data = $(node).parent().data('iosslider'); 959 this.sliderObject = node; 960 this.sliderContainerObject = $(node).parent(); 961 962 this.currentSlideObject = activeSlideNode; 963 this.currentSlideNumber = newChildOffset + 1; 964 this.currentSliderOffset = helpers.getSliderOffset(node, 'x') * -1; 965 966 }, 967 968 preventDrag: function(event) { 969 event.preventDefault(); 970 }, 971 972 preventClick: function(event) { 973 event.stopImmediatePropagation(); 974 return false; 975 }, 976 977 enableClick: function() { 978 return true; 979 } 980 981 } 982 983 helpers.setBrowserInfo(); 984 985 var methods = { 986 987 init: function(options, node) { 988 989 has3DTransform = helpers.has3DTransform(); 990 991 var settings = $.extend(true, { 992 'elasticPullResistance': 0.6, 993 'frictionCoefficient': 0.92, 994 'elasticFrictionCoefficient': 0.6, 995 'snapFrictionCoefficient': 0.92, 996 'snapToChildren': false, 997 'snapSlideCenter': false, 998 'startAtSlide': 1, 999 'scrollbar': false, 1000 'scrollbarDrag': false, 1001 'scrollbarHide': true, 1002 'scrollbarLocation': 'top', 1003 'scrollbarContainer': '', 1004 'scrollbarOpacity': 0.4, 1005 'scrollbarHeight': '4px', 1006 'scrollbarBorder': '0', 1007 'scrollbarMargin': '5px', 1008 'scrollbarBackground': '#000', 1009 'scrollbarBorderRadius': '100px', 1010 'scrollbarShadow': '0 0 0 #000', 1011 'scrollbarElasticPullResistance': 0.9, 1012 'desktopClickDrag': false, 1013 'keyboardControls': false, 1014 'tabToAdvance': false, 1015 'responsiveSlideContainer': true, 1016 'responsiveSlides': true, 1017 'navSlideSelector': '', 1018 'navPrevSelector': '', 1019 'navNextSelector': '', 1020 'autoSlideToggleSelector': '', 1021 'autoSlide': false, 1022 'autoSlideTimer': 5000, 1023 'autoSlideTransTimer': 750, 1024 'autoSlideHoverPause': true, 1025 'infiniteSlider': false, 1026 'snapVelocityThreshold': 5, 1027 'slideStartVelocityThreshold': 0, 1028 'horizontalSlideLockThreshold': 5, 1029 'verticalSlideLockThreshold': 3, 1030 'stageCSS': { 1031 position: 'relative', 1032 top: '0', 1033 left: '0', 1034 overflow: 'hidden', 1035 zIndex: 1 1036 }, 1037 'unselectableSelector': '', 1038 'onSliderLoaded': '',
1039 'onSliderUpdate': '', 1040 'onSliderResize': '', 1041 'onSlideStart': '', 1042 'onSlideChange': '', 1043 'onSlideComplete': '' 1044 }, options); 1045 1046 if(node == undefined) { 1047 node = this; 1048 } 1049 1050 return $(node).each(function(i) { 1051 1052 scrollbarNumber++; 1053 var sliderNumber = scrollbarNumber; 1054 var scrollTimeouts = new Array(); 1055 iosSliderSettings[sliderNumber] = $.extend({}, settings); 1056 sliderMin[sliderNumber] = 0; 1057 sliderMax[sliderNumber] = 0; 1058 var minTouchpoints = 0; 1059 var xCurrentScrollRate = new Array(0, 0); 1060 var yCurrentScrollRate = new Array(0, 0); 1061 var scrollbarBlockClass = 'scrollbarBlock' + scrollbarNumber; 1062 var scrollbarClass = 'scrollbar' + scrollbarNumber; 1063 var scrollbarNode; 1064 var scrollbarBlockNode; 1065 var scrollbarStageWidth; 1066 var scrollbarWidth; 1067 var containerWidth; 1068 var containerHeight; 1069 var centeredSlideOffset = 0; 1070 var stageNode = $(this); 1071 var stageWidth; 1072 var stageHeight; 1073 var slideWidth; 1074 var scrollMargin; 1075 var scrollBorder; 1076 var lastTouch; 1077 var isFirstInit = true; 1078 var newChildOffset = -1; 1079 var webkitTransformArray = new Array(); 1080 var childrenOffsets; 1081 var originalOffsets = new Array(); 1082 var scrollbarStartOpacity = 0; 1083 var xScrollStartPosition = 0; 1084 var yScrollStartPosition = 0; 1085 var currentTouches = 0; 1086 var scrollerNode = $(this).children(':first-child'); 1087 var slideNodes; 1088 var slideNodeWidths; 1089 var slideNodeOuterWidths; 1090 var numberOfSlides = $(scrollerNode).children().not('script').length; 1091 var xScrollStarted = false; 1092 var lastChildOffset = 0; 1093 var isMouseDown = false; 1094 var currentSlider = undefined; 1095 var sliderStopLocation = 0; 1096 var infiniteSliderWidth; 1097 infiniteSliderOffset[sliderNumber] = 0; 1098 var shortContent = false; 1099 onChangeEventLastFired[sliderNumber] = -1; 1100 var isAutoSlideToggleOn = false; 1101 iosSliders[sliderNumber] = stageNode; 1102 isEventCleared[sliderNumber] = false; 1103 var currentEventNode; 1104 var intermediateChildOffset = 0; 1105 var tempInfiniteSliderOffset = 0; 1106 var preventXScroll = false; 1107 var snapOverride = false; 1108 var clickEvent = 'touchstart.iosSliderEvent click.iosSliderEvent'; 1109 var scrollerWidth; 1110 var anchorEvents; 1111 var onclickEvents; 1112 var allScrollerNodeChildren; 1113 touchLocks[sliderNumber] = false; 1114 slideTimeouts[sliderNumber] = new Array(); 1115 if(settings.scrollbarDrag) { 1116 settings.scrollbar = true; 1117 settings.scrollbarHide = false;
1118 } 1119 var $this = $(this); 1120 var data = $this.data('iosslider'); 1121 if(data != undefined) return true; 1122 1123 $(this).find('img').bind('dragstart.iosSliderEvent', function(event) { event.preventDefault(); }); 1124 1125 if(settings.infiniteSlider) { 1126 settings.scrollbar = false; 1127 } 1128 1129 if(settings.infiniteSlider && (numberOfSlides == 1)) { 1130 settings.infiniteSlider = false; 1131 } 1132 1133 if(settings.scrollbar) { 1134 1135 if(settings.scrollbarContainer != '') { 1136 $(settings.scrollbarContainer).append("<div class = '" + scrollbarBlockClass + "'><div class = '" + scrollbarClass + "'></div></div>"); 1137 } else { 1138 $(scrollerNode).parent().append("<div class = '" + scrollbarBlockClass + "'><div class = '" + scrollbarClass + "'></div></div>"); 1139 } 1140 1141 } 1142 1143 if(!init()) return true; 1144 1145 $(this).find('a').bind('mousedown', helpers.preventDrag); 1146 $(this).find("[onclick]").bind('click', helpers.preventDrag).each(function() { 1147 1148 $(this).data('onclick', this.onclick); 1149 1150 }); 1151 1152 var newChildOffset = helpers.calcActiveOffset(settings, helpers.getSliderOffset($(scrollerNode), 'x'), childrenOffsets, stageWidth, infiniteSliderOffset[sliderNumber], numberOfSlides, undefined, sliderNumber); 1153 var tempOffset = (newChildOffset + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 1154 1155 var args = new helpers.args('load', settings, scrollerNode, $(scrollerNode).children(':eq(' + tempOffset + ')'), tempOffset, tempOffset); 1156 $(stageNode).data('args', args); 1157 1158 if(settings.onSliderLoaded != '') { 1159 1160 settings.onSliderLoaded(args); 1161 1162 } 1163 1164 onChangeEventLastFired[sliderNumber] = tempOffset; 1165 1166 function init() { 1167 1168 helpers.autoSlidePause(sliderNumber); 1169 1170 anchorEvents = $(scrollerNode).find('a'); 1171 onclickEvents = $(scrollerNode).find('[onclick]'); 1172 allScrollerNodeChildren = $(scrollerNode).find('*'); 1173 1174 $(stageNode).css('width', ''); 1175 $(stageNode).css('height', ''); 1176 $(scrollerNode).css('width', ''); 1177 slideNodes = $(scrollerNode).children().not('script').get(); 1178 slideNodeWidths = new Array(); 1179 slideNodeOuterWidths = new Array(); 1180 1181 if(settings.responsiveSlides) { 1182 $(slideNodes).css('width', ''); 1183 } 1184 1185 sliderMax[sliderNumber] = 0; 1186 childrenOffsets = new Array(); 1187 containerWidth = $(stageNode).parent().width(); 1188 stageWidth = $(stageNode).outerWidth(true); 1189 1190 if(settings.responsiveSlideContainer) { 1191 stageWidth = ($(stageNode).outerWidth(true) > containerWidth) ? containerWidth : $(stageNode).width(); 1192 } 1193 1194 $(stageNode).css({ 1195 position: settings.stageCSS.position, 1196 top: settings.stageCSS.top, 1197 left: settings.stageCSS.left, 1198 overflow: settings.stageCSS.overflow, 1199 zIndex: settings.stageCSS.zIndex, 1200 'webkitPerspective': 1000, 1201 'webkitBackfaceVisibility': 'hidden', 1202 'msTouchAction': 'pan-y', 1203 width: stageWidth 1204 }); 1205 1206 $(settings.unselectableSelector).css({ 1207 cursor: 'default' 1208 }); 1209 1210 for(var j = 0; j < slideNodes.length; j++) { 1211 1212 slideNodeWidths[j] = $(slideNodes[j]).width(); 1213 slideNodeOuterWidths[j] = $(slideNodes[j]).outerWidth(true); 1214 var newWidth = slideNodeOuterWidths[j]; 1215 1216 if(settings.responsiveSlides) { 1217 1218 if(slideNodeOuterWidths[j] > stageWidth) { 1219 1220 newWidth = stageWidth + (slideNodeOuterWidths[j] - slideNodeWidths[j]) * -1; 1221 slideNodeWidths[j] = newWidth; 1222 slideNodeOuterWidths[j] = stageWidth; 1223 1224 } else { 1225 1226 newWidth = slideNodeWidths[j]; 1227 1228 } 1229 1230 $(slideNodes[j]).css({ 1231 width: newWidth 1232 }); 1233 1234 } 1235 1236 $(slideNodes[j]).css({ 1237 'webkitBackfaceVisibility': 'hidden', 1238 overflow: 'hidden', 1239 position: 'absolute' 1240 }); 1241 1242 childrenOffsets[j] = sliderMax[sliderNumber] * -1; 1243 1244 sliderMax[sliderNumber] = sliderMax[sliderNumber] + newWidth + (slideNodeOuterWidths[j] - slideNodeWidths[j]); 1245 1246 } 1247 1248 if(settings.snapSlideCenter) { 1249 centeredSlideOffset = (stageWidth - slideNodeOuterWidths[0]) * 0.5; 1250 1251 if(settings.responsiveSlides && (slideNodeOuterWidths[0] > stageWidth)) { 1252 centeredSlideOffset = 0; 1253 } 1254 } 1255 1256 sliderAbsMax[sliderNumber] = sliderMax[sliderNumber] * 2; 1257 1258 for(var j = 0; j < slideNodes.length; j++) { 1259 1260 helpers.setSliderOffset($(slideNodes[j]), childrenOffsets[j] * -1 + sliderMax[sliderNumber] + centeredSlideOffset); 1261 1262 childrenOffsets[j] = childrenOffsets[j] - sliderMax[sliderNumber]; 1263 1264 } 1265
1266 if(!settings.infiniteSlider && !settings.snapSlideCenter) { 1267 1268 for(var i = 0; i < childrenOffsets.length; i++) { 1269 1270 if(childrenOffsets[i] <= ((sliderMax[sliderNumber] * 2 - stageWidth) * -1)) { 1271 break; 1272 } 1273 1274 lastChildOffset = i; 1275 1276 } 1277 1278 childrenOffsets.splice(lastChildOffset + 1, childrenOffsets.length); 1279 childrenOffsets[childrenOffsets.length] = (sliderMax[sliderNumber] * 2 - stageWidth) * -1; 1280 1281 } 1282 1283 for(var i = 0; i < childrenOffsets.length; i++) { 1284 originalOffsets[i] = childrenOffsets[i]; 1285 } 1286 1287 if(isFirstInit) { 1288 1289 iosSliderSettings[sliderNumber].startAtSlide = (iosSliderSettings[sliderNumber].startAtSlide > childrenOffsets.length) ? childrenOffsets.length : iosSliderSettings[sliderNumber].startAtSlide; 1290 if(settings.infiniteSlider) { 1291 iosSliderSettings[sliderNumber].startAtSlide = (iosSliderSettings[sliderNumber].startAtSlide - 1 + numberOfSlides)%numberOfSlides; 1292 activeChildOffsets[sliderNumber] = (iosSliderSettings[sliderNumber].startAtSlide); 1293 } else { 1294 iosSliderSettings[sliderNumber].startAtSlide = ((iosSliderSettings[sliderNumber].startAtSlide - 1) < 0) ? childrenOffsets.length-1 : iosSliderSettings[sliderNumber].startAtSlide; 1295 activeChildOffsets[sliderNumber] = (iosSliderSettings[sliderNumber].startAtSlide-1); 1296 } 1297 activeChildInfOffsets[sliderNumber] = activeChildOffsets[sliderNumber]; 1298 } 1299 1300 sliderMin[sliderNumber] = sliderMax[sliderNumber] + centeredSlideOffset; 1301 1302 $(scrollerNode).css({ 1303 position: 'relative', 1304 cursor: grabOutCursor, 1305 'webkitPerspective': '0', 1306 'webkitBackfaceVisibility': 'hidden', 1307 width: sliderMax[sliderNumber] + 'px' 1308 }); 1309 1310 scrollerWidth = sliderMax[sliderNumber]; 1311 sliderMax[sliderNumber] = sliderMax[sliderNumber] * 2 - stageWidth + centeredSlideOffset * 2; 1312 1313 shortContent = ((scrollerWidth < stageWidth) || (stageWidth == 0)) ? true : false; 1314 1315 if(shortContent) { 1316 1317 $(scrollerNode).css({ 1318 cursor: 'default' 1319 }); 1320 1321 } 1322 1323 containerHeight = $(stageNode).parent().outerHeight(true); 1324 stageHeight = $(stageNode).height(); 1325 1326 if(settings.responsiveSlideContainer) { 1327 stageHeight = (stageHeight > containerHeight) ? containerHeight : stageHeight; 1328 } 1329 1330 $(stageNode).css({ 1331 height: stageHeight 1332 }); 1333 1334 helpers.setSliderOffset(scrollerNode, childrenOffsets[activeChildOffsets[sliderNumber]]); 1335 1336 if(settings.infiniteSlider && !shortContent) { 1337 1338 var currentScrollOffset = helpers.getSliderOffset($(scrollerNode), 'x'); 1339 var count = (infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides * -1; 1340 1341 while(count < 0) { 1342 1343 var lowSlideNumber = 0; 1344 var lowSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 1345 $(slideNodes).each(function(i) { 1346 1347 if(helpers.getSliderOffset(this, 'x') < lowSlideOffset) { 1348 lowSlideOffset = helpers.getSliderOffset(this, 'x'); 1349 lowSlideNumber = i; 1350 } 1351 1352 }); 1353 1354 var newOffset = sliderMin[sliderNumber] + scrollerWidth; 1355 helpers.setSliderOffset($(slideNodes)[lowSlideNumber], newOffset); 1356 1357 sliderMin[sliderNumber] = childrenOffsets[1] * -1 + centeredSlideOffset; 1358 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 1359 1360 childrenOffsets.splice(0, 1); 1361 childrenOffsets.splice(childrenOffsets.length, 0, newOffset * -1 + centeredSlideOffset); 1362 1363 count++; 1364 1365 } 1366 1367 while(((childrenOffsets[0] * -1 - scrollerWidth + centeredSlideOffset) > 0) && settings.snapSlideCenter && isFirstInit) { 1368 1369 var highSlideNumber = 0; 1370 var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 1371 $(slideNodes).each(function(i) { 1372 1373 if(helpers.getSliderOffset(this, 'x') > highSlideOffset) { 1374 highSlideOffset = helpers.getSliderOffset(this, 'x'); 1375 highSlideNumber = i; 1376 } 1377 1378 }); 1379 1380 var newOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber]; 1381 helpers.setSliderOffset($(slideNodes)[highSlideNumber], newOffset); 1382 1383 childrenOffsets.splice(0, 0, newOffset * -1 + centeredSlideOffset); 1384 childrenOffsets.splice(childrenOffsets.length-1, 1); 1385 1386 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 1387 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 1388 1389 infiniteSliderOffset[sliderNumber]--; 1390 activeChildOffsets[sliderNumber]++; 1391 1392 } 1393 1394 while(currentScrollOffset <= (sliderMax[sliderNumber] * -1)) { 1395 1396 var lowSlideNumber = 0; 1397 var lowSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 1398 $(slideNodes).each(function(i) { 1399 1400 if(helpers.getSliderOffset(this, 'x') < lowSlideOffset) { 1401 lowSlideOffset = helpers.getSliderOffset(this, 'x'); 1402 lowSlideNumber = i; 1403 } 1404 1405 }); 1406 1407 var newOffset = sliderMin[sliderNumber] + scrollerWidth; 1408 helpers.setSliderOffset($(slideNodes)[lowSlideNumber], newOffset); 1409 1410 sliderMin[sliderNumber] = childrenOffsets[1] * -1 + centeredSlideOffset; 1411 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 1412 1413 childrenOffsets.splice(0, 1); 1414 childrenOffsets.splice(childrenOffsets.length, 0, newOffset * -1 + centeredSlideOffset); 1415 1416 infiniteSliderOffset[sliderNumber]++; 1417 activeChildOffsets[sliderNumber]--; 1418 1419 } 1420 1421 } 1422 1423 helpers.setSliderOffset(scrollerNode, childrenOffsets[activeChildOffsets[sliderNumber]]); 1424 1425 if(!settings.desktopClickDrag) { 1426 1427 $(scrollerNode).css({ 1428 cursor: 'default' 1429 }); 1430 1431 } 1432 1433 if(settings.scrollbar) { 1434 1435 $('.' + scrollbarBlockClass).css({ 1436 margin: settings.scrollbarMargin, 1437 overflow: 'hidden', 1438 display: 'none' 1439 }); 1440 1441 $('.' + scrollbarBlockClass + ' .' + scrollbarClass).css({ 1442 border: settings.scrollbarBorder 1443 }); 1444 1445 scrollMargin = parseInt($('.' + scrollbarBlockClass).css('marginLeft')) + parseInt($('.' + scrollbarBlockClass).css('marginRight')); 1446 scrollBorder = parseInt($('.' + scrollbarBlockClass + ' .' + scrollbarClass).css('borderLeftWidth'), 10) + parseInt($('.' + scrollbarBlockClass + ' .' + scrollbarClass).css('borderRightWidth'), 10); 1447 scrollbarStageWidth = (settings.scrollbarContainer != '') ? $(settings.scrollbarContainer).width() : stageWidth; 1448 scrollbarWidth = (stageWidth / scrollerWidth) * (scrollbarStageWidth - scrollMargin); 1449 1450 if(!settings.scrollbarHide) { 1451 scrollbarStartOpacity = settings.scrollbarOpacity; 1452 } 1453 1454 $('.' + scrollbarBlockClass).css({ 1455 position: 'absolute', 1456 left: 0, 1457 width: scrollbarStageWidth - scrollMargin + 'px', 1458 margin: settings.scrollbarMargin 1459 }); 1460 1461 if(settings.scrollbarLocation == 'top') { 1462 $('.' + scrollbarBlockClass).css('top', '0'); 1463 } else { 1464 $('.' + scrollbarBlockClass).css('bottom', '0'); 1465 } 1466 1467 $('.' + scrollbarBlockClass + ' .' + scrollbarClass).css({ 1468 borderRadius: settings.scrollbarBorderRadius,
1469 background: settings.scrollbarBackground, 1470 height: settings.scrollbarHeight, 1471 width: scrollbarWidth - scrollBorder + 'px', 1472 minWidth: settings.scrollbarHeight, 1473 border: settings.scrollbarBorder, 1474 'webkitPerspective': 1000, 1475 'webkitBackfaceVisibility': 'hidden', 1476 'position': 'relative', 1477 opacity: scrollbarStartOpacity, 1478 filter: 'alpha(opacity:' + (scrollbarStartOpacity * 100) + ')', 1479 boxShadow: settings.scrollbarShadow 1480 }); 1481 1482 helpers.setSliderOffset($('.' + scrollbarBlockClass + ' .' + scrollbarClass), Math.floor((childrenOffsets[activeChildOffsets[sliderNumber]] * -1 - sliderMin[sliderNumber] + centeredSlideOffset) / (sliderMax[sliderNumber] - sliderMin[sliderNumber] + centeredSlideOffset) * (scrollbarStageWidth - scrollMargin - scrollbarWidth))); 1483 1484 $('.' + scrollbarBlockClass).css({ 1485 display: 'block' 1486 }); 1487 1488 scrollbarNode = $('.' + scrollbarBlockClass + ' .' + scrollbarClass); 1489 scrollbarBlockNode = $('.' + scrollbarBlockClass); 1490 1491 } 1492 1493 if(settings.scrollbarDrag && !shortContent) { 1494 $('.' + scrollbarBlockClass + ' .' + scrollbarClass).css({ 1495 cursor: grabOutCursor 1496 }); 1497 } 1498 1499 if(settings.infiniteSlider) { 1500 1501 infiniteSliderWidth = (sliderMax[sliderNumber] + stageWidth) / 3; 1502 1503 } 1504 1505 if(settings.navSlideSelector != '') { 1506 1507 $(settings.navSlideSelector).each(function(j) { 1508 1509 $(this).css({ 1510 cursor: 'pointer' 1511 }); 1512 1513 $(this).unbind(clickEvent).bind(clickEvent, function(e) { 1514 1515 if(e.type == 'touchstart') { 1516 $(this).unbind('click.iosSliderEvent'); 1517 } else { 1518 $(this).unbind('touchstart.iosSliderEvent'); 1519 } 1520 clickEvent = e.type + '.iosSliderEvent'; 1521 1522 helpers.changeSlide(j, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1523 1524 }); 1525 1526 }); 1527 1528 } 1529 1530 if(settings.navPrevSelector != '') { 1531 1532 $(settings.navPrevSelector).css({ 1533 cursor: 'pointer' 1534 }); 1535 1536 $(settings.navPrevSelector).unbind(clickEvent).bind(clickEvent, function(e) { 1537 1538 if(e.type == 'touchstart') { 1539 $(this).unbind('click.iosSliderEvent'); 1540 } else { 1541 $(this).unbind('touchstart.iosSliderEvent'); 1542 } 1543 clickEvent = e.type + '.iosSliderEvent'; 1544 1545 var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 1546 1547 if((slide > 0) || settings.infiniteSlider) { 1548 helpers.changeSlide(slide - 1, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1549 } 1550 }); 1551 1552 } 1553 1554 if(settings.navNextSelector != '') { 1555 1556 $(settings.navNextSelector).css({ 1557 cursor: 'pointer' 1558 }); 1559 1560 $(settings.navNextSelector).unbind(clickEvent).bind(clickEvent, function(e) { 1561 1562 if(e.type == 'touchstart') { 1563 $(this).unbind('click.iosSliderEvent'); 1564 } else { 1565 $(this).unbind('touchstart.iosSliderEvent'); 1566 } 1567 clickEvent = e.type + '.iosSliderEvent'; 1568 1569 var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 1570 1571 if((slide < childrenOffsets.length-1) || settings.infiniteSlider) { 1572 helpers.changeSlide(slide + 1, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1573 } 1574 }); 1575 1576 } 1577 1578 if(settings.autoSlide && !shortContent) { 1579 1580 if(settings.autoSlideToggleSelector != '') { 1581 1582 $(settings.autoSlideToggleSelector).css({ 1583 cursor: 'pointer' 1584 }); 1585 1586 $(settings.autoSlideToggleSelector).unbind(clickEvent).bind(clickEvent, function(e) { 1587 1588 if(e.type == 'touchstart') { 1589 $(this).unbind('click.iosSliderEvent'); 1590 } else { 1591 $(this).unbind('touchstart.iosSliderEvent'); 1592 } 1593 clickEvent = e.type + '.iosSliderEvent'; 1594 1595 if(!isAutoSlideToggleOn) { 1596 1597 helpers.autoSlidePause(sliderNumber); 1598 isAutoSlideToggleOn = true; 1599 1600 $(settings.autoSlideToggleSelector).addClass('on'); 1601 1602 } else { 1603
1604 helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1605 1606 isAutoSlideToggleOn = false; 1607 1608 $(settings.autoSlideToggleSelector).removeClass('on'); 1609 1610 } 1611 1612 }); 1613 1614 } 1615 1616 } 1617 1618 helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1619 1620 $(stageNode).bind('mouseleave.iosSliderEvent', function() { 1621 1622 helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1623 1624 }); 1625 1626 $(stageNode).bind('touchend.iosSliderEvent', function() { 1627 1628 helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1629 1630 }); 1631 1632 if(settings.autoSlideHoverPause) { 1633 $(stageNode).bind('mouseenter.iosSliderEvent', function() { 1634 helpers.autoSlidePause(sliderNumber); 1635 }); 1636 } 1637 1638 $(stageNode).data('iosslider', { 1639 obj: $this, 1640 settings: settings, 1641 scrollerNode: scrollerNode, 1642 slideNodes: slideNodes, 1643 numberOfSlides: numberOfSlides, 1644 centeredSlideOffset: centeredSlideOffset, 1645 sliderNumber: sliderNumber, 1646 originalOffsets: originalOffsets, 1647 childrenOffsets: childrenOffsets, 1648 sliderMax: sliderMax[sliderNumber], 1649 scrollbarClass: scrollbarClass, 1650 scrollbarWidth: scrollbarWidth, 1651 scrollbarStageWidth: scrollbarStageWidth, 1652 stageWidth: stageWidth, 1653 scrollMargin: scrollMargin, 1654 scrollBorder: scrollBorder, 1655 infiniteSliderOffset: infiniteSliderOffset[sliderNumber], 1656 infiniteSliderWidth: infiniteSliderWidth, 1657 slideNodeOuterWidths: slideNodeOuterWidths 1658 }); 1659 1660 isFirstInit = false; 1661 1662 return true; 1663 1664 } 1665 1666 if(iosSliderSettings[sliderNumber].responsiveSlides || iosSliderSettings[sliderNumber].responsiveSlideContainer) { 1667 1668 var orientationEvent = supportsOrientationChange ? 'orientationchange' : 'resize'; 1669 1670 $(window).bind(orientationEvent + '.iosSliderEvent-' + sliderNumber, function() { 1671 1672 if(!init()) return true; 1673 1674 var args = $(stageNode).data('args'); 1675 1676 if(settings.onSliderResize != '') { 1677 settings.onSliderResize(args); 1678 } 1679 1680 }); 1681 1682 } 1683 1684 if((settings.keyboardControls || settings.tabToAdvance) && !shortContent) { 1685 1686 $(document).bind('keydown.iosSliderEvent', function(e) { 1687 1688 if((!isIe7) && (!isIe8)) { 1689 var e = e.originalEvent; 1690 } 1691 1692 if((e.keyCode == 37) && settings.keyboardControls) { 1693 1694 e.preventDefault(); 1695 1696 var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 1697 1698 if((slide > 0) || settings.infiniteSlider) { 1699 helpers.changeSlide(slide - 1, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1700 } 1701 1702 } else if(((e.keyCode == 39) && settings.keyboardControls) || ((e.keyCode == 9) && settings.tabToAdvance)) { 1703 1704 e.preventDefault(); 1705 1706 var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 1707 1708 if((slide < childrenOffsets.length-1) || settings.infiniteSlider) {
1709 helpers.changeSlide(slide + 1, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings); 1710 } 1711 1712 } 1713 1714 }); 1715 1716 } 1717 1718 if(isTouch || settings.desktopClickDrag) { 1719 1720 var touchStartFlag = false; 1721 var touchSelection = $(scrollerNode); 1722 var touchSelectionMove = $(scrollerNode); 1723 var preventDefault = null; 1724 var isUnselectable = false; 1725 1726 if(settings.scrollbarDrag) { 1727 1728 touchSelection = touchSelection.add(scrollbarNode); 1729 touchSelectionMove = touchSelectionMove.add(scrollbarBlockNode); 1730 1731 } 1732 1733 $(touchSelection).bind('mousedown.iosSliderEvent touchstart.iosSliderEvent', function(e) { 1734 1735 if(touchStartFlag) return true; 1736 touchStartFlag = true; 1737 1738 if(e.type == 'touchstart') { 1739 $(touchSelectionMove).unbind('mousedown.iosSliderEvent'); 1740 } else { 1741 $(touchSelectionMove).unbind('touchstart.iosSliderEvent'); 1742 } 1743 1744 if(touchLocks[sliderNumber] || shortContent) { 1745 touchStartFlag = false; 1746 xScrollStarted = false; 1747 return true; 1748 } 1749 1750 isUnselectable = helpers.isUnselectable(e.target, settings); 1751 1752 if(isUnselectable) { 1753 touchStartFlag = false; 1754 xScrollStarted = false; 1755 return true; 1756 } 1757 1758 currentEventNode = ($(this)[0] === $(scrollbarNode)[0]) ? scrollbarNode : scrollerNode; 1759 1760 if((!isIe7) && (!isIe8)) { 1761 var e = e.originalEvent; 1762 } 1763 1764 helpers.autoSlidePause(sliderNumber); 1765 1766 allScrollerNodeChildren.unbind('.disableClick'); 1767 1768 if(e.type == 'touchstart') { 1769 1770 eventX = e.touches[0].pageX; 1771 eventY = e.touches[0].pageY; 1772 1773 } else { 1774 1775 if (window.getSelection) { 1776 if (window.getSelection().empty) { 1777 window.getSelection().empty(); 1778 } else if (window.getSelection().removeAllRanges) { 1779 window.getSelection().removeAllRanges(); 1780 } 1781 } else if (document.selection) { 1782 if(isIe8) { 1783 try { document.selection.empty(); } catch(e) { /* absorb ie8 bug */ } 1784 } else { 1785 document.selection.empty(); 1786 } 1787 } 1788 1789 eventX = e.pageX; 1790 eventY = e.pageY; 1791 1792 isMouseDown = true; 1793 currentSlider = scrollerNode; 1794 1795 $(this).css({ 1796 cursor: grabInCursor 1797 }); 1798 1799 } 1800 1801 xCurrentScrollRate = new Array(0, 0); 1802 yCurrentScrollRate = new Array(0, 0); 1803 xScrollDistance = 0; 1804 xScrollStarted = false; 1805 1806 for(var j = 0; j < scrollTimeouts.length; j++) { 1807 clearTimeout(scrollTimeouts[j]); 1808 } 1809 1810 var scrollPosition = helpers.getSliderOffset(scrollerNode, 'x'); 1811 1812 if(scrollPosition > (sliderMin[sliderNumber] * -1 + centeredSlideOffset + scrollerWidth)) { 1813 1814 scrollPosition = sliderMin[sliderNumber] * -1 + centeredSlideOffset + scrollerWidth; 1815 1816 helpers.setSliderOffset($('.' + scrollbarClass), scrollPosition); 1817 1818 $('.' + scrollbarClass).css({ 1819 width: (scrollbarWidth - scrollBorder) + 'px' 1820 }); 1821 1822 } else if(scrollPosition < (sliderMax[sliderNumber] * -1)) { 1823 1824 scrollPosition = sliderMax[sliderNumber] * -1; 1825 1826 helpers.setSliderOffset($('.' + scrollbarClass), (scrollbarStageWidth - scrollMargin - scrollbarWidth)); 1827 1828 $('.' + scrollbarClass).css({ 1829 width: (scrollbarWidth - scrollBorder) + 'px' 1830 }); 1831 1832 } 1833 1834 var scrollbarSubtractor = ($(this)[0] === $(scrollbarNode)[0]) ? (sliderMin[sliderNumber]) : 0; 1835 1836 xScrollStartPosition = (helpers.getSliderOffset(this, 'x') - eventX - scrollbarSubtractor) * -1; 1837 yScrollStartPosition = (helpers.getSliderOffset(this, 'y') - eventY) * -1; 1838 1839 xCurrentScrollRate[1] = eventX; 1840 yCurrentScrollRate[1] = eventY; 1841 1842 snapOverride = false;
1843 1844 }); 1845 1846 $(touchSelectionMove).bind('touchmove.iosSliderEvent mousemove.iosSliderEvent', function(e) { 1847 1848 if((!isIe7) && (!isIe8)) { 1849 var e = e.originalEvent; 1850 } 1851 1852 if(touchLocks[sliderNumber] || shortContent) return true; 1853 1854 if(isUnselectable) return true; 1855 1856 var edgeDegradation = 0; 1857 1858 if(e.type == 'touchmove') { 1859 1860 eventX = e.touches[0].pageX; 1861 eventY = e.touches[0].pageY; 1862 1863 } else { 1864 1865 if(window.getSelection) { 1866 if(window.getSelection().empty) { 1867 //window.getSelection().empty(); /* removed to enable input fields within the slider */ 1868 } else if(window.getSelection().removeAllRanges) { 1869 window.getSelection().removeAllRanges(); 1870 } 1871 } else if(document.selection) { 1872 if(isIe8) { 1873 try { document.selection.empty(); } catch(e) { /* absorb ie8 bug */ } 1874 } else { 1875 document.selection.empty(); 1876 } 1877 } 1878 1879 eventX = e.pageX; 1880 eventY = e.pageY; 1881 1882 if(!isMouseDown) { 1883 return true; 1884 } 1885 1886 if(!isIe) { 1887 if((typeof e.webkitMovementX != 'undefined' || typeof e.webkitMovementY != 'undefined') && e.
1887webkitMovementY === 0 && e.webkitMovementX === 0) { 1888 return true; 1889 } 1890 } 1891 1892 } 1893 1894 xCurrentScrollRate[0] = xCurrentScrollRate[1]; 1895 xCurrentScrollRate[1] = eventX; 1896 xScrollDistance = (xCurrentScrollRate[1] - xCurrentScrollRate[0]) / 2; 1897 1898 yCurrentScrollRate[0] = yCurrentScrollRate[1]; 1899 yCurrentScrollRate[1] = eventY; 1900 yScrollDistance = (yCurrentScrollRate[1] - yCurrentScrollRate[0]) / 2; 1901 1902 if(!xScrollStarted) { 1903 1904 var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 1905 var args = new helpers.args('start', settings, scrollerNode, $(scrollerNode).children(':eq(' + slide + ')'), slide, undefined); 1906 $(stageNode).data('args', args); 1907 1908 if(settings.onSlideStart != '') { 1909 settings.onSlideStart(args); 1910 } 1911 1912 } 1913 1914 if(((yScrollDistance > settings.verticalSlideLockThreshold) || (yScrollDistance < (settings.verticalSlideLockThreshold * -1))) && (e.type == 'touchmove') && (!xScrollStarted)) { 1915 1916 preventXScroll = true; 1917 1918 } 1919 1920 if(((xScrollDistance > settings.horizontalSlideLockThreshold) || (xScrollDistance < (settings.horizontalSlideLockThreshold * -1))) && (e.type == 'touchmove')) { 1921 1922 e.preventDefault(); 1923 1924 } 1925 1926 if(((xScrollDistance > settings.slideStartVelocityThreshold) || (xScrollDistance < (settings.slideStartVelocityThreshold * -1)))) { 1927 1928 xScrollStarted = true; 1929 1930 } 1931 1932 if(xScrollStarted && !preventXScroll) { 1933 1934 var scrollPosition = helpers.getSliderOffset(scrollerNode, 'x'); 1935 var scrollbarSubtractor = ($(currentEventNode)[0] === $(scrollbarNode)[0]) ? (sliderMin[sliderNumber]) : centeredSlideOffset; 1936 var scrollbarMultiplier = ($(currentEventNode)[0] === $(scrollbarNode)[0]) ? ((sliderMin[sliderNumber] - sliderMax[sliderNumber] - centeredSlideOffset) / (scrollbarStageWidth - scrollMargin - scrollbarWidth)) : 1; 1937 var elasticPullResistance = ($(currentEventNode)[0] === $(scrollbarNode)[0]) ? settings.scrollbarElasticPullResistance : settings.elasticPullResistance; 1938 var snapCenteredSlideOffset = (settings.snapSlideCenter && ($(currentEventNode)[0] === $(scrollbarNode)[0])) ? 0 : centeredSlideOffset; 1939 var snapCenteredSlideOffsetScrollbar = (settings.snapSlideCenter && ($(currentEventNode)[0] === $(scrollbarNode)[0])) ? centeredSlideOffset : 0; 1940 1941 if(e.type == 'touchmove') { 1942 if(currentTouches != e.touches.length) { 1943 xScrollStartPosition = (scrollPosition * -1) + eventX; 1944 } 1945 1946 currentTouches = e.touches.length; 1947 } 1948 1949 if(settings.infiniteSlider) { 1950 1951 if(scrollPosition <= (sliderMax[sliderNumber] * -1)) { 1952 1953 var scrollerWidth = $(scrollerNode).width(); 1954 1955 if(scrollPosition <= (sliderAbsMax[sliderNumber] * -1)) { 1956 1957 var sum = originalOffsets[0] * -1; 1958 $(slideNodes).each(function(i) { 1959 1960 helpers.setSliderOffset($(slideNodes)[i], sum + centeredSlideOffset); 1961 if(i < childrenOffsets.length) { 1962 childrenOffsets[i] = sum * -1; 1963 } 1964 sum = sum + slideNodeOuterWidths[i]; 1965 1966 }); 1967 1968 xScrollStartPosition = xScrollStartPosition - childrenOffsets[0] * -1; 1969 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 1970 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 1971 infiniteSliderOffset[sliderNumber] = 0; 1972 1973 } else { 1974 1975 var lowSlideNumber = 0; 1976 var lowSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 1977 $(slideNodes).each(function(i) { 1978 1979 if(helpers.getSliderOffset(this, 'x') < lowSlideOffset) { 1980 lowSlideOffset = helpers.getSliderOffset(this, 'x'); 1981 lowSlideNumber = i; 1982 } 1983 1984 }); 1985 1986 var newOffset = sliderMin[sliderNumber] + scrollerWidth; 1987 helpers.setSliderOffset($(slideNodes)[lowSlideNumber], newOffset); 1988 1989 sliderMin[sliderNumber] = childrenOffsets[1] * -1 + centeredSlideOffset; 1990 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 1991 1992 childrenOffsets.splice(0, 1); 1993 childrenOffsets.splice(childrenOffsets.length, 0, newOffset * -1 + centeredSlideOffset); 1994 1995 infiniteSliderOffset[sliderNumber]++; 1996 1997 } 1998 1999 } 2000 2001 if((scrollPosition >= (sliderMin[sliderNumber] * -1)) || (scrollPosition >= 0)) { 2002 2003 var scrollerWidth = $(scrollerNode).width(); 2004 2005 if(scrollPosition >= 0) { 2006 2007 var sum = originalOffsets[0] * -1; 2008 $(slideNodes).each(function(i) { 2009 2010 helpers.setSliderOffset($(slideNodes)[i], sum + centeredSlideOffset); 2011 if(i < childrenOffsets.length) { 2012 childrenOffsets[i] = sum * -1; 2013 } 2014 sum = sum + slideNodeOuterWidths[i]; 2015 2016 }); 2017 2018 xScrollStartPosition = xScrollStartPosition + childrenOffsets[0] * -1; 2019 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 2020 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 2021 infiniteSliderOffset[sliderNumber] = numberOfSlides; 2022 2023 while(((childrenOffsets[0] * -1 - scrollerWidth + centeredSlideOffset) > 0)) { 2024 2025 var highSlideNumber = 0; 2026 var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 2027 $(slideNodes).each(function(i) { 2028 2029 if(helpers.getSliderOffset(this, 'x') > highSlideOffset) { 2030 highSlideOffset = helpers.getSliderOffset(this, 'x'); 2031 highSlideNumber = i; 2032 } 2033 2034 }); 2035 2036 var newOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber]; 2037 helpers.setSliderOffset($(slideNodes)[highSlideNumber], newOffset); 2038 2039 childrenOffsets.splice(0, 0, newOffset * -1 + centeredSlideOffset); 2040 childrenOffsets.splice(childrenOffsets.length-1, 1); 2041 2042 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 2043 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 2044 2045 infiniteSliderOffset[sliderNumber]--; 2046 activeChildOffsets[sliderNumber]++; 2047 2048 } 2049 2050 } else { 2051 2052 var highSlideNumber = 0; 2053 var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x'); 2054 $(slideNodes).each(function(i) { 2055 2056 if(helpers.getSliderOffset(this, 'x') > highSlideOffset) { 2057 highSlideOffset = helpers.getSliderOffset(this, 'x'); 2058 highSlideNumber = i; 2059 } 2060 2061 }); 2062 2063 var newOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber]; 2064 helpers.setSliderOffset($(slideNodes)[highSlideNumber], newOffset); 2065 2066 childrenOffsets.splice(0, 0, newOffset * -1 + centeredSlideOffset); 2067 childrenOffsets.splice(childrenOffsets.length-1, 1); 2068 2069 sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset; 2070 sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth; 2071 2072 infiniteSliderOffset[sliderNumber]--; 2073 2074 } 2075 2076 } 2077 2078 } else { 2079 2080 var scrollerWidth = $(scrollerNode).width(); 2081 2082 if(scrollPosition > (sliderMin[sliderNumber] * -1 + centeredSlideOffset)) { 2083 2084 edgeDegradation = (sliderMin[sliderNumber] + ((xScrollStartPosition - scrollbarSubtractor - eventX + snapCenteredSlideOffset) * -1 * scrollbarMultiplier) - scrollbarSubtractor) * elasticPullResistance * -1 / scrollbarMultiplier; 2085 2086 } 2087 2088 if(scrollPosition < (sliderMax[sliderNumber] * -1)) { 2089 2090 edgeDegradation = (sliderMax[sliderNumber] + snapCenteredSlideOffsetScrollbar + ((xScrollStartPosition - scrollbarSubtractor - eventX) * -1 * scrollbarMultiplier) - scrollbarSubtractor) * elasticPullResistance * -1 / scrollbarMultiplier; 2091 2092 } 2093 2094 } 2095 2096 helpers.setSliderOffset(scrollerNode, ((xScrollStartPosition - scrollbarSubtractor - eventX - edgeDegradation) * -1 * scrollbarMultiplier) - scrollbarSubtractor + snapCenteredSlideOffsetScrollbar); 2097 2098 if(settings.scrollbar) { 2099 2100 helpers.showScrollbar(settings, scrollbarClass); 2101 2102 scrollbarDistance = Math.floor((xScrollStartPosition - eventX - edgeDegradation - sliderMin[sliderNumber] + snapCenteredSlideOffset) / (sliderMax[sliderNumber] - sliderMin[sliderNumber] + centeredSlideOffset) * (scrollbarStageWidth - scrollMargin - scrollbarWidth) * scrollbarMultiplier); 2103 2104 var width = scrollbarWidth; 2105 2106 if(scrollbarDistance <= 0) { 2107 2108 width = scrollbarWidth - scrollBorder - (scrollbarDistance * -1); 2109 2110 helpers.setSliderOffset($('.' + scrollbarClass), 0); 2111 2112 $('.' + scrollbarClass).css({ 2113 width: width + 'px' 2114 }); 2115 2116 } else if(scrollbarDistance >= (scrollbarStageWidth - scrollMargin - scrollBorder - scrollbarWidth)) { 2117 2118 width = scrollbarStageWidth - scrollMargin - scrollBorder - scrollbarDistance; 2119 2120 helpers.setSliderOffset($('.' + scrollbarClass), scrollbarDistance); 2121 2122 $('.' + scrollbarClass).css({ 2123 width: width + 'px' 2124 }); 2125 2126 } else { 2127 2128 helpers.setSliderOffset($('.' + scrollbarClass), scrollbarDistance); 2129 2130 } 2131 2132 } 2133 2134 if(e.type == 'touchmove') { 2135 lastTouch = e.touches[0].pageX; 2136 } 2137 2138 var slideChanged = false;
2139 var newChildOffset = helpers.calcActiveOffset(settings, (xScrollStartPosition - eventX - edgeDegradation) * -1, childrenOffsets, stageWidth, infiniteSliderOffset[sliderNumber], numberOfSlides, undefined, sliderNumber); 2140 var tempOffset = (newChildOffset + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides; 2141 2142 if(settings.infiniteSlider) { 2143 2144 if(tempOffset != activeChildInfOffsets[sliderNumber]) { 2145 slideChanged = true; 2146 } 2147 2148 } else { 2149 2150 if(newChildOffset != activeChildOffsets[sliderNumber]) { 2151 slideChanged = true; 2152 } 2153 2154 } 2155 2156 if(slideChanged) { 2157 2158 activeChildOffsets[sliderNumber] = newChildOffset; 2159 activeChildInfOffsets[sliderNumber] = tempOffset; 2160 snapOverride = true; 2161 2162 var args = new helpers.args('change', settings, scrollerNode, $(scrollerNode).children(':eq(' + tempOffset + ')'), tempOffset, tempOffset); 2163 $(stageNode).data('args', args); 2164 2165 if(settings.onSlideChange != '') { 2166 settings.onSlideChange(args); 2167 } 2168 2169 } 2170 2171 } 2172 2173 touchStartFlag = false; 2174 2175 }); 2176 2177 var eventObject = $(window); 2178 2179 if(isIe8 || isIe7) { 2180 var eventObject = $(document); 2181 } 2182 2183 $(touchSelection).bind('touchend.iosSliderEvent', function(e) { 2184 2185 var e = e.originalEvent; 2186 2187 if(touchLocks[sliderNumber] || shortContent) return true; 2188 2189 if(isUnselectable) return true; 2190 2191 if(e.touches.length != 0) { 2192 2193 for(var j = 0; j < e.touches.length; j++) { 2194 2195 if(e.touches[j].pageX == lastTouch) { 2196 helpers.slowScrollHorizontal(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, xScrollDistance, yScrollDistance, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, currentEventNode, snapOverride, centeredSlideOffset, settings); 2197 } 2198 2199 } 2200 2201 } else { 2202 2203 helpers.slowScrollHorizontal(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, xScrollDistance, yScrollDistance, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, currentEventNode, snapOverride, centeredSlideOffset, settings); 2204 2205 } 2206 2207 preventXScroll = false; 2208 touchStartFlag = false; 2209 2210 }); 2211 2212 $(eventObject).bind('mouseup.iosSliderEvent-' + sliderNumber, function(e) { 2213 2214 if(xScrollStarted) { 2215 anchorEvents.unbind('click.disableClick').bind('click.disableClick', helpers.preventClick); 2216 } else { 2217 anchorEvents.unbind('click.disableClick').bind('click.disableClick', helpers.enableClick); 2218 } 2219 2220 onclickEvents.each(function() { 2221 2222 this.onclick = function(event) { 2223 if(xScrollStarted) { 2224 return false; 2225 } 2226 2227 $(this).data('onclick').call(this, event || window.event); 2228 } 2229 2230 this.onclick = $(this).data('onclick'); 2231 2232 }); 2233 2234 if(parseFloat($().jquery) >= 1.8) { 2235 2236 allScrollerNodeChildren.each(function() { 2237 2238 var clickObject = $._data(this, 'events'); 2239 2240 if(clickObject != undefined) { 2241 if(clickObject.click != undefined) { 2242 2243 if(clickObject.click[0].namespace != 'iosSliderEvent') { 2244 2245 if(!xScrollStarted) { 2246 return false; 2247 } 2248 2249 $(this).one('click.disableClick', helpers.preventClick); 2250 var handlers = $._data(this, 'events').click; 2251 var handler = handlers.pop(); 2252 handlers.splice(0, 0, handler); 2253 2254 } 2255 2256 } 2257 } 2258 2259 }); 2260 2261 } else if(parseFloat($().jquery) >= 1.6) { 2262 2263 allScrollerNodeChildren.each(function() { 2264 2265 var clickObject = $(this).data('events'); 2266 2267 if(clickObject != undefined) { 2268 if(clickObject.click != undefined) { 2269 2270 if(clickObject.click[0].namespace != 'iosSliderEvent') { 2271 2272 if(!xScrollStarted) { 2273 return false;
2274 } 2275 2276 $(this).one('click.disableClick', helpers.preventClick); 2277 var handlers = $(this).data('events').click; 2278 var handler = handlers.pop(); 2279 handlers.splice(0, 0, handler); 2280 2281 } 2282 2283 } 2284 } 2285 2286 }); 2287 2288 } else { 2289 } 2290 2291 if(!isEventCleared[sliderNumber]) { 2292 2293 if(shortContent) return true; 2294 2295 $(touchSelection).css({ 2296 cursor: grabOutCursor 2297 }); 2298 2299 isMouseDown = false; 2300 2301 if(currentSlider == undefined) { 2302 return true; 2303 } 2304 2305 helpers.slowScrollHorizontal(currentSlider, slideNodes, scrollTimeouts, scrollbarClass, xScrollDistance, yScrollDistance, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, currentEventNode, snapOverride, centeredSlideOffset, settings); 2306 2307 currentSlider = undefined; 2308 2309 } 2310 2311 preventXScroll = false; 2312 touchStartFlag = false; 2313 2314 }); 2315 2316 } 2317 2318 }); 2319 2320 }, 2321 2322 destroy: function(clearStyle, node) { 2323 2324 if(node == undefined) { 2325 node = this; 2326 } 2327 2328 return $(node).each(function() { 2329 2330 var $this = $(this); 2331 var data = $this.data('iosslider'); 2332 if(data == undefined) return false; 2333 2334 if(clearStyle == undefined) { 2335 clearStyle = true; 2336 } 2337 2338 helpers.autoSlidePause(data.sliderNumber); 2339 isEventCleared[data.sliderNumber] = true; 2340 $(window).unbind('.iosSliderEvent-' + data.sliderNumber); 2341 $(document).unbind('.iosSliderEvent-' + data.sliderNumber); 2342 $(document).unbind('keydown.iosSliderEvent'); 2343 $(this).unbind('.iosSliderEvent'); 2344 $(this).children(':first-child').unbind('.iosSliderEvent'); 2345 $(this).children(':first-child').children().unbind('.iosSliderEvent'); 2346 2347 if(clearStyle) { 2348 $(this).attr('style', ''); 2349 $(this).children(':first-child').attr('style', ''); 2350 $(this).children(':first-child').children().attr('style', ''); 2351 2352 $(data.settings.navSlideSelector).attr('style', ''); 2353 $(data.settings.navPrevSelector).attr('style', ''); 2354 $(data.settings.navNextSelector).attr('style', ''); 2355 $(data.settings.autoSlideToggleSelector).attr('style', ''); 2356 $(data.settings.unselectableSelector).attr('style', ''); 2357 } 2358 2359 if(data.settings.scrollbar) { 2360 $('.scrollbarBlock' + data.sliderNumber).remove(); 2361 } 2362 2363 var scrollTimeouts = slideTimeouts[data.sliderNumber]; 2364 2365 for(var i = 0; i < scrollTimeouts.length; i++) { 2366 clearTimeout(scrollTimeouts[i]); 2367 } 2368 2369 $this.removeData('iosslider'); 2370 $this.removeData('args'); 2371 2372 }); 2373 2374 }, 2375 2376 update: function(node) { 2377 2378 if(node == undefined) { 2379 node = this; 2380 } 2381 2382 return $(node).each(function() { 2383 2384 var $this = $(this); 2385 var data = $this.data('iosslider'); 2386 if(data == undefined) return false; 2387 2388 data.settings.startAtSlide = $this.data('args').currentSlideNumber; 2389 2390 methods.destroy(false, this); 2391 2392 if((data.numberOfSlides != 1) && data.settings.infiniteSlider) { 2393 data.settings.startAtSlide = (activeChildOffsets[data.sliderNumber] + 1 + infiniteSliderOffset[data.sliderNumber] + data.numberOfSlides)%data.numberOfSlides; 2394 } 2395 2396 methods.init(data.settings, this); 2397 2398 var args = new helpers.args('update', data.settings, data.scrollerNode, $(data.scrollerNode).children(':eq(' + (data.settings.startAtSlide - 1) + ')'), data.settings.startAtSlide - 1, data.settings.startAtSlide - 1); 2399 $(data.stageNode).data('args', args); 2400 2401 if(data.settings.onSliderUpdate != '') { 2402 data.settings.onSliderUpdate(args); 2403 } 2404 2405 }); 2406 2407 }, 2408 2409 addSlide: function(slideNode, slidePosition) { 2410 2411 return this.each(function() { 2412 2413 var $this = $(this); 2414 var data = $this.data('iosslider'); 2415 if(data == undefined) return false;
2416 2417 if($(data.scrollerNode).children().length == 0) { 2418 2419 $(data.scrollerNode).append(slideNode); 2420 $this.data('args').currentSlideNumber = 1; 2421 2422 } else if(!data.settings.infiniteSlider) { 2423 2424 if(slidePosition <= data.numberOfSlides) { 2425 $(data.scrollerNode).children(':eq(' + (slidePosition - 1) + ')').before(slideNode); 2426 } else { 2427 $(data.scrollerNode).children(':eq(' + (slidePosition - 2) + ')').after(slideNode); 2428 } 2429 2430 if($this.data('args').currentSlideNumber >= slidePosition) { 2431 $this.data('args').currentSlideNumber++; 2432 } 2433 2434 } else { 2435 2436 if(slidePosition == 1) { 2437 $(data.scrollerNode).children(':eq(0)').before(slideNode); 2438 } else { 2439 $(data.scrollerNode).children(':eq(' + (slidePosition - 2) + ')').after(slideNode); 2440 } 2441 2442 if((infiniteSliderOffset[data.sliderNumber] < -1) && (true)) { 2443 activeChildOffsets[data.sliderNumber]--; 2444 } 2445 2446 if($this.data('args').currentSlideNumber >= slidePosition) { 2447 activeChildOffsets[data.sliderNumber]++; 2448 } 2449 2450 } 2451 2452 $this.data('iosslider').numberOfSlides++; 2453 2454 methods.update(this); 2455 2456 }); 2457 2458 }, 2459 2460 removeSlide: function(slideNumber) { 2461 2462 return this.each(function() { 2463 2464 var $this = $(this); 2465 var data = $this.data('iosslider'); 2466 if(data == undefined) return false; 2467 2468 $(data.scrollerNode).children(':eq(' + (slideNumber - 1) + ')').remove(); 2469 if(activeChildOffsets[data.sliderNumber] > (slideNumber - 1)) { 2470 activeChildOffsets[data.sliderNumber]--; 2471 } 2472 2473 methods.update(this); 2474 2475 }); 2476 2477 }, 2478 2479 goToSlide: function(slide, node) { 2480 2481 if(node == undefined) { 2482 node = this; 2483 } 2484 2485 return $(node).each(function() { 2486 2487 var $this = $(this); 2488 var data = $this.data('iosslider'); 2489 if(data == undefined) return false; 2490 2491 slide = (slide > data.childrenOffsets.length) ? data.childrenOffsets.length - 1 : slide - 1; 2492 2493 helpers.changeSlide(slide, $(data.scrollerNode), $(data.slideNodes), slideTimeouts[data.sliderNumber], data.scrollbarClass, data.scrollbarWidth, data.stageWidth, data.scrollbarStageWidth, data.scrollMargin, data.scrollBorder, data.originalOffsets, data.childrenOffsets, data.slideNodeOuterWidths, data.sliderNumber, data.infiniteSliderWidth, data.numberOfSlides, data.centeredSlideOffset, data.settings); 2494 2495 }); 2496 2497 }, 2498 2499 prevSlide: function() { 2500 2501 return this.each(function() { 2502 2503 var $this = $(this); 2504 var data = $this.data('iosslider'); 2505 if(data == undefined) return false; 2506 2507 var slide = (activeChildOffsets[data.sliderNumber] + infiniteSliderOffset[data.sliderNumber] + data.numberOfSlides)%data.numberOfSlides; 2508 2509 if((slide > 0) || data.settings.infiniteSlider) { 2510 helpers.changeSlide(slide - 1, $(data.scrollerNode), $(data.slideNodes), slideTimeouts[data.sliderNumber], data.scrollbarClass, data.scrollbarWidth, data.stageWidth, data.scrollbarStageWidth, data.scrollMargin, data.scrollBorder, data.originalOffsets, data.childrenOffsets, data.slideNodeOuterWidths, data.sliderNumber, data.infiniteSliderWidth, data.numberOfSlides, data.centeredSlideOffset, data.settings); 2511 } 2512 2513 activeChildOffsets[data.sliderNumber] = slide; 2514 2515 }); 2516 2517 }, 2518 2519 nextSlide: function() { 2520 2521 return this.each(function() { 2522 2523 var $this = $(this); 2524 var data = $this.data('iosslider'); 2525 if(data == undefined) return false; 2526 2527 var slide = (activeChildOffsets[data.sliderNumber] + infiniteSliderOffset[data.sliderNumber] + data.numberOfSlides)%data.numberOfSlides; 2528 2529 if((slide < data.childrenOffsets.length-1) || data.settings.infiniteSlider) { 2530 helpers.changeSlide(slide + 1, $(data.scrollerNode), $(data.slideNodes), slideTimeouts[data.sliderNumber], data.scrollbarClass, data.scrollbarWidth, data.stageWidth, data.scrollbarStageWidth, data.scrollMargin, data.scrollBorder, data.originalOffsets, data.childrenOffsets, data.slideNodeOuterWidths, data.sliderNumber, data.infiniteSliderWidth, data.numberOfSlides, data.centeredSlideOffset, data.settings); 2531 } 2532 2533 activeChildOffsets[data.sliderNumber] = slide; 2534 2535 }); 2536 2537 }, 2538 2539 lock: function() { 2540 2541 return this.each(function() { 2542 2543 var $this = $(this); 2544 var data = $this.data('iosslider'); 2545 if(data == undefined) return false;
2546 2547 touchLocks[data.sliderNumber] = true; 2548 2549 }); 2550 2551 }, 2552 2553 unlock: function() { 2554 2555 return this.each(function() { 2556 2557 var $this = $(this); 2558 var data = $this.data('iosslider'); 2559 if(data == undefined) return false; 2560 2561 touchLocks[data.sliderNumber] = false; 2562 2563 }); 2564 2565 }, 2566 2567 getData: function() { 2568 2569 return this.each(function() { 2570 2571 var $this = $(this); 2572 var data = $this.data('iosslider'); 2573 if(data == undefined) return false; 2574 2575 return data; 2576 2577 }); 2578 2579 }, 2580 2581 autoSlidePause: function() { 2582 2583 return this.each(function() { 2584 2585 var $this = $(this); 2586 var data = $this.data('iosslider'); 2587 if(data == undefined) return false; 2588 2589 iosSliderSettings[data.sliderNumber].autoSlide = false; 2590 2591 helpers.autoSlidePause(data.sliderNumber); 2592 2593 return data; 2594 2595 }); 2596 2597 }, 2598 2599 autoSlidePlay: function() { 2600 2601 return this.each(function() { 2602 2603 var $this = $(this); 2604 var data = $this.data('iosslider'); 2605 if(data == undefined) return false; 2606 2607 iosSliderSettings[data.sliderNumber].autoSlide = true; 2608 2609 helpers.autoSlide($(data.scrollerNode), $(data.slideNodes), slideTimeouts[data.sliderNumber], data.scrollbarClass, data.scrollbarWidth, data.stageWidth, data.scrollbarStageWidth, data.scrollMargin, data.scrollBorder, data.originalOffsets, data.childrenOffsets, data.slideNodeOuterWidths, data.sliderNumber, data.infiniteSliderWidth, data.numberOfSlides, data.centeredSlideOffset, data.settings); 2610 2611 return data; 2612 2613 }); 2614 2615 } 2616 2617 } 2618 2619 /* public functions */ 2620 $.fn.iosSlider = function(method) { 2621 2622 if(methods[method]) { 2623 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 2624 } else if (typeof method === 'object' || !method) { 2625 return methods.init.apply(this, arguments); 2626 } else { 2627 $.error('invalid method call!'); 2628 } 2629 2630 }; 2631 2632}) (jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.