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