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: 'data-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="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}&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 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(' '); 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&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}
313/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" && (settings.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.