1/*! 2 Colorbox 1.6.3
vendor: 29,143 bytes, lines 2-1105
2 3 license: MIT 4 http://www.jacklmoore.com/colorbox 5*/ 6(function ($, document, window) { 7 var 8 // Default settings object. 9 // See http://jacklmoore.com/colorbox for details. 10 defaults = { 11 // data sources 12 html: false, 13 photo: false, 14 iframe: false, 15 inline: false, 16 17 // behavior and appearance 18 transition: "elastic", 19 speed: 300, 20 fadeOut: 300, 21 width: false, 22 initialWidth: "600", 23 innerWidth: false, 24 maxWidth: false, 25 height: false, 26 initialHeight: "450", 27 innerHeight: false, 28 maxHeight: false, 29 scalePhotos: true, 30 scrolling: true, 31 opacity: 0.9, 32 preloading: true, 33 className: false, 34 overlayClose: true, 35 escKey: true, 36 arrowKey: true, 37 top: false, 38 bottom: false, 39 left: false, 40 right: false, 41 fixed: false, 42 data: undefined, 43 closeButton: true, 44 fastIframe: true, 45 open: false, 46 reposition: true, 47 loop: true, 48 slideshow: false, 49 slideshowAuto: true, 50 slideshowSpeed: 2500, 51 slideshowStart: "start slideshow", 52 slideshowStop: "stop slideshow", 53 photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i, 54 55 // alternate image paths for high-res displays 56 retinaImage: false, 57 retinaUrl: false, 58 retinaSuffix: '@2x.$1', 59 60 // internationalization 61 current: "image {current} of {total}", 62 previous: "previous", 63 next: "next", 64 close: "close", 65 xhrError: "This content failed to load.", 66 imgError: "This image failed to load.", 67 68 // accessbility 69 returnFocus: true, 70 trapFocus: true, 71 72 // callbacks 73 onOpen: false, 74 onLoad: false, 75 onComplete: false, 76 onCleanup: false, 77 onClosed: false, 78 79 rel: function() { 80 return this.rel; 81 }, 82 href: function() { 83 // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container') 84 return $(this).attr('href'); 85 }, 86 title: function() { 87 return this.title; 88 }, 89 createImg: function() { 90 var img = new Image(); 91 var attrs = $(this).data('cbox-img-attrs'); 92 93 if (typeof attrs === 'object') { 94 $.each(attrs, function(key, val){ 95 img[key] = val; 96 }); 97 } 98 99 return img; 100 }, 101 createIframe: function() { 102 var iframe = document.createElement('iframe'); 103 var attrs = $(this).data('cbox-iframe-attrs'); 104 105 if (typeof attrs === 'object') { 106 $.each(attrs, function(key, val){ 107 iframe[key] = val; 108 }); 109 } 110 111 if ('frameBorder' in iframe) { 112 iframe.frameBorder = 0; 113 } 114 if ('allowTransparency' in iframe) { 115 iframe.allowTransparency = "true"; 116 } 117 iframe.name = (new Date()).getTime(); // give the iframe a unique name to prevent caching 118 iframe.allowFullscreen = true; 119 120 return iframe; 121 } 122 }, 123 124 // Abstracting the HTML and event identifiers for easy rebranding 125 colorbox = 'colorbox', 126 prefix = 'cbox', 127 boxElement = prefix + 'Element', 128 129 // Events 130 event_open = prefix + '_open', 131 event_load = prefix + '_load', 132 event_complete = prefix + '_complete', 133 event_cleanup = prefix + '_cleanup', 134 event_closed = prefix + '_closed', 135 event_purge = prefix + '_purge', 136 137 // Cached jQuery Object Variables 138 $overlay, 139 $box, 140 $wrap, 141 $content, 142 $topBorder, 143 $leftBorder, 144 $rightBorder, 145 $bottomBorder, 146 $related, 147 $window, 148 $loaded, 149 $loadingBay, 150 $loadingOverlay, 151 $title, 152 $current, 153 $slideshow, 154 $next, 155 $prev, 156 $close, 157 $groupControls, 158 $events = $('<a/>'), // $({}) would be prefered, but there is an issue with jQuery 1.4.2 159 160 // Variables for cached values or use across multiple functions 161 settings, 162 interfaceHeight, 163 interfaceWidth, 164 loadedHeight, 165 loadedWidth, 166 index, 167 photo, 168 open, 169 active, 170 closing, 171 loadingTimer, 172 publicMethod, 173 div = "div", 174 requests = 0, 175 previousCSS = {}, 176 init; 177 178 // **************** 179 // HELPER FUNCTIONS 180 // **************** 181 182 // Convenience function for creating new jQuery objects 183 function $tag(tag, id, css) { 184 var element = document.createElement(tag); 185 186 if (id) { 187 element.id = prefix + id; 188 } 189 190 if (css) { 191 element.style.cssText = css; 192 } 193 194 return $(element); 195 } 196 197 // Get the window height using innerHeight when available to avoid an issue with iOS 198 // http://bugs.jquery.com/ticket/6724 199 function winheight() { 200 return window.innerHeight ? window.innerHeight : $(window).height(); 201 } 202 203 function Settings(element, options) { 204 if (options !== Object(options)) { 205 options = {}; 206 } 207 208 this.cache = {}; 209 this.el = element; 210 211 this.value = function(key) { 212 var dataAttr; 213 214 if (this.cache[key] === undefined) { 215 dataAttr = $(this.el).attr('data-cbox-'+key); 216 217 if (dataAttr !== undefined) { 218 this.cache[key] = dataAttr; 219 } else if (options[key] !== undefined) { 220 this.cache[key] = options[key]; 221 } else if (defaults[key] !== undefined) { 222 this.cache[key] = defaults[key]; 223 } 224 } 225 226 return this.cache[key]; 227 }; 228 229 this.get = function(key) { 230 var value = this.value(key); 231 return $.isFunction(value) ? value.call(this.el, this) : value; 232 }; 233 } 234 235 // Determine the next and previous members in a group. 236 function getIndex(increment) { 237 var 238 max = $related.length, 239 newIndex = (index + increment) % max; 240 241 return (newIndex < 0) ? max + newIndex : newIndex; 242 } 243 244 // Convert '%' and 'px' values to integers 245 function setSize(size, dimension) { 246 return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10)); 247 } 248 249 // Checks an href to see if it is a photo. 250 // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex. 251 function isImage(settings, url) { 252 return settings.get('photo') || settings.get('photoRegex').test(url); 253 } 254 255 function retinaUrl(settings, url) { 256 return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url; 257 } 258 259 function trapFocus(e) { 260 if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) { 261 e.stopPropagation(); 262 $box.focus(); 263 } 264 } 265 266 function setClass(str) { 267 if (setClass.str !== str) { 268 $box.add($overlay).removeClass(setClass.str).addClass(str); 269 setClass.str = str; 270 } 271 } 272 273 function getRelated(rel) { 274 index = 0; 275 276 if (rel && rel !== false && rel !== 'nofollow') { 277 $related = $('.' + boxElement).filter(function () { 278 var options = $.data(this, colorbox); 279 var settings = new Settings(this, options); 280 return (settings.get('rel') === rel); 281 }); 282 index = $related.index(settings.el); 283 284 // Check direct calls to Colorbox. 285 if (index === -1) { 286 $related = $related.add(settings.el); 287 index = $related.length - 1; 288 } 289 } else { 290 $related = $(settings.el); 291 } 292 } 293 294 function trigger(event) { 295 // for external use 296 $(document).trigger(event); 297 // for internal use 298 $events.triggerHandler(event); 299 } 300 301 var slideshow = (function(){ 302 var active, 303 className = prefix + "Slideshow_", 304 click = "click." + prefix, 305 timeOut; 306 307 function clear () { 308 clearTimeout(timeOut); 309 } 310 311 function set() { 312 if (settings.get('loop') || $related[index + 1]) { 313 clear(); 314 timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed')); 315 } 316 } 317 318 function start() { 319 $slideshow 320 .html(settings.get('slideshowStop')) 321 .unbind(click) 322 .one(click, stop); 323 324 $events 325 .bind(event_complete, set) 326 .bind(event_load, clear); 327 328 $box.removeClass(className + "off").addClass(className + "on"); 329 } 330 331 function stop() { 332 clear(); 333 334 $events 335 .unbind(event_complete, set) 336 .unbind(event_load, clear); 337 338 $slideshow 339 .html(settings.get('slideshowStart')) 340 .unbind(click) 341 .one(click, function () { 342 publicMethod.next(); 343 start(); 344 }); 345 346 $box.removeClass(className + "on").addClass(className + "off"); 347 } 348 349 function reset() { 350 active = false; 351 $slideshow.hide(); 352 clear(); 353 $events 354 .unbind(event_complete, set) 355 .unbind(event_load, clear); 356 $box.removeClass(className + "off " + className + "on"); 357 } 358 359 return function(){ 360 if (active) { 361 if (!settings.get('slideshow')) { 362 $events.unbind(event_cleanup, reset); 363 reset(); 364 } 365 } else { 366 if (settings.get('slideshow') && $related[1]) { 367 active = true; 368 $events.one(event_cleanup, reset); 369 if (settings.get('slideshowAuto')) { 370 start(); 371 } else { 372 stop(); 373 } 374 $slideshow.show(); 375 } 376 } 377 }; 378 379 }()); 380 381 382 function launch(element) { 383 var options; 384 385 if (!closing) { 386 387 options = $(element).data(colorbox); 388 389 settings = new Settings(element, options); 390 391 getRelated(settings.get('rel')); 392 393 if (!open) { 394 open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. 395 396 setClass(settings.get('className')); 397 398 // Show colorbox so the sizes can be calculated in older versions of jQuery 399 $box.css({visibility:'hidden', display:'block', opacity:''}); 400 401 $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden'); 402 $content.css({width:'', height:''}).append($loaded); 403 404 // Cache values needed for size calculations 405 interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height(); 406 interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); 407 loadedHeight = $loaded.outerHeight(true); 408 loadedWidth = $loaded.outerWidth(true); 409 410 // Opens inital empty Colorbox prior to content being loaded. 411 var initialWidth = setSize(settings.get('initialWidth'), 'x'); 412 var initialHeight = setSize(settings.get('initialHeight'), 'y'); 413 var maxWidth = settings.get('maxWidth'); 414 var maxHeight = settings.get('maxHeight'); 415 416 settings.w = Math.max((maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth, 0); 417 settings.h = Math.max((maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight, 0); 418 419 $loaded.css({width:'', height:settings.h}); 420 publicMethod.position(); 421 422 trigger(event_open); 423 settings.get('onOpen'); 424 425 $groupControls.add($title).hide(); 426 427 $box.focus(); 428 429 if (settings.get('trapFocus')) { 430 // Confine focus to the modal 431 // Uses event capturing that is not supported in IE8- 432 if (document.addEventListener) { 433 434 document.addEventListener('focus', trapFocus, true); 435 436 $events.one(event_closed, function () { 437 document.removeEventListener('focus', trapFocus, true); 438 }); 439 } 440 } 441 442 // Return focus on closing 443 if (settings.get('returnFocus')) { 444 $events.one(event_closed, function () { 445 $(settings.el).focus(); 446 }); 447 } 448 } 449 450 var opacity = parseFloat(settings.get('opacity')); 451 $overlay.css({ 452 opacity: opacity === opacity ? opacity : '', 453 cursor: settings.get('overlayClose') ? 'pointer' : '', 454 visibility: 'visible' 455 }).show(); 456 457 if (settings.get('closeButton')) { 458 $close.html(settings.get('close')).appendTo($content); 459 } else { 460 $close.appendTo('<div/>'); // replace with .detach() when dropping jQuery < 1.4 461 } 462 463 load(); 464 } 465 } 466 467 // Colorbox's markup needs to be added to the DOM prior to being called 468 // so that the browser will go ahead and load the CSS background images. 469 function appendHTML() { 470 if (!$box) { 471 init = false; 472 $window = $(window); 473 $box = $tag(div).attr({ 474 id: colorbox, 475 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS. 476 role: 'dialog', 477 tabindex: '-1' 478 }).hide(); 479 $overlay = $tag(div, "Overlay").hide(); 480 $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]); 481 $wrap = $tag(div, "Wrapper"); 482 $content = $tag(div, "Content").append( 483 $title = $tag(div, "Title"), 484 $current = $tag(div, "Current"), 485 $prev = $('<button type="button"/>').attr({id:prefix+'Previous'}), 486 $next = $('<button type="button"/>').attr({id:prefix+'Next'}), 487 $slideshow = $('<button type="button"/>').attr({id:prefix+'Slideshow'}), 488 $loadingOverlay 489 ); 490 491 $close = $('<button type="button"/>').attr({id:prefix+'Close'}); 492 493 $wrap.append( // The 3x3 Grid that makes up Colorbox 494 $tag(div).append( 495 $tag(div, "TopLeft"), 496 $topBorder = $tag(div, "TopCenter"), 497 $tag(div, "TopRight") 498 ), 499 $tag(div, false, 'clear:left').append( 500 $leftBorder = $tag(div, "MiddleLeft"), 501 $content, 502 $rightBorder = $tag(div, "MiddleRight") 503 ), 504 $tag(div, false, 'clear:left').append( 505 $tag(div, "BottomLeft"), 506 $bottomBorder = $tag(div, "BottomCenter"), 507 $tag(div, "BottomRight") 508 ) 509 ).find('div div').css({'float': 'left'}); 510 511 $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;'); 512 513 $groupControls = $next.add($prev).add($current).add($slideshow); 514 } 515 if (document.body && !$box.parent().length) { 516 $(document.body).append($overlay, $box.append($wrap, $loadingBay)); 517 } 518 } 519 520 // Add Colorbox's event bindings 521 function addBindings() { 522 function clickHandler(e) { 523 // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt. 524 // See: http://jacklmoore.com/notes/click-events/ 525 if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey || e.ctrlKey)) { 526 e.preventDefault(); 527 launch(this); 528 } 529 } 530 531 if ($box) { 532 if (!init) { 533 init = true; 534 535 // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly. 536 $next.click(function () { 537 publicMethod.next(); 538 }); 539 $prev.click(function () { 540 publicMethod.prev(); 541 }); 542 $close.click(function () { 543 publicMethod.close(); 544 }); 545 $overlay.click(function () { 546 if (settings.get('overlayClose')) { 547 publicMethod.close(); 548 } 549 }); 550 551 // Key Bindings 552 $(document).bind('keydown.' + prefix, function (e) { 553 var key = e.keyCode; 554 if (open && settings.get('escKey') && key === 27) { 555 e.preventDefault(); 556 publicMethod.close(); 557 } 558 if (open && settings.get('arrowKey') && $related[1] && !e.altKey) { 559 if (key === 37) { 560 e.preventDefault(); 561 $prev.click(); 562 } else if (key === 39) { 563 e.preventDefault(); 564 $next.click(); 565 } 566 } 567 }); 568 569 if ($.isFunction($.fn.on)) { 570 // For jQuery 1.7+ 571 $(document).on('click.'+prefix, '.'+boxElement, clickHandler); 572 } else { 573 // For jQuery 1.3.x -> 1.6.x 574 // This code is never reached in jQuery 1.9, so do not contact me about 'live' being removed. 575 // This is not here for jQuery 1.9, it's here for legacy users. 576 $('.'+boxElement).live('click.'+prefix, clickHandler); 577 } 578 } 579 return true; 580 } 581 return false; 582 } 583 584 // Don't do anything if Colorbox already exists. 585 if ($[colorbox]) { 586 return; 587 } 588 589 // Append the HTML when the DOM loads 590 $(appendHTML); 591 592 593 // **************** 594 // PUBLIC FUNCTIONS 595 // Usage format: $.colorbox.close(); 596 // Usage from within an iframe: parent.jQuery.colorbox.close(); 597 // **************** 598 599 publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) { 600 var settings; 601 var $obj = this; 602 603 options = options || {}; 604 605 if ($.isFunction($obj)) { // assume a call to $.colorbox 606 $obj = $('<a/>'); 607 options.open = true; 608 } 609 610 if (!$obj[0]) { // colorbox being applied to empty collection 611 return $obj; 612 } 613 614 appendHTML(); 615 616 if (addBindings()) { 617 618 if (callback) { 619 options.onComplete = callback; 620 } 621 622 $obj.each(function () { 623 var old = $.data(this, colorbox) || {}; 624 $.data(this, colorbox, $.extend(old, options)); 625 }).addClass(boxElement); 626 627 settings = new Settings($obj[0], options); 628 629 if (settings.get('open')) { 630 launch($obj[0]); 631 } 632 } 633 634 return $obj; 635 }; 636 637 publicMethod.position = function (speed, loadedCallback) { 638 var 639 css, 640 top = 0, 641 left = 0, 642 offset = $box.offset(), 643 scrollTop, 644 scrollLeft; 645 646 $window.unbind('resize.' + prefix); 647 648 // remove the modal so that it doesn't influence the document width/height 649 $box.css({top: -9e4, left: -9e4}); 650 651 scrollTop = $window.scrollTop(); 652 scrollLeft = $window.scrollLeft(); 653 654 if (settings.get('fixed')) { 655 offset.top -= scrollTop; 656 offset.left -= scrollLeft; 657 $box.css({position: 'fixed'}); 658 } else { 659 top = scrollTop; 660 left = scrollLeft; 661 $box.css({position: 'absolute'}); 662 } 663 664 // keeps the top and left positions within the browser's viewport. 665 if (settings.get('right') !== false) { 666 left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.get('right'), 'x'), 0); 667 } else if (settings.get('left') !== false) { 668 left += setSize(settings.get('left'), 'x'); 669 } else { 670 left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2); 671 } 672 673 if (settings.get('bottom') !== false) { 674 top += Math.max(winheight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.get('bottom'), 'y'), 0); 675 } else if (settings.get('top') !== false) { 676 top += setSize(settings.get('top'), 'y'); 677 } else { 678 top += Math.round(Math.max(winheight() - settings.h - loadedHeight - interfaceHeight, 0) / 2); 679 } 680 681 $box.css({top: offset.top, left: offset.left, visibility:'visible'}); 682 683 // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly, 684 // but it has to be shrank down around the size of div#colorbox when it's done. If not, 685 // it can invoke an obscure IE bug when using iframes. 686 $wrap[0].style.width = $wrap[0].style.height = "9999px"; 687 688 function modalDimensions() { 689 $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt($box[0].style.width,10) - interfaceWidth)+'px'; 690 $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt($box[0].style.height,10) - interfaceHeight)+'px'; 691 } 692 693 css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left}; 694 695 // setting the speed to 0 if the content hasn't changed size or position 696 if (speed) { 697 var tempSpeed = 0; 698 $.each(css, function(i){ 699 if (css[i] !== previousCSS[i]) { 700 tempSpeed = speed; 701 return; 702 } 703 }); 704 speed = tempSpeed; 705 } 706 707 previousCSS = css; 708 709 if (!speed) { 710 $box.css(css); 711 } 712 713 $box.dequeue().animate(css, { 714 duration: speed || 0, 715 complete: function () { 716 modalDimensions(); 717 718 active = false; 719 720 // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation. 721 $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px"; 722 $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px"; 723 724 if (settings.get('reposition')) { 725 setTimeout(function () { // small delay before binding onresize due to an IE8 bug. 726 $window.bind('resize.' + prefix, publicMethod.position); 727 }, 1); 728 } 729 730 if ($.isFunction(loadedCallback)) { 731 loadedCallback(); 732 } 733 }, 734 step: modalDimensions 735 }); 736 }; 737 738 publicMethod.resize = function (options) { 739 var scrolltop; 740 741 if (open) { 742 options = options || {}; 743 744 if (options.width) { 745 settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth; 746 } 747 748 if (options.innerWidth) { 749 settings.w = setSize(options.innerWidth, 'x'); 750 } 751 752 $loaded.css({width: settings.w}); 753 754 if (options.height) { 755 settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight; 756 } 757 758 if (options.innerHeight) { 759 settings.h = setSize(options.innerHeight, 'y'); 760 } 761 762 if (!options.innerHeight && !options.height) { 763 scrolltop = $loaded.scrollTop(); 764 $loaded.css({height: "auto"}); 765 settings.h = $loaded.height(); 766 } 767 768 $loaded.css({height: settings.h}); 769 770 if(scrolltop) { 771 $loaded.scrollTop(scrolltop); 772 } 773 774 publicMethod.position(settings.get('transition') === "none" ? 0 : settings.get('speed')); 775 } 776 }; 777 778 publicMethod.prep = function (object) { 779 if (!open) { 780 return; 781 } 782 783 var callback, speed = settings.get('transition') === "none" ? 0 : settings.get('speed'); 784 785 $loaded.remove(); 786 787 $loaded = $tag(div, 'LoadedContent').append(object); 788 789 function getWidth() { 790 settings.w = settings.w || $loaded.width(); 791 settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w; 792 return settings.w; 793 } 794 function getHeight() { 795 settings.h = settings.h || $loaded.height(); 796 settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h; 797 return settings.h; 798 } 799 800 $loaded.hide() 801 .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations. 802 .css({width: getWidth(), overflow: settings.get('scrolling') ? 'auto' : 'hidden'}) 803 .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height. 804 .prependTo($content); 805 806 $loadingBay.hide(); 807 808 // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width. 809 810 $(photo).css({'float': 'none'}); 811 812 setClass(settings.get('className')); 813 814 callback = function () { 815 var total = $related.length, 816 iframe, 817 complete; 818 819 if (!open) { 820 return; 821 } 822 823 function removeFilter() { // Needed for IE8 in versions of jQuery prior to 1.7.2 824 if ($.support.opacity === false) { 825 $box[0].style.removeAttribute('filter'); 826 } 827 } 828 829 complete = function () { 830 clearTimeout(loadingTimer); 831 $loadingOverlay.hide(); 832 trigger(event_complete); 833 settings.get('onComplete'); 834 }; 835 836 837 $title.html(settings.get('title')).show(); 838 $loaded.show(); 839 840 if (total > 1) { // handle grouping 841 if (typeof settings.get('current') === "string") { 842 $current.html(settings.get('current').replace('{current}', index + 1).replace('{total}', total)).show(); 843 } 844 845 $next[(settings.get('loop') || index < total - 1) ? "show" : "hide"]().html(settings.get('next')); 846 $prev[(settings.get('loop') || index) ? "show" : "hide"]().html(settings.get('previous')); 847 848 slideshow(); 849 850 // Preloads images within a rel group 851 if (settings.get('preloading')) { 852 $.each([getIndex(-1), getIndex(1)], function(){ 853 var img, 854 i = $related[this], 855 settings = new Settings(i, $.data(i, colorbox)), 856 src = settings.get('href'); 857 858 if (src && isImage(settings, src)) { 859 src = retinaUrl(settings, src); 860 img = document.createElement('img'); 861 img.src = src; 862 } 863 }); 864 } 865 } else { 866 $groupControls.hide(); 867 } 868 869 if (settings.get('iframe')) { 870 871 iframe = settings.get('createIframe'); 872 873 if (!settings.get('scrolling')) { 874 iframe.scrolling = "no"; 875 } 876 877 $(iframe) 878 .attr({ 879 src: settings.get('href'), 880 'class': prefix + 'Iframe' 881 }) 882 .one('load', complete) 883 .appendTo($loaded); 884 885 $events.one(event_purge, function () { 886 iframe.src = "//about:blank"; 887 }); 888 889 if (settings.get('fastIframe')) { 890 $(iframe).trigger('load'); 891 } 892 } else { 893 complete(); 894 } 895 896 if (settings.get('transition') === 'fade') { 897 $box.fadeTo(speed, 1, removeFilter); 898 } else { 899 removeFilter(); 900 } 901 }; 902 903 if (settings.get('transition') === 'fade') { 904 $box.fadeTo(speed, 0, function () { 905 publicMethod.position(0, callback); 906 }); 907 } else { 908 publicMethod.position(speed, callback); 909 } 910 }; 911 912 function load () { 913 var href, setResize, prep = publicMethod.prep, $inline, request = ++requests; 914 915 active = true; 916 917 photo = false; 918 919 trigger(event_purge); 920 trigger(event_load); 921 settings.get('onLoad'); 922 923 settings.h = settings.get('height') ? 924 setSize(settings.get('height'), 'y') - loadedHeight - interfaceHeight : 925 settings.get('innerHeight') && setSize(settings.get('innerHeight'), 'y'); 926 927 settings.w = settings.get('width') ? 928 setSize(settings.get('width'), 'x') - loadedWidth - interfaceWidth : 929 settings.get('innerWidth') && setSize(settings.get('innerWidth'), 'x'); 930 931 // Sets the minimum dimensions for use in image scaling 932 settings.mw = settings.w; 933 settings.mh = settings.h; 934 935 // Re-evaluate the minimum width and height based on maxWidth and maxHeight values. 936 // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead. 937 if (settings.get('maxWidth')) { 938 settings.mw = setSize(settings.get('maxWidth'), 'x') - loadedWidth - interfaceWidth; 939 settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw; 940 } 941 if (settings.get('maxHeight')) { 942 settings.mh = setSize(settings.get('maxHeight'), 'y') - loadedHeight - interfaceHeight; 943 settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh; 944 } 945 946 href = settings.get('href'); 947 948 loadingTimer = setTimeout(function () { 949 $loadingOverlay.show(); 950 }, 100); 951 952 if (settings.get('inline')) { 953 var $target = $(href); 954 // Inserts an empty placeholder where inline content is being pulled from. 955 // An event is bound to put inline content back when Colorbox closes or loads new content. 956 $inline = $('<div>').hide().insertBefore($target); 957 958 $events.one(event_purge, function () { 959 $inline.replaceWith($target); 960 }); 961 962 prep($target); 963 } else if (settings.get('iframe')) { 964 // IFrame element won't be added to the DOM until it is ready to be displayed, 965 // to avoid problems with DOM-ready JS that might be trying to run in that iframe. 966 prep(" "); 967 } else if (settings.get('html')) { 968 prep(settings.get('html')); 969 } else if (isImage(settings, href)) { 970 971 href = retinaUrl(settings, href); 972 973 photo = settings.get('createImg'); 974 975 $(photo) 976 .addClass(prefix + 'Photo') 977 .bind('error.'+prefix,function () { 978 prep($tag(div, 'Error').html(settings.get('imgError'))); 979 }) 980 .one('load', function () { 981 if (request !== requests) { 982 return; 983 } 984 985 // A small pause because some browsers will occassionaly report a 986 // img.width and img.height of zero immediately after the img.onload fires 987 setTimeout(function(){ 988 var percent; 989 990 if (settings.get('retinaImage') && window.devicePixelRatio > 1) { 991 photo.height = photo.height / window.devicePixelRatio; 992 photo.width = photo.width / window.devicePixelRatio; 993 } 994 995 if (settings.get('scalePhotos')) { 996 setResize = function () { 997 photo.height -= photo.height * percent; 998 photo.width -= photo.width * percent; 999 }; 1000 if (settings.mw && photo.width > settings.mw) { 1001 percent = (photo.width - settings.mw) / photo.width; 1002 setResize(); 1003 } 1004 if (settings.mh && photo.height > settings.mh) { 1005 percent = (photo.height - settings.mh) / photo.height; 1006 setResize(); 1007 } 1008 } 1009 1010 if (settings.h) { 1011 photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px'; 1012 } 1013 1014 if ($related[1] && (settings.get('loop') || $related[index + 1])) { 1015 photo.style.cursor = 'pointer'; 1016 1017 $(photo).bind('click.'+prefix, function () { 1018 publicMethod.next(); 1019 }); 1020 } 1021 1022 photo.style.width = photo.width + 'px'; 1023 photo.style.height = photo.height + 'px'; 1024 prep(photo); 1025 }, 1); 1026 }); 1027 1028 photo.src = href; 1029 1030 } else if (href) { 1031 $loadingBay.load(href, settings.get('data'), function (data, status) { 1032 if (request === requests) { 1033 prep(status === 'error' ? $tag(div, 'Error').html(settings.get('xhrError')) : $(this).contents()); 1034 } 1035 }); 1036 } 1037 } 1038 1039 // Navigates to the next page/image in a set. 1040 publicMethod.next = function () { 1041 if (!active && $related[1] && (settings.get('loop') || $related[index + 1])) { 1042 index = getIndex(1); 1043 launch($related[index]); 1044 } 1045 }; 1046 1047 publicMethod.prev = function () { 1048 if (!active && $related[1] && (settings.get('loop') || index)) { 1049 index = getIndex(-1); 1050 launch($related[index]); 1051 } 1052 }; 1053 1054 // Note: to use this within an iframe use the following format: parent.jQuery.colorbox.close(); 1055 publicMethod.close = function () { 1056 if (open && !closing) { 1057 1058 closing = true; 1059 open = false; 1060 trigger(event_cleanup); 1061 settings.get('onCleanup'); 1062 $window.unbind('.' + prefix); 1063 $overlay.fadeTo(settings.get('fadeOut') || 0, 0); 1064 1065 $box.stop().fadeTo(settings.get('fadeOut') || 0, 0, function () { 1066 $box.hide(); 1067 $overlay.hide(); 1068 trigger(event_purge); 1069 $loaded.remove(); 1070 1071 setTimeout(function () { 1072 closing = false; 1073 trigger(event_closed); 1074 settings.get('onClosed'); 1075 }, 1); 1076 }); 1077 } 1078 }; 1079 1080 // Removes changes Colorbox made to the document, but does not remove the plugin. 1081 publicMethod.remove = function () { 1082 if (!$box) { return; } 1083 1084 $box.stop(); 1085 $[colorbox].close(); 1086 $box.stop(false, true).remove(); 1087 $overlay.remove(); 1088 closing = false; 1089 $box = null; 1090 $('.' + boxElement) 1091 .removeData(colorbox) 1092 .removeClass(boxElement); 1093 1094 $(document).unbind('click.'+prefix).unbind('keydown.'+prefix); 1095 }; 1096 1097 // A method for fetching the current element Colorbox is referencing. 1098 // returns a jQuery object. 1099 publicMethod.element = function () { 1100 return $(settings.el); 1101 }; 1102 1103 publicMethod.settings = defaults; 1104 1105}(jQuery, document, window));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.