1/* 2 * Lightcase - jQuery Plugin 3 * The smart and flexible Lightbox Plugin. 4 * 5 * @author Cornel Boppart <[email protected]> 6 * @copyright Author 7 * 8 * @version 2.3.4 (29/12/2015) 9 */ 10 11; 12(function($) { 13 'use strict'; 14 // ã¹ã¯ãã¼ã«ä½ç½®è¨æ¶ç¨ 15 var currentScrollPos; 16 17 var _self = { 18 cache: {}, 19 support: {}, 20 objects: {}, 21 scrollPosition: $(window).scrollTop(), 22 init: function(options) { 23 return this.each(function() { 24 $(this).unbind('click.lightcase').bind('click.lightcase', function(event) { 25 26 event.preventDefault(); 27 $(this).lightcase('start', options); 28 }); 29 }); 30 }, 31 start: function(options) { 32 _self.origin = lightcase.origin = this; 33 34 _self.settings = lightcase.settings = $.extend(true, { 35 idPrefix: 'lightcase-', 36 classPrefix: 'lightcase-', 37 attrPrefix: 'lc-', 38 transition: 'elastic', 39 transitionIn: null, 40 transitionOut: null, 41 cssTransitions: true, 42 speedIn: 250, 43 speedOut: 250, 44 maxWidth: 835, 45 maxHeight: 750, 46 forceWidth: false, 47 forceHeight: false, 48 liveResize: true, 49 fullScreenModeForMobile: true, 50 mobileMatchExpression: /(iphone|ipod|ipad|android|blackberry|symbian)/, 51 disableShrink: false, 52 shrinkFactor: .75, 53 overlayOpacity: .9, 54 slideshow: false, 55 timeout: 5000, 56 swipe: true, 57 useKeys: true, 58 useCategories: true, 59 navigateEndless: true, 60 closeOnOverlayClick: true, 61 title: null, 62 caption: null, 63 showTitle: true, 64 showCaption: true, 65 showSequenceInfo: true, 66 inline: { 67 width: 'auto', 68 height: 'auto' 69 }, 70 ajax: { 71 width: 'auto', 72 height: 'auto', 73 type: 'get', 74 dataType: 'html', 75 data: {} 76 }, 77 iframe: { 78 width: 835, 79 height: 750, 80 frameborder: 0 81 }, 82 flash: { 83 width: 400, 84 height: 205, 85 wmode: 'transparent' 86 }, 87 video: { 88 width: 400, 89 height: 225, 90 poster: '', 91 preload: 'auto', 92 controls: true, 93 autobuffer: true, 94 autoplay: true, 95 loop: false 96 }, 97 attr: 'data-rel', 98 href: null, 99 type: null, 100 typeMapping: { 101 'image': 'jpg,jpeg,gif,png,bmp', 102 'flash': 'swf', 103 'video': 'mp4,mov,ogv,ogg,webm', 104 'iframe': 'html,php', 105 'ajax': 'json,txt', 106 'inline': '#' 107 }, 108 errorMessage: function() { 109 return '<p class="' + _self.settings.classPrefix + 'error">' + _self.settings.labels['errorMessage'] + '</p>'; 110 }, 111 labels: { 112 'errorMessage': 'Source could not be found...', 113 'sequenceInfo.of': ' of ', 114 'close': 'Close', 115 'navigator.prev': 'Prev', 116 'navigator.next': 'Next', 117 'navigator.play': 'Play', 118 'navigator.pause': 'Pause' 119 }, 120 markup: function() { 121 $('body').append( 122 _self.objects.overlay = $('<div id="' + _self.settings.idPrefix + 'overlay"></div>'), 123 _self.objects.loading = $('<div id="' + _self.settings.idPrefix + 'loading" class="' + _self.settings.classPrefix + 'icon-spin"></div>'), 124 _self.objects.case = $('<div id="' + _self.settings.idPrefix + 'case" aria-hidden="true" role="dialog"></div>') 125 ); 126 _self.objects.case.after(
127 _self.objects.nav = $('<div id="' + _self.settings.idPrefix + 'nav"></div>') 128 ); 129 _self.objects.nav.append( 130 _self.objects.close = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-close"><span>' + _self.settings.labels['close'] + '</span></a>'), 131 _self.objects.prev = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-prev"><span>' + _self.settings.labels['navigator.prev'] + '</span></a>').hide(), 132 _self.objects.next = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-next"><span>' + _self.settings.labels['navigator.next'] + '</span></a>').hide(), 133 _self.objects.play = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-play"><span>' + _self.settings.labels['navigator.play'] + '</span></a>').hide(), 134 _self.objects.pause = $('<a href="javascript:void(0)" class="' + _self.settings.classPrefix + 'icon-pause"><span>' + _self.settings.labels['navigator.pause'] + '</span></a>').hide() 135 ); 136 _self.objects.case.append( 137 _self.objects.content = $('<div id="' + _self.settings.idPrefix + 'content"></div>'), 138 _self.objects.info = $('<div id="' + _self.settings.idPrefix + 'info"></div>') 139 ); 140 _self.objects.content.append(
141 _self.objects.contentInner = $('<div class="' + _self.settings.classPrefix + 'contentInner"></div>') 142 ); 143 _self.objects.info.append( 144 _self.objects.sequenceInfo = $('<div id="' + _self.settings.idPrefix + 'sequenceInfo"></div>'), 145 _self.objects.title = $('<h4 id="' + _self.settings.idPrefix + 'title"></h4>'), 146 _self.objects.caption = $('<p id="' + _self.settings.idPrefix + 'caption"></p>') 147 ); 148 }, 149 onInit: {}, 150 onStart: {}, 151 onFinish: {}, 152 onClose: {}, 153 onCleanup: {} 154 }, options); 155 156 // Call onInit hook functions 157 _self._callHooks(_self.settings.onInit); 158 159 _self.objectData = _self._setObjectData(this); 160 161 _self._cacheScrollPosition(); 162 _self._watchScrollInteraction(); 163 164 _self._addElements(); 165 _self._open(); 166 167 _self.dimensions = _self.getViewportDimensions(); 168 }, 169 get: function(name) { 170 return _self.objects[name]; 171 }, 172 getObjectData: function() { 173 return _self.objectData; 174 }, 175 _setObjectData: function(object) { 176 var $object = $(object), 177 objectData = { 178 title: _self.settings.title || $object.attr(_self._prefixAttributeName('title')) || $object.attr('title'), 179 caption: _self.settings.caption || $object.attr(_self._prefixAttributeName('caption')) || $object.children('img').attr('alt'), 180 url: _self._determineUrl(), 181 requestType: _self.settings.ajax.type, 182 requestData: _self.settings.ajax.data, 183 requestDataType: _self.settings.ajax.dataType, 184 rel: $object.attr(_self._determineAttributeSelector()), 185 type: _self.settings.type || _self._verifyDataType(_self._determineUrl()), 186 isPartOfSequence: _self._isPartOfSequence($object.attr(_self.settings.attr), ':'), 187 isPartOfSequenceWithSlideshow: _self._isPartOfSequence($object.attr(_self.settings.attr), ':slideshow'), 188 currentIndex: $(_self._determineAttributeSelector()).index($object), 189 sequenceLength: $(_self._determineAttributeSelector()).length 190 }; 191 192 // Add sequence info to objectData 193 objectData.sequenceInfo = (objectData.currentIndex + 1) + _self.settings.labels['sequenceInfo.of'] + objectData.sequenceLength; 194 195 // Add next/prev index 196 objectData.prevIndex = objectData.currentIndex - 1; 197 objectData.nextIndex = objectData.currentIndex + 1; 198 199 return objectData; 200 }, 201 _prefixAttributeName: function(name) { 202 return 'data-' + _self.settings.attrPrefix + name; 203 }, 204 _determineLinkTarget: function() { 205 return _self.settings.href || $(_self.origin).attr(_self._prefixAttributeName('href')) || $(_self.origin).attr('href'); 206 }, 207 _determineAttributeSelector: function() { 208 var $origin = $(_self.origin), 209 selector = ''; 210 211 if (typeof _self.cache.selector !== 'undefined') { 212 selector = _self.cache.selector; 213 } else if (_self.settings.useCategories === true && $origin.attr(_self._prefixAttributeName('categories'))) { 214 var categories = $origin.attr(_self._prefixAttributeName('categories')).split(' '); 215 216 $.each(categories, function(index, category) { 217 if (index > 0) { 218 selector += ','; 219 } 220 selector += '[' + _self._prefixAttributeName('categories') + '~="' + category + '"]'; 221 }); 222 } else { 223 selector = '[' + _self.settings.attr + '="' + $origin.attr(_self.settings.attr) + '"]'; 224 } 225 226 _self.cache.selector = selector; 227 228 return selector; 229 }, 230 _determineUrl: function() { 231 var dataUrl = _self._verifyDataUrl(_self._determineLinkTarget()), 232 width = 0, 233 density = 0, 234 url; 235 236 $.each(dataUrl, function(index, src) { 237 if ( 238 // Check density 239 _self._devicePixelRatio() >= src.density && 240 src.density >= density && 241 // Check viewport width 242 _self._matchMedia()('screen and (min-width:' + src.width + 'px)') && 243 src.width >= width 244 ) { 245 width = src.width; 246 density = src.density; 247 url = src.url; 248 } 249 }); 250 251 return url; 252 }, 253 _normalizeUrl: function(url) { 254 var srcExp = /^\d+$/; 255 256 return url.split(',').map(function(str) { 257 var src = { 258 width: 0, 259 density: 0 260 }; 261
262 str.trim().split(/\s+/).forEach(function(url, i) { 263 if (i === 0) { 264 return src.url = url; 265 } 266 267 var value = url.substring(0, url.length - 1), 268 lastChar = url[url.length - 1], 269 intVal = parseInt(value, 10), 270 floatVal = parseFloat(value); 271 if (lastChar === 'w' && srcExp.test(value)) { 272 src.width = intVal; 273 } else if (lastChar === 'h' && srcExp.test(value)) { 274 src.height = intVal; 275 } else if (lastChar === 'x' && !isNaN(floatVal)) { 276 src.density = floatVal; 277 } 278 }); 279 280 return src; 281 }); 282 }, 283 _isPartOfSequence: function(rel, expression) { 284 var getSimilarLinks = $('[' + _self.settings.attr + '="' + rel + '"]'), 285 regexp = new RegExp(expression); 286 287 return (regexp.test(rel) && getSimilarLinks.length > 1); 288 }, 289 isSlideshowEnabled: function() { 290 return (_self.objectData.isPartOfSequence && (_self.settings.slideshow === true || _self.objectData.isPartOfSequenceWithSlideshow === true)); 291 }, 292 _loadContent: function() { 293 if (_self.cache.originalObject) { 294 _self._restoreObject(); 295 } 296 297 _self._createObject(); 298 }, 299 _createObject: function() { 300 var $object; 301 302 // Create object 303 switch (_self.objectData.type) { 304 case 'image': 305 $object = $(new Image()); 306 $object.attr({ 307 // The time expression is required to prevent the binding of an image load 308 'src': _self.objectData.url, 309 'alt': _self.objectData.title 310 }); 311 break; 312 case 'inline': 313 $object = $('<div class="' + _self.settings.classPrefix + 'inlineWrap"></div>'); 314 $('html').addClass('inlineMode'); 315 $object.html(_self._cloneObject($(_self.objectData.url))); 316 317 // Add custom attributes from _self.settings 318 $.each(_self.settings.inline, function(name, value) { 319 $object.attr(_self._prefixAttributeName(name), value); 320 }); 321 break; 322 case 'ajax': 323 $object = $('<div class="' + _self.settings.classPrefix + 'inlineWrap"></div>'); 324 325 // Add custom attributes from _self.settings 326 $.each(_self.settings.ajax, function(name, value) { 327 if (name !== 'data') { 328 $object.attr(_self._prefixAttributeName(name), value); 329 } 330 }); 331 break; 332 case 'flash': 333 $object = $('<embed src="' + _self.objectData.url + '" type="application/x-shockwave-flash"></embed>'); 334 335 // Add custom attributes from _self.settings 336 $.each(_self.settings.flash, function(name, value) { 337 $object.attr(name, value); 338 }); 339 break; 340 case 'video': 341 $object = $('<video></video>'); 342 $object.attr('src', _self.objectData.url); 343 344 // Add custom attributes from _self.settings 345 $.each(_self.settings.video, function(name, value) { 346 $object.attr(name, value); 347 }); 348 break; 349 default: 350 $object = $('<iframe></iframe>'); 351 $object.attr({ 352 'src': _self.objectData.url 353 }); 354 355 // Add custom attributes from _self.settings 356 $.each(_self.settings.iframe, function(name, value) { 357 $object.attr(name, value); 358 }); 359 break; 360 } 361 362 _self._addObject($object); 363 _self._loadObject($object); 364 }, 365 _addObject: function($object) { 366 // Add object to content holder 367 _self.objects.contentInner.html($object); 368 369 // Start loading 370 _self._loading('start'); 371 372 // Call onStart hook functions 373 _self._callHooks(_self.settings.onStart); 374 375 // Add sequenceInfo to the content holder or hide if its empty 376 if (_self.settings.showSequenceInfo === true && _self.objectData.isPartOfSequence) { 377 _self.objects.sequenceInfo.html(_self.objectData.sequenceInfo); 378 _self.objects.sequenceInfo.show(); 379 } else { 380 _self.objects.sequenceInfo.empty(); 381 _self.objects.sequenceInfo.hide(); 382 } 383 // Add title to the content holder or hide if its empty 384 if (_self.settings.showTitle === true && _self.objectData.title !== undefined && _self.objectData.title !== '') { 385 _self.objects.title.html(_self.objectData.title); 386 _self.objects.title.show(); 387 } else { 388 _self.objects.title.empty(); 389 _self.objects.title.hide(); 390 } 391 // Add caption to the content holder or hide if its empty 392 if (_self.settings.showCaption === true && _self.objectData.caption !== undefined && _self.objectData.caption !== '') { 393 _self.objects.caption.html(_self.objectData.caption); 394 _self.objects.caption.show(); 395 } else { 396 _self.objects.caption.empty(); 397 _self.objects.caption.hide(); 398 } 399 }, 400 _loadObject: function($object) { 401 // Load the object 402 switch (_self.objectData.type) { 403 case 'inline': 404 if ($(_self.objectData.url)) { 405 _self._showContent($object); 406 } else { 407 _self.error(); 408 } 409 break; 410 case 'ajax': 411 $.ajax( 412 $.extend({}, _self.settings.ajax, { 413 url: _self.objectData.url, 414 type: _self.objectData.requestType, 415 dataType: _self.objectData.requestDataType, 416 data: _self.objectData.requestData, 417 success: function(data, textStatus, jqXHR) { 418 // Unserialize if data is transferred as json 419 if (_self.objectData.requestDataType === 'json') { 420 _self.objectData.data = data; 421 } else { 422 $object.html(data); 423 } 424 _self._showContent($object); 425 }, 426 error: function(jqXHR, textStatus, errorThrown) { 427 _self.error(); 428 } 429 }) 430 ); 431 break; 432 case 'flash': 433 _self._showContent($object); 434 break; 435 case 'video': 436 if (typeof($object.get(0).canPlayType) === 'function' || _self.objects.case.find('video').length === 0) { 437 _self._showContent($object); 438 } else { 439 _self.error(); 440 } 441 break; 442 default: 443 if (_self.objectData.url) { 444 $object.load(function() { 445 _self._showContent($object); 446 });
447 $object.error(function() { 448 _self.error(); 449 }); 450 } else { 451 _self.error(); 452 } 453 break; 454 } 455 }, 456 error: function() { 457 _self.objectData.type = 'error'; 458 var $object = $('<div class="' + _self.settings.classPrefix + 'inlineWrap"></div>'); 459 460 $object.html(_self.settings.errorMessage); 461 _self.objects.contentInner.html($object); 462 463 _self._showContent(_self.objects.contentInner); 464 }, 465 _calculateDimensions: function($object) { 466 _self._cleanupDimensions(); 467 468 // Set default dimensions 469 var dimensions = { 470 objectWidth: $object.attr('width') ? $object.attr('width') : $object.attr(_self._prefixAttributeName('width')), 471 objectHeight: $object.attr('height') ? $object.attr('height') : $object.attr(_self._prefixAttributeName('height')) 472 }; 473 474 if (!_self.settings.disableShrink) { 475 // Add calculated maximum width/height to dimensions 476 dimensions.maxWidth = parseInt(_self.dimensions.windowWidth * _self.settings.shrinkFactor); 477 dimensions.maxHeight = parseInt(_self.dimensions.windowHeight * _self.settings.shrinkFactor); 478 479 // If the auto calculated maxWidth/maxHeight greather than the userdefined one, use that. 480 if (dimensions.maxWidth > _self.settings.maxWidth) { 481 dimensions.maxWidth = _self.settings.maxWidth; 482 } 483 if (dimensions.maxHeight > _self.settings.maxHeight) { 484 dimensions.maxHeight = _self.settings.maxHeight; 485 } 486 487 // Calculate the difference between screen width/height and image width/height 488 dimensions.differenceWidthAsPercent = parseInt(100 / dimensions.maxWidth * dimensions.objectWidth); 489 dimensions.differenceHeightAsPercent = parseInt(100 / dimensions.maxHeight * dimensions.objectHeight); 490 491 switch (_self.objectData.type) { 492 case 'image': 493 case 'flash': 494 case 'video': 495 if (dimensions.differenceWidthAsPercent > 100 && dimensions.differenceWidthAsPercent > dimensions.differenceHeightAsPercent) { 496 dimensions.objectWidth = dimensions.maxWidth; 497 dimensions.objectHeight = parseInt(dimensions.objectHeight / dimensions.differenceWidthAsPercent * 100); 498 } 499 if (dimensions.differenceHeightAsPercent > 100 && dimensions.differenceHeightAsPercent > dimensions.differenceWidthAsPercent) { 500 dimensions.objectWidth = parseInt(dimensions.objectWidth / dimensions.differenceHeightAsPercent * 100); 501 dimensions.objectHeight = dimensions.maxHeight; 502 } 503 if (dimensions.differenceHeightAsPercent > 100 && dimensions.differenceWidthAsPercent < dimensions.differenceHeightAsPercent) { 504 dimensions.objectWidth = parseInt(dimensions.maxWidth / dimensions.differenceHeightAsPercent * dimensions.differenceWidthAsPercent); 505 dimensions.objectHeight = dimensions.maxHeight; 506 } 507 break; 508 case 'error': 509 if (!isNaN(dimensions.objectWidth) && dimensions.objectWidth > dimensions.maxWidth) { 510 dimensions.objectWidth = dimensions.maxWidth; 511 } 512 break; 513 default: 514 if ((isNaN(dimensions.objectWidth) || dimensions.objectWidth > dimensions.maxWidth) && !_self.settings.forceWidth) { 515 dimensions.objectWidth = dimensions.maxWidth; 516 } 517 if (((isNaN(dimensions.objectHeight) && dimensions.objectHeight !== 'auto') || dimensions.objectHeight > dimensions.maxHeight) && !_self.settings.forceHeight) { 518 dimensions.objectHeight = dimensions.maxHeight; 519 } 520 break; 521 } 522 } 523 524 if (_self.settings.forceWidth) { 525 dimensions.maxWidth = dimensions.objectWidth; 526 } else if ($object.attr(_self._prefixAttributeName('max-width'))) { 527 dimensions.maxWidth = $object.attr(_self._prefixAttributeName('max-width')); 528 } 529 530 if (_self.settings.forceHeight) { 531 dimensions.maxHeight = dimensions.objectHeight; 532 } else if ($object.attr(_self._prefixAttributeName('max-height'))) { 533 dimensions.maxHeight = $object.attr(_self._prefixAttributeName('max-height')); 534 } 535 536 _self._adjustDimensions($object, dimensions); 537 }, 538 _adjustDimensions: function($object, dimensions) { 539 // Adjust width and height 540 $object.css({ 541 'width': dimensions.objectWidth, 542 'height': dimensions.objectHeight, 543 'max-width': dimensions.maxWidth, 544 'max-height': dimensions.maxHeight 545 }); 546 547 _self.objects.contentInner.css({ 548 'width': $object.outerWidth(), 549 'height': $object.outerHeight(), 550 'max-width': '100%' 551 }); 552 553 _self.objects.case.css({ 554 'width': _self.objects.contentInner.outerWidth() 555 }); 556 557 // Adjust margin 558 _self.objects.case.css({ 559 'margin-top': parseInt(-(_self.objects.case.outerHeight() / 2)), 560 'margin-left': parseInt(-(_self.objects.case.outerWidth() / 2)) 561 }); 562 }, 563 _loading: function(process) { 564 if (process === 'start') { 565 _self.objects.case.addClass(_self.settings.classPrefix + 'loading'); 566 _self.objects.loading.show(); 567 } else if (process === 'end') { 568 _self.objects.case.removeClass(_self.settings.classPrefix + 'loading'); 569 _self.objects.loading.hide(); 570 } 571 }, 572 getViewportDimensions: function() { 573 return { 574 windowWidth: $(window).innerWidth(), 575 windowHeight: $(window).innerHeight() 576 }; 577 }, 578 _verifyDataUrl: function(dataUrl) { 579 if (!dataUrl || dataUrl === undefined || dataUrl === '') { 580 return false; 581 } 582 583 if (dataUrl.indexOf('#') > -1) { 584 dataUrl = dataUrl.split('#'); 585 dataUrl = '#' + dataUrl[dataUrl.length - 1]; 586 } 587 588 return _self._normalizeUrl(dataUrl.toString()); 589 }, 590 _verifyDataType: function(url) { 591 var typeMapping = _self.settings.typeMapping; 592 593 // Early abort if dataUrl couldn't be verified 594 if (!url) { 595 return false; 596 } 597 598 // Verify the dataType of url according to typeMapping which 599 // has been defined in settings. 600 for (var key in typeMapping) { 601 if (typeMapping.hasOwnProperty(key)) { 602 var suffixArr = typeMapping[key].split(','); 603 604 for (var i = 0; i < suffixArr.length; i++) { 605 var suffix = suffixArr[i].toLowerCase(), 606 regexp = new RegExp('\.(' + suffix + ')$', 'i'), 607 // Verify only the last 5 characters of the string 608 str = url.toLowerCase().split('?')[0].substr(-5); 609 610 if (regexp.test(str) === true || (key === 'inline' && (url.indexOf(suffix) > -1))) { 611 return key; 612 } 613 } 614 } 615 } 616 617 // If no expression matched, return 'iframe'. 618 return 'iframe'; 619 }, 620 _addElements: function() { 621 if (typeof _self.objects.case !== 'undefined' && $('#' + _self.objects.case.attr('id')).length) { 622 return; 623 } 624 625 _self.settings.markup(); 626 }, 627 _showContent: function($object) { 628 // Add data attribute with the object type 629 _self.objects.case.attr(_self._prefixAttributeName('type'), _self.objectData.type); 630 631 _self.cache.object = $object; 632 _self._calculateDimensions($object); 633 634 // Call onFinish hook functions 635 _self._callHooks(_self.settings.onFinish); 636 637 switch (_self.settings.transitionIn) { 638 case 'scrollTop': 639 case 'scrollRight': 640 case 'scrollBottom': 641 case 'scrollLeft': 642 case 'scrollHorizontal': 643 case 'scrollVertical': 644 _self.transition.scroll(_self.objects.case, 'in', _self.settings.speedIn); 645 _self.transition.fade(_self.objects.contentInner, 'in', _self.settings.speedIn); 646 break; 647 case 'elastic': 648 if (_self.objects.case.css('opacity') < 1) { 649 _self.transition.zoom(_self.objects.case, 'in', _self.settings.speedIn); 650 _self.transition.fade(_self.objects.contentInner, 'in', _self.settings.speedIn); 651 } 652 case 'fade': 653 case 'fadeInline': 654 _self.transition.fade(_self.objects.case, 'in', _self.settings.speedIn); 655 _self.transition.fade(_self.objects.contentInner, 'in', _self.settings.speedIn); 656 break; 657 default: 658 _self.transition.fade(_self.objects.case, 'in', 0); 659 break; 660 } 661 662 // End loading. 663 _self._loading('end'); 664 _self.isBusy = false; 665 }, 666 _processContent: function() { 667 _self.isBusy = true; 668 669 switch (_self.settings.transitionOut) { 670 case 'scrollTop': 671 case 'scrollRight': 672 case 'scrollBottom': 673 case 'scrollLeft': 674 case 'scrollVertical': 675 case 'scrollHorizontal': 676 if (_self.objects.case.is(':hidden')) { 677 _self.transition.fade(_self.objects.case, 'out', 0, 0, function() { 678 _self._loadContent(); 679 });
680 _self.transition.fade(_self.objects.contentInner, 'out', 0); 681 } else { 682 _self.transition.scroll(_self.objects.case, 'out', _self.settings.speedOut, function() { 683 _self._loadContent(); 684 }); 685 } 686 break; 687 case 'fade': 688 if (_self.objects.case.is(':hidden')) { 689 _self.transition.fade(_self.objects.case, 'out', 0, 0, function() { 690 _self._loadContent(); 691 }); 692 } else { 693 _self.transition.fade(_self.objects.case, 'out', _self.settings.speedOut, 0, function() { 694 _self._loadContent(); 695 }); 696 } 697 break; 698 case 'fadeInline': 699 case 'elastic': 700 if (_self.objects.case.is(':hidden')) { 701 _self.transition.fade(_self.objects.case, 'out', 0, 0, function() { 702 _self._loadContent(); 703 }); 704 } else { 705 _self.transition.fade(_self.objects.contentInner, 'out', _self.settings.speedOut, 0, function() { 706 _self._loadContent(); 707 }); 708 } 709 break; 710 default: 711 _self.transition.fade(_self.objects.case, 'out', 0, 0, function() { 712 _self._loadContent(); 713 }); 714 break; 715 } 716 }, 717 _handleEvents: function() { 718 _self._unbindEvents(); 719 720 _self.objects.nav.children().not(_self.objects.close).hide(); 721 722 // If slideshow is enabled, show play/pause and start timeout. 723 if (_self.isSlideshowEnabled()) { 724 // Only start the timeout if slideshow is not pausing 725 if (!_self.objects.nav.hasClass(_self.settings.classPrefix + 'paused')) { 726 _self._startTimeout(); 727 } else { 728 _self._stopTimeout(); 729 } 730 } 731 732 if (_self.settings.liveResize) { 733 _self._watchResizeInteraction(); 734 } 735 736 _self.objects.close.click(function(event) { 737 event.preventDefault(); 738 _self.close(); 739 // å½åã®ã¹ã¯ãã¼ã«ä½ç½®ã«æ»ã 740 $( 'html, body' ).prop( { scrollTop: currentScrollPos } ); 741 }); 742 743 if (_self.settings.closeOnOverlayClick === true) { 744 _self.objects.overlay.css('cursor', 'pointer').click(function(event) { 745 event.preventDefault(); 746 747 _self.close(); 748 }); 749 } 750 751 if (_self.settings.useKeys === true) { 752 _self._addKeyEvents(); 753 } 754 755 if (_self.objectData.isPartOfSequence) { 756 _self.objects.nav.attr(_self._prefixAttributeName('ispartofsequence'), true); 757 _self.objects.nav.data('items', _self._setNavigation()); 758 759 _self.objects.prev.click(function(event) { 760 event.preventDefault(); 761 762 if (_self.settings.navigateEndless === true || !_self.item.isFirst()) { 763 _self.objects.prev.unbind('click'); 764 _self.cache.action = 'prev'; 765 _self.objects.nav.data('items').prev.click(); 766 767 if (_self.isSlideshowEnabled()) { 768 _self._stopTimeout(); 769 } 770 } 771 return false; 772 }); 773 774 _self.objects.next.click(function(event) { 775 event.preventDefault(); 776 777 if (_self.settings.navigateEndless === true || !_self.item.isLast()) { 778 _self.objects.next.unbind('click'); 779 _self.cache.action = 'next'; 780 _self.objects.nav.data('items').next.click(); 781 782 if (_self.isSlideshowEnabled()) { 783 _self._stopTimeout(); 784 } 785 } 786 return false; 787 }); 788 789 if (_self.isSlideshowEnabled()) { 790 _self.objects.play.click(function(event) { 791 event.preventDefault(); 792 _self._startTimeout(); 793 }); 794 _self.objects.pause.click(function(event) { 795 event.preventDefault(); 796 _self._stopTimeout(); 797 }); 798 } 799 800 // Enable swiping if activated 801 if (_self.settings.swipe === true) { 802 if ($.isPlainObject($.event.special.swipeleft)) { 803 _self.objects.case.on('swipeleft', function(event) { 804 event.preventDefault(); 805 _self.objects.next.click(); 806 if (_self.isSlideshowEnabled()) { 807 _self._stopTimeout(); 808 } 809 }); 810 } 811 if ($.isPlainObject($.event.special.swiperight)) { 812 _self.objects.case.on('swiperight', function(event) { 813 event.preventDefault(); 814 _self.objects.prev.click(); 815 if (_self.isSlideshowEnabled()) { 816 _self._stopTimeout(); 817 } 818 });
819 } 820 } 821 } 822 }, 823 _addKeyEvents: function() { 824 $(document).bind('keyup.lightcase', function(event) { 825 // Do nothing if lightcase is in process 826 if (_self.isBusy) { 827 return; 828 } 829 830 switch (event.keyCode) { 831 // Escape key 832 case 27: 833 _self.objects.close.click(); 834 break; 835 // Backward key 836 case 37: 837 if (_self.objectData.isPartOfSequence) { 838 _self.objects.prev.click(); 839 } 840 break; 841 // Forward key 842 case 39: 843 if (_self.objectData.isPartOfSequence) { 844 _self.objects.next.click(); 845 } 846 break; 847 } 848 }); 849 }, 850 _startTimeout: function() { 851 _self.objects.play.hide(); 852 _self.objects.pause.show(); 853 854 _self.cache.action = 'next'; 855 _self.objects.nav.removeClass(_self.settings.classPrefix + 'paused'); 856 857 _self.timeout = setTimeout(function() { 858 _self.objects.nav.data('items').next.click(); 859 }, _self.settings.timeout); 860 }, 861 _stopTimeout: function() { 862 _self.objects.play.show(); 863 _self.objects.pause.hide(); 864 865 _self.objects.nav.addClass(_self.settings.classPrefix + 'paused'); 866 867 clearTimeout(_self.timeout); 868 }, 869 _setNavigation: function() { 870 var $links = $((_self.cache.selector || _self.settings.attr)), 871 sequenceLength = _self.objectData.sequenceLength - 1, 872 items = { 873 prev: $links.eq(_self.objectData.prevIndex), 874 next: $links.eq(_self.objectData.nextIndex) 875 }; 876 877 if (_self.objectData.currentIndex > 0) { 878 _self.objects.prev.show(); 879 } else { 880 items.prevItem = $links.eq(sequenceLength); 881 } 882 if (_self.objectData.nextIndex <= sequenceLength) { 883 _self.objects.next.show(); 884 } else { 885 items.next = $links.eq(0); 886 } 887 888 if (_self.settings.navigateEndless === true) { 889 _self.objects.prev.show(); 890 _self.objects.next.show(); 891 } 892 893 return items; 894 }, 895 item: { 896 isFirst: function() { 897 return (_self.objectData.currentIndex === 0); 898 }, 899 isLast: function() { 900 return (_self.objectData.currentIndex === (_self.objectData.sequenceLength - 1)); 901 } 902 }, 903 _cloneObject: function($object) { 904 var $clone = $object.clone(), 905 objectId = $object.attr('id'); 906 907 // If element is hidden, cache the object and remove 908 if ($object.is(':hidden')) { 909 _self._cacheObjectData($object); 910 $object.attr('id', _self.settings.idPrefix + 'temp-' + objectId).empty(); 911 } else { 912 // Prevent duplicated id's 913 $clone.removeAttr('id'); 914 } 915 916 return $clone.show(); 917 }, 918 isMobileDevice: function() { 919 var deviceAgent = navigator.userAgent.toLowerCase(), 920 agentId = deviceAgent.match(_self.settings.mobileMatchExpression); 921 922 return agentId ? true : false; 923 }, 924 isTransitionSupported: function() { 925 var body = $('body').get(0), 926 isTransitionSupported = false, 927 transitionMapping = { 928 'transition': '', 929 'WebkitTransition': '-webkit-', 930 'MozTransition': '-moz-', 931 'OTransition': '-o-', 932 'MsTransition': '-ms-' 933 }; 934 935 for (var key in transitionMapping) { 936 if (transitionMapping.hasOwnProperty(key) && key in body.style) { 937 _self.support.transition = transitionMapping[key]; 938 isTransitionSupported = true; 939 } 940 } 941 942 return isTransitionSupported; 943 }, 944 transition: { 945 fade: function($object, type, speed, opacity, callback) { 946 var isInTransition = type === 'in', 947 startTransition = {}, 948 startOpacity = $object.css('opacity'), 949 endTransition = {}, 950 endOpacity = opacity ? opacity : isInTransition ? 1 : 0; 951 952 if (!_self.isOpen && isInTransition) return; 953 954 startTransition['opacity'] = startOpacity; 955 endTransition['opacity'] = endOpacity; 956 957 $object.css(startTransition).show(); 958 959 // Css transition 960 if (_self.support.transitions) { 961 endTransition[_self.support.transition + 'transition'] = speed + 'ms ease'; 962 963 setTimeout(function() { 964 $object.css(endTransition); 965 966 setTimeout(function() { 967 $object.css(_self.support.transition + 'transition', ''); 968 969 if (callback && (_self.isOpen || !isInTransition)) { 970 callback(); 971 } 972 }, speed); 973 }, 15); 974 } else { 975 // Fallback to js transition 976 $object.stop(); 977 $object.animate(endTransition, speed, callback); 978 } 979 }, 980 scroll: function($object, type, speed, callback) { 981 var isInTransition = type === 'in', 982 transition = isInTransition ? _self.settings.transitionIn : _self.settings.transitionOut, 983 direction = 'left', 984 startTransition = {}, 985 startOpacity = isInTransition ? 0 : 1, 986 startOffset = isInTransition ? '-50%' : '50%', 987 endTransition = {}, 988 endOpacity = isInTransition ? 1 : 0, 989 endOffset = isInTransition ? '50%' : '-50%'; 990 991 if (!_self.isOpen && isInTransition) return; 992 993 switch (transition) { 994 case 'scrollTop': 995 direction = 'top'; 996 break; 997 case 'scrollRight': 998 startOffset = isInTransition ? '150%' : '50%'; 999 endOffset = isInTransition ? '50%' : '150%'; 1000 break; 1001 case 'scrollBottom': 1002 direction = 'top'; 1003 startOffset = isInTransition ? '150%' : '50%'; 1004 endOffset = isInTransition ? '50%' : '150%'; 1005 break; 1006 case 'scrollHorizontal': 1007 startOffset = isInTransition ? '150%' : '50%'; 1008 endOffset = isInTransition ? '50%' : '-50%'; 1009 break; 1010 case 'scrollVertical': 1011 direction = 'top'; 1012 startOffset = isInTransition ? '-50%' : '50%'; 1013 endOffset = isInTransition ? '50%' : '150%'; 1014 break; 1015 } 1016 1017 if (_self.cache.action === 'prev') { 1018 switch (transition) { 1019 case 'scrollHorizontal': 1020 startOffset = isInTransition ? '-50%' : '50%'; 1021 endOffset = isInTransition ? '50%' : '150%'; 1022 break; 1023 case 'scrollVertical': 1024 startOffset = isInTransition ? '150%' : '50%'; 1025 endOffset = isInTransition ? '50%' : '-50%'; 1026 break; 1027 } 1028 } 1029 1030 startTransition['opacity'] = startOpacity; 1031 startTransition[direction] = startOffset; 1032 1033 endTransition['opacity'] = endOpacity; 1034 endTransition[direction] = endOffset; 1035 1036 $object.css(startTransition).show(); 1037 1038 // Css transition 1039 if (_self.support.transitions) { 1040 endTransition[_self.support.transition + 'transition'] = speed + 'ms ease'; 1041 1042 setTimeout(function() { 1043 $object.css(endTransition); 1044 1045 setTimeout(function() { 1046 $object.css(_self.support.transition + 'transition', ''); 1047 1048 if (callback && (_self.isOpen || !isInTransition)) { 1049 callback(); 1050 } 1051 }, speed); 1052 }, 15); 1053 } else { 1054 // Fallback to js transition 1055 $object.stop(); 1056 $object.animate(endTransition, speed, callback); 1057 } 1058 }, 1059 zoom: function($object, type, speed, callback) { 1060 var isInTransition = type === 'in', 1061 startTransition = {}, 1062 startOpacity = $object.css('opacity'), 1063 startScale = isInTransition ? 'scale(0.75)' : 'scale(1)', 1064 endTransition = {}, 1065 endOpacity = isInTransition ? 1 : 0, 1066 endScale = isInTransition ? 'scale(1)' : 'scale(0.75)'; 1067 1068 if (!_self.isOpen && isInTransition) return; 1069 1070 startTransition['opacity'] = startOpacity; 1071 startTransition[_self.support.transition + 'transform'] = startScale; 1072 1073 endTransition['opacity'] = endOpacity; 1074 1075 $object.css(startTransition).show(); 1076 1077 // Css transition 1078 if (_self.support.transitions) { 1079 endTransition[_self.support.transition + 'transform'] = endScale; 1080 endTransition[_self.support.transition + 'transition'] = speed + 'ms ease'; 1081 1082 setTimeout(function() { 1083 $object.css(endTransition); 1084 1085 setTimeout(function() { 1086 $object.css(_self.support.transition + 'transform', ''); 1087 $object.css(_self.support.transition + 'transition', ''); 1088 1089 if (callback && (_self.isOpen || !isInTransition)) { 1090 callback(); 1091 } 1092 }, speed); 1093 }, 15); 1094 } else { 1095 // Fallback to js transition 1096 $object.stop(); 1097 $object.animate(endTransition, speed, callback); 1098 } 1099 } 1100 }, 1101 _callHooks: function(hooks) { 1102 if (typeof(hooks) === 'object') { 1103 $.each(hooks, function(index, hook) { 1104 if (typeof(hook) === 'function') { 1105 hook.call(_self.origin); 1106 } 1107 }); 1108 } 1109 }, 1110 _cacheObjectData: function($object) { 1111 $.data($object, 'cache', { 1112 id: $object.attr('id'), 1113 content: $object.html() 1114 }); 1115 1116 _self.cache.originalObject = $object; 1117 }, 1118 _restoreObject: function() { 1119 var $object = $('[id^="' + _self.settings.idPrefix + 'temp-"]'); 1120 1121 $object.attr('id', $.data(_self.cache.originalObject, 'cache').id); 1122 $object.html($.data(_self.cache.originalObject, 'cache').content); 1123 }, 1124 resize: function() { 1125 if (!_self.isOpen) return; 1126 1127 if (_self.isSlideshowEnabled()) { 1128 _self._stopTimeout(); 1129 } 1130 1131 _self.dimensions = _self.getViewportDimensions(); 1132 _self._calculateDimensions(_self.cache.object); 1133 }, 1134 _cacheScrollPosition: function() { 1135 var $window = $('body'), 1136 $document = $(document), 1137 offset = { 1138 'top': $window.scrollTop(), 1139 'left': $window.scrollLeft() 1140 }; 1141 1142 _self.cache.scrollPosition = _self.cache.scrollPosition || {}; 1143 1144 if ($document.width() > $window.width()) { 1145 _self.cache.scrollPosition.left = offset.left; 1146 } 1147 if ($document.height() > $window.height()) { 1148 _self.cache.scrollPosition.top = offset.top; 1149 var userAgent = window.navigator.userAgent.toLowerCase(); 1150 if (userAgent.indexOf('msie') > -1 || userAgent.indexOf('trident') > -1 || userAgent.indexOf("firefox") > -1) { 1151 _self.cache.scrollPosition.top = _self.scrollPosition; 1152 } 1153 } 1154 }, 1155 _watchResizeInteraction: function() { 1156 $(window).resize(_self.resize); 1157 }, 1158 _unwatchResizeInteraction: function() { 1159 $(window).off('resize', _self.resize); 1160 }, 1161 _watchScrollInteraction: function() { 1162 $(window).scroll(_self._cacheScrollPosition); 1163 }, 1164 _unwatchScrollInteraction: function() { 1165 $(window).off('scroll', _self._cacheScrollPosition); 1166 }, 1167 _restoreScrollPosition: function() { 1168 // $(window) 1169 // .scrollTop(parseInt(_self.cache.scrollPosition.top)) 1170 // .scrollLeft(parseInt(_self.cache.scrollPosition.left)) 1171 // .resize(); 1172 }, 1173 _switchToFullScreenMode: function() { 1174 _self.settings.shrinkFactor = 1; 1175 _self.settings.overlayOpacity = 1; 1176 1177 $('html').addClass(_self.settings.classPrefix + 'fullScreenMode'); 1178 }, 1179 _open: function() { 1180 1181 // ã¹ã¯ãã¼ã«ä½ç½®ã»ãã 1182 currentScrollPos = $(window).scrollTop(); 1183 if ($(window).scrollTop() > 1) { 1184 _self.scrollPosition = $(window).scrollTop(); 1185 } else {} 1186 1187 _self.isOpen = true; 1188 _self.support.transitions = _self.settings.cssTransitions ? _self.isTransitionSupported() : false; 1189 _self.support.mobileDevice = _self.isMobileDevice(); 1190 if (_self.support.mobileDevice) { 1191 $('html').addClass(_self.settings.classPrefix + 'isMobileDevice'); 1192 if (_self.settings.fullScreenModeForMobile) { 1193 _self._switchToFullScreenMode(); 1194 } 1195 } 1196 if (!_self.settings.transitionIn) { 1197 _self.settings.transitionIn = _self.settings.transition; 1198 } 1199 if (!_self.settings.transitionOut) { 1200 _self.settings.transitionOut = _self.settings.transition; 1201 } 1202 1203 switch (_self.settings.transitionIn) { 1204 case 'fade': 1205 case 'fadeInline': 1206 case 'elastic': 1207 case 'scrollTop': 1208 case 'scrollRight': 1209 case 'scrollBottom': 1210 case 'scrollLeft': 1211 case 'scrollVertical': 1212 case 'scrollHorizontal': 1213 if (_self.objects.case.is(':hidden')) { 1214 _self.objects.close.css('opacity', 0); 1215 _self.objects.overlay.css('opacity', 0); 1216 _self.objects.case.css('opacity', 0); 1217 _self.objects.contentInner.css('opacity', 0); 1218 } 1219 _self.transition.fade(_self.objects.overlay, 'in', _self.settings.speedIn, _self.settings.overlayOpacity, function() { 1220 _self.transition.fade(_self.objects.close, 'in', _self.settings.speedIn); 1221 _self._handleEvents(); 1222 _self._processContent(); 1223 });
1224 break; 1225 default: 1226 _self.transition.fade(_self.objects.overlay, 'in', 0, _self.settings.overlayOpacity, function() { 1227 _self.transition.fade(_self.objects.close, 'in', 0); 1228 _self._handleEvents(); 1229 _self._processContent(); 1230 }); 1231 break; 1232 } 1233 // console.log(_self.settings.classPrefix); 1234 $('html').addClass(_self.settings.classPrefix + 'open'); 1235 _self.objects.case.attr('aria-hidden', 'false'); 1236 1237 if(_self.cache.scrollPosition.top > 0){ 1238 if ($('body').hasClass('pcView')) { 1239 $('body').css('top', -_self.cache.scrollPosition.top + 'px'); 1240 } 1241 } else { 1242 if ($('body').hasClass('pcView')) { 1243 if(_self.scrollPosition > 0){ 1244 $('body').css('top', -_self.scrollPosition + 'px'); 1245 } else { 1246 $('body').css('top', '0px'); 1247 } 1248 } 1249 } 1250 }, 1251 close: function() { 1252 _self.isOpen = false; 1253 1254 if (_self.isSlideshowEnabled()) { 1255 _self._stopTimeout(); 1256 _self.objects.nav.removeClass(_self.settings.classPrefix + 'paused'); 1257 } 1258 _self.objects.loading.hide(); 1259 _self._unbindEvents(); 1260 _self._unwatchResizeInteraction(); 1261 _self._unwatchScrollInteraction(); 1262 $('html').removeClass(_self.settings.classPrefix + 'open'); 1263 if ($('html').hasClass('inlineMode')) { 1264 $('html').removeClass('inlineMode'); 1265 } 1266 _self.objects.case.attr('aria-hidden', 'true'); 1267 _self.objects.nav.children().hide(); 1268 _self._restoreScrollPosition(); 1269 // Call onClose hook functions 1270 _self._callHooks(_self.settings.onClose); 1271 1272 switch (_self.settings.transitionOut) { 1273 case 'fade': 1274 case 'fadeInline': 1275 case 'scrollTop': 1276 case 'scrollRight': 1277 case 'scrollBottom': 1278 case 'scrollLeft': 1279 case 'scrollHorizontal': 1280 case 'scrollVertical': 1281 _self.transition.fade(_self.objects.case, 'out', _self.settings.speedOut, 0, function() { 1282 _self.transition.fade(_self.objects.overlay, 'out', _self.settings.speedOut, 0, function() { 1283 _self.cleanup(); 1284 }); 1285 }); 1286 break; 1287 case 'elastic': 1288 _self.transition.zoom(_self.objects.case, 'out', _self.settings.speedOut, function() { 1289 _self.transition.fade(_self.objects.overlay, 'out', _self.settings.speedOut, 0, function() { 1290 _self.cleanup(); 1291 }); 1292 }); 1293 break; 1294 default: 1295 _self.cleanup(); 1296 break; 1297 } 1298 1299 // ãã©ã¦ã¶ã®UAãå°æåã§åå¾ 1300 var userAgent = window.navigator.userAgent.toLowerCase(); 1301 // IEã®å¤å® 1302 var isIE = (userAgent.indexOf('msie') >= 0 || userAgent.indexOf('trident') >= 0); 1303 1304 if ($('body').hasClass('spView')) { 1305 // console.log(_self.scrollPosition); 1306 // console.log(_self.cache.scrollPosition.top); 1307 $('body').animate({ scrollTop: _self.scrollPosition }, 0); 1308 } else { 1309 $('html, body').animate({ scrollTop: _self.cache.scrollPosition.top }, 0); 1310 if (isIE) { 1311 document.documentElement.scrollTop = _self.cache.scrollPosition.top; 1312 } 1313 } 1314 }, 1315 _unbindEvents: function() { 1316 // Unbind overlay event 1317 _self.objects.overlay.unbind('click'); 1318 1319 // Unbind key events 1320 $(document).unbind('keyup.lightcase'); 1321 1322 // Unbind swipe events 1323 _self.objects.case.unbind('swipeleft').unbind('swiperight'); 1324 1325 // Unbind navigator events 1326 _self.objects.prev.unbind('click'); 1327 _self.objects.next.unbind('click'); 1328 _self.objects.play.unbind('click'); 1329 _self.objects.pause.unbind('click'); 1330 1331 // Unbind close event 1332 _self.objects.close.unbind('click'); 1333 }, 1334 _cleanupDimensions: function() { 1335 var opacity = _self.objects.contentInner.css('opacity'); 1336 1337 _self.objects.case.css({ 1338 'width': '', 1339 'height': '', 1340 'top': '', 1341 'left': '', 1342 'margin-top': '', 1343 'margin-left': '' 1344 }); 1345 1346 _self.objects.contentInner.removeAttr('style').css('opacity', opacity); 1347 _self.objects.contentInner.children().removeAttr('style'); 1348 }, 1349 cleanup: function() { 1350 _self._cleanupDimensions(); 1351 1352 _self.objects.loading.hide(); 1353 _self.objects.overlay.hide(); 1354 _self.objects.case.hide(); 1355 _self.objects.prev.hide(); 1356 _self.objects.next.hide(); 1357 _self.objects.play.hide(); 1358 _self.objects.pause.hide(); 1359 1360 _self.objects.case.removeAttr(_self._prefixAttributeName('type')); 1361 _self.objects.nav.removeAttr(_self._prefixAttributeName('ispartofsequence')); 1362 1363 _self.objects.contentInner.empty().hide(); 1364 _self.objects.info.children().empty(); 1365 1366 if (_self.cache.originalObject) { 1367 _self._restoreObject(); 1368 } 1369 1370 // Call onCleanup hook functions 1371 _self._callHooks(_self.settings.onCleanup); 1372 1373 // Restore cache 1374 _self.cache = {}; 1375 }, 1376 _matchMedia: function() { 1377 return window.matchMedia || window.msMatchMedia; 1378 }, 1379 _devicePixelRatio: function() { 1380 return window.devicePixelRatio || 1; 1381 }, 1382 _isPublicMethod: function(method) { 1383 return (typeof _self[method] === 'function' && method.charAt(0) !== '_'); 1384 }, 1385 _export: function() { 1386 window.lightcase = {}; 1387 1388 $.each(_self, function(property) { 1389 if (_self._isPublicMethod(property)) { 1390 lightcase[property] = _self[property]; 1391 } 1392 }); 1393 } 1394 }; 1395 1396 _self._export(); 1397 1398 $.fn.lightcase = function(method) { 1399 // Method calling logic (only public methods are applied)
1400 if (_self._isPublicMethod(method)) { 1401 return _self[method].apply(this, Array.prototype.slice.call(arguments, 1)); 1402 } else if (typeof method === 'object' || !method) { 1403 return _self.init.apply(this, arguments); 1404 } else { 1405 $.error('Method ' + method + ' does not exist on jQuery.lightcase'); 1406 } 1407 }; 1408})(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.