1// ColorBox v1.3.20.1 - jQuery lightbox plugin 2// (c) 2012 Jack Moore - jacklmoore.com 3// License: http://www.opensource.org/licenses/mit-license.php 4(function ($, document, window) { 5 var 6 // Default settings object. 7 // See http://jacklmoore.com/colorbox for details. 8 defaults = { 9 transition: "elastic", 10 speed: 300, 11 width: false, 12 initialWidth: "600", 13 innerWidth: false, 14 maxWidth: false, 15 height: false, 16 initialHeight: "450", 17 innerHeight: false, 18 maxHeight: false, 19 scalePhotos: true, 20 scrolling: true, 21 inline: false, 22 html: false, 23 iframe: false, 24 fastIframe: true, 25 photo: false, 26 href: false, 27 title: false, 28 rel: false, 29 opacity: 0.9, 30 preloading: true, 31 32 current: "image {current} of {total}", 33 previous: "previous", 34 next: "next", 35 close: "close", 36 xhrError: "This content failed to load.", 37 imgError: "This image failed to load.", 38 39 open: false, 40 returnFocus: true, 41 reposition: true, 42 loop: true, 43 slideshow: false, 44 slideshowAuto: true, 45 slideshowSpeed: 2500, 46 slideshowStart: "start slideshow", 47 slideshowStop: "stop slideshow", 48 onOpen: false, 49 onLoad: false, 50 onComplete: false, 51 onCleanup: false, 52 onClosed: false, 53 overlayClose: true, 54 escKey: true, 55 arrowKey: true, 56 top: false, 57 bottom: false, 58 left: false, 59 right: false, 60 fixed: false, 61 data: undefined 62 }, 63 64 // Abstracting the HTML and event identifiers for easy rebranding 65 colorbox = 'colorbox', 66 prefix = 'cbox', 67 boxElement = prefix + 'Element', 68 69 // Events 70 event_open = prefix + '_open', 71 event_load = prefix + '_load', 72 event_complete = prefix + '_complete', 73 event_cleanup = prefix + '_cleanup', 74 event_closed = prefix + '_closed', 75 event_purge = prefix + '_purge', 76 77 // Special Handling for IE 78 isIE = !$.support.opacity && !$.support.style, // IE7 & IE8 79 isIE6 = isIE && !window.XMLHttpRequest, // IE6 80 event_ie6 = prefix + '_IE6', 81 82 // Cached jQuery Object Variables 83 $overlay, 84 $box, 85 $wrap, 86 $content, 87 $topBorder, 88 $leftBorder, 89 $rightBorder, 90 $bottomBorder, 91 $related, 92 $window, 93 $loaded, 94 $loadingBay, 95 $loadingOverlay, 96 $title, 97 $current, 98 $slideshow, 99 $next, 100 $prev, 101 $close, 102 $groupControls, 103 104 // Variables for cached values or use across multiple functions 105 settings, 106 interfaceHeight, 107 interfaceWidth, 108 loadedHeight, 109 loadedWidth, 110 element, 111 index, 112 photo, 113 open, 114 active, 115 closing, 116 loadingTimer, 117 publicMethod, 118 div = "div", 119 init; 120 121 // **************** 122 // HELPER FUNCTIONS 123 // **************** 124 125 // Convience function for creating new jQuery objects 126 function $tag(tag, id, css) { 127 var element = document.createElement(tag); 128 129 if (id) { 130 element.id = prefix + id; 131 } 132 133 if (css) { 134 element.style.cssText = css; 135 } 136 137 return $(element); 138 } 139 140 // Determine the next and previous members in a group. 141 function getIndex(increment) { 142 var 143 max = $related.length, 144 newIndex = (index + increment) % max; 145 146 return (newIndex < 0) ? max + newIndex : newIndex; 147 } 148 149 // Convert '%' and 'px' values to integers 150 function setSize(size, dimension) { 151 return Math.round((/%/.test(size) ? ((dimension === 'x' ? winWidth() : winHeight()) / 100) : 1) * parseInt(size, 10)); 152 } 153 154 // Checks an href to see if it is a photo. 155 // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex. 156 function isImage(url) { 157 return settings.photo || /\.(gif|png|jp(e|g|eg)|bmp|ico)((#|\?).*)?$/i.test(url); 158 } 159 160 function winWidth() { 161 // $(window).width() is incorrect for some mobile browsers, but 162 // window.innerWidth is unsupported in IE8 and lower. 163 return window.innerWidth || $window.width(); 164 } 165 166 function winHeight() { 167 return window.innerHeight || $window.height(); 168 } 169 170 // Assigns function results to their respective properties 171 function makeSettings() { 172 var i, 173 data = $.data(element, colorbox); 174 175 if (data == null) { 176 settings = $.extend({}, defaults); 177 if (console && console.log) { 178 console.log('Error: cboxElement missing settings object'); 179 } 180 } else { 181 settings = $.extend({}, data); 182 } 183 184 for (i in settings) { 185 if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time. 186 settings[i] = settings[i].call(element); 187 } 188 } 189 190 settings.rel = settings.rel || element.rel || 'nofollow'; 191 settings.href = settings.href || $(element).attr('href'); 192 settings.title = settings.title || element.title; 193 194 if (typeof settings.href === "string") { 195 settings.href = $.trim(settings.href); 196 } 197 } 198 199 function trigger(event, callback) { 200 $('body').trigger(event); 201 if (callback) { 202 callback.call(element); 203 } 204 } 205 206 // Slideshow functionality 207 function slideshow() { 208 var 209 timeOut, 210 className = prefix + "Slideshow_", 211 click = "click." + prefix, 212 start, 213 stop, 214 clear; 215 216 if (settings.slideshow && $related[1]) { 217 start = function () { 218 $slideshow
219 .text(settings.slideshowStop) 220 .unbind(click) 221 .bind(event_complete, function () { 222 if (settings.loop || $related[index + 1]) { 223 timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); 224 } 225 }) 226 .bind(event_load, function () { 227 clearTimeout(timeOut); 228 }) 229 .one(click + ' ' + event_cleanup, stop); 230 $box.removeClass(className + "off").addClass(className + "on"); 231 timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); 232 }; 233 234 stop = function () { 235 clearTimeout(timeOut); 236 $slideshow 237 .text(settings.slideshowStart) 238 .unbind([event_complete, event_load, event_cleanup, click].join(' ')) 239 .one(click, function () { 240 publicMethod.next(); 241 start(); 242 }); 243 $box.removeClass(className + "on").addClass(className + "off"); 244 }; 245 246 if (settings.slideshowAuto) { 247 start(); 248 } else { 249 stop(); 250 } 251 } else { 252 $box.removeClass(className + "off " + className + "on"); 253 } 254 } 255 256 function launch(target) { 257 if (!closing) { 258 259 element = target; 260 261 makeSettings(); 262 263 $related = $(element); 264 265 index = 0; 266 267 if (settings.rel !== 'nofollow') { 268 $related = $('.' + boxElement).filter(function () { 269 var data = $.data(this, colorbox), 270 relRelated; 271 272 if (data) { 273 relRelated = data.rel || this.rel; 274 } 275 276 return (relRelated === settings.rel); 277 }); 278 index = $related.index(element); 279 280 // Check direct calls to ColorBox. 281 if (index === -1) { 282 $related = $related.add(element); 283 index = $related.length - 1; 284 } 285 } 286 287 if (!open) { 288 open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. 289 290 $box.show(); 291 292 if (settings.returnFocus) { 293 $(element).blur().one(event_closed, function () { 294 $(this).focus(); 295 }); 296 } 297 298 // +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5' 299 $overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show(); 300 301 // Opens inital empty ColorBox prior to content being loaded. 302 settings.w = setSize(settings.initialWidth, 'x'); 303 settings.h = setSize(settings.initialHeight, 'y'); 304 publicMethod.position(); 305 306 if (isIE6) { 307 $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () { 308 $overlay.css({width: winWidth(), height: winHeight(), top: $window.scrollTop(), left: $window.scrollLeft()}); 309 }).trigger('resize.' + event_ie6); 310 } 311 312 trigger(event_open, settings.onOpen); 313 314 $groupControls.add($title).hide(); 315 316 $close.html(settings.close).show(); 317 } 318 319 publicMethod.load(true); 320 } 321 } 322 323 // ColorBox's markup needs to be added to the DOM prior to being called 324 // so that the browser will go ahead and load the CSS background images. 325 function appendHTML() { 326 if (!$box && document.body) { 327 init = false; 328 329 $window = $(window); 330 $box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide();
331 $overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide(); 332 $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic")); 333 $wrap = $tag(div, "Wrapper"); 334 $content = $tag(div, "Content").append( 335 $loaded = $tag(div, "LoadedContent", 'width:0; height:0; overflow:hidden'), 336 $title = $tag(div, "Title"), 337 $current = $tag(div, "Current"), 338 $next = $tag(div, "Next"), 339 $prev = $tag(div, "Previous"), 340 $slideshow = $tag(div, "Slideshow").bind(event_open, slideshow), 341 $close = $tag(div, "Close") 342 ); 343 344 $wrap.append( // The 3x3 Grid that makes up ColorBox 345 $tag(div).append( 346 $tag(div, "TopLeft"), 347 $topBorder = $tag(div, "TopCenter"), 348 $tag(div, "TopRight") 349 ), 350 $tag(div, false, 'clear:left').append( 351 $leftBorder = $tag(div, "MiddleLeft"), 352 $content, 353 $rightBorder = $tag(div, "MiddleRight") 354 ), 355 $tag(div, false, 'clear:left').append( 356 $tag(div, "BottomLeft"), 357 $bottomBorder = $tag(div, "BottomCenter"), 358 $tag(div, "BottomRight") 359 ) 360 ).find('div div').css({'float': 'left'}); 361 362 $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none'); 363 364 $groupControls = $next.add($prev).add($current).add($slideshow); 365 366 $(document.body).append($overlay, $box.append($wrap, $loadingBay)); 367 } 368 } 369 370 // Add ColorBox's event bindings 371 function addBindings() { 372 if ($box) { 373 if (!init) { 374 init = true; 375 376 // Cache values needed for size calculations 377 interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6 378 interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); 379 loadedHeight = $loaded.outerHeight(true); 380 loadedWidth = $loaded.outerWidth(true); 381 382 // Setting padding to remove the need to do size conversions during the animation step. 383 $box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}); 384 385 // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly. 386 $next.click(function () { 387 publicMethod.next(); 388 }); 389 $prev.click(function () { 390 publicMethod.prev(); 391 }); 392 $close.click(function () { 393 publicMethod.close(); 394 }); 395 $overlay.click(function () { 396 if (settings.overlayClose) { 397 publicMethod.close(); 398 } 399 }); 400 401 // Key Bindings 402 $(document).bind('keydown.' + prefix, function (e) { 403 var key = e.keyCode; 404 if (open && settings.escKey && key === 27) { 405 e.preventDefault(); 406 publicMethod.close(); 407 } 408 if (open && settings.arrowKey && $related[1]) { 409 if (key === 37) { 410 e.preventDefault(); 411 $prev.click(); 412 } else if (key === 39) { 413 e.preventDefault(); 414 $next.click(); 415 } 416 } 417 }); 418 419 $('.' + boxElement, document).live('click', function (e) { 420 // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt. 421 // See: http://jacklmoore.com/notes/click-events/ 422 if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) { 423 e.preventDefault(); 424 launch(this); 425 } 426 }); 427 } 428 return true; 429 } 430 return false; 431 } 432 433 // Don't do anything if ColorBox already exists. 434 if ($.colorbox) { 435 return; 436 } 437 438 // Append the HTML when the DOM loads 439 $(appendHTML); 440 441 442 // **************** 443 // PUBLIC FUNCTIONS 444 // Usage format: $.fn.colorbox.close(); 445 // Usage from within an iframe: parent.$.fn.colorbox.close(); 446 // **************** 447 448 publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) { 449 var $this = this; 450 451 options = options || {}; 452 453 appendHTML(); 454 455 if (addBindings()) { 456 if (!$this[0]) { 457 if ($this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit. 458 return $this; 459 } 460 // if no selector was given (ie. $.colorbox()), create a temporary element to work with 461 $this = $('<a/>'); 462 options.open = true; // assume an immediate open 463 } 464 465 if (callback) { 466 options.onComplete = callback; 467 } 468 469 $this.each(function () { 470 $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options)); 471 }).addClass(boxElement); 472 473 if (($.isFunction(options.open) && options.open.call($this)) || options.open) { 474 launch($this[0]); 475 } 476 } 477 478 return $this; 479 }; 480 481 publicMethod.position = function (speed, loadedCallback) { 482 var 483 css, 484 top = 0, 485 left = 0, 486 offset = $box.offset(), 487 scrollTop, 488 scrollLeft; 489 490 $window.unbind('resize.' + prefix); 491 492 // remove the modal so that it doesn't influence the document width/height 493 $box.css({top: -9e4, left: -9e4}); 494 495 scrollTop = $window.scrollTop(); 496 scrollLeft = $window.scrollLeft(); 497 498 if (settings.fixed && !isIE6) { 499 offset.top -= scrollTop; 500 offset.left -= scrollLeft; 501 $box.css({position: 'fixed'}); 502 } else { 503 top = scrollTop; 504 left = scrollLeft; 505 $box.css({position: 'absolute'}); 506 } 507 508 // keeps the top and left positions within the browser's viewport. 509 if (settings.right !== false) { 510 left += Math.max(winWidth() - settings.w - loadedWidth - interfaceWidth - setSize(sett
510ings.right, 'x'), 0); 511 } else if (settings.left !== false) { 512 left += setSize(settings.left, 'x'); 513 } else { 514 left += Math.round(Math.max(winWidth() - settings.w - loadedWidth - interfaceWidth, 0) / 2); 515 } 516 517 if (settings.bottom !== false) { 518 top += Math.max(winHeight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0); 519 } else if (settings.top !== false) { 520 top += setSize(settings.top, 'y'); 521 } else { 522 top += Math.round(Math.max(winHeight() - settings.h - loadedHeight - interfaceHeight, 0) / 2); 523 } 524 525 $box.css({top: offset.top, left: offset.left}); 526 527 // setting the speed to 0 to reduce the delay between same-sized content. 528 speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0; 529 530 // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly, 531 // but it has to be shrank down around the size of div#colorbox when it's done. If not, 532 // it can invoke an obscure IE bug when using iframes. 533 $wrap[0].style.width = $wrap[0].style.height = "9999px"; 534 535 function modalDimensions(that) { 536 $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width; 537 $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height; 538 } 539 540 css = {width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: top, left: left}; 541 if(speed===0){ // temporary workaround to side-step jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273) 542 $box.css(css); 543 } 544 545 $box.dequeue().animate(css, { 546 duration: speed, 547 complete: function () { 548 modalDimensions(this); 549 550 active = false; 551 552 // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation. 553 $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px"; 554 $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px"; 555 556 if (settings.reposition) { 557 setTimeout(function () { // small delay before binding onresize due to an IE8 bug. 558 $window.bind('resize.' + prefix, publicMethod.position); 559 }, 1); 560 } 561 562 if (loadedCallback) { 563 loadedCallback(); 564 } 565 }, 566 step: function () { 567 modalDimensions(this); 568 } 569 }); 570 }; 571 572 publicMethod.resize = function (options) { 573 if (open) { 574 options = options || {}; 575 576 if (options.width) { 577 settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth; 578 } 579 if (options.innerWidth) { 580 settings.w = setSize(options.innerWidth, 'x'); 581 } 582 $loaded.css({width: settings.w}); 583 584 if (options.height) { 585 settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight; 586 } 587 if (options.innerHeight) { 588 settings.h = setSize(options.innerHeight, 'y'); 589 } 590 if (!options.innerHeight && !options.height) { 591 $loaded.css({height: "auto"}); 592 settings.h = $loaded.height(); 593 } 594 $loaded.css({height: settings.h}); 595 596 publicMethod.position(settings.transition === "none" ? 0 : settings.speed); 597 } 598 }; 599 600 publicMethod.prep = function (object) { 601 if (!open) { 602 return; 603 } 604 605 var callback, speed = settings.transition === "none" ? 0 : settings.speed; 606 607 $loaded.remove(); 608 $loaded = $tag(div, 'LoadedContent').append(object); 609 610 function getWidth() { 611 settings.w = settings.w || $loaded.width(); 612 settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w; 613 return settings.w; 614 } 615 function getHeight() { 616 settings.h = settings.h || $loaded.height(); 617 settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h; 618 return settings.h; 619 } 620 621 $loaded.hide() 622 .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations. 623 .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'}) 624 .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
625 .prependTo($content); 626 627 $loadingBay.hide(); 628 629 // 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. 630 //$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'}); 631 632 $(photo).css({'float': 'none'}); 633 634 // Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay. 635 if (isIE6) { 636 $('select').not($box.find('select')).filter(function () { 637 return this.style.visibility !== 'hidden'; 638 }).css({'visibility': 'hidden'}).one(event_cleanup, function () { 639 this.style.visibility = 'inherit'; 640 }); 641 } 642 643 callback = function () { 644 var preload, 645 i, 646 total = $related.length, 647 iframe, 648 frameBorder = 'frameBorder', 649 allowTransparency = 'allowTransparency', 650 complete, 651 src, 652 img, 653 data; 654 655 if (!open) { 656 return; 657 } 658 659 function removeFilter() { 660 if (isIE) { 661 $box[0].style.removeAttribute('filter'); 662 } 663 } 664 665 complete = function () { 666 clearTimeout(loadingTimer); 667 // Detaching forces Andriod stock browser to redraw the area underneat the loading overlay. Hiding alone isn't enough. 668 $loadingOverlay.detach().hide(); 669 trigger(event_complete, settings.onComplete); 670 }; 671 672 if (isIE) { 673 //This fadeIn helps the bicubic resampling to kick-in. 674 if (photo) { 675 $loaded.fadeIn(100); 676 } 677 } 678 679 $title.html(settings.title).add($loaded).show(); 680 681 if (total > 1) { // handle grouping 682 if (typeof settings.current === "string") { 683 $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show(); 684 } 685 686 $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(sett
686ings.next); 687 $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous); 688 689 if (settings.slideshow) { 690 $slideshow.show(); 691 } 692 693 // Preloads images within a rel group 694 if (settings.preloading) { 695 preload = [ 696 getIndex(-1), 697 getIndex(1) 698 ]; 699 while (i = $related[preload.pop()]) { 700 data = $.data(i, colorbox); 701 702 if (data && data.href) { 703 src = data.href; 704 if ($.isFunction(src)) { 705 src = src.call(i); 706 } 707 } else { 708 src = i.href; 709 } 710 711 if (isImage(src)) { 712 img = new Image(); 713 img.src = src; 714 } 715 } 716 } 717 } else { 718 $groupControls.hide(); 719 } 720 721 if (settings.iframe) { 722 iframe = $tag('iframe')[0]; 723 724 if (frameBorder in iframe) { 725 iframe[frameBorder] = 0; 726 } 727 if (allowTransparency in iframe) { 728 iframe[allowTransparency] = "true"; 729 } 730 // give the iframe a unique name to prevent caching 731 iframe.name = prefix + (+new Date()); 732 if (settings.fastIframe) { 733 complete(); 734 } else { 735 $(iframe).one('load', complete); 736 } 737 iframe.src = settings.href; 738 if (!settings.scrolling) { 739 iframe.scrolling = "no"; 740 } 741 $(iframe).addClass(prefix + 'Iframe').appendTo($loaded).one(event_purge, function () { 742 iframe.src = "//about:blank"; 743 }); 744 } else { 745 complete(); 746 } 747 748 if (settings.transition === 'fade') { 749 $box.fadeTo(speed, 1, removeFilter); 750 } else { 751 removeFilter(); 752 } 753 }; 754 755 if (settings.transition === 'fade') { 756 $box.fadeTo(speed, 0, function () { 757 publicMethod.position(0, callback); 758 }); 759 } else { 760 publicMethod.position(speed, callback); 761 } 762 }; 763 764 publicMethod.load = function (launched) { 765 var href, setResize, prep = publicMethod.prep; 766 767 active = true; 768 769 photo = false; 770 771 element = $related[index]; 772 773 if (!launched) { 774 makeSettings(); 775 } 776 777 trigger(event_purge); 778 779 trigger(event_load, settings.onLoad); 780 781 settings.h = settings.height ? 782 setSize(settings.height, 'y') - loadedHeight - interfaceHeight : 783 settings.innerHeight && setSize(settings.innerHeight, 'y'); 784 785 settings.w = settings.width ? 786 setSize(settings.width, 'x') - loadedWidth - interfaceWidth : 787 settings.innerWidth && setSize(settings.innerWidth, 'x'); 788 789 // Sets the minimum dimensions for use in image scaling 790 settings.mw = settings.w; 791 settings.mh = settings.h; 792 793 // Re-evaluate the minimum width and height based on maxWidth and maxHeight values. 794 // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead. 795 if (settings.maxWidth) { 796 settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth; 797 settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw; 798 } 799 if (settings.maxHeight) { 800 settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight; 801 settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh; 802 } 803 804 href = settings.href; 805 806 loadingTimer = setTimeout(function () { 807 $loadingOverlay.show().appendTo($content); 808 }, 100); 809 810 if (settings.inline) { 811 // Inserts an empty placeholder where inline content is being pulled from. 812 // An event is bound to put inline content back when ColorBox closes or loads new content. 813 var tmp = $tag(div).hide().insertBefore($(href)[0]); 814 $('body').one(event_purge, function () { 815 tmp.replaceWith($loaded.children()); 816 }); 817 prep($(href)); 818 } else if (settings.iframe) { 819 // IFrame element won't be added to the DOM until it is ready to be displayed, 820 // to avoid problems with DOM-ready JS that might be trying to run in that iframe. 821 prep(" "); 822 } else if (settings.html) { 823 prep(settings.html); 824 } else if (isImage(href)) { 825 $(photo = new Image()) 826 .addClass(prefix + 'Photo') 827 .error(function () { 828 settings.title = false; 829 prep($tag(div, 'Error').html(settings.imgError)); 830 }) 831 .load(function () { 832 var percent; 833 photo.onload = null; //stops animated gifs from firing the onload repeatedly. 834 835 if (settings.scalePhotos) { 836 setResize = function () { 837 photo.height -= photo.height * percent; 838 photo.width -= photo.width * percent; 839 }; 840 if (settings.mw && photo.width > settings.mw) { 841 percent = (photo.width - settings.mw) / photo.width; 842 setResize(); 843 } 844 if (settings.mh && photo.height > settings.mh) { 845 percent = (photo.height - settings.mh) / photo.height; 846 setResize(); 847 } 848 } 849 850 if (settings.h) { 851 photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px'; 852 } 853
854 if ($related[1] && (settings.loop || $related[index + 1])) { 855 photo.style.cursor = 'pointer'; 856 photo.onclick = function () { 857 publicMethod.next(); 858 }; 859 } 860 861 if (isIE) { 862 photo.style.msInterpolationMode = 'bicubic'; 863 } 864 865 setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise. 866 prep(photo); 867 }, 1); 868 }); 869 870 setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise. 871 photo.src = href; 872 }, 1); 873 } else if (href) { 874 $loadingBay.load(href, settings.data, function (data, status, xhr) { 875 prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents()); 876 }); 877 } 878 }; 879 880 // Navigates to the next page/image in a set. 881 publicMethod.next = function () { 882 if (!active && $related[1] && (settings.loop || $related[index + 1])) { 883 index = getIndex(1); 884 publicMethod.load(); 885 } 886 }; 887 888 publicMethod.prev = function () { 889 if (!active && $related[1] && (settings.loop || index)) { 890 index = getIndex(-1); 891 publicMethod.load(); 892 } 893 }; 894 895 // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close(); 896 publicMethod.close = function () { 897 if (open && !closing) { 898 899 closing = true; 900 901 open = false; 902 903 trigger(event_cleanup, settings.onCleanup); 904 905 $window.unbind('.' + prefix + ' .' + event_ie6); 906 907 $overlay.fadeTo(200, 0); 908 909 $box.stop().fadeTo(300, 0, function () { 910 911 $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide(); 912 913 trigger(event_purge); 914 915 $loaded.remove(); 916 917 setTimeout(function () { 918 closing = false; 919 trigger(event_closed, settings.onClosed); 920 }, 1); 921 }); 922 } 923 }; 924 925 // Removes changes ColorBox made to the document, but does not remove the plugin 926 // from jQuery. 927 publicMethod.remove = function () { 928 $([]).add($box).add($overlay).remove(); 929 $box = null; 930 $('.' + boxElement) 931 .removeData(colorbox) 932 .removeClass(boxElement) 933 .die(); 934 }; 935 936 // A method for fetching the current element ColorBox is referencing. 937 // returns a jQuery object. 938 publicMethod.element = function () { 939 return $(element); 940 }; 941 942 publicMethod.settings = defaults; 943 944}(jQuery, document, this));
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.