PageSourceSearch

https://technoframes.com/wp-content/plugins/responsive-lightbox/as…/js/jquery.prettyPhoto.js?ver=1.6.9

js technoframes.com collected 2026-09-27 01:00:19 UTC 37,858 bytes, 982 lines download raw bytes

1/* ------------------------------------------------------------------------
2	Class: prettyPhoto
3	Use: Lightbox clone for jQuery
4	Author: Stephane Caron (http://www.no-margin-for-errors.com)
5	Version: 3.1.6
6------------------------------------------------------------------------- */
7(function($) {
8	$.prettyPhoto = {version: '3.1.6'};
9	
10	$.fn.prettyPhoto = function(pp_settings) {
11		pp_settings = jQuery.extend({
12			hook: 'rel', /* the attribute tag to use for prettyPhoto hooks. default: 'rel'. For HTML5, use "data-rel" or similar. */
13			animation_speed: 'fast', /* fast/slow/normal */
14			ajaxcallback: function() {},
15			slideshow: 5000, /* false OR interval time in ms */
16			autoplay_slideshow: false, /* true/false */
17			opacity: 0.80, /* Value between 0 and 1 */
18			show_title: true, /* true/false */
19			allow_resize: true, /* Resize the photos bigger than viewport. true/false */
20			allow_expand: true, /* Allow the user to expand a resized image. true/false */
21			default_width: 500,
22			default_height: 344,
23			counter_separator_label: '/', /* The separator for the gallery counter 1 "of" 2 */
24			theme: 'pp_default', /* light_rounded / dark_rounded / light_square / dark_square / facebook */
25			horizontal_padding: 20, /* The padding on each side of the picture */
26			hideflash: false, /* Hides all the flash object on a page, set to TRUE if flash appears over prettyPhoto */
27			wmode: 'opaque', /* Set the flash wmode attribute */
28			autoplay: true, /* Automatically start videos: True/False */
29			modal: false, /* If set to true, only the close button will close the window */
30			deeplinking: true, /* Allow prettyPhoto to update the url to enable deeplinking. */
31			overlay_gallery: true, /* If set to true, a gallery will overlay the fullscreen image on mouse over */
32			overlay_gallery_max: 30, /* Maximum number of pictures in the overlay gallery */
33			keyboard_shortcuts: true, /* Set to false if you open forms inside prettyPhoto */
34			changepicturecallback: function(){}, /* Called everytime an item is shown/changed */
35			callback: function(){}, /* Called when prettyPhoto is closed */
36			ie6_fallback: true,
37			markup: '<div class="pp_pic_holder"> \
38						<div class="ppt">&nbsp;</div> \
39						<div class="pp_top"> \
40							<div class="pp_left"></div> \
41							<div class="pp_middle"></div> \
42							<div class="pp_right"></div> \
43						</div> \
44						<div class="pp_content_container"> \
45							<div class="pp_left"> \
46							<div class="pp_right"> \
47								<div class="pp_content"> \
48									<div class="pp_loaderIcon"></div> \
49									<div class="pp_fade"> \
50										<a href="#" class="pp_expand" title="Expand the image">Expand</a> \
51										<div class="pp_hoverContainer"> \
52											<a class="pp_next" href="#">next</a> \
53											<a class="pp_previous" href="#">previous</a> \
54										</div> \
55										<div id="pp_full_res"></div> \
56										<div class="pp_details"> \
57											<div class="pp_nav"> \
58												<a href="#" class="pp_arrow_previous">Previous</a> \
59												<p class="currentTextHolder">0/0</p> \
60												<a href="#" class="pp_arrow_next">Next</a> \
61											</div> \
62											<p class="pp_description"></p> \
63											<div class="pp_social">{pp_social}</div> \
64											<a class="pp_close" href="#">Close</a> \
65										</div> \
66									</div> \
67								</div> \
68							</div> \
69							</div> \
70						</div> \
71						<div class="pp_bottom"> \
72							<div class="pp_left"></div> \
73							<div class="pp_middle"></div> \
74							<div class="pp_right"></div> \
75						</div> \
76					</div> \
77					<div class="pp_overlay"></div>',
78			gallery_markup: '<div class="pp_gallery"> \
79								<a href="#" class="pp_arrow_previous">Previous</a> \
80								<div> \
81									<ul> \
82										{gallery} \
83									</ul> \
84								</div> \
85								<a href="#" class="pp_arrow_next">Next</a> \
86							</div>',
87			image_markup: '<img id="fullResImage" src="{path}" />',
88			flash_markup: '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{width}" height="{height}"><param name="wmode" value="{wmode}" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{path}" /><embed src="{path}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="{width}" height="{height}" wmode="{wmode}"></embed></object>',
89			quicktime_markup: '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="//www.apple.com/qtactivex/qtplugin.cab" height="{height}" width="{width}"><param name="src" value="{path}"><param name="autoplay" value="{autoplay}"><param name="type" value="video/quicktime"><embed src="{path}" height="{height}" width="{width}" autoplay="{autoplay}" type="video/quicktime" pluginspage="//www.apple.com/quicktime/download/"></embed></object>',
90			iframe_markup: '<iframe src ="{path}" width="{width}" height="{height}" frameborder="no"></iframe>',
91			inline_markup: '<div class="pp_inline">{content}</div>',
92			custom_markup: '',
93			social_tools: '<div class="twitter"><a href="//twitter.com/share" class="twitter-share-button" data-count="none">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="facebook"><iframe src="//www.facebook.com/plugins/like.php?locale=en_US&href={location_href}&amp;layout=button_count&amp;show_faces=true&amp;width=500&amp;action=like&amp;font&amp;colorscheme=light&amp;height=23" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:23px;" allowTransparency="true"></iframe></div>' /* html or false to disable */
94		}, pp_settings);
95
96		var isMobile = {
97			Android: function() {
98				return navigator.userAgent.match( /Android/i );
99			},
100			BlackBerry: function() {
101				return navigator.userAgent.match( /BlackBerry/i );
102			},
103			iOS: function() {
104				return navigator.userAgent.match( /iPhone|iPad|iPod/i );
105			},
106			Opera: function() {
107				return navigator.userAgent.match( /Opera Mini/i );
108			},
109			Windows: function() {
110				return navigator.userAgent.match( /IEMobile/i );
111			},
112			any: function() {
113				return ( isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows() );
114			}
115		};
116
117		function fitToMobileViewport( newWindowWidth, newWindowHeight, imgWidth, imgHeight ) {
118			var newHeight = 0,
119				newWidth = 0;
120
121			if ( imgWidth > imgHeight ) {
122				newWidth = newWindowWidth;
123				newHeight = Math.round( imgHeight * newWindowWidth / imgWidth );
124			} else {
125				newWidth = Math.round( imgWidth * newWindowHeight / imgHeight );
126				newHeight = newWindowHeight;
127			}
128
129			return _fitToViewport( newWidth, newHeight );
130		}
131
132		// Global variables accessible only by prettyPhoto
133		var matchedObjects = this, percentBased = false, pp_dimensions, pp_open,
134		
135		// prettyPhoto container specific
136		pp_contentHeight, pp_contentWidth, pp_containerHeight, pp_containerWidth,
137		
138		// Window size
139		windowHeight = $(window).height(), windowWidth = $(window).width(),
140
141		// Global elements
142		pp_slideshow;
143		
144		doresize = true, scroll_pos = _get_scroll();
145	
146		// Window/Keyboard events
147		$(window).unbind('resize.prettyphoto').bind('resize.prettyphoto',function(){ _center_overlay(); _resize_overlay(); });
148		
149		if(pp_settings.keyboard_shortcuts) {
150			$(document).unbind('keydown.prettyphoto').bind('keydown.prettyphoto',function(e){
151				if(typeof $pp_pic_holder != 'undefined'){
152					if($pp_pic_holder.is(':visible')){
153						switch(e.keyCode){
154							case 37:
155								$.prettyPhoto.changePage('previous');
156								e.preventDefault();
157								break;
158							case 39:
159								$.prettyPhoto.changePage('next');
160								e.preventDefault();
161								break;
162							case 27:
163								if(!settings.modal)
164								$.prettyPhoto.close();
165								e.preventDefault();
166								break;
167						};
168						// return false;
169					};
170				};
171			});
172		};
173		
174		/**
175		* Initialize prettyPhoto.
176		*/
177		$.prettyPhoto.initialize = function() {
178			
179			settings = pp_settings;
180			
181			if(settings.theme == 'pp_default') settings.horizontal_padding = 16;
182			
183			// Find out if the picture is part of a set
184			theRel = $(this).attr(settings.hook);
185			galleryRegExp = /\-(?:.*)/;
186			isSet = (galleryRegExp.exec(theRel)) ? true : false;
187			
188			// Put the SRCs, TITLEs, ALTs into an array.
189			pp_images = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return $(n).attr('href'); }) : $.makeArray($(this).attr('href'));
190			pp_titles = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return ($(n).find('img').attr('alt')) ? $(n).find('img').attr('alt') : ""; }) : $.makeArray($(this).find('img').attr('alt'));
191			pp_descriptions = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return ($(n).attr('title')) ? $(n).attr('title') : ""; }) : $.makeArray($(this).attr('title'));
192			
193			if(pp_images.length > settings.overlay_gallery_max) settings.overlay_gallery = false;
194			
195			set_position = jQuery.inArray($(this).attr('href'), pp_images); // Define where in the array the clicked item is positionned
196			rel_index = (isSet) ? set_position : $("a["+settings.hook+"^='"+theRel+"']").index($(this));
197			
198			_build_overlay(this); // Build the overlay {this} being the caller
199			
200			if(settings.allow_resize)
201				$(window).bind('scroll.prettyphoto',function(){ _center_overlay(); });
202			
203			
204			$.prettyPhoto.open();
205			
206			return false;
207		}
208
209
210		/**
211		* Opens the prettyPhoto modal box.
212		* @param image {String,Array} Full path to the image to be open, can also be an array containing full images paths.
213		* @param title {String,Array} The title to be displayed with the picture, can also be an array containing all the titles.
214		* @param description {String,Array} The description to be displayed with the picture, can also be an array containing all the descriptions.
215		*/
216		$.prettyPhoto.open = function(event) {
217			if(typeof settings == "undefined"){ // Means it's an API call, need to manually get the settings and set the variables
218				settings = pp_settings;
219				pp_images = $.makeArray(arguments[0]);
220				pp_titles = (arguments[1]) ? $.makeArray(arguments[1]) : $.makeArray("");
221				pp_descriptions = (arguments[2]) ? $.makeArray(arguments[2]) : $.makeArray("");
222				isSet = (pp_images.length > 1) ? true : false;
223				set_position = (arguments[3])? arguments[3]: 0;
224				_build_overlay(event.target); // Build the overlay {this} being the caller
225			}
226			
227			if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','hidden'); // Hide the flash
228
229			_checkPosition($(pp_images).size()); // Hide the next/previous links if on first or last images.
230		
231			$('.pp_loaderIcon').show();
232		
233			if(settings.deeplinking)
234				setHashtag();
235		
236			// Rebuild Facebook Like Button with updated href
237			if(settings.social_tools){
238				facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); 
239				$pp_pic_holder.find('.pp_social').html(facebook_like_link);
240			}
241			
242			// Fade the content in
243			if($ppt.is(':hidden')) $ppt.css('opacity',0).show();
244			$pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);
245
246			// Display the current position
247			$pp_pic_holder.find('.currentTextHolder').text((set_position+1) + settings.counter_separator_label + $(pp_images).size());
248
249			// Set the description
250			if(typeof pp_descriptions[set_position] != 'undefined' && pp_descriptions[set_position] != ""){
251				$pp_pic_holder.find('.pp_description').show().html(unescape(pp_descriptions[set_position]));
252			}else{
253				$pp_pic_holder.find('.pp_description').hide();
254			}
255			
256			// Get the dimensions
257			movie_width = ( parseFloat(getParam('width',pp_images[set_position])) ) ? getParam('width',pp_images[set_position]) : settings.default_width.toString();
258			movie_height = ( parseFloat(getParam('height',pp_images[set_position])) ) ? getParam('height',pp_images[set_position]) : settings.default_height.toString();
259			
260			// If the size is % based, calculate according to window dimensions
261			percentBased=false;
262			if(movie_height.indexOf('%') != -1) { movie_height = parseFloat(($(window).height() * parseFloat(movie_height) / 100) - 150); percentBased = true; }
263			if(movie_width.indexOf('%') != -1) { movie_width = parseFloat(($(window).width() * parseFloat(movie_width) / 100) - 150); percentBased = true; }
264			
265			// Fade the holder
266			$pp_pic_holder.fadeIn(function(){
267				// Set the title
268				(settings.show_title && pp_titles[set_position] != "" && typeof pp_titles[set_position] != "undefined") ? $ppt.html(unescape(pp_titles[set_position])) : $ppt.html('&nbsp;');
269				
270				imgPreloader = "";
271				skipInjection = false;
272				
273				// Inject the proper content
274				switch(_getFileType(pp_images[set_position])){
275					case 'image':
276						imgPreloader = new Image();
277
278						// Preload the neighbour images
279						nextImage = new Image();
280						if(isSet && set_position < $(pp_images).size() -1) nextImage.src = pp_images[set_position + 1];
281						prevImage = new Image();
282						if(isSet && pp_images[set_position - 1]) prevImage.src = pp_images[set_position - 1];
283
284						$pp_pic_holder.find('#pp_full_res')[0].innerHTML = settings.image_markup.replace(/{path}/g,pp_images[set_position]);
285
286						imgPreloader.onload = function() {
287							// Fit item to viewport
288							if ( isMobile.any() )
289								pp_dimensions = fitToMobileViewport( Math.round( windowWidth * 0.9 ), Math.round( windowHeight * 0.9 ), imgPreloader.width, imgPreloader.height );
290							else
291								pp_dimensions = _fitToViewport(imgPreloader.width,imgPreloader.height);
292
293							_showContent();
294						};
295
296						imgPreloader.onerror = function(){
297							alert('Image cannot be loaded. Make sure the path is correct and image exist.');
298							$.prettyPhoto.close();
299						};
300					
301						imgPreloader.src = pp_images[set_position];
302					break;
303				
304					case 'youtube':
305						// Fit item to viewport
306						if ( isMobile.any() )
307							pp_dimensions = fitToMobileViewport( Math.round( windowWidth * 0.9 ), Math.round( windowHeight * 0.9 ), movie_width, movie_height );
308						else
309							pp_dimensions = _fitToViewport( movie_width, movie_height );
310
311						// Regular youtube link
312						movie_id = getParam('v',pp_images[set_position]);
313						
314						// youtu.be link
315						if(movie_id == ""){
316							movie_id = pp_images[set_position].split('youtu.be/');
317							movie_id = movie_id[1];
318							if(movie_id.indexOf('?') > 0)
319								movie_id = movie_id.substr(0,movie_id.indexOf('?')); // Strip anything after the ?
320
321							if(movie_id.indexOf('&') > 0)
322								movie_id = movie_id.substr(0,movie_id.indexOf('&')); // Strip anything after the &
323						}
324
325						movie = '//www.youtube.com/embed/'+movie_id;
326						(getParam('rel',pp_images[set_position])) ? movie+="?rel="+getParam('rel',pp_images[set_position]) : movie+="?rel=1";
327							
328						if(settings.autoplay) movie += "&autoplay=1";
329					
330						toInject = settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);
331					break;
332				
333					case 'vimeo':
334						// Fit item to viewport
335						if ( isMobile.any() )
336							pp_dimensions = fitToMobileViewport( Math.round( windowWidth * 0.9 ), Math.round( windowHeight * 0.9 ), movie_width, movie_height );
337						else
338							pp_dimensions = _fitToViewport( movie_width, movie_height );
339
340						movie_id = pp_images[set_position];
341						var regExp = /http(s?):\/\/(www\.)?vimeo.com\/(\d+)/;
342						var match = movie_id.match(regExp);
343						
344						movie = '//player.vimeo.com/video/'+ match[3] +'?title=0&amp;byline=0&amp;portrait=0';
345						if(settings.autoplay) movie += "&autoplay=1;";
346				
347						vimeo_width = pp_dimensions['width'] + '/embed/?moog_width='+ pp_dimensions['width'];
348				
349						toInject = settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,movie);
350					break;
351				
352					case 'quicktime':
353						pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
354						pp_dimensions['height']+=15; pp_dimensions['contentHeight']+=15; pp_dimensions['containerHeight']+=15; // Add space for the control bar
355				
356						toInject = settings.quicktime_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);
357					break;
358				
359					case 'flash':
360						// Fit item to viewport
361						if ( isMobile.any() )
362							pp_dimensions = fitToMobileViewport( Math.round( windowWidth * 0.9 ), Math.round( windowHeight * 0.9 ), movie_width, movie_height );
363						else
364							pp_dimensions = _fitToViewport( movie_width, movie_height );
365
366						flash_vars = pp_images[set_position];
367						flash_vars = flash_vars.substring(pp_images[set_position].indexOf('flashvars') + 10,pp_images[set_position].length);
368
369						filename = pp_images[set_position];
370						filename = filename.substring(0,filename.indexOf('?'));
371
372						toInject =  settings.flash_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+'?'+flash_vars);
373					break;
374				
375					case 'iframe':
376						// Fit item to viewport
377						if ( isMobile.any() )
378							pp_dimensions = fitToMobileViewport( Math.round( windowWidth * 0.9 ), Math.round( windowHeight * 0.9 ), movie_width, movie_height );
379						else
380							pp_dimensions = _fitToViewport( movie_width, movie_height );
381
382						frame_url = pp_images[set_position];
383						frame_url = frame_url.substr(0,frame_url.indexOf('iframe')-1);
384
385						toInject = settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,frame_url);
386					break;
387					
388					case 'ajax':
389						doresize = false; // Make sure the dimensions are not resized.
390
391						// Fit item to viewport
392						if ( isMobile.any() )
393							pp_dimensions = fitToMobileViewport( Math.round( windowWidth * 0.9 ), Math.round( windowHeight * 0.9 ), movie_width, movie_height );
394						else
395							pp_dimensions = _fitToViewport( movie_width, movie_height );
396
397						doresize = true; // Reset the dimensions
398					
399						skipInjection = true;
400						$.get(pp_images[set_position],function(responseHTML){
401							toInject = settings.inline_markup.replace(/{content}/g,responseHTML);
402							$pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject;
403							_showContent();
404						});
405						
406					break;
407					
408					case 'custom':
409						// Fit item to viewport
410						if ( isMobile.any() )
411							pp_dimensions = fitToMobileViewport( Math.round( windowWidth * 0.9 ), Math.round( windowHeight * 0.9 ), movie_width, movie_height );
412						else
413							pp_dimensions = _fitToViewport( movie_width, movie_height );
414
415						toInject = settings.custom_markup;
416					break;
417				
418					case 'inline':
419						// to get the item height clone it, apply default width, wrap it in the prettyPhoto containers , then delete
420						myClone = $(pp_images[set_position]).clone().append('<br clear="all" />').css({'width':settings.default_width}).wrapInner('<div id="pp_full_res"><div class="pp_inline"></div></div>').appendTo($('body')).show();
421						doresize = false; // Make sure the dimensions are not resized.
422
423						// Fit item to viewport
424						if ( isMobile.any() )
425							pp_dimensions = fitToMobileViewport( Math.round( windowWidth * 0.9 ), Math.round( windowHeight * 0.9 ), $(myClone).width(), $(myClone).height() );
426						else
427							pp_dimensions = _fitToViewport( $(myClone).width(), $(myClone).height() );
428
429						doresize = true; // Reset the dimensions
430						$(myClone).remove();
431						toInject = settings.inline_markup.replace(/{content}/g,$(pp_images[set_position]).html());
432					break;
433				};
434
435				if(!imgPreloader && !skipInjection){
436					$pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject;
437				
438					// Show content
439					_showContent();
440				};
441			});
442
443			return false;
444		};
445
446	
447		/**
448		* Change page in the prettyPhoto modal box
449		* @param direction {String} Direction of the paging, previous or next.
450		*/
451		$.prettyPhoto.changePage = function(direction){
452			currentGalleryPage = 0;
453			
454			if(direction == 'previous') {
455				set_position--;
456				if (set_position < 0) set_position = $(pp_images).size()-1;
457			}else if(direction == 'next'){
458				set_position++;
459				if(set_position > $(pp_images).size()-1) set_position = 0;
460			}else{
461				set_position=direction;
462			};
463			
464			rel_index = set_position;
465
466			if(!doresize) doresize = true; // Allow the resizing of the images
467			if(settings.allow_expand) {
468				$('.pp_contract').removeClass('pp_contract').addClass('pp_expand');
469			}
470
471			_hideContent(function(){ $.prettyPhoto.open(); });
472		};
473
474
475		/**
476		* Change gallery page in the prettyPhoto modal box
477		* @param direction {String} Direction of the paging, previous or next.
478		*/
479		$.prettyPhoto.changeGalleryPage = function(direction){
480			if(direction=='next'){
481				currentGalleryPage ++;
482
483				if(currentGalleryPage > totalPage) currentGalleryPage = 0;
484			}else if(direction=='previous'){
485				currentGalleryPage --;
486
487				if(currentGalleryPage < 0) currentGalleryPage = totalPage;
488			}else{
489				currentGalleryPage = direction;
490			};
491			
492			slide_speed = (direction == 'next' || direction == 'previous') ? settings.animation_speed : 0;
493
494			slide_to = currentGalleryPage * (itemsPerPage * itemWidth);
495
496			$pp_gallery.find('ul').animate({left:-slide_to},slide_speed);
497		};
498
499
500		/**
501		* Start the slideshow...
502		*/
503		$.prettyPhoto.startSlideshow = function(){
504			if(typeof pp_slideshow == 'undefined'){
505				$pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function(){
506					$.prettyPhoto.stopSlideshow();
507					return false;
508				});
509				pp_slideshow = setInterval($.prettyPhoto.startSlideshow,settings.slideshow);
510			}else{
511				$.prettyPhoto.changePage('next');	
512			};
513		}
514
515
516		/**
517		* Stop the slideshow...
518		*/
519		$.prettyPhoto.stopSlideshow = function(){
520			$pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function(){
521				$.prettyPhoto.startSlideshow();
522				return false;
523			});
524			clearInterval(pp_slideshow);
525			pp_slideshow=undefined;
526		}
527
528
529		/**
530		* Closes prettyPhoto.
531		*/
532		$.prettyPhoto.close = function(){
533			if($pp_overlay.is(":animated")) return;
534			
535			$.prettyPhoto.stopSlideshow();
536			
537			$pp_pic_holder.stop().find('object,embed').css('visibility','hidden');
538			
539			$('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed,function(){ $(this).remove(); });
540			
541			$pp_overlay.fadeOut(settings.animation_speed, function(){
542				
543				if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','visible'); // Show the flash
544				
545				$(this).remove(); // No more need for the prettyPhoto markup
546				
547				$(window).unbind('scroll.prettyphoto');
548				
549				clearHashtag();
550				
551				settings.callback();
552				
553				doresize = true;
554				
555				pp_open = false;
556				
557				delete settings;
558			});
559		};
560	
561		/**
562		* Set the proper sizes on the containers and animate the content in.
563		*/
564		function _showContent(){
565			$('.pp_loaderIcon').hide();
566
567			// Calculate the opened top position of the pic holder
568			projectedTop = scroll_pos['scrollTop'] + ((windowHeight/2) - (pp_dimensions['containerHeight']/2));
569			if(projectedTop < 0) projectedTop = 0;
570
571			$ppt.fadeTo(settings.animation_speed,1);
572
573			// Resize the content holder
574			$pp_pic_holder.find('.pp_content')
575				.animate({
576					height:pp_dimensions['contentHeight'],
577					width:pp_dimensions['contentWidth']
578				},settings.animation_speed);
579			
580			// Resize picture the holder
581			$pp_pic_holder.animate({
582				'top': projectedTop,
583				'left': ((windowWidth/2) - (pp_dimensions['containerWidth']/2) < 0) ? 0 : (windowWidth/2) - (pp_dimensions['containerWidth']/2),
584				width:pp_dimensions['containerWidth']
585			},settings.animation_speed,function(){
586				$pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']);
587
588				$pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed); // Fade the new content
589
590				// Show the nav
591				if(isSet && _getFileType(pp_images[set_position])=="image") { $pp_pic_holder.find('.pp_hoverContainer').show(); }else{ $pp_pic_holder.find('.pp_hoverContainer').hide(); }
592			
593				if(settings.allow_expand) {
594					if(pp_dimensions['resized']){ // Fade the resizing link if the image is resized
595						$('a.pp_expand,a.pp_contract').show();
596					}else{
597						$('a.pp_expand').hide();
598					}
599				}
600				
601				if(settings.autoplay_slideshow && !pp_slideshow && !pp_open) $.prettyPhoto.startSlideshow();
602				
603				settings.changepicturecallback(); // Callback!
604				
605				pp_open = true;
606			});
607			
608			_insert_gallery();
609			pp_settings.ajaxcallback();
610		};
611		
612		/**
613		* Hide the content...DUH!
614		*/
615		function _hideContent(callback){
616			// Fade out the current picture
617			$pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden');
618			$pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed,function(){
619				$('.pp_loaderIcon').show();
620				
621				callback();
622			});
623		};
624	
625		/**
626		* Check the item position in the gallery array, hide or show the navigation links
627		* @param setCount {integer} The total number of items in the set
628		*/
629		function _checkPosition(setCount){
630			(setCount > 1) ? $('.pp_nav').show() : $('.pp_nav').hide(); // Hide the bottom nav if it's not a set.
631		};
632	
633		/**
634		* Resize the item dimensions if it's bigger than the viewport
635		* @param width {integer} Width of the item to be opened
636		* @param height {integer} Height of the item to be opened
637		* @return An array containin the "fitted" dimensions
638		*/
639		function _fitToViewport(width,height){
640			resized = false;
641
642			_getDimensions(width,height);
643			
644			// Define them in case there's no resize needed
645			imageWidth = width, imageHeight = height;
646
647			if( ((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)) && doresize && settings.allow_resize && !percentBased) {
648				resized = true, fitting = false;
649			
650				while (!fitting){
651					if((pp_containerWidth > windowWidth)){
652						imageWidth = (windowWidth - 200);
653						imageHeight = (height/width) * imageWidth;
654					}else if((pp_containerHeight > windowHeight)){
655						imageHeight = (windowHeight - 200);
656						imageWidth = (width/height) * imageHeight;
657					}else{
658						fitting = true;
659					};
660
661					pp_containerHeight = imageHeight, pp_containerWidth = imageWidth;
662				};
663			
664
665				
666				if((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)){
667					_fitToViewport(pp_containerWidth,pp_containerHeight)
668				};
669				
670				_getDimensions(imageWidth,imageHeight);
671			};
672			
673			return {
674				width:Math.floor(imageWidth),
675				height:Math.floor(imageHeight),
676				containerHeight:Math.floor(pp_containerHeight),
677				containerWidth:Math.floor(pp_containerWidth) + (settings.horizontal_padding * 2),
678				contentHeight:Math.floor(pp_contentHeight),
679				contentWidth:Math.floor(pp_contentWidth),
680				resized:resized
681			};
682		};
683		
684		/**
685		* Get the containers dimensions according to the item size
686		* @param width {integer} Width of the item to be opened
687		* @param height {integer} Height of the item to be opened
688		*/
689		function _getDimensions(width,height){
690			width = parseFloat(width);
691			height = parseFloat(height);
692			
693			// Get the details height, to do so, I need to clone it since it's invisible
694			$pp_details = $pp_pic_holder.find('.pp_details');
695			$pp_details.width(width);
696			detailsHeight = parseFloat($pp_details.css('marginTop')) + parseFloat($pp_details.css('marginBottom'));
697			
698			$pp_details = $pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({
699				'position':'absolute',
700				'top':-10000
701			});
702			detailsHeight += $pp_details.height();
703			detailsHeight = (detailsHeight <= 34) ? 36 : detailsHeight; // Min-height for the details
704			$pp_details.remove();
705			
706			// Get the titles height, to do so, I need to clone it since it's invisible
707			$pp_title = $pp_pic_holder.find('.ppt');
708			$pp_title.width(width);
709			titleHeight = parseFloat($pp_title.css('marginTop')) + parseFloat($pp_title.css('marginBottom'));
710			$pp_title = $pp_title.clone().appendTo($('body')).css({
711				'position':'absolute',
712				'top':-10000
713			});
714			titleHeight += $pp_title.height();
715			$pp_title.remove();
716			
717			// Get the container size, to resize the holder to the right dimensions
718			pp_contentHeight = height + detailsHeight;
719			pp_contentWidth = width;
720			pp_containerHeight = pp_contentHeight + titleHeight + $pp_pic_holder.find('.pp_top').height() + $pp_pic_holder.find('.pp_bottom').height();
721			pp_containerWidth = width;
722		}
723	
724		function _getFileType(itemSrc){
725			if (itemSrc.match(/youtube\.com\/watch/i) || itemSrc.match(/youtu\.be/i)) {
726				return 'youtube';
727			}else if (itemSrc.match(/vimeo\.com/i)) {
728				return 'vimeo';
729			}else if(itemSrc.match(/\b.mov\b/i)){ 
730				return 'quicktime';
731			}else if(itemSrc.match(/\b.swf\b/i)){
732				return 'flash';
733			}else if(itemSrc.match(/\biframe=true\b/i)){
734				return 'iframe';
735			}else if(itemSrc.match(/\bajax=true\b/i)){
736				return 'ajax';
737			}else if(itemSrc.match(/\bcustom=true\b/i)){
738				return 'custom';
739			}else if(itemSrc.substr(0,1) == '#'){
740				return 'inline';
741			}else{
742				return 'image';
743			};
744		};
745	
746		function _center_overlay(){
747			if(doresize && typeof $pp_pic_holder != 'undefined') {
748				scroll_pos = _get_scroll();
749				contentHeight = $pp_pic_holder.height(), contentwidth = $pp_pic_holder.width();
750
751				projectedTop = (windowHeight/2) + scroll_pos['scrollTop'] - (contentHeight/2);
752				if(projectedTop < 0) projectedTop = 0;
753				
754				if(contentHeight > windowHeight)
755					return;
756
757				$pp_pic_holder.css({
758					'top': projectedTop,
759					'left': (windowWidth/2) + scroll_pos['scrollLeft'] - (contentwidth/2)
760				});
761			};
762		};
763	
764		function _get_scroll(){
765			if (self.pageYOffset) {
766				return {scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset};
767			} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
768				return {scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft};
769			} else if (document.body) {// all other Explorers
770				return {scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft};
771			};
772		};
773	
774		function _resize_overlay() {
775			windowHeight = $(window).height(), windowWidth = $(window).width();
776			
777			if(typeof $pp_overlay != "undefined") $pp_overlay.height($(document).height()).width(windowWidth);
778		};
779	
780		function _insert_gallery(){
781			if(isSet && settings.overlay_gallery && _getFileType(pp_images[set_position])=="image") {
782				itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin.
783				navWidth = (settings.theme == "facebook" || settings.theme == "pp_default") ? 50 : 30; // Define the arrow width depending on the theme
784				
785				itemsPerPage = Math.floor((pp_dimensions['containerWidth'] - 100 - navWidth) / itemWidth);
786				itemsPerPage = (itemsPerPage < pp_images.length) ? itemsPerPage : pp_images.length;
787				totalPage = Math.ceil(pp_images.length / itemsPerPage) - 1;
788
789				// Hide the nav in the case there's no need for links
790				if(totalPage == 0){
791					navWidth = 0; // No nav means no width!
792					$pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').hide();
793				}else{
794					$pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').show();
795				};
796
797				galleryWidth = itemsPerPage * itemWidth;
798				fullGalleryWidth = pp_images.length * itemWidth;
799				
800				// Set the proper width to the gallery items
801				$pp_gallery
802					.css('margin-left',-((galleryWidth/2) + (navWidth/2)))
803					.find('div:first').width(galleryWidth+5)
804					.find('ul').width(fullGalleryWidth)
805					.find('li.selected').removeClass('selected');
806				
807				goToPage = (Math.floor(set_position/itemsPerPage) < totalPage) ? Math.floor(set_position/itemsPerPage) : totalPage;
808
809				$.prettyPhoto.changeGalleryPage(goToPage);
810				
811				$pp_gallery_li.filter(':eq('+set_position+')').addClass('selected');
812			}else{
813				$pp_pic_holder.find('.pp_content').unbind('mouseenter mouseleave');
814				// $pp_gallery.hide();
815			}
816		}
817	
818		function _build_overlay(caller){
819			// Inject Social Tool markup into General markup
820			if(settings.social_tools)
821				facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); 
822
823			settings.markup = settings.markup.replace('{pp_social}',''); 
824			
825			$('body').append(settings.markup); // Inject the markup
826			
827			$pp_pic_holder = $('.pp_pic_holder') , $ppt = $('.ppt'), $pp_overlay 
827= $('div.pp_overlay'); // Set my global selectors
828			
829			// Inject the inline gallery!
830			if(isSet && settings.overlay_gallery) {
831				currentGalleryPage = 0;
832				toInject = "";
833				for (var i=0; i < pp_images.length; i++) {
834					if(!pp_images[i].match(/\b(jpg|jpeg|png|gif)\b/gi)){
835						classname = 'default';
836						img_src = '';
837					}else{
838						classname = '';
839						img_src = pp_images[i];
840					}
841					toInject += "<li class='"+classname+"'><a href='#'><img src='" + img_src + "' width='50' alt='' /></a></li>";
842				};
843				
844				toInject = settings.gallery_markup.replace(/{gallery}/g,toInject);
845				
846				$pp_pic_holder.find('#pp_full_res').after(toInject);
847				
848				$pp_gallery = $('.pp_pic_holder .pp_gallery'), $pp_gallery_li = $pp_gallery.find('li'); // Set the gallery selectors
849				
850				$pp_gallery.find('.pp_arrow_next').click(function(){
851					$.prettyPhoto.changeGalleryPage('next');
852					$.prettyPhoto.stopSlideshow();
853					return false;
854				});
855				
856				$pp_gallery.find('.pp_arrow_previous').click(function(){
857					$.prettyPhoto.changeGalleryPage('previous');
858					$.prettyPhoto.stopSlideshow();
859					return false;
860				});
861				
862				$pp_pic_holder.find('.pp_content').hover(
863					function(){
864						$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn();
865					},
866					function(){
867						$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut();
868					});
869
870				itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin.
871				$pp_gallery_li.each(function(i){
872					$(this)
873						.find('a')
874						.click(function(){
875							$.prettyPhoto.changePage(i);
876							$.prettyPhoto.stopSlideshow();
877							return false;
878						});
879				});
880			};
881			
882			
883			// Inject the play/pause if it's a slideshow
884			if(settings.slideshow){
885				$pp_pic_holder.find('.pp_nav').prepend('<a href="#" class="pp_play">Play</a>')
886				$pp_pic_holder.find('.pp_nav .pp_play').click(function(){
887					$.prettyPhoto.startSlideshow();
888					return false;
889				});
890			}
891			
892			$pp_pic_holder.attr('class','pp_pic_holder ' + settings.theme); // Set the proper theme
893			
894			$pp_overlay
895				.css({
896					'opacity':0,
897					'height':$(document).height(),
898					'width':$(window).width()
899					})
900				.bind('click',function(){
901					if(!settings.modal) $.prettyPhoto.close();
902				});
903
904			$('a.pp_close').bind('click',function(){ $.prettyPhoto.close(); return false; });
905
906
907			if(settings.allow_expand) {
908				$('a.pp_expand').bind('click',function(e){
909					// Expand the image
910					if($(this).hasClass('pp_expand')){
911						$(this).removeClass('pp_expand').addClass('pp_contract');
912						doresize = false;
913					}else{
914						$(this).removeClass('pp_contract').addClass('pp_expand');
915						doresize = true;
916					};
917				
918					_hideContent(function(){ $.prettyPhoto.open(); });
919			
920					return false;
921				});
922			}
923		
924			$pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click',function(){
925				$.prettyPhoto.changePage('previous');
926				$.prettyPhoto.stopSlideshow();
927				return false;
928			});
929		
930			$pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click',function(){
931				$.prettyPhoto.changePage('next');
932				$.prettyPhoto.stopSlideshow();
933				return false;
934			});
935			
936			_center_overlay(); // Center it
937		};
938
939		if(!pp_alreadyInitialized && getHashtag()){
940			pp_alreadyInitialized = true;
941			
942			// Grab the rel index to trigger the click on the correct element
943			hashIndex = getHashtag();
944			hashRel = hashIndex;
945			hashIndex = hashIndex.substring(hashIndex.indexOf('/')+1,hashIndex.length-1);
946			hashRel = hashRel.substring(0,hashRel.indexOf('/'));
947
948			// Little timeout to make sure all the prettyPhoto initialize scripts has been run.
949			// Useful in the event the page contain several init scripts.
950			setTimeout(function(){ $("a["+pp_settings.hook+"^='"+hashRel+"']:eq("+hashIndex+")").trigger('click'); },50);
951		}
952		
953		return this.unbind('click.prettyphoto').bind('click.prettyphoto',$.prettyPhoto.initialize); // Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once
954	};
955
956	function getHashtag(){
957		var url = location.href;
958		hashtag = (url.indexOf('#prettyPhoto') !== -1) ? decodeURI(url.substring(url.indexOf('#prettyPhoto')+1,url.length)) : false;
959		if(hashtag){  hashtag = hashtag.replace(/<|>/g,''); }
960		return hashtag;
961	};
962	
963	function setHashtag(){
964		if(typeof theRel == 'undefined') return; // theRel is set on normal calls, it's impossible to deeplink using the API
965		location.hash = theRel + '/'+rel_index+'/';
966	};
967	
968	function clearHashtag(){
969		if ( location.href.indexOf('#prettyPhoto') !== -1 ) location.hash = "prettyPhoto";
970	}
971	
972	function getParam(name,url){
973	  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
974	  var regexS = "[\\?&]"+name+"=([^&#]*)";
975	  var regex = new RegExp( regexS );
976	  var results = regex.exec( url );
977	  return ( results == null ) ? "" : results[1];
978	}
979	
980})(jQuery);
981
982var pp_alreadyInitialized = false; // Used for the deep linking to make sure not to call the same function several times.

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.