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