PageSourceSearch

https://galactosemiamidwest.com/wp-content/themes/tgcustom/assets/js/jquery.prettyPhoto.js

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