' /* html or false to disable */ }, pp_settings); // Global variables accessible only by prettyPhoto var matchedObjects = this, percentBased = false, pp_dimensions, pp_open, // prettyPhoto container specific pp_contentHeight, pp_contentWidth, pp_containerHeight, pp_containerWidth, // Window size windowHeight = $(window).height(), windowWidth = $(window).width(), // Global elements pp_slideshow; doresize = true, scroll_pos = _get_scroll(); // Window/Keyboard events $(window).unbind('resize.prettyphoto').bind('resize.prettyphoto', function() { _center_overlay(); _resize_overlay(); }); if (pp_settings.keyboard_shortcuts) { $(document).unbind('keydown.prettyphoto').bind('keydown.prettyphoto', function(e) { if (typeof $pp_pic_holder != 'undefined') { if ($pp_pic_holder.is(':visible')) { switch (e.keyCode) { case 37: $.prettyPhoto.changePage('previous'); e.preventDefault(); break; case 39: $.prettyPhoto.changePage('next'); e.preventDefault(); break; case 27: if (!settings.modal) $.prettyPhoto.close(); e.preventDefault(); break; } ; // return false; } ; } ; }); } ; /** * Initialize prettyPhoto. */ $.prettyPhoto.initialize = function() { settings = pp_settings; if (settings.theme == 'pp_default') settings.horizontal_padding = 16; // Find out if the picture is part of a set theRel = $(this).attr(settings.hook); galleryRegExp = /\[(?:.*)\]/; isSet = (galleryRegExp.exec(theRel)) ? true : false; // Put the SRCs, TITLEs, ALTs into an array. 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')); 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')); 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')); if (pp_images.length > settings.overlay_gallery_max) settings.overlay_gallery = false; set_position = jQuery.inArray($(this).attr('href'), pp_images); // Define where in the array the clicked item is positionned rel_index = (isSet) ? set_position : $("a[" + settings.hook + "^='" + theRel + "']").index($(this)); _build_overlay(this); // Build the overlay {this} being the caller if (settings.allow_resize) $(window).bind('scroll.prettyphoto', function() { _center_overlay(); }); $.prettyPhoto.open(); return false; } /** * Opens the prettyPhoto modal box. * @param image {String,Array} Full path to the image to be open, can also be an array containing full images paths. * @param title {String,Array} The title to be displayed with the picture, can also be an array containing all the titles. * @param description {String,Array} The description to be displayed with the picture, can also be an array containing all the descriptions. */ $.prettyPhoto.open = function(event) { if (typeof settings == "undefined") { // Means it's an API call, need to manually get the settings and set the variables settings = pp_settings; pp_images = $.makeArray(arguments[0]); pp_titles = (arguments[1]) ? $.makeArray(arguments[1]) : $.makeArray(""); pp_descriptions = (arguments[2]) ? $.makeArray(arguments[2]) : $.makeArray(""); isSet = (pp_images.length > 1) ? true : false; set_position = (arguments[3]) ? arguments[3] : 0; _build_overlay(event.target); // Build the overlay {this} being the caller } if (settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility', 'hidden'); // Hide the flash _checkPosition($(pp_images).size()); // Hide the next/previous links if on first or last images. $('.pp_loaderIcon').show(); if (settings.deeplinking) setHashtag(); // Rebuild Facebook Like Button with updated href if (settings.social_tools) { facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); $pp_pic_holder.find('.pp_social').html(facebook_like_link); } // Fade the content in if ($ppt.is(':hidden')) $ppt.css('opacity', 0).show(); $pp_overlay.show().fadeTo(settings.animation_speed, settings.opacity); // Display the current position $pp_pic_holder.find('.currentTextHolder').text((set_position + 1) + settings.counter_separator_label + $(pp_images).size()); // Set the description if (typeof pp_descriptions[set_position] != 'undefined' && pp_descriptions[set_position] != "") { $pp_pic_holder.find('.pp_description').show().html(unescape(pp_descriptions[set_position])); } else { $pp_pic_holder.find('.pp_description').hide(); } // Get the dimensions movie_width = (parseFloat(getParam('width', pp_images[set_position]))) ? getParam('width', pp_images[set_position]) : settings.default_width.toString(); movie_height = (parseFloat(getParam('height', pp_images[set_position]))) ? getParam('height', pp_images[set_position]) : settings.default_height.toString(); // If the size is % based, calculate according to window dimensions percentBased = false; if (movie_height.indexOf('%') != -1) { movie_height = parseFloat(($(window).height() * parseFloat(movie_height) / 100) - 150); percentBased = true; } if (movie_width.indexOf('%') != -1) { movie_width = parseFloat(($(window).width() * parseFloat(movie_width) / 100) - 150); percentBased = true; } // Fade the holder $pp_pic_holder.fadeIn(function() { // Set the title (settings.show_title && pp_titles[set_position] != "" && typeof pp_titles[set_position] != "undefined") ? $ppt.html(unescape(pp_titles[set_position])) : $ppt.html(' '); imgPreloader = ""; skipInjection = false; // Inject the proper content switch (_getFileType(pp_images[set_position])) { case 'image': imgPreloader = new Image(); // Preload the neighbour images nextImage = new Image(); if (isSet && set_position < $(pp_images).size() - 1) nextImage.src = pp_images[set_position + 1]; prevImage = new Image(); if (isSet && pp_images[set_position - 1]) prevImage.src = pp_images[set_position - 1]; $pp_pic_holder.find('#pp_full_res')[0].innerHTML = settings.image_markup.replace(/{path}/g, pp_images[set_position]); imgPreloader.onload = function() { // Fit item to viewport pp_dimensions = _fitToViewport(imgPreloader.width, imgPreloader.height); _showContent(); }; imgPreloader.onerror = function() { alert('Image cannot be loaded. Make sure the path is correct and image exist.'); $.prettyPhoto.close(); }; imgPreloader.src = pp_images[set_position]; break; case 'youtube': pp_dimensions = _fitToViewport(movie_width, movie_height); // Fit item to viewport // Regular youtube link movie_id = getParam('v', pp_images[set_position]); // youtu.be link if (movie_id == "") { movie_id = pp_images[set_position].split('youtu.be/'); movie_id = movie_id[1]; if (movie_id.indexOf('?') > 0) movie_id = movie_id.substr(0, movie_id.indexOf('?')); // Strip anything after the ? if (movie_id.indexOf('&') > 0) movie_id = movie_id.substr(0, movie_id.indexOf('&')); // Strip anything after the & } movie = 'http://www.youtube.com/embed/' + movie_id; (getParam('rel', pp_images[set_position])) ? movie += "?rel=" + getParam('rel', pp_images[set_position]) : movie += "?rel=1"; if (settings.autoplay) movie += "&autoplay=1"; 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); break; case 'vimeo': pp_dimensions = _fitToViewport(movie_width, movie_height); // Fit item to viewport movie_id = pp_images[set_position]; var regExp = /http(s?):\/\/(www\.)?vimeo.com\/(\d+)/; var match = movie_id.match(regExp); movie = 'http://player.vimeo.com/video/' + match[3] + '?title=0&byline=0&portrait=0'; if (settings.autoplay) movie += "&autoplay=1;"; vimeo_width = pp_dimensions['width'] + '/embed/?moog_width=' + pp_dimensions['width']; toInject = settings.iframe_markup.replace(/{width}/g, vimeo_width).replace(/{height}/g, pp_dimensions['height']).replace(/{path}/g, movie); break; case 'quicktime': pp_dimensions = _fitToViewport(movie_width, movie_height); // Fit item to viewport pp_dimensions['height'] += 15; pp_dimensions['contentHeight'] += 15; pp_dimensions['containerHeight'] += 15; // Add space for the control bar 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); break; case 'flash': pp_dimensions = _fitToViewport(movie_width, movie_height); // Fit item to viewport flash_vars = pp_images[set_position]; flash_vars = flash_vars.substring(pp_images[set_position].indexOf('flashvars') + 10, pp_images[set_position].length); filename = pp_images[set_position]; filename = filename.substring(0, filename.indexOf('?')); 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); break; case 'iframe': pp_dimensions = _fitToViewport(movie_width, movie_height); // Fit item to viewport frame_url = pp_images[set_position]; frame_url = frame_url.substr(0, frame_url.indexOf('iframe') - 1); toInject = settings.iframe_markup.replace(/{width}/g, pp_dimensions['width']).replace(/{height}/g, pp_dimensions['height']).replace(/{path}/g, frame_url); break; case 'ajax': doresize = false; // Make sure the dimensions are not resized. pp_dimensions = _fitToViewport(movie_width, movie_height); doresize = true; // Reset the dimensions skipInjection = true; $.get(pp_images[set_position], function(responseHTML) { toInject = settings.inline_markup.replace(/{content}/g, responseHTML); $pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject; _showContent(); }); break; case 'custom': pp_dimensions = _fitToViewport(movie_width, movie_height); // Fit item to viewport toInject = settings.custom_markup; break; case 'inline': // to get the item height clone it, apply default width, wrap it in the prettyPhoto containers , then delete myClone = $(pp_images[set_position]).clone().append('
').css({'width': settings.default_width}).wrapInner('
').appendTo($('body')).show(); doresize = false; // Make sure the dimensions are not resized. pp_dimensions = _fitToViewport($(myClone).width(), $(myClone).height()); doresize = true; // Reset the dimensions $(myClone).remove(); toInject = settings.inline_markup.replace(/{content}/g, $(pp_images[set_position]).html()); break; } ; if (!imgPreloader && !skipInjection) { $pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject; // Show content _showContent(); } ; }); return false; }; /** * Change page in the prettyPhoto modal box * @param direction {String} Direction of the paging, previous or next. */ $.prettyPhoto.changePage = function(direction) { currentGalleryPage = 0; if (direction == 'previous') { set_position--; if (set_position < 0) set_position = $(pp_images).size() - 1; } else if (direction == 'next') { set_position++; if (set_position > $(pp_images).size() - 1) set_position = 0; } else { set_position = direction; } ; rel_index = set_position; if (!doresize) doresize = true; // Allow the resizing of the images if (settings.allow_expand) { $('.pp_contract').removeClass('pp_contract').addClass('pp_expand'); } _hideContent(function() { $.prettyPhoto.open(); }); }; /** * Change gallery page in the prettyPhoto modal box * @param direction {String} Direction of the paging, previous or next. */ $.prettyPhoto.changeGalleryPage = function(direction) { if (direction == 'next') { currentGalleryPage++; if (currentGalleryPage > totalPage) currentGalleryPage = 0; } else if (direction == 'previous') { currentGalleryPage--; if (currentGalleryPage < 0) currentGalleryPage = totalPage; } else { currentGalleryPage = direction; } ; slide_speed = (direction == 'next' || direction == 'previous') ? settings.animation_speed : 0; slide_to = currentGalleryPage * (itemsPerPage * itemWidth); $pp_gallery.find('ul').animate({left: -slide_to}, slide_speed); }; /** * Start the slideshow... */ $.prettyPhoto.startSlideshow = function() { if (typeof pp_slideshow == 'undefined') { $pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function() { $.prettyPhoto.stopSlideshow(); return false; }); pp_slideshow = setInterval($.prettyPhoto.startSlideshow, settings.slideshow); } else { $.prettyPhoto.changePage('next'); } ; } /** * Stop the slideshow... */ $.prettyPhoto.stopSlideshow = function() { $pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function() { $.prettyPhoto.startSlideshow(); return false; }); clearInterval(pp_slideshow); pp_slideshow = undefined; } /** * Closes prettyPhoto. */ $.prettyPhoto.close = function() { if ($pp_overlay.is(":animated")) return; $.prettyPhoto.stopSlideshow(); $pp_pic_holder.stop().find('object,embed').css('visibility', 'hidden'); $('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed, function() { $(this).remove(); }); $pp_overlay.fadeOut(settings.animation_speed, function() { if (settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility', 'visible'); // Show the flash $(this).remove(); // No more need for the prettyPhoto markup $(window).unbind('scroll.prettyphoto'); clearHashtag(); settings.callback(); doresize = true; pp_open = false; delete settings; }); }; /** * Set the proper sizes on the containers and animate the content in. */ function _showContent() { $('.pp_loaderIcon').hide(); // Calculate the opened top position of the pic holder projectedTop = scroll_pos['scrollTop'] + ((windowHeight / 2) - (pp_dimensions['containerHeight'] / 2)); if (projectedTop < 0) projectedTop = 0; $ppt.fadeTo(settings.animation_speed, 1); // Resize the content holder $pp_pic_holder.find('.pp_content') .animate({ height: pp_dimensions['contentHeight'], width: pp_dimensions['contentWidth'] }, settings.animation_speed); // Resize picture the holder $pp_pic_holder.animate({ 'top': projectedTop, 'left': ((windowWidth / 2) - (pp_dimensions['containerWidth'] / 2) < 0) ? 0 : (windowWidth / 2) - (pp_dimensions['containerWidth'] / 2), width: pp_dimensions['containerWidth'] }, settings.animation_speed, function() { $pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']); $pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed); // Fade the new content // Show the nav if (isSet && _getFileType(pp_images[set_position]) == "image") { $pp_pic_holder.find('.pp_hoverContainer').show(); } else { $pp_pic_holder.find('.pp_hoverContainer').hide(); } if (settings.allow_expand) { if (pp_dimensions['resized']) { // Fade the resizing link if the image is resized $('a.pp_expand,a.pp_contract').show(); } else { $('a.pp_expand').hide(); } } if (settings.autoplay_slideshow && !pp_slideshow && !pp_open) $.prettyPhoto.startSlideshow(); settings.changepicturecallback(); // Callback! pp_open = true; }); _insert_gallery(); pp_settings.ajaxcallback(); } ; /** * Hide the content...DUH! */ function _hideContent(callback) { // Fade out the current picture $pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility', 'hidden'); $pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed, function() { $('.pp_loaderIcon').show(); callback(); }); } ; /** * Check the item position in the gallery array, hide or show the navigation links * @param setCount {integer} The total number of items in the set */ function _checkPosition(setCount) { (setCount > 1) ? $('.pp_nav').show() : $('.pp_nav').hide(); // Hide the bottom nav if it's not a set. } ; /** * Resize the item dimensions if it's bigger than the viewport * @param width {integer} Width of the item to be opened * @param height {integer} Height of the item to be opened * @return An array containin the "fitted" dimensions */ function _fitToViewport(width, height) { resized = false; _getDimensions(width, height); // Define them in case there's no resize needed imageWidth = width, imageHeight = height; if (((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)) && doresize && settings.allow_resize && !percentBased) { resized = true, fitting = false; while (!fitting) { if ((pp_containerWidth > windowWidth)) { imageWidth = (windowWidth - 200); imageHeight = (height / width) * imageWidth; } else if ((pp_containerHeight > windowHeight)) { imageHeight = (windowHeight - 200); imageWidth = (width / height) * imageHeight; } else { fitting = true; } ; pp_containerHeight = imageHeight, pp_containerWidth = imageWidth; } ; if ((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)) { _fitToViewport(pp_containerWidth, pp_containerHeight) } ; _getDimensions(imageWidth, imageHeight); } ; return { width: Math.floor(imageWidth), height: Math.floor(imageHeight), containerHeight: Math.floor(pp_containerHeight), containerWidth: Math.floor(pp_containerWidth) + (settings.horizontal_padding * 2), contentHeight: Math.floor(pp_contentHeight), contentWidth: Math.floor(pp_contentWidth), resized: resized }; } ; /** * Get the containers dimensions according to the item size * @param width {integer} Width of the item to be opened * @param height {integer} Height of the item to be opened */ function _getDimensions(width, height) { width = parseFloat(width); height = parseFloat(height); // Get the details height, to do so, I need to clone it since it's invisible $pp_details = $pp_pic_holder.find('.pp_details'); $pp_details.width(width); detailsHeight = parseFloat($pp_details.css('marginTop')) + parseFloat($pp_details.css('marginBottom')); $pp_details = $pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({ 'position': 'absolute', 'top': -10000 }); detailsHeight += $pp_details.height(); detailsHeight = (detailsHeight <= 34) ? 36 : detailsHeight; // Min-height for the details $pp_details.remove(); // Get the titles height, to do so, I need to clone it since it's invisible $pp_title = $pp_pic_holder.find('.ppt'); $pp_title.width(width); titleHeight = parseFloat($pp_title.css('marginTop')) + parseFloat($pp_title.css('marginBottom')); $pp_title = $pp_title.clone().appendTo($('body')).css({ 'position': 'absolute', 'top': -10000 }); titleHeight += $pp_title.height(); $pp_title.remove(); // Get the container size, to resize the holder to the right dimensions pp_contentHeight = height + detailsHeight; pp_contentWidth = width; pp_containerHeight = pp_contentHeight + titleHeight + $pp_pic_holder.find('.pp_top').height() + $pp_pic_holder.find('.pp_bottom').height(); pp_containerWidth = width; } function _getFileType(itemSrc) { if (itemSrc.match(/youtube\.com\/watch/i) || itemSrc.match(/youtu\.be/i)) { return 'youtube'; } else if (itemSrc.match(/vimeo\.com/i)) { return 'vimeo'; } else if (itemSrc.match(/\b.mov\b/i)) { return 'quicktime'; } else if (itemSrc.match(/\b.swf\b/i)) { return 'flash'; } else if (itemSrc.match(/\biframe=true\b/i)) { return 'iframe'; } else if (itemSrc.match(/\bajax=true\b/i)) { return 'ajax'; } else if (itemSrc.match(/\bcustom=true\b/i)) { return 'custom'; } else if (itemSrc.substr(0, 1) == '#') { return 'inline'; } else { return 'image'; } ; } ; function _center_overlay() { if (doresize && typeof $pp_pic_holder != 'undefined') { scroll_pos = _get_scroll(); contentHeight = $pp_pic_holder.height(), contentwidth = $pp_pic_holder.width(); projectedTop = (windowHeight / 2) + scroll_pos['scrollTop'] - (contentHeight / 2); if (projectedTop < 0) projectedTop = 0; if (contentHeight > windowHeight) return; $pp_pic_holder.css({ 'top': projectedTop, 'left': (windowWidth / 2) + scroll_pos['scrollLeft'] - (contentwidth / 2) }); } ; } ; function _get_scroll() { if (self.pageYOffset) { return {scrollTop: self.pageYOffset, scrollLeft: self.pageXOffset}; } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict return {scrollTop: document.documentElement.scrollTop, scrollLeft: document.documentElement.scrollLeft}; } else if (document.body) {// all other Explorers return {scrollTop: document.body.scrollTop, scrollLeft: document.body.scrollLeft}; } ; } ; function _resize_overlay() { windowHeight = $(window).height(), windowWidth = $(window).width(); if (typeof $pp_overlay != "undefined") $pp_overlay.height($(document).height()).width(windowWidth); } ; function _insert_gallery() { if (isSet && settings.overlay_gallery && _getFileType(pp_images[set_position]) == "image") { itemWidth = 52 + 5; // 52 beign the thumb width, 5 being the right margin. navWidth = (settings.theme == "facebook" || settings.theme == "pp_default") ? 50 : 30; // Define the arrow width depending on the theme itemsPerPage = Math.floor((pp_dimensions['containerWidth'] - 100 - navWidth) / itemWidth); itemsPerPage = (itemsPerPage < pp_images.length) ? itemsPerPage : pp_images.length; totalPage = Math.ceil(pp_images.length / itemsPerPage) - 1; // Hide the nav in the case there's no need for links if (totalPage == 0) { navWidth = 0; // No nav means no width! $pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').hide(); } else { $pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').show(); } ; galleryWidth = itemsPerPage * itemWidth; fullGalleryWidth = pp_images.length * itemWidth; // Set the proper width to the gallery items $pp_gallery .css('margin-left', -((galleryWidth / 2) + (navWidth / 2))) .find('div:first').width(galleryWidth + 5) .find('ul').width(fullGalleryWidth) .find('li.selected').removeClass('selected'); goToPage = (Math.floor(set_position / itemsPerPage) < totalPage) ? Math.floor(set_position / itemsPerPage) : totalPage; $.prettyPhoto.changeGalleryPage(goToPage); $pp_gallery_li.filter(':eq(' + set_position + ')').addClass('selected'); } else { $pp_pic_holder.find('.pp_content').unbind('mouseenter mouseleave'); // $pp_gallery.hide(); } } function _build_overlay(caller) { // Inject Social Tool markup into General markup if (settings.social_tools) facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); settings.markup = settings.markup.replace('{pp_social}', ''); $('body').append(settings.markup); // Inject the markup $pp_pic_holder = $('.pp_pic_holder'), $ppt = $('.ppt'), $pp_overlay = $('div.pp_overlay'); // Set my global selectors // Inject the inline gallery! if (isSet && settings.overlay_gallery) { currentGalleryPage = 0; toInject = ""; for (var i = 0; i < pp_images.length; i++) { if (!pp_images[i].match(/\b(jpg|jpeg|png|gif)\b/gi)) { classname = 'default'; img_src = ''; } else { classname = ''; img_src = pp_images[i]; } toInject += "
  • "; } ; toInject = settings.gallery_markup.replace(/{gallery}/g, toInject); $pp_pic_holder.find('#pp_full_res').after(toInject); $pp_gallery = $('.pp_pic_holder .pp_gallery'), $pp_gallery_li = $pp_gallery.find('li'); // Set the gallery selectors $pp_gallery.find('.pp_arrow_next').click(function() { $.prettyPhoto.changeGalleryPage('next'); $.prettyPhoto.stopSlideshow(); return false; }); $pp_gallery.find('.pp_arrow_previous').click(function() { $.prettyPhoto.changeGalleryPage('previous'); $.prettyPhoto.stopSlideshow(); return false; }); $pp_pic_holder.find('.pp_content').hover( function() { $pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn(); }, function() { $pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut(); }); itemWidth = 52 + 5; // 52 beign the thumb width, 5 being the right margin. $pp_gallery_li.each(function(i) { $(this) .find('a') .click(function() { $.prettyPhoto.changePage(i); $.prettyPhoto.stopSlideshow(); return false; }); }); } ; // Inject the play/pause if it's a slideshow if (settings.slideshow) { $pp_pic_holder.find('.pp_nav').prepend('Play') $pp_pic_holder.find('.pp_nav .pp_play').click(function() { $.prettyPhoto.startSlideshow(); return false; }); } $pp_pic_holder.attr('class', 'pp_pic_holder ' + settings.theme); // Set the proper theme $pp_overlay .css({ 'opacity': 0, 'height': $(document).height(), 'width': $(window).width() }) .bind('click', function() { if (!settings.modal) $.prettyPhoto.close(); }); $('a.pp_close').bind('click', function() { $.prettyPhoto.close(); return false; }); if (settings.allow_expand) { $('a.pp_expand').bind('click', function(e) { // Expand the image if ($(this).hasClass('pp_expand')) { $(this).removeClass('pp_expand').addClass('pp_contract'); doresize = false; } else { $(this).removeClass('pp_contract').addClass('pp_expand'); doresize = true; } ; _hideContent(function() { $.prettyPhoto.open(); }); return false; }); } $pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click', function() { $.prettyPhoto.changePage('previous'); $.prettyPhoto.stopSlideshow(); return false; }); $pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click', function() { $.prettyPhoto.changePage('next'); $.prettyPhoto.stopSlideshow(); return false; }); _center_overlay(); // Center it } ; if (!pp_alreadyInitialized && getHashtag()) { pp_alreadyInitialized = true; // Grab the rel index to trigger the click on the correct element hashIndex = getHashtag(); hashRel = hashIndex; hashIndex = hashIndex.substring(hashIndex.indexOf('/') + 1, hashIndex.length - 1); hashRel = hashRel.substring(0, hashRel.indexOf('/')); // Little timeout to make sure all the prettyPhoto initialize scripts has been run. // Useful in the event the page contain several init scripts. setTimeout(function() { $("a[" + pp_settings.hook + "^='" + hashRel + "']:eq(" + hashIndex + ")").trigger('click'); }, 50); } 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 }; function getHashtag() { var url = location.href; hashtag = (url.indexOf('#prettyPhoto') !== -1) ? decodeURI(url.substring(url.indexOf('#prettyPhoto') + 1, url.length)) : false; if (hashtag) { hashtag = hashtag.replace(/<|>/g, ''); } return hashtag; } ; function setHashtag() { if (typeof theRel == 'undefined') return; // theRel is set on normal calls, it's impossible to deeplink using the API location.hash = theRel + '/' + rel_index + '/'; } ; function clearHashtag() { if (location.href.indexOf('#prettyPhoto') !== -1) location.hash = "prettyPhoto"; } function getParam(name, url) { name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); var regexS = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexS); var results = regex.exec(url); return (results == null) ? "" : results[1]; } })(jQuery); var pp_alreadyInitialized = false; // Used for the deep linking to make sure not to call the same function several times.

    programma culturale

    Il programma culturale del Salone 2025 prevede oltre 100 appuntamenti per affrontare tutte le dimensioni della sostenibilità.
    Per orientarsi in un’offerta tanto articolata sono stati definiti 6 percorsi.

    Scarica il programma

    8 ottobre 2025

    9 ottobre 2025

    10 ottobre 2025

    PROGRAMMA DI

    VENERDÌ 10 OTTOBRE

    GIOVEDÌ 9 OTTOBRE

    MERCOLEDÌ 8 OTTOBRE

    ×
    FILTRA GLI EVENTI

    Eventi in programma

    Creare futuri di valore

    09:30  -  10:15
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Rilanciare la responsabilità d’impresa attraverso la concretezza

    10:30  -  11:15
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Percorsi sostenibili, esperienze educative a confronto

    10:30  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Società e cambiamento demografico: sfide e opportunità

    10:30  -  11:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    La transizione digitale a supporto della sostenibilità: quali rischi e opportunità per le imprese?

    11:00  -  12:15
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Accelerare la transizione sostenibile e digitale delle imprese: il ruolo delle Camere di commercio

    11:00  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Verso un’economia rigenerativa

    11:30  -  12:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Comunicare la sostenibilità per valorizzare l’impegno dell’organizzazione

    11:30  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Innovare i programmi di welfare: verso il corporate wellbeing

    11:30  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Filantropi d’Italia: le storie, le idee, le prospettive di chi opera “per amore dell’umanità”

    12:00  -  12:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Blu è il futuro: sostenibilità d’impresa e tutela del mare

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Educare e orientare, progetti in evoluzione

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Sostenibilità al lavoro: idee e azioni per coinvolgere le persone

    12:00  -  13:45
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Finanza sostenibile ed economia reale

    12:15  -  13:15
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Carbon & Nature Positive Strategy: percorsi integrati dall’azione, alla valutazione, alla rendicontazione

    12:30  -  13:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    La cerniera – La spinta gentile al servizio della sostenibilità

    14:00  -  14:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Città in trasformazione

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Imprese, Terzo Settore, PA: relazioni in trasformazione

    14:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Politiche DE&I: l’inclusione come fattore di competitività

    14:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Non è solo sostenibilità: è competitività

    14:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Marca e comunicazione della sostenibilità: percezione, interessi e aspettative del consumatore

    14:00  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Nativi sostenibili: la GenZ di fronte alla salute del pianeta, della società, degli individui

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Glossario della sostenibilità

    14:30  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Ma quale GenZ?

    15:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Mobilità integrata e innovazione tecnologica

    15:00  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Generare Valore: laboratorio di Innovazione Comunitaria

    15:00  -  17:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Salute, prevenzione, ricerca: investimenti in crescita

    15:15  -  16:15
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Dialogo tra generazioni: inclusione e partecipazione

    15:15  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Scope 3: la grande sfida

    15:30  -  17:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Urbano e umano. Ripensare le città per un equilibrio tra progresso e umanità

    15:30  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Quando il consumatore sceglie la sostenibilità

    16:00  -  17:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Il Futuro (si) muove: un confronto tra istituzioni, fondazioni, imprese

    16:00  -  17:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Evoluzione del diritto della sostenibilità UE: cosa cambia e quali impatti su strategia, governance e supply chain

    16:00  -  17:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Sprigiona il valore! Made in Carcere e la rivoluzione del Benessere Interno Lordo

    16:00  -  16:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Cambia il mercato del lavoro: sostenibilità al centro

    16:30  -  17:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Agenda 2030: 10 anni dopo

    16:30  -  17:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Premio Impatto: 4° edizione

    17:00  -  18:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    La leadership narrativa per generare impatto positivo

    10:00  -  10:45
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Consumatori e sostenibilità del packaging

    10:00  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Impegno per la biodiversità, una leva strategica

    10:00  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Come finanziare la giusta transizione?

    10:00  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Società Benefit: il modello per un’economia rigenerativa

    10:00  -  11:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    SOS editoria: affidabilità, trasparenza, sostenibilità economica

    10:00  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Trasparenza e competitività: l’importanza delle certificazioni

    10:00  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Il valore narrativo delle partnership

    10:45  -  11:15
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Intelligenza artificiale al servizio della sostenibilità. Quali opportunità per i professionisti?

    11:00  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Valore pubblico: quando l’approccio è collaborativo

    11:00  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Blue Economy: l’impegno delle imprese per l’ecosistema marino

    11:00  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    L’innovazione come leva competitiva della sostenibilità

    11:00  -  11:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Sostenibilità nel settore Outdoor: un’analisi della maturità ESG in Italia

    11:30  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Space Economy: il ruolo dell’ecologia spaziale

    11:30  -  12:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Trasformazione digitale, disuguaglianze e mercato del lavoro

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Contrastare l’effetto dei cambiamenti climatici nei territori

    12:00  -  13:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Sport, sostenibilità e impatto: misurare il cambiamento per generare valore

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Mondo del lavoro: il ruolo delle donne

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Reti territoriali: esperienze a confronto

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Imprese, Terzo Settore, PA: sinergie sempre nuove

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    L’ecologia dei dati tra rigore e bulimia

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Vivere senza sprechi: la sostenibilità a portata di tutti

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Transizione digitale per un futuro aumentato

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Sustainability Clinics for Startups – II edizione

    14:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    L’impatto dei musei: storie ed esperienze a confronto

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Custodi del territorio: i Consorzi di tutela del vino tra qualità, criticità e sostenibilità

    14:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Circolarità e stakeholder engagement in tempi di incertezza

    14:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Le stagioni dell’impresa. Creare valore tra cicli di gestione e generazioni che coesistono

    14:30  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Supply chain sostenibile: innovare il patto con i fornitori

    15:00  -  16:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Diversità, equità e inclusione: un percorso importante

    15:00  -  16:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Ridurre e ottimizzare: i vantaggi dell’economia circolare

    15:00  -  16:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Beni comuni e sistemi di responsabilità comune: un patrimonio da sviluppare e proteggere

    15:00  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Il potere dei luoghi

    15:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    “Fundraising Index”. L’incipit necessario per iniziare a raccogliere fondi e cercare nuovi donatori di tempo

    15:30  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Impresa e cultura: quali alleanze per promuovere la sostenibilità?

    15:30  -  17:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Ospitalità sostenibile: gli hotel raccontano la loro esperienza ESG

    16:00  -  16:45
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Misurare l’impatto, come fare?

    16:00  -  17:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Rendicontare la sostenibilità tra obblighi e opportunità di valore

    16:00  -  18:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    RELAZIONI PUBBLICHE – PR Hub: il racconto autentico di un decennio di comunicazione strategica

    16:00  -  16:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Diritto alla Riparazione: nuovi modelli di produzione e di consumo per la circolarità

    16:30  -  17:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Net zero: da obiettivo a impegno concreto

    16:30  -  17:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Benessere digitale: istruzioni per l’uso

    16:30  -  17:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Grandi imprese e PMI: cresce il dialogo

    16:30  -  17:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Volontariato d’impresa: un’azione tanti vantaggi

    09:30  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Innovare con equilibrio: l’importanza di una buona governance

    09:30  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    L’acqua, una risorsa preziosa

    10:00  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Energie rinnovabili: avanti tutta!

    10:00  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Nice to Meet You. Colloqui con il lavoro

    10:00  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Territori e filiere integrate per economie circolari

    10:00  -  11:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Collaborazione pubblico-privato: sinergie innovative

    10:00  -  11:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Comunicare la sostenibilità, tra creatività e tecnicismi

    11:00  -  11:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Dalle CER alle CERS: l’evoluzione delle comunità energetiche

    11:00  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Le filiere agroalimentari: sostenibilità tra innovazione ed efficienza

    11:00  -  12:15
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Talenti cercasi: il retail che parla alle nuove generazioni

    11:00  -  12:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Imprese e diritti umani: senza aspettare la direttiva

    12:00  -  13:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Industria e Distribuzione: un patto possibile?

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Rieducare e reinserire: creare valore oltre il carcere

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Dalle città alle imprese: come rendere i luoghi più inclusivi?

    12:00  -  13:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    E tu che femminista sei?

    12:00  -  12:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Agricoltura rigenerativa: tradizione e innovazione

    12:15  -  13:15
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Prendiamo la parola! La retorica dalla parte delle donne

    14:00  -  14:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Infrastrutture e sostenibilità: alla ricerca del giusto equilibrio

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    AI e sostenibilità: un binomio vincente?

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Sostenere la cultura per lo sviluppo dei territori

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Finanza sostenibile e banche, attori della transizione

    14:00  -  15:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Anna e la banda del ghiacciolo sciolto

    15:00  -  15:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    La sostenibilità dinamica: il piano di Transizione diventa centrale

    15:00  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    La sostenibilità degli eventi: a che punto siamo?

    15:00  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Un mercato del lavoro davvero sostenibile

    15:00  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    L’ambiguità del presente: il valore della reputazione

    15:30  -  16:30
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    La catena di smontaggio

    15:30  -  16:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Ecodesign e Green Claims: il ruolo delle certificazioni Emas, Ecolabel, Made Green in Italy

    16:00  -  17:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :

    Areté Education Summit

    16:15  -  18:00
    edizioni :
    fasce orarie 2025 :
    focus 2025 :
    tipologie 2025 :