PageSourceSearch

https://www.starbucks.co.jp/common-v2/js/colorbox/jquery.colorbox.js?ver=20141001

js starbucks.co.jp collected 2026-09-24 15:16:55 UTC 30,435 bytes, 1,096 lines download raw bytes

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