PageSourceSearch

https://www.iisc.ac.in/wp-content/themes/iisc/js/jquery.fancybox.js?v=2.1.5

js iisc.ac.in collected 2026-09-24 08:36:11 UTC 52,744 bytes, 2,020 lines download raw bytes

vendor: 7,653 bytes, lines 1-280
1/*!�
2 * fancyBox - jQuery Plugin�
3 * version: 2.1.5 (Fri, 14 Jun 2013)�
4 * @requires jQuery v1.6 or later�
5 *�
6 * Examples at http://fancyapps.com/fancybox/�
7 * License: www.fancyapps.com/fancybox/#license�
8 *�
9 * Copyright 2012 Janis Skarnelis - [email protected]�
10 *�
11 */�
12�
13(function (window, document, $, undefined) {�
14	"use strict";�
15�
16	var H = $("html"),�
17		W = $(window),�
18		D = $(document),�
19		F = $.fancybox = function () {�
20			F.open.apply( this, arguments );�
21		},�
22		IE =  navigator.userAgent.match(/msie/i),�
23		didUpdate	= null,�
24		isTouch		= document.createTouch !== undefined,�
25�
26		isQuery	= function(obj) {�
27			return obj && obj.hasOwnProperty && obj instanceof $;�
28		},�
29		isString = function(str) {�
30			return str && $.type(str) === "string";�
31		},�
32		isPercentage = function(str) {�
33			return isString(str) && str.indexOf('%') > 0;�
34		},�
35		isScrollable = function(el) {�
36			return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight)));�
37		},�
38		getScalar = function(orig, dim) {�
39			var value = parseInt(orig, 10) || 0;�
40�
41			if (dim && isPercentage(orig)) {�
42				value = F.getViewport()[ dim ] / 100 * value;�
43			}�
44�
45			return Math.ceil(value);�
46		},�
47		getValue = function(value, dim) {�
48			return getScalar(value, dim) + 'px';�
49		};�
50�
51	$.extend(F, {�
52		// The current version of fancyBox�
53		version: '2.1.5',�
54�
55		defaults: {�
56			padding : 15,�
57			margin  : 20,�
58�
59			width     : 800,�
60			height    : 600,�
61			minWidth  : 100,�
62			minHeight : 100,�
63			maxWidth  : 9999,�
64			maxHeight : 9999,�
65			pixelRatio: 1, // Set to 2 for retina display support�
66�
67			autoSize   : true,�
68			autoHeight : false,�
69			autoWidth  : false,�
70�
71			autoResize  : true,�
72			autoCenter  : !isTouch,�
73			fitToView   : true,�
74			aspectRatio : false,�
75			topRatio    : 0.5,�
76			leftRatio   : 0.5,�
77�
78			scrolling : 'auto', // 'auto', 'yes' or 'no'�
79			wrapCSS   : '',�
80�
81			arrows     : true,�
82			closeBtn   : true,�
83			closeClick : false,�
84			nextClick  : false,�
85			mouseWheel : true,�
86			autoPlay   : false,�
87			playSpeed  : 3000,�
88			preload    : 3,�
89			modal      : false,�
90			loop       : true,�
91�
92			ajax  : {�
93				dataType : 'html',�
94				headers  : { 'X-fancyBox': true }�
95			},�
96			iframe : {�
97				scrolling : 'auto',�
98				preload   : true�
99			},�
100			swf : {�
101				wmode: 'transparent',�
102				allowfullscreen   : 'true',�
103				allowscriptaccess : 'always'�
104			},�
105�
106			keys  : {�
107				next : {�
108					13 : 'left', // enter�
109					34 : 'up',   // page down�
110					39 : 'left', // right arrow�
111					40 : 'up'    // down arrow�
112				},�
113				prev : {�
114					8  : 'right',  // backspace�
115					33 : 'down',   // page up�
116					37 : 'right',  // left arrow�
117					38 : 'down'    // up arrow�
118				},�
119				close  : [27], // escape key�
120				play   : [32], // space - start/stop slideshow�
121				toggle : [70]  // letter "f" - toggle fullscreen�
122			},�
123�
124			direction : {�
125				next : 'left',�
126				prev : 'right'�
127			},�
128�
129			scrollOutside  : true,�
130�
131			// Override some properties�
132			index   : 0,�
133			type    : null,�
134			href    : null,�
135			content : null,�
136			title   : null,�
137�
138			// HTML templates�
139			tpl: {�
140				wrap     : '<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',�
141				image    : '<img class="fancybox-image" src="{href}" alt="" />',�
142				iframe   : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen' + (IE ? ' allowtransparency="true"' : '') + '></iframe>',�
143				error    : '<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',�
144				closeBtn : '<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',�
145				next     : '<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',�
146				prev     : '<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'�
147			},�
148�
149			// Properties for each animation type�
150			// Opening fancyBox�
151			openEffect  : 'fade', // 'elastic', 'fade' or 'none'�
152			openSpeed   : 250,�
153			openEasing  : 'swing',�
154			openOpacity : true,�
155			openMethod  : 'zoomIn',�
156�
157			// Closing fancyBox�
158			closeEffect  : 'fade', // 'elastic', 'fade' or 'none'�
159			closeSpeed   : 250,�
160			closeEasing  : 'swing',�
161			closeOpacity : true,�
162			closeMethod  : 'zoomOut',�
163�
164			// Changing next gallery item�
165			nextEffect : 'elastic', // 'elastic', 'fade' or 'none'�
166			nextSpeed  : 250,�
167			nextEasing : 'swing',�
168			nextMethod : 'changeIn',�
169�
170			// Changing previous gallery item�
171			prevEffect : 'elastic', // 'elastic', 'fade' or 'none'�
172			prevSpeed  : 250,�
173			prevEasing : 'swing',�
174			prevMethod : 'changeOut',�
175�
176			// Enable default helpers�
177			helpers : {�
178				overlay : true,�
179				title   : true�
180			},�
181�
182			// Callbacks�
183			onCancel     : $.noop, // If canceling�
184			beforeLoad   : $.noop, // Before loading�
185			afterLoad    : $.noop, // After loading�
186			beforeShow   : $.noop, // Before changing in current item�
187			afterShow    : $.noop, // After opening�
188			beforeChange : $.noop, // Before changing gallery item�
189			beforeClose  : $.noop, // Before closing�
190			afterClose   : $.noop  // After closing�
191		},�
192�
193		//Current state�
194		group    : {}, // Selected group�
195		opts     : {}, // Group options�
196		previous : null,  // Previous element�
197		coming   : null,  // Element being loaded�
198		current  : null,  // Currently loaded element�
199		isActive : false, // Is activated�
200		isOpen   : false, // Is currently open�
201		isOpened : false, // Have been fully opened at least once�
202�
203		wrap  : null,�
204		skin  : null,�
205		outer : null,�
206		inner : null,�
207�
208		player : {�
209			timer    : null,�
210			isActive : false�
211		},�
212�
213		// Loaders�
214		ajaxLoad   : null,�
215		imgPreload : null,�
216�
217		// Some collections�
218		transitions : {},�
219		helpers     : {},�
220�
221		/*�
222		 *	Static methods�
223		 */�
224�
225		open: function (group, opts) {�
226			if (!group) {�
227				return;�
228			}�
229�
230			if (!$.isPlainObject(opts)) {�
231				opts = {};�
232			}�
233�
234			// Close if already active�
235			if (false === F.close(true)) {�
236				return;�
237			}�
238�
239			// Normalize group�
240			if (!$.isArray(group)) {�
241				group = isQuery(group) ? $(group).get() : [group];�
242			}�
243�
244			// Recheck if the type of each element is `object` and set content type (image, ajax, etc)�
245			$.each(group, function(i, element) {�
246				var obj = {},�
247					href,�
248					title,�
249					content,�
250					type,�
251					rez,�
252					hrefParts,�
253					selector;�
254�
255				if ($.type(element) === "object") {�
256					// Check if is DOM element�
257					if (element.nodeType) {�
258						element = $(element);�
259					}�
260�
261					if (isQuery(element)) {�
262						obj = {�
263							href    : element.data('fancybox-href') || element.attr('href'),�
264							title   : element.data('fancybox-title') || element.attr('title'),�
265							isDom   : true,�
266							element : element�
267						};�
268�
269						if ($.metadata) {�
270							$.extend(true, obj, element.metadata());�
271						}�
272�
273					} else {�
274						obj = element;�
275					}�
276				}�
277�
278				href  = opts.href  || obj.href || (isString(element) ? element : null);�
279				title = opts.title !== undefined ? opts.title : obj.title || '';�
280�
vendor: 41,674 bytes, lines 281-1892
281				content = opts.content || obj.content;�
282				type    = content ? 'html' : (opts.type  || obj.type);�
283�
284				if (!type && obj.isDom) {�
285					type = element.data('fancybox-type');�
286�
287					if (!type) {�
288						rez  = element.prop('class').match(/fancybox\.(\w+)/);�
289						type = rez ? rez[1] : null;�
290					}�
291				}�
292�
293				if (isString(href)) {�
294					// Try to guess the content type�
295					if (!type) {�
296						if (F.isImage(href)) {�
297							type = 'image';�
298�
299						} else if (F.isSWF(href)) {�
300							type = 'swf';�
301�
302						} else if (href.charAt(0) === '#') {�
303							type = 'inline';�
304�
305						} else if (isString(element)) {�
306							type    = 'html';�
307							content = element;�
308						}�
309					}�
310�
311					// Split url into two pieces with source url and content selector, e.g,�
312					// "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id"�
313					if (type === 'ajax') {�
314						hrefParts = href.split(/\s+/, 2);�
315						href      = hrefParts.shift();�
316						selector  = hrefParts.shift();�
317					}�
318				}�
319�
320				if (!content) {�
321					if (type === 'inline') {�
322						if (href) {�
323							content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7�
324�
325						} else if (obj.isDom) {�
326							content = element;�
327						}�
328�
329					} else if (type === 'html') {�
330						content = href;�
331�
332					} else if (!type && !href && obj.isDom) {�
333						type    = 'inline';�
334						content = element;�
335					}�
336				}�
337�
338				$.extend(obj, {�
339					href     : href,�
340					type     : type,�
341					content  : content,�
342					title    : title,�
343					selector : selector�
344				});�
345�
346				group[ i ] = obj;�
347			});�
348�
349			// Extend the defaults�
350			F.opts = $.extend(true, {}, F.defaults, opts);�
351�
352			// All options are merged recursive except keys�
353			if (opts.keys !== undefined) {�
354				F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false;�
355			}�
356�
357			F.group = group;�
358�
359			return F._start(F.opts.index);�
360		},�
361�
362		// Cancel image loading or abort ajax request�
363		cancel: function () {�
364			var coming = F.coming;�
365�
366			if (!coming || false === F.trigger('onCancel')) {�
367				return;�
368			}�
369�
370			F.hideLoading();�
371�
372			if (F.ajaxLoad) {�
373				F.ajaxLoad.abort();�
374			}�
375�
376			F.ajaxLoad = null;�
377�
378			if (F.imgPreload) {�
379				F.imgPreload.onload = F.imgPreload.onerror = null;�
380			}�
381�
382			if (coming.wrap) {�
383				coming.wrap.stop(true, true).trigger('onReset').remove();�
384			}�
385�
386			F.coming = null;�
387�
388			// If the first item has been canceled, then clear everything�
389			if (!F.current) {�
390				F._afterZoomOut( coming );�
391			}�
392		},�
393�
394		// Start closing animation if is open; remove immediately if opening/closing�
395		close: function (event) {�
396			F.cancel();�
397�
398			if (false === F.trigger('beforeClose')) {�
399				return;�
400			}�
401�
402			F.unbindEvents();�
403�
404			if (!F.isActive) {�
405				return;�
406			}�
407�
408			if (!F.isOpen || event === true) {�
409				$('.fancybox-wrap').stop(true).trigger('onReset').remove();�
410�
411				F._afterZoomOut();�
412�
413			} else {�
414				F.isOpen = F.isOpened = false;�
415				F.isClosing = true;�
416�
417				$('.fancybox-item, .fancybox-nav').remove();�
418�
419				F.wrap.stop(true, true).removeClass('fancybox-opened');�
420�
421				F.transitions[ F.current.closeMethod ]();�
422			}�
423		},�
424�
425		// Manage slideshow:�
426		//   $.fancybox.play(); - toggle slideshow�
427		//   $.fancybox.play( true ); - start�
428		//   $.fancybox.play( false ); - stop�
429		play: function ( action ) {�
430			var clear = function () {�
431					clearTimeout(F.player.timer);�
432				},�
433				set = function () {�
434					clear();�
435�
436					if (F.current && F.player.isActive) {�
437						F.player.timer = setTimeout(F.next, F.current.playSpeed);�
438					}�
439				},�
440				stop = function () {�
441					clear();�
442�
443					D.unbind('.player');�
444�
445					F.player.isActive = false;�
446�
447					F.trigger('onPlayEnd');�
448				},�
449				start = function () {�
450					if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) {�
451						F.player.isActive = true;�
452�
453						D.bind({�
454							'onCancel.player beforeClose.player' : stop,�
455							'onUpdate.player'   : set,�
456							'beforeLoad.player' : clear�
457						});�
458�
459						set();�
460�
461						F.trigger('onPlayStart');�
462					}�
463				};�
464�
465			if (action === true || (!F.player.isActive && action !== false)) {�
466				start();�
467			} else {�
468				stop();�
469			}�
470		},�
471�
472		// Navigate to next gallery item�
473		next: function ( direction ) {�
474			var current = F.current;�
475�
476			if (current) {�
477				if (!isString(direction)) {�
478					direction = current.direction.next;�
479				}�
480�
481				F.jumpto(current.index + 1, direction, 'next');�
482			}�
483		},�
484�
485		// Navigate to previous gallery item�
486		prev: function ( direction ) {�
487			var current = F.current;�
488�
489			if (current) {�
490				if (!isString(direction)) {�
491					direction = current.direction.prev;�
492				}�
493�
494				F.jumpto(current.index - 1, direction, 'prev');�
495			}�
496		},�
497�
498		// Navigate to gallery item by index�
499		jumpto: function ( index, direction, router ) {�
500			var current = F.current;�
501�
502			if (!current) {�
503				return;�
504			}�
505�
506			index = getScalar(index);�
507�
508			F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ];�
509			F.router    = router || 'jumpto';�
510�
511			if (current.loop) {�
512				if (index < 0) {�
513					index = current.group.length + (index % current.group.length);�
514				}�
515�
516				index = index % current.group.length;�
517			}�
518�
519			if (current.group[ index ] !== undefined) {�
520				F.cancel();�
521�
522				F._start(index);�
523			}�
524		},�
525�
526		// Center inside viewport and toggle position type to fixed or absolute if needed�
527		reposition: function (e, onlyAbsolute) {�
528			var current = F.current,�
529				wrap    = current ? current.wrap : null,�
530				pos;�
531�
532			if (wrap) {�
533				pos = F._getPosition(onlyAbsolute);�
534�
535				if (e && e.type === 'scroll') {�
536					delete pos.position;�
537�
538					wrap.stop(true, true).animate(pos, 200);�
539�
540				} else {�
541					wrap.css(pos);�
542�
543					current.pos = $.extend({}, current.dim, pos);�
544				}�
545			}�
546		},�
547�
548		update: function (e) {�
549			var type = (e && e.type),�
550				anyway = !type || type === 'orientationchange';�
551�
552			if (anyway) {�
553				clearTimeout(didUpdate);�
554�
555				didUpdate = null;�
556			}�
557�
558			if (!F.isOpen || didUpdate) {�
559				return;�
560			}�
561�
562			didUpdate = setTimeout(function() {�
563				var current = F.current;�
564�
565				if (!current || F.isClosing) {�
566					return;�
567				}�
568�
569				F.wrap.removeClass('fancybox-tmp');�
570�
571				if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) {�
572					F._setDimension();�
573				}�
574�
575				if (!(type === 'scroll' && current.canShrink)) {�
576					F.reposition(e);�
577				}�
578�
579				F.trigger('onUpdate');�
580�
581				didUpdate = null;�
582�
583			}, (anyway && !isTouch ? 0 : 300));�
584		},�
585�
586		// Shrink content to fit inside viewport or restore if resized�
587		toggle: function ( action ) {�
588			if (F.isOpen) {�
589				F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView;�
590�
591				// Help browser to restore document dimensions�
592				if (isTouch) {�
593					F.wrap.removeAttr('style').addClass('fancybox-tmp');�
594�
595					F.trigger('onUpdate');�
596				}�
597�
598				F.update();�
599			}�
600		},�
601�
602		hideLoading: function () {�
603			D.unbind('.loading');�
604�
605			$('#fancybox-loading').remove();�
606		},�
607�
608		showLoading: function () {�
609			var el, viewport;�
610�
611			F.hideLoading();�
612�
613			el = $('<div id="fancybox-loading"><div></div></div>').click(F.cancel).appendTo('body');�
614�
615			// If user will press the escape-button, the request will be canceled�
616			D.bind('keydown.loading', function(e) {�
617				if ((e.which || e.keyCode) === 27) {�
618					e.preventDefault();�
619�
620					F.cancel();�
621				}�
622			});�
623�
624			if (!F.defaults.fixed) {�
625				viewport = F.getViewport();�
626�
627				el.css({�
628					position : 'absolute',�
629					top  : (viewport.h * 0.5) + viewport.y,�
630					left : (viewport.w * 0.5) + viewport.x�
631				});�
632			}�
633		},�
634�
635		getViewport: function () {�
636			var locked = (F.current && F.current.locked) || false,�
637				rez    = {�
638					x: W.scrollLeft(),�
639					y: W.scrollTop()�
640				};�
641�
642			if (locked) {�
643				rez.w = locked[0].clientWidth;�
644				rez.h = locked[0].clientHeight;�
645�
646			} else {�
647				// See http://bugs.jquery.com/ticket/6724�
648				rez.w = isTouch && window.innerWidth  ? window.innerWidth  : W.width();�
649				rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height();�
650			}�
651�
652			return rez;�
653		},�
654�
655		// Unbind the keyboard / clicking actions�
656		unbindEvents: function () {�
657			if (F.wrap && isQuery(F.wrap)) {�
658				F.wrap.unbind('.fb');�
659			}�
660�
661			D.unbind('.fb');�
662			W.unbind('.fb');�
663		},�
664�
665		bindEvents: function () {�
666			var current = F.current,�
667				keys;�
668�
669			if (!current) {�
670				return;�
671			}�
672�
673			// Changing document height on iOS devices triggers a 'resize' event,�
674			// that can change document height... repeating infinitely�
675			W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update);�
676�
677			keys = current.keys;�
678�
679			if (keys) {�
680				D.bind('keydown.fb', function (e) {�
681					var code   = e.which || e.keyCode,�
682						target = e.target || e.srcElement;�
683�
684					// Skip esc key if loading, because showLoading will cancel preloading�
685					if (code === 27 && F.coming) {�
686						return false;�
687					}�
688�
689					// Ignore key combinations and key events within form elements�
690					if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) {�
691						$.each(keys, function(i, val) {�
692							if (current.group.length > 1 && val[ code ] !== undefined) {�
693								F[ i ]( val[ code ] );�
694�
695								e.preventDefault();�
696								return false;�
697							}�
698�
699							if ($.inArray(code, val) > -1) {�
700								F[ i ] ();�
701�
702								e.preventDefault();�
703								return false;�
704							}�
705						});�
706					}�
707				});�
708			}�
709�
710			if ($.fn.mousewheel && current.mouseWheel) {�
711				F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) {�
712					var target = e.target || null,�
713						parent = $(target),�
714						canScroll = false;�
715�
716					while (parent.length) {�
717						if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) {�
718							break;�
719						}�
720�
721						canScroll = isScrollable( parent[0] );�
722						parent    = $(parent).parent();�
723					}�
724�
725					if (delta !== 0 && !canScroll) {�
726						if (F.group.length > 1 && !current.canShrink) {�
727							if (deltaY > 0 || deltaX > 0) {�
728								F.prev( deltaY > 0 ? 'down' : 'left' );�
729�
730							} else if (deltaY < 0 || deltaX < 0) {�
731								F.next( deltaY < 0 ? 'up' : 'right' );�
732							}�
733�
734							e.preventDefault();�
735						}�
736					}�
737				});�
738			}�
739		},�
740�
741		trigger: function (event, o) {�
742			var ret, obj = o || F.coming || F.current;�
743�
744			if (!obj) {�
745				return;�
746			}�
747�
748			if ($.isFunction( obj[event] )) {�
749				ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1));�
750			}�
751�
752			if (ret === false) {�
753				return false;�
754			}�
755�
756			if (obj.helpers) {�
757				$.each(obj.helpers, function (helper, opts) {�
758					if (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) {�
759						F.helpers[helper][event]($.extend(true, {}, F.helpers[helper].defaults, opts), obj);�
760					}�
761				});�
762			}�
763�
764			D.trigger(event);�
765		},�
766�
767		isImage: function (str) {�
768			return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i);�
769		},�
770�
771		isSWF: function (str) {�
772			return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i);�
773		},�
774�
775		_start: function (index) {�
776			var coming = {},�
777				obj,�
778				href,�
779				type,�
780				margin,�
781				padding;�
782�
783			index = getScalar( index );�
784			obj   = F.group[ index ] || null;�
785�
786			if (!obj) {�
787				return false;�
788			}�
789�
790			coming = $.extend(true, {}, F.opts, obj);�
791�
792			// Convert margin and padding properties to array - top, right, bottom, left�
793			margin  = coming.margin;�
794			padding = coming.padding;�
795�
796			if ($.type(margin) === 'number') {�
797				coming.margin = [margin, margin, margin, margin];�
798			}�
799�
800			if ($.type(padding) === 'number') {�
801				coming.padding = [padding, padding, padding, padding];�
802			}�
803�
804			// 'modal' propery is just a shortcut�
805			if (coming.modal) {�
806				$.extend(true, coming, {�
807					closeBtn   : false,�
808					closeClick : false,�
809					nextClick  : false,�
810					arrows     : false,�
811					mouseWheel : false,�
812					keys       : null,�
813					helpers: {�
814						overlay : {�
815							closeClick : false�
816						}�
817					}�
818				});�
819			}�
820�
821			// 'autoSize' property is a shortcut, too�
822			if (coming.autoSize) {�
823				coming.autoWidth = coming.autoHeight = true;�
824			}�
825�
826			if (coming.width === 'auto') {�
827				coming.autoWidth = true;�
828			}�
829�
830			if (coming.height === 'auto') {�
831				coming.autoHeight = true;�
832			}�
833�
834			/*�
835			 * Add reference to the group, so it`s possible to access from callbacks, example:�
836			 * afterLoad : function() {�
837			 *     this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');�
838			 * }�
839			 */�
840�
841			coming.group  = F.group;�
842			coming.index  = index;�
843�
844			// Give a chance for callback or helpers to update coming item (type, title, etc)�
845			F.coming = coming;�
846�
847			if (false === F.trigger('beforeLoad')) {�
848				F.coming = null;�
849�
850				return;�
851			}�
852�
853			type = coming.type;�
854			href = coming.href;�
855�
856			if (!type) {�
857				F.coming = null;�
858�
859				//If we can not determine content type then drop silently or display next/prev item if looping through gallery�
860				if (F.current && F.router && F.router !== 'jumpto') {�
861					F.current.index = index;�
862�
863					return F[ F.router ]( F.direction );�
864				}�
865�
866				return false;�
867			}�
868�
869			F.isActive = true;�
870�
871			if (type === 'image' || type === 'swf') {�
872				coming.autoHeight = coming.autoWidth = false;�
873				coming.scrolling  = 'visible';�
874			}�
875�
876			if (type === 'image') {�
877				coming.aspectRatio = true;�
878			}�
879�
880			if (type === 'iframe' && isTouch) {�
881				coming.scrolling = 'scroll';�
882			}�
883�
884			// Build the neccessary markup�
885			coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' );�
886�
887			$.extend(coming, {�
888				skin  : $('.fancybox-skin',  coming.wrap),�
889				outer : $('.fancybox-outer', coming.wrap),�
890				inner : $('.fancybox-inner', coming.wrap)�
891			});�
892�
893			$.each(["Top", "Right", "Bottom", "Left"], function(i, v) {�
894				coming.skin.css('padding' + v, getValue(coming.padding[ i ]));�
895			});�
896�
897			F.trigger('onReady');�
898�
899			// Check before try to load; 'inline' and 'html' types need content, others - href�
900			if (type === 'inline' || type === 'html') {�
901				if (!coming.content || !coming.content.length) {�
902					return F._error( 'content' );�
903				}�
904�
905			} else if (!href) {�
906				return F._error( 'href' );�
907			}�
908�
909			if (type === 'image') {�
910				F._loadImage();�
911�
912			} else if (type === 'ajax') {�
913				F._loadAjax();�
914�
915			} else if (type === 'iframe') {�
916				F._loadIframe();�
917�
918			} else {�
919				F._afterLoad();�
920			}�
921		},�
922�
923		_error: function ( type ) {�
924			$.extend(F.coming, {�
925				type       : 'html',�
926				autoWidth  : true,�
927				autoHeight : true,�
928				minWidth   : 0,�
929				minHeight  : 0,�
930				scrolling  : 'no',�
931				hasError   : type,�
932				content    : F.coming.tpl.error�
933			});�
934�
935			F._afterLoad();�
936		},�
937�
938		_loadImage: function () {�
939			// Reset preload image so it is later possible to check "complete" property�
940			var img = F.imgPreload = new Image();�
941�
942			img.onload = function () {�
943				this.onload = this.onerror = null;�
944�
945				F.coming.width  = this.width / F.opts.pixelRatio;�
946				F.coming.height = this.height / F.opts.pixelRatio;�
947�
948				F._afterLoad();�
949			};�
950�
951			img.onerror = function () {�
952				this.onload = this.onerror = null;�
953�
954				F._error( 'image' );�
955			};�
956�
957			img.src = F.coming.href;�
958�
959			if (img.complete !== true) {�
960				F.showLoading();�
961			}�
962		},�
963�
964		_loadAjax: function () {�
965			var coming = F.coming;�
966�
967			F.showLoading();�
968�
969			F.ajaxLoad = $.ajax($.extend({}, coming.ajax, {�
970				url: coming.href,�
971				error: function (jqXHR, textStatus) {�
972					if (F.coming && textStatus !== 'abort') {�
973						F._error( 'ajax', jqXHR );�
974�
975					} else {�
976						F.hideLoading();�
977					}�
978				},�
979				success: function (data, textStatus) {�
980					if (textStatus === 'success') {�
981						coming.content = data;�
982�
983						F._afterLoad();�
984					}�
985				}�
986			}));�
987		},�
988�
989		_loadIframe: function() {�
990			var coming = F.coming,�
991				iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime()))�
992					.attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling)�
993					.attr('src', coming.href);�
994�
995			// This helps IE�
996			$(coming.wrap).bind('onReset', function () {�
997				try {�
998					$(this).find('iframe').hide().attr('src', '//about:blank').end().empty();�
999				} catch (e) {}�
1000			});�
1001�
1002			if (coming.iframe.preload) {�
1003				F.showLoading();�
1004�
1005				iframe.one('load', function() {�
1006					$(this).data('ready', 1);�
1007�
1008					// iOS will lose scrolling if we resize�
1009					if (!isTouch) {�
1010						$(this).bind('load.fb', F.update);�
1011					}�
1012�
1013					// Without this trick:�
1014					//   - iframe won't scroll on iOS devices�
1015					//   - IE7 sometimes displays empty iframe�
1016					$(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show();�
1017�
1018					F._afterLoad();�
1019				});�
1020			}�
1021�
1022			coming.content = iframe.appendTo( coming.inner );�
1023�
1024			if (!coming.iframe.preload) {�
1025				F._afterLoad();�
1026			}�
1027		},�
1028�
1029		_preloadImages: function() {�
1030			var group   = F.group,�
1031				current = F.current,�
1032				len     = group.length,�
1033				cnt     = current.preload ? Math.min(current.preload, len - 1) : 0,�
1034				item,�
1035				i;�
1036�
1037			for (i = 1; i <= cnt; i += 1) {�
1038				item = group[ (current.index + i ) % len ];�
1039�
1040				if (item.type === 'image' && item.href) {�
1041					new Image().src = item.href;�
1042				}�
1043			}�
1044		},�
1045�
1046		_afterLoad: function () {�
1047			var coming   = F.coming,�
1048				previous = F.current,�
1049				placeholder = 'fancybox-placeholder',�
1050				current,�
1051				content,�
1052				type,�
1053				scrolling,�
1054				href,�
1055				embed;�
1056�
1057			F.hideLoading();�
1058�
1059			if (!coming || F.isActive === false) {�
1060				return;�
1061			}�
1062�
1063			if (false === F.trigger('afterLoad', coming, previous)) {�
1064				coming.wrap.stop(true).trigger('onReset').remove();�
1065�
1066				F.coming = null;�
1067�
1068				return;�
1069			}�
1070�
1071			if (previous) {�
1072				F.trigger('beforeChange', previous);�
1073�
1074				previous.wrap.stop(true).removeClass('fancybox-opened')�
1075					.find('.fancybox-item, .fancybox-nav')�
1076					.remove();�
1077			}�
1078�
1079			F.unbindEvents();�
1080�
1081			current   = coming;�
1082			content   = coming.content;�
1083			type      = coming.type;�
1084			scrolling = coming.scrolling;�
1085�
1086			$.extend(F, {�
1087				wrap  : current.wrap,�
1088				skin  : current.skin,�
1089				outer : current.outer,�
1090				inner : current.inner,�
1091				current  : current,�
1092				previous : previous�
1093			});�
1094�
1095			href = current.href;�
1096�
1097			switch (type) {�
1098				case 'inline':�
1099				case 'ajax':�
1100				case 'html':�
1101					if (current.selector) {�
1102						content = $('<div>').html(content).find(current.selector);�
1103�
1104					} else if (isQuery(content)) {�
1105						if (!content.data(placeholder)) {�
1106							content.data(placeholder, $('<div class="' + placeholder + '"></div>').insertAfter( content ).hide() );�
1107						}�
1108�
1109						content = content.show().detach();�
1110�
1111						current.wrap.bind('onReset', function () {�
1112							if ($(this).find(content).length) {�
1113								content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false);�
1114							}�
1115						});�
1116					}�
1117				break;�
1118�
1119				case 'image':�
1120					content = current.tpl.image.replace('{href}', href);�
1121				break;�
1122�
1123				case 'swf':�
1124					content = '<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="' + href + '"></param>';�
1125					embed   = '';�
1126�
1127					$.each(current.swf, function(name, val) {�
1128						content += '<param name="' + name + '" value="' + val + '"></param>';�
1129						embed   += ' ' + name + '="' + val + '"';�
1130					});�
1131�
1132					content += '<embed src="' + href + '" type="application/x-shockwave-flash" width="100%" height="100%"' + embed + '></embed></object>';�
1133				break;�
1134			}�
1135�
1136			if (!(isQuery(content) && content.parent().is(current.inner))) {�
1137				current.inner.append( content );�
1138			}�
1139�
1140			// Give a chance for helpers or callbacks to update elements�
1141			F.trigger('beforeShow');�
1142�
1143			// Set scrolling before calculating dimensions�
1144			current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling));�
1145�
1146			// Set initial dimensions and start position�
1147			F._setDimension();�
1148�
1149			F.reposition();�
1150�
1151			F.isOpen = false;�
1152			F.coming = null;�
1153�
1154			F.bindEvents();�
1155�
1156			if (!F.isOpened) {�
1157				$('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove();�
1158�
1159			} else if (previous.prevMethod) {�
1160				F.transitions[ previous.prevMethod ]();�
1161			}�
1162�
1163			F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ]();�
1164�
1165			F._preloadImages();�
1166		},�
1167�
1168		_setDimension: function () {�
1169			var viewport   = F.getViewport(),�
1170				steps      = 0,�
1171				canShrink  = false,�
1172				canExpand  = false,�
1173				wrap       = F.wrap,�
1174				skin       = F.skin,�
1175				inner      = F.inner,�
1176				current    = F.current,�
1177				width      = current.width,�
1178				height     = current.height,�
1179				minWidth   = current.minWidth,�
1180				minHeight  = current.minHeight,�
1181				maxWidth   = current.maxWidth,�
1182				maxHeight  = current.maxHeight,�
1183				scrolling  = current.scrolling,�
1184				scrollOut  = current.scrollOutside ? current.scrollbarWidth : 0,�
1185				margin     = current.margin,�
1186				wMargin    = getScalar(margin[1] + margin[3]),�
1187				hMargin    = getScalar(margin[0] + margin[2]),�
1188				wPadding,�
1189				hPadding,�
1190				wSpace,�
1191				hSpace,�
1192				origWidth,�
1193				origHeight,�
1194				origMaxWidth,�
1195				origMaxHeight,�
1196				ratio,�
1197				width_,�
1198				height_,�
1199				maxWidth_,�
1200				maxHeight_,�
1201				iframe,�
1202				body;�
1203�
1204			// Reset dimensions so we could re-check actual size�
1205			wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp');�
1206�
1207			wPadding = getScalar(skin.outerWidth(true)  - skin.width());�
1208			hPadding = getScalar(skin.outerHeight(true) - skin.height());�
1209�
1210			// Any space between content and viewport (margin, padding, border, title)�
1211			wSpace = wMargin + wPadding;�
1212			hSpace = hMargin + hPadding;�
1213�
1214			origWidth  = isPercentage(width)  ? (viewport.w - wSpace) * getScalar(width)  / 100 : width;�
1215			origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height;�
1216�
1217			if (current.type === 'iframe') {�
1218				iframe = current.content;�
1219�
1220				if (current.autoHeight && iframe.data('ready') === 1) {�
1221					try {�
1222						if (iframe[0].contentWindow.document.location) {�
1223							inner.width( origWidth ).height(9999);�
1224�
1225							body = iframe.contents().find('body');�
1226�
1227							if (scrollOut) {�
1228								body.css('overflow-x', 'hidden');�
1229							}�
1230�
1231							origHeight = body.outerHeight(true);�
1232						}�
1233�
1234					} catch (e) {}�
1235				}�
1236�
1237			} else if (current.autoWidth || current.autoHeight) {�
1238				inner.addClass( 'fancybox-tmp' );�
1239�
1240				// Set width or height in case we need to calculate only one dimension�
1241				if (!current.autoWidth) {�
1242					inner.width( origWidth );�
1243				}�
1244�
1245				if (!current.autoHeight) {�
1246					inner.height( origHeight );�
1247				}�
1248�
1249				if (current.autoWidth) {�
1250					origWidth = inner.width();�
1251				}�
1252�
1253				if (current.autoHeight) {�
1254					origHeight = inner.height();�
1255				}�
1256�
1257				inner.removeClass( 'fancybox-tmp' );�
1258			}�
1259�
1260			width  = getScalar( origWidth );�
1261			height = getScalar( origHeight );�
1262�
1263			ratio  = origWidth / origHeight;�
1264�
1265			// Calculations for the content�
1266			minWidth  = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth);�
1267			maxWidth  = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth);�
1268�
1269			minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight);�
1270			maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight);�
1271�
1272			// These will be used to determine if wrap can fit in the viewport�
1273			origMaxWidth  = maxWidth;�
1274			origMaxHeight = maxHeight;�
1275�
1276			if (current.fitToView) {�
1277				maxWidth  = Math.min(viewport.w - wSpace, maxWidth);�
1278				maxHeight = Math.min(viewport.h - hSpace, maxHeight);�
1279			}�
1280�
1281			maxWidth_  = viewport.w - wMargin;�
1282			maxHeight_ = viewport.h - hMargin;�
1283�
1284			if (current.aspectRatio) {�
1285				if (width > maxWidth) {�
1286					width  = maxWidth;�
1287					height = getScalar(width / ratio);�
1288				}�
1289�
1290				if (height > maxHeight) {�
1291					height = maxHeight;�
1292					width  = getScalar(height * ratio);�
1293				}�
1294�
1295				if (width < minWidth) {�
1296					width  = minWidth;�
1297					height = getScalar(width / ratio);�
1298				}�
1299�
1300				if (height < minHeight) {�
1301					height = minHeight;�
1302					width  = getScalar(height * ratio);�
1303				}�
1304�
1305			} else {�
1306				width = Math.max(minWidth, Math.min(width, maxWidth));�
1307�
1308				if (current.autoHeight && current.type !== 'iframe') {�
1309					inner.width( width );�
1310�
1311					height = inner.height();�
1312				}�
1313�
1314				height = Math.max(minHeight, Math.min(height, maxHeight));�
1315			}�
1316�
1317			// Try to fit inside viewport (including the title)�
1318			if (current.fitToView) {�
1319				inner.width( width ).height( height );�
1320�
1321				wrap.width( width + wPadding );�
1322�
1323				// Real wrap dimensions�
1324				width_  = wrap.width();�
1325				height_ = wrap.height();�
1326�
1327				if (current.aspectRatio) {�
1328					while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) {�
1329						if (steps++ > 19) {�
1330							break;�
1331						}�
1332�
1333						height = Math.max(minHeight, Math.min(maxHeight, height - 10));�
1334						width  = getScalar(height * ratio);�
1335�
1336						if (width < minWidth) {�
1337							width  = minWidth;�
1338							height = getScalar(width / ratio);�
1339						}�
1340�
1341						if (width > maxWidth) {�
1342							width  = maxWidth;�
1343							height = getScalar(width / ratio);�
1344						}�
1345�
1346						inner.width( width ).height( height );�
1347�
1348						wrap.width( width + wPadding );�
1349�
1350						width_  = wrap.width();�
1351						height_ = wrap.height();�
1352					}�
1353�
1354				} else {�
1355					width  = Math.max(minWidth,  Math.min(width,  width  - (width_  - maxWidth_)));�
1356					height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_)));�
1357				}�
1358			}�
1359�
1360			if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) {�
1361				width += scrollOut;�
1362			}�
1363�
1364			inner.width( width ).height( height );�
1365�
1366			wrap.width( width + wPadding );�
1367�
1368			width_  = wrap.width();�
1369			height_ = wrap.height();�
1370�
1371			canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight;�
1372			canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight));�
1373�
1374			$.extend(current, {�
1375				dim : {�
1376					width	: getValue( width_ ),�
1377					height	: getValue( height_ )�
1378				},�
1379				origWidth  : origWidth,�
1380				origHeight : origHeight,�
1381				canShrink  : canShrink,�
1382				canExpand  : canExpand,�
1383				wPadding   : wPadding,�
1384				hPadding   : hPadding,�
1385				wrapSpace  : height_ - skin.outerHeight(true),�
1386				skinSpace  : skin.height() - height�
1387			});�
1388�
1389			if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) {�
1390				inner.height('auto');�
1391			}�
1392		},�
1393�
1394		_getPosition: function (onlyAbsolute) {�
1395			var current  = F.current,�
1396				viewport = F.getViewport(),�
1397				margin   = current.margin,�
1398				width    = F.wrap.width()  + margin[1] + margin[3],�
1399				height   = F.wrap.height() + margin[0] + margin[2],�
1400				rez      = {�
1401					position: 'absolute',�
1402					top  : margin[0],�
1403					left : margin[3]�
1404				};�
1405�
1406			if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) {�
1407				rez.position = 'fixed';�
1408�
1409			} else if (!current.locked) {�
1410				rez.top  += viewport.y;�
1411				rez.left += viewport.x;�
1412			}�
1413�
1414			rez.top  = getValue(Math.max(rez.top,  rez.top  + ((viewport.h - height) * current.topRatio)));�
1415			rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width)  * current.leftRatio)));�
1416�
1417			return rez;�
1418		},�
1419�
1420		_afterZoomIn: function () {�
1421			var current = F.current;�
1422�
1423			if (!current) {�
1424				return;�
1425			}�
1426�
1427			F.isOpen = F.isOpened = true;�
1428�
1429			F.wrap.css('overflow', 'visible').addClass('fancybox-opened');�
1430�
1431			F.update();�
1432�
1433			// Assign a click event�
1434			if ( current.closeClick || (current.nextClick && F.group.length > 1) ) {�
1435				F.inner.css('cursor', 'pointer').bind('click.fb', function(e) {�
1436					if (!$(e.target).is('a') && !$(e.target).parent().is('a')) {�
1437						e.preventDefault();�
1438�
1439						F[ current.closeClick ? 'close' : 'next' ]();�
1440					}�
1441				});�
1442			}�
1443�
1444			// Create a close button�
1445			if (current.closeBtn) {�
1446				$(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) {�
1447					e.preventDefault();�
1448�
1449					F.close();�
1450				});�
1451			}�
1452�
1453			// Create navigation arrows�
1454			if (current.arrows && F.group.length > 1) {�
1455				if (current.loop || current.index > 0) {�
1456					$(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev);�
1457				}�
1458�
1459				if (current.loop || current.index < F.group.length - 1) {�
1460					$(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next);�
1461				}�
1462			}�
1463�
1464			F.trigger('afterShow');�
1465�
1466			// Stop the slideshow if this is the last item�
1467			if (!current.loop && current.index === current.group.length - 1) {�
1468				F.play( false );�
1469�
1470			} else if (F.opts.autoPlay && !F.player.isActive) {�
1471				F.opts.autoPlay = false;�
1472�
1473				F.play();�
1474			}�
1475		},�
1476�
1477		_afterZoomOut: function ( obj ) {�
1478			obj = obj || F.current;�
1479�
1480			$('.fancybox-wrap').trigger('onReset').remove();�
1481�
1482			$.extend(F, {�
1483				group  : {},�
1484				opts   : {},�
1485				router : false,�
1486				current   : null,�
1487				isActive  : false,�
1488				isOpened  : false,�
1489				isOpen    : false,�
1490				isClosing : false,�
1491				wrap   : null,�
1492				skin   : null,�
1493				outer  : null,�
1494				inner  : null�
1495			});�
1496�
1497			F.trigger('afterClose', obj);�
1498		}�
1499	});�
1500�
1501	/*�
1502	 *	Default transitions�
1503	 */�
1504�
1505	F.transitions = {�
1506		getOrigPosition: function () {�
1507			var current  = F.current,�
1508				element  = current.element,�
1509				orig     = current.orig,�
1510				pos      = {},�
1511				width    = 50,�
1512				height   = 50,�
1513				hPadding = current.hPadding,�
1514				wPadding = current.wPadding,�
1515				viewport = F.getViewport();�
1516�
1517			if (!orig && current.isDom && element.is(':visible')) {�
1518				orig = element.find('img:first');�
1519�
1520				if (!orig.length) {�
1521					orig = element;�
1522				}�
1523			}�
1524�
1525			if (isQuery(orig)) {�
1526				pos = orig.offset();�
1527�
1528				if (orig.is('img')) {�
1529					width  = orig.outerWidth();�
1530					height = orig.outerHeight();�
1531				}�
1532�
1533			} else {�
1534				pos.top  = viewport.y + (viewport.h - height) * current.topRatio;�
1535				pos.left = viewport.x + (viewport.w - width)  * current.leftRatio;�
1536			}�
1537�
1538			if (F.wrap.css('position') === 'fixed' || current.locked) {�
1539				pos.top  -= viewport.y;�
1540				pos.left -= viewport.x;�
1541			}�
1542�
1543			pos = {�
1544				top     : getValue(pos.top  - hPadding * current.topRatio),�
1545				left    : getValue(pos.left - wPadding * current.leftRatio),�
1546				width   : getValue(width  + wPadding),�
1547				height  : getValue(height + hPadding)�
1548			};�
1549�
1550			return pos;�
1551		},�
1552�
1553		step: function (now, fx) {�
1554			var ratio,�
1555				padding,�
1556				value,�
1557				prop       = fx.prop,�
1558				current    = F.current,�
1559				wrapSpace  = current.wrapSpace,�
1560				skinSpace  = current.skinSpace;�
1561�
1562			if (prop === 'width' || prop === 'height') {�
1563				ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start);�
1564�
1565				if (F.isClosing) {�
1566					ratio = 1 - ratio;�
1567				}�
1568�
1569				padding = prop === 'width' ? current.wPadding : current.hPadding;�
1570				value   = now - padding;�
1571�
1572				F.skin[ prop ](  getScalar( prop === 'width' ?  value : value - (wrapSpace * ratio) ) );�
1573				F.inner[ prop ]( getScalar( prop === 'width' ?  value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) );�
1574			}�
1575		},�
1576�
1577		zoomIn: function () {�
1578			var current  = F.current,�
1579				startPos = current.pos,�
1580				effect   = current.openEffect,�
1581				elastic  = effect === 'elastic',�
1582				endPos   = $.extend({opacity : 1}, startPos);�
1583�
1584			// Remove "position" property that breaks older IE�
1585			delete endPos.position;�
1586�
1587			if (elastic) {�
1588				startPos = this.getOrigPosition();�
1589�
1590				if (current.openOpacity) {�
1591					startPos.opacity = 0.1;�
1592				}�
1593�
1594			} else if (effect === 'fade') {�
1595				startPos.opacity = 0.1;�
1596			}�
1597�
1598			F.wrap.css(startPos).animate(endPos, {�
1599				duration : effect === 'none' ? 0 : current.openSpeed,�
1600				easing   : current.openEasing,�
1601				step     : elastic ? this.step : null,�
1602				complete : F._afterZoomIn�
1603			});�
1604		},�
1605�
1606		zoomOut: function () {�
1607			var current  = F.current,�
1608				effect   = current.closeEffect,�
1609				elastic  = effect === 'elastic',�
1610				endPos   = {opacity : 0.1};�
1611�
1612			if (elastic) {�
1613				endPos = this.getOrigPosition();�
1614�
1615				if (current.closeOpacity) {�
1616					endPos.opacity = 0.1;�
1617				}�
1618			}�
1619�
1620			F.wrap.animate(endPos, {�
1621				duration : effect === 'none' ? 0 : current.closeSpeed,�
1622				easing   : current.closeEasing,�
1623				step     : elastic ? this.step : null,�
1624				complete : F._afterZoomOut�
1625			});�
1626		},�
1627�
1628		changeIn: function () {�
1629			var current   = F.current,�
1630				effect    = current.nextEffect,�
1631				startPos  = current.pos,�
1632				endPos    = { opacity : 1 },�
1633				direction = F.direction,�
1634				distance  = 200,�
1635				field;�
1636�
1637			startPos.opacity = 0.1;�
1638�
1639			if (effect === 'elastic') {�
1640				field = direction === 'down' || direction === 'up' ? 'top' : 'left';�
1641�
1642				if (direction === 'down' || direction === 'right') {�
1643					startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance);�
1644					endPos[ field ]   = '+=' + distance + 'px';�
1645�
1646				} else {�
1647					startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance);�
1648					endPos[ field ]   = '-=' + distance + 'px';�
1649				}�
1650			}�
1651�
1652			// Workaround for http://bugs.jquery.com/ticket/12273�
1653			if (effect === 'none') {�
1654				F._afterZoomIn();�
1655�
1656			} else {�
1657				F.wrap.css(startPos).animate(endPos, {�
1658					duration : current.nextSpeed,�
1659					easing   : current.nextEasing,�
1660					complete : F._afterZoomIn�
1661				});�
1662			}�
1663		},�
1664�
1665		changeOut: function () {�
1666			var previous  = F.previous,�
1667				effect    = previous.prevEffect,�
1668				endPos    = { opacity : 0.1 },�
1669				direction = F.direction,�
1670				distance  = 200;�
1671�
1672			if (effect === 'elastic') {�
1673				endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px';�
1674			}�
1675�
1676			previous.wrap.animate(endPos, {�
1677				duration : effect === 'none' ? 0 : previous.prevSpeed,�
1678				easing   : previous.prevEasing,�
1679				complete : function () {�
1680					$(this).trigger('onReset').remove();�
1681				}�
1682			});�
1683		}�
1684	};�
1685�
1686	/*�
1687	 *	Overlay helper�
1688	 */�
1689�
1690	F.helpers.overlay = {�
1691		defaults : {�
1692			closeClick : true,      // if true, fancyBox will be closed when user clicks on the overlay�
1693			speedOut   : 200,       // duration of fadeOut animation�
1694			showEarly  : true,      // indicates if should be opened immediately or wait until the content is ready�
1695			css        : {},        // custom CSS properties�
1696			locked     : !isTouch,  // if true, the content will be locked into overlay�
1697			fixed      : true       // if false, the overlay CSS position property will not be set to "fixed"�
1698		},�
1699�
1700		overlay : null,      // current handle�
1701		fixed   : false,     // indicates if the overlay has position "fixed"�
1702		el      : $('html'), // element that contains "the lock"�
1703�
1704		// Public methods�
1705		create : function(opts) {�
1706			opts = $.extend({}, this.defaults, opts);�
1707�
1708			if (this.overlay) {�
1709				this.close();�
1710			}�
1711�
1712			this.overlay = $('<div class="fancybox-overlay"></div>').appendTo( F.coming ? F.coming.parent : opts.parent );�
1713			this.fixed   = false;�
1714�
1715			if (opts.fixed && F.defaults.fixed) {�
1716				this.overlay.addClass('fancybox-overlay-fixed');�
1717�
1718				this.fixed = true;�
1719			}�
1720		},�
1721�
1722		open : function(opts) {�
1723			var that = this;�
1724�
1725			opts = $.extend({}, this.defaults, opts);�
1726�
1727			if (this.overlay) {�
1728				this.overlay.unbind('.overlay').width('auto').height('auto');�
1729�
1730			} else {�
1731				this.create(opts);�
1732			}�
1733�
1734			if (!this.fixed) {�
1735				W.bind('resize.overlay', $.proxy( this.update, this) );�
1736�
1737				this.update();�
1738			}�
1739�
1740			if (opts.closeClick) {�
1741				this.overlay.bind('click.overlay', function(e) {�
1742					if ($(e.target).hasClass('fancybox-overlay')) {�
1743						if (F.isActive) {�
1744							F.close();�
1745						} else {�
1746							that.close();�
1747						}�
1748�
1749						return false;�
1750					}�
1751				});�
1752			}�
1753�
1754			this.overlay.css( opts.css ).show();�
1755		},�
1756�
1757		close : function() {�
1758			var scrollV, scrollH;�
1759�
1760			W.unbind('resize.overlay');�
1761�
1762			if (this.el.hasClass('fancybox-lock')) {�
1763				$('.fancybox-margin').removeClass('fancybox-margin');�
1764�
1765				scrollV = W.scrollTop();�
1766				scrollH = W.scrollLeft();�
1767�
1768				this.el.removeClass('fancybox-lock');�
1769�
1770				W.scrollTop( scrollV ).scrollLeft( scrollH );�
1771			}�
1772�
1773			$('.fancybox-overlay').remove().hide();�
1774�
1775			$.extend(this, {�
1776				overlay : null,�
1777				fixed   : false�
1778			});�
1779		},�
1780�
1781		// Private, callbacks�
1782�
1783		update : function () {�
1784			var width = '100%', offsetWidth;�
1785�
1786			// Reset width/height so it will not mess�
1787			this.overlay.width(width).height('100%');�
1788�
1789			// jQuery does not return reliable result for IE�
1790			if (IE) {�
1791				offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth);�
1792�
1793				if (D.width() > offsetWidth) {�
1794					width = D.width();�
1795				}�
1796�
1797			} else if (D.width() > W.width()) {�
1798				width = D.width();�
1799			}�
1800�
1801			this.overlay.width(width).height(D.height());�
1802		},�
1803�
1804		// This is where we can manipulate DOM, because later it would cause iframes to reload�
1805		onReady : function (opts, obj) {�
1806			var overlay = this.overlay;�
1807�
1808			$('.fancybox-overlay').stop(true, true);�
1809�
1810			if (!overlay) {�
1811				this.create(opts);�
1812			}�
1813�
1814			if (opts.locked && this.fixed && obj.fixed) {�
1815				if (!overlay) {�
1816					this.margin = D.height() > W.height() ? $('html').css('margin-right').replace("px", "") : false;�
1817				}�
1818�
1819				obj.locked = this.overlay.append( obj.wrap );�
1820				obj.fixed  = false;�
1821			}�
1822�
1823			if (opts.showEarly === true) {�
1824				this.beforeShow.apply(this, arguments);�
1825			}�
1826		},�
1827�
1828		beforeShow : function(opts, obj) {�
1829			var scrollV, scrollH;�
1830�
1831			if (obj.locked) {�
1832				if (this.margin !== false) {�
1833					$('*').filter(function(){�
1834						return ($(this).css('position') === 'fixed' && !$(this).hasClass("fancybox-overlay") && !$(this).hasClass("fancybox-wrap") );�
1835					}).addClass('fancybox-margin');�
1836�
1837					this.el.addClass('fancybox-margin');�
1838				}�
1839�
1840				scrollV = W.scrollTop();�
1841				scrollH = W.scrollLeft();�
1842�
1843				this.el.addClass('fancybox-lock');�
1844�
1845				W.scrollTop( scrollV ).scrollLeft( scrollH );�
1846			}�
1847�
1848			this.open(opts);�
1849		},�
1850�
1851		onUpdate : function() {�
1852			if (!this.fixed) {�
1853				this.update();�
1854			}�
1855		},�
1856�
1857		afterClose: function (opts) {�
1858			// Remove overlay if exists and fancyBox is not opening�
1859			// (e.g., it is not being open using afterClose callback)�
1860			//if (this.overlay && !F.isActive) {�
1861			if (this.overlay && !F.coming) {�
1862				this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this ));�
1863			}�
1864		}�
1865	};�
1866�
1867	/*�
1868	 *	Title helper�
1869	 */�
1870�
1871	F.helpers.title = {�
1872		defaults : {�
1873			type     : 'float', // 'float', 'inside', 'outside' or 'over',�
1874			position : 'bottom' // 'top' or 'bottom'�
1875		},�
1876�
1877		beforeShow: function (opts) {�
1878			var current = F.current,�
1879				text    = current.title,�
1880				type    = opts.type,�
1881				title,�
1882				target;�
1883�
1884			if ($.isFunction(text)) {�
1885				text = text.call(current.element, current);�
1886			}�
1887�
1888			if (!isString(text) || $.trim(text) === '') {�
1889				return;�
1890			}�
1891�
1892			title = $('<div class="fancybox-title fancybox-title-' + type + '-wrap">
vendor: 3,417 bytes, lines 1892-2020
1892' + text + '</div>');�
1893�
1894			switch (type) {�
1895				case 'inside':�
1896					target = F.skin;�
1897				break;�
1898�
1899				case 'outside':�
1900					target = F.wrap;�
1901				break;�
1902�
1903				case 'over':�
1904					target = F.inner;�
1905				break;�
1906�
1907				default: // 'float'�
1908					target = F.skin;�
1909�
1910					title.appendTo('body');�
1911�
1912					if (IE) {�
1913						title.width( title.width() );�
1914					}�
1915�
1916					title.wrapInner('<span class="child"></span>');�
1917�
1918					//Increase bottom margin so this title will also fit into viewport�
1919					F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) );�
1920				break;�
1921			}�
1922�
1923			title[ (opts.position === 'top' ? 'prependTo'  : 'appendTo') ](target);�
1924		}�
1925	};�
1926�
1927	// jQuery plugin initialization�
1928	$.fn.fancybox = function (options) {�
1929		var index,�
1930			that     = $(this),�
1931			selector = this.selector || '',�
1932			run      = function(e) {�
1933				var what = $(this).blur(), idx = index, relType, relVal;�
1934�
1935				if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) {�
1936					relType = options.groupAttr || 'data-fancybox-group';�
1937					relVal  = what.attr(relType);�
1938�
1939					if (!relVal) {�
1940						relType = 'rel';�
1941						relVal  = what.get(0)[ relType ];�
1942					}�
1943�
1944					if (relVal && relVal !== '' && relVal !== 'nofollow') {�
1945						what = selector.length ? $(selector) : that;�
1946						what = what.filter('[' + relType + '="' + relVal + '"]');�
1947						idx  = what.index(this);�
1948					}�
1949�
1950					options.index = idx;�
1951�
1952					// Stop an event from bubbling if everything is fine�
1953					if (F.open(what, options) !== false) {�
1954						e.preventDefault();�
1955					}�
1956				}�
1957			};�
1958�
1959		options = options || {};�
1960		index   = options.index || 0;�
1961�
1962		if (!selector || options.live === false) {�
1963			that.unbind('click.fb-start').bind('click.fb-start', run);�
1964�
1965		} else {�
1966			D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run);�
1967		}�
1968�
1969		this.filter('[data-fancybox-start=1]').trigger('click');�
1970�
1971		return this;�
1972	};�
1973�
1974	// Tests that need a body at doc ready�
1975	D.ready(function() {�
1976		var w1, w2;�
1977�
1978		if ( $.scrollbarWidth === undefined ) {�
1979			// http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth�
1980			$.scrollbarWidth = function() {�
1981				var parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body'),�
1982					child  = parent.children(),�
1983					width  = child.innerWidth() - child.height( 99 ).innerWidth();�
1984�
1985				parent.remove();�
1986�
1987				return width;�
1988			};�
1989		}�
1990�
1991		if ( $.support.fixedPosition === undefined ) {�
1992			$.support.fixedPosition = (function() {�
1993				var elem  = $('<div style="position:fixed;top:20px;"></div>').appendTo('body'),�
1994					fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 );�
1995�
1996				elem.remove();�
1997�
1998				return fixed;�
1999			}());�
2000		}�
2001�
2002		$.extend(F.defaults, {�
2003			scrollbarWidth : $.scrollbarWidth(),�
2004			fixed  : $.support.fixedPosition,�
2005			parent : $('body')�
2006		});�
2007�
2008		//Get real width of page scroll-bar�
2009		w1 = $(window).width();�
2010�
2011		H.addClass('fancybox-lock-test');�
2012�
2013		w2 = $(window).width();�
2014�
2015		H.removeClass('fancybox-lock-test');�
2016�
2017		$("<style type='text/css'>.fancybox-margin{margin-right:" + (w2 - w1) + "px;}</style>").appendTo("head");�
2018	});�
2019�
2020}(window, document, jQuery));

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.