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"> </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}&layout=button_count&show_faces=true&width=500&action=like&font&colorscheme=light&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(' '); 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&byline=0&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.