PageSourceSearch

https://www.kaisergruft.at/swstatic-260928031210/swscripts/jquery/plugins/prettyPhoto/jquery.prettyPhoto.js

js kaisergruft.at collected 2026-10-02 11:33:45 UTC 35,493 bytes, 920 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.5
6------------------------------------------------------------------------- */
7(function($) {
8	$.prettyPhoto = {version: '3.1.5'};
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="https://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="https://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="https://twitter.com/share" class="twitter-share-button" data-count="none">Tweet</a><script type="text/javascript" src="https://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			
147			// Find out if the picture is part of a set
148			theRel = $(this).attr(settings.hook);
149			galleryRegExp = /\[(?:.*)\]/;
150			isSet = (galleryRegExp.exec(theRel)) ? true : false;
151			
152			// Put the SRCs, TITLEs, ALTs into an array.
153			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'));
154			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'));
155			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'));
156			
157			if(pp_images.length > settings.overlay_gallery_max) settings.overlay_gallery = false;
158			
159			set_position = jQuery.inArray($(this).attr('href'), pp_images); // Define where in the array the clicked item is positionned
160			rel_index = (isSet) ? set_position : $("a["+settings.hook+"^='"+theRel+"']").index($(this));
161			
162			_build_overlay(this); // Build the overlay {this} being the caller
163			
164			if(settings.allow_resize)
165				$(window).bind('scroll.prettyphoto',function(){ _center_overlay(); });
166			
167			
168			$.prettyPhoto.open();
169			
170			return false;
171		}
172
173
174		/**
175		* Opens the prettyPhoto modal box.
176		* @param image {String,Array} Full path to the image to be open, can also be an array containing full images paths.
177		* @param title {String,Array} The title to be displayed with the picture, can also be an array containing all the titles.
178		* @param description {String,Array} The description to be displayed with the picture, can also be an array containing all the descriptions.
179		*/
180		$.prettyPhoto.open = function(event) {
181			if(typeof settings == "undefined"){ // Means it's an API call, need to manually get the settings and set the variables
182				settings = pp_settings;
183				pp_images = $.makeArray(arguments[0]);
184				pp_titles = (arguments[1]) ? $.makeArray(arguments[1]) : $.makeArray("");
185				pp_descriptions = (arguments[2]) ? $.makeArray(arguments[2]) : $.makeArray("");
186				isSet = (pp_images.length > 1) ? true : false;
187				set_position = (arguments[3])? arguments[3]: 0;
188				_build_overlay(event.target); // Build the overlay {this} being the caller
189			}
190
191			/*++++++ AZP CUSTOM ++++++*/
192			on_after_load_callback = arguments[4];
193			/*++++++ AZP CUSTOM END ++++++*/
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 = 'https://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(s?):\/\/(www\.)?vimeo.com\/(\d+)/;
299						var match = movie_id.match(regExp);
300						
301						movie = 'https://player.vimeo.com/video/'+ match[3] +'?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					/*++++++ AZP CUSTOM ++++++*/
372					if (on_after_load_callback)
373						on_after_load_callback();
374					/*++++++ AZP CUSTOM END ++++++*/
375
376					// Show content
377					_showContent();
378				};
379			});
380
381			return false;
382		};
383
384	
385		/**
386		* Change page in the prettyPhoto modal box
387		* @param direction {String} Direction of the paging, previous or next.
388		*/
389		$.prettyPhoto.changePage = function(direction){
390			currentGalleryPage = 0;
391			
392			if(direction == 'previous') {
393				set_position--;
394				if (set_position < 0) set_position = $(pp_images).size()-1;
395			}else if(direction == 'next'){
396				set_position++;
397				if(set_position > $(pp_images).size()-1) set_position = 0;
398			}else{
399				set_position=direction;
400			};
401			
402			rel_index = set_position;
403
404			if(!doresize) doresize = true; // Allow the resizing of the images
405			if(settings.allow_expand) {
406				$('.pp_contract').removeClass('pp_contract').addClass('pp_expand');
407			}
408
409			_hideContent(function(){ $.prettyPhoto.open(); });
410		};
411
412
413		/**
414		* Change gallery page in the prettyPhoto modal box
415		* @param direction {String} Direction of the paging, previous or next.
416		*/
417		$.prettyPhoto.changeGalleryPage = function(direction){
418			if(direction=='next'){
419				currentGalleryPage ++;
420
421				if(currentGalleryPage > totalPage) currentGalleryPage = 0;
422			}else if(direction=='previous'){
423				currentGalleryPage --;
424
425				if(currentGalleryPage < 0) currentGalleryPage = totalPage;
426			}else{
427				currentGalleryPage = direction;
428			};
429			
430			slide_speed = (direction == 'next' || direction == 'previous') ? settings.animation_speed : 0;
431
432			slide_to = currentGalleryPage * (itemsPerPage * itemWidth);
433
434			$pp_gallery.find('ul').animate({left:-slide_to},slide_speed);
435		};
436
437
438		/**
439		* Start the slideshow...
440		*/
441		$.prettyPhoto.startSlideshow = function(){
442			if(typeof pp_slideshow == 'undefined'){
443				$pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function(){
444					$.prettyPhoto.stopSlideshow();
445					return false;
446				});
447				pp_slideshow = setInterval($.prettyPhoto.startSlideshow,settings.slideshow);
448			}else{
449				$.prettyPhoto.changePage('next');	
450			};
451		}
452
453
454		/**
455		* Stop the slideshow...
456		*/
457		$.prettyPhoto.stopSlideshow = function(){
458			$pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function(){
459				$.prettyPhoto.startSlideshow();
460				return false;
461			});
462			clearInterval(pp_slideshow);
463			pp_slideshow=undefined;
464		}
465
466
467		/**
468		* Closes prettyPhoto.
469		*/
470		$.prettyPhoto.close = function(){
471			if($pp_overlay.is(":animated")) return;
472			
473			$.prettyPhoto.stopSlideshow();
474			
475			$pp_pic_holder.stop().find('object,embed').css('visibility','hidden');
476			
477			$('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed,function(){ $(this).remove(); });
478			
479			$pp_overlay.fadeOut(settings.animation_speed, function(){
480				
481				if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','visible'); // Show the flash
482				
483				$(this).remove(); // No more need for the prettyPhoto markup
484				
485				$(window).unbind('scroll.prettyphoto');
486				
487				clearHashtag();
488				
489				settings.callback();
490				
491				doresize = true;
492				
493				pp_open = false;
494				
495				delete settings;
496			});
497		};
498	
499		/**
500		* Set the proper sizes on the containers and animate the content in.
501		*/
502		function _showContent(){
503			$('.pp_loaderIcon').hide();
504
505			// Calculate the opened top position of the pic holder
506			projectedTop = scroll_pos['scrollTop'] + ((windowHeight/2) - (pp_dimensions['containerHeight']/2));
507			if(projectedTop < 0) projectedTop = 0;
508
509			$ppt.fadeTo(settings.animation_speed,1);
510
511			// Resize the content holder
512			$pp_pic_holder.find('.pp_content')
513				.animate({
514					height:pp_dimensions['contentHeight'],
515					width:pp_dimensions['contentWidth']
516				},settings.animation_speed);
517			
518			// Resize picture the holder
519			$pp_pic_holder.animate({
520				'top': projectedTop,
521				'left': ((windowWidth/2) - (pp_dimensions['containerWidth']/2) < 0) ? 0 : (windowWidth/2) - (pp_dimensions['containerWidth']/2),
522				width:pp_dimensions['containerWidth']
523			},settings.animation_speed,function(){
524				$pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']);
525
526				$pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed); // Fade the new content
527
528				// Show the nav
529				if(isSet && _getFileType(pp_images[set_position])=="image") { $pp_pic_holder.find('.pp_hoverContainer').show(); }else{ $pp_pic_holder.find('.pp_hoverContainer').hide(); }
530			
531				if(settings.allow_expand) {
532					if(pp_dimensions['resized']){ // Fade the resizing link if the image is resized
533						$('a.pp_expand,a.pp_contract').show();
534					}else{
535						$('a.pp_expand').hide();
536					}
537				}
538				
539				if(settings.autoplay_slideshow && !pp_slideshow && !pp_open) $.prettyPhoto.startSlideshow();
540				
541				settings.changepicturecallback(); // Callback!
542				
543				pp_open = true;
544			});
545			
546			_insert_gallery();
547			pp_settings.ajaxcallback();
548		};
549		
550		/**
551		* Hide the content...DUH!
552		*/
553		function _hideContent(callback){
554			// Fade out the current picture
555			$pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden');
556			$pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed,function(){
557				$('.pp_loaderIcon').show();
558				
559				callback();
560			});
561		};
562	
563		/**
564		* Check the item position in the gallery array, hide or show the navigation links
565		* @param setCount {integer} The total number of items in the set
566		*/
567		function _checkPosition(setCount){
568			(setCount > 1) ? $('.pp_nav').show() : $('.pp_nav').hide(); // Hide the bottom nav if it's not a set.
569		};
570	
571		/**
572		* Resize the item dimensions if it's bigger than the viewport
573		* @param width {integer} Width of the item to be opened
574		* @param height {integer} Height of the item to be opened
575		* @return An array containin the "fitted" dimensions
576		*/
577		function _fitToViewport(width,height){
578			resized = false;
579
580			_getDimensions(width,height);
581			
582			// Define them in case there's no resize needed
583			imageWidth = width, imageHeight = height;
584
585			if( ((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)) && doresize && settings.allow_resize && !percentBased) {
586				resized = true, fitting = false;
587			
588				while (!fitting){
589					if((pp_containerWidth > windowWidth)){
590						imageWidth = (windowWidth - 200);
591						imageHeight = (height/width) * imageWidth;
592					}else if((pp_containerHeight > windowHeight)){
593						imageHeight = (windowHeight - 200);
594						imageWidth = (width/height) * imageHeight;
595					}else{
596						fitting = true;
597					};
598
599					pp_containerHeight = imageHeight, pp_containerWidth = imageWidth;
600				};
601			
602
603				
604				if((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)){
605					_fitToViewport(pp_containerWidth,pp_containerHeight)
606				};
607				
608				_getDimensions(imageWidth,imageHeight);
609			};
610			
611			return {
612				width:Math.floor(imageWidth),
613				height:Math.floor(imageHeight),
614				containerHeight:Math.floor(pp_containerHeight),
615				containerWidth:Math.floor(pp_containerWidth) + (settings.horizontal_padding * 2),
616				contentHeight:Math.floor(pp_contentHeight),
617				contentWidth:Math.floor(pp_contentWidth),
618				resized:resized
619			};
620		};
621		
622		/**
623		* Get the containers dimensions according to the item size
624		* @param width {integer} Width of the item to be opened
625		* @param height {integer} Height of the item to be opened
626		*/
627		function _getDimensions(width,height){
628			width = parseFloat(width);
629			height = parseFloat(height);
630			
631			// Get the details height, to do so, I need to clone it since it's invisible
632			$pp_details = $pp_pic_holder.find('.pp_details');
633			$pp_details.width(width);
634			detailsHeight = parseFloat($pp_details.css('marginTop')) + parseFloat($pp_details.css('marginBottom'));
635			
636			$pp_details = $pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({
637				'position':'absolute',
638				'top':-10000
639			});
640			detailsHeight += $pp_details.height();
641			detailsHeight = (detailsHeight <= 34) ? 36 : detailsHeight; // Min-height for the details
642			$pp_details.remove();
643			
644			// Get the titles height, to do so, I need to clone it since it's invisible
645			$pp_title = $pp_pic_holder.find('.ppt');
646			$pp_title.width(width);
647			titleHeight = parseFloat($pp_title.css('marginTop')) + parseFloat($pp_title.css('marginBottom'));
648			$pp_title = $pp_title.clone().appendTo($('body')).css({
649				'position':'absolute',
650				'top':-10000
651			});
652			titleHeight += $pp_title.height();
653			$pp_title.remove();
654			
655			// Get the container size, to resize the holder to the right dimensions
656			pp_contentHeight = height + detailsHeight;
657			pp_contentWidth = width;
658			pp_containerHeight = pp_contentHeight + titleHeight + $pp_pic_holder.find('.pp_top').height() + $pp_pic_holder.find('.pp_bottom').height();
659			pp_containerWidth = width;
660		}
661	
662		function _getFileType(itemSrc){
663			if (itemSrc.match(/youtube\.com\/watch/i) || itemSrc.match(/youtu\.be/i)) {
664				return 'youtube';
665			}else if (itemSrc.match(/vimeo\.com/i)) {
666				return 'vimeo';
667			}else if(itemSrc.match(/\b.mov\b/i)){ 
668				return 'quicktime';
669			}else if(itemSrc.match(/\b.swf\b/i)){
670				return 'flash';
671			}else if(itemSrc.match(/\biframe=true\b/i)){
672				return 'iframe';
673			}else if(itemSrc.match(/\bajax=true\b/i)){
674				return 'ajax';
675			}else if(itemSrc.match(/\bcustom=true\b/i)){
676				return 'custom';
677			}else if(itemSrc.substr(0,1) == '#'){
678				return 'inline';
679			}else{
680				return 'image';
681			};
682		};
683	
684		function _center_overlay(){
685			if(doresize && typeof $pp_pic_holder != 'undefined') {
686				scroll_pos = _get_scroll();
687				contentHeight = $pp_pic_holder.height(), contentwidth = $pp_pic_holder.width();
688
689				projectedTop = (windowHeight/2) + scroll_pos['scrollTop'] - (contentHeight/2);
690				if(projectedTop < 0) projectedTop = 0;
691				
692				if(contentHeight > windowHeight)
693					return;
694
695				$pp_pic_holder.css({
696					'top': projectedTop,
697					'left': (windowWidth/2) + scroll_pos['scrollLeft'] - (contentwidth/2)
698				});
699			};
700		};
701	
702		function _get_scroll(){
703			if (self.pageYOffset) {
704				return {scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset};
705			} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
706				return {scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft};
707			} else if (document.body) {// all other Explorers
708				return {scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft};
709			};
710		};
711	
712		function _resize_overlay() {
713			windowHeight = $(window).height(), windowWidth = $(window).width();
714			
715			if(typeof $pp_overlay != "undefined") $pp_overlay.height($(document).height()).width(windowWidth);
716		};
717	
718		function _insert_gallery(){
719			if(isSet && settings.overlay_gallery && _getFileType(pp_images[set_position])=="image") {
720				itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin.
721				navWidth = (settings.theme == "facebook" || settings.theme == "pp_default") ? 50 : 30; // Define the arrow width depending on the theme
722				
723				itemsPerPage = Math.floor((pp_dimensions['containerWidth'] - 100 - navWidth) / itemWidth);
724				itemsPerPage = (itemsPerPage < pp_images.length) ? itemsPerPage : pp_images.length;
725				totalPage = Math.ceil(pp_images.length / itemsPerPage) - 1;
726
727				// Hide the nav in the case there's no need for links
728				if(totalPage == 0){
729					navWidth = 0; // No nav means no width!
730					$pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').hide();
731				}else{
732					$pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').show();
733				};
734
735				galleryWidth = itemsPerPage * itemWidth;
736				fullGalleryWidth = pp_images.length * itemWidth;
737				
738				// Set the proper width to the gallery items
739				$pp_gallery
740					.css('margin-left',-((galleryWidth/2) + (navWidth/2)))
741					.find('div:first').width(galleryWidth+5)
742					.find('ul').width(fullGalleryWidth)
743					.find('li.selected').removeClass('selected');
744				
745				goToPage = (Math.floor(set_position/itemsPerPage) < totalPage) ? Math.floor(set_position/itemsPerPage) : totalPage;
746
747				$.prettyPhoto.changeGalleryPage(goToPage);
748				
749				$pp_gallery_li.filter(':eq('+set_position+')').addClass('selected');
750			}else{
751				$pp_pic_holder.find('.pp_content').unbind('mouseenter mouseleave');
752				// $pp_gallery.hide();
753			}
754		}
755	
756		function _build_overlay(caller){
757			// Inject Social Tool markup into General markup
758			if(settings.social_tools)
759				facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); 
760
761			settings.markup = settings.markup.replace('{pp_social}',''); 
762			
763			$('body').append(settings.markup); // Inject the markup
764			
765			$pp_pic_holder = $('.pp_pic_holder') , $ppt = $('.ppt'), $pp_overlay 
765= $('div.pp_overlay'); // Set my global selectors
766			
767			// Inject the inline gallery!
768			if(isSet && settings.overlay_gallery) {
769				currentGalleryPage = 0;
770				toInject = "";
771				for (var i=0; i < pp_images.length; i++) {
772					if(!pp_images[i].match(/\b(jpg|jpeg|png|gif)\b/gi)){
773						classname = 'default';
774						img_src = '';
775					}else{
776						classname = '';
777						img_src = pp_images[i];
778					}
779					toInject += "<li class='"+classname+"'><a href='#'><img src='" + img_src + "' width='50' alt='' /></a></li>";
780				};
781				
782				toInject = settings.gallery_markup.replace(/{gallery}/g,toInject);
783				
784				$pp_pic_holder.find('#pp_full_res').after(toInject);
785				
786				$pp_gallery = $('.pp_pic_holder .pp_gallery'), $pp_gallery_li = $pp_gallery.find('li'); // Set the gallery selectors
787				
788				$pp_gallery.find('.pp_arrow_next').click(function(){
789					$.prettyPhoto.changeGalleryPage('next');
790					$.prettyPhoto.stopSlideshow();
791					return false;
792				});
793				
794				$pp_gallery.find('.pp_arrow_previous').click(function(){
795					$.prettyPhoto.changeGalleryPage('previous');
796					$.prettyPhoto.stopSlideshow();
797					return false;
798				});
799				
800				$pp_pic_holder.find('.pp_content').hover(
801					function(){
802						$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn();
803					},
804					function(){
805						$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut();
806					});
807
808				itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin.
809				$pp_gallery_li.each(function(i){
810					$(this)
811						.find('a')
812						.click(function(){
813							$.prettyPhoto.changePage(i);
814							$.prettyPhoto.stopSlideshow();
815							return false;
816						});
817				});
818			};
819			
820			
821			// Inject the play/pause if it's a slideshow
822			if(settings.slideshow){
823				$pp_pic_holder.find('.pp_nav').prepend('<a href="#" class="pp_play">Play</a>')
824				$pp_pic_holder.find('.pp_nav .pp_play').click(function(){
825					$.prettyPhoto.startSlideshow();
826					return false;
827				});
828			}
829			
830			$pp_pic_holder.attr('class','pp_pic_holder ' + settings.theme); // Set the proper theme
831			
832			$pp_overlay
833				.css({
834					'opacity':0,
835					'height':$(document).height(),
836					'width':$(window).width()
837					})
838				.bind('click',function(){
839					if(!settings.modal) $.prettyPhoto.close();
840				});
841
842			$('a.pp_close').bind('click',function(){ $.prettyPhoto.close(); return false; });
843
844
845			if(settings.allow_expand) {
846				$('a.pp_expand').bind('click',function(e){
847					// Expand the image
848					if($(this).hasClass('pp_expand')){
849						$(this).removeClass('pp_expand').addClass('pp_contract');
850						doresize = false;
851					}else{
852						$(this).removeClass('pp_contract').addClass('pp_expand');
853						doresize = true;
854					};
855				
856					_hideContent(function(){ $.prettyPhoto.open(); });
857			
858					return false;
859				});
860			}
861		
862			$pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click',function(){
863				$.prettyPhoto.changePage('previous');
864				$.prettyPhoto.stopSlideshow();
865				return false;
866			});
867		
868			$pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click',function(){
869				$.prettyPhoto.changePage('next');
870				$.prettyPhoto.stopSlideshow();
871				return false;
872			});
873			
874			_center_overlay(); // Center it
875		};
876
877		if(!pp_alreadyInitialized && getHashtag()){
878			pp_alreadyInitialized = true;
879			
880			// Grab the rel index to trigger the click on the correct element
881			hashIndex = getHashtag();
882			hashRel = hashIndex;
883			hashIndex = hashIndex.substring(hashIndex.indexOf('/')+1,hashIndex.length-1);
884			hashRel = hashRel.substring(0,hashRel.indexOf('/'));
885
886			// Little timeout to make sure all the prettyPhoto initialize scripts has been run.
887			// Useful in the event the page contain several init scripts.
888			setTimeout(function(){ $("a["+pp_settings.hook+"^='"+hashRel+"']:eq("+hashIndex+")").trigger('click'); },50);
889		}
890		
891		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
892	};
893	
894	function getHashtag(){
895		var url = location.href;
896		hashtag = (url.indexOf('#prettyPhoto') !== -1) ? decodeURI(url.substring(url.indexOf('#prettyPhoto')+1,url.length)) : false;
897
898		return hashtag;
899	};
900	
901	function setHashtag(){
902		if(typeof theRel == 'undefined') return; // theRel is set on normal calls, it's impossible to deeplink using the API
903		location.hash = theRel + '/'+rel_index+'/';
904	};
905	
906	function clearHashtag(){
907		if ( location.href.indexOf('#prettyPhoto') !== -1 ) location.hash = "prettyPhoto";
908	}
909	
910	function getParam(name,url){
911	  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
912	  var regexS = "[\\?&]"+name+"=([^&#]*)";
913	  var regex = new RegExp( regexS );
914	  var results = regex.exec( url );
915	  return ( results == null ) ? "" : results[1];
916	}
917	
918})(jQuery);
919
920var 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.