//fgnass.github.com/spin.js#v1.3 /** * Copyright (c) 2011-2013 Felix Gnass * Licensed under the MIT license */ (function(root, factory) { /* CommonJS */ if (typeof exports == 'object') module.exports = factory() /* AMD module */ else if (typeof define == 'function' && define.amd) define(factory) /* Browser global */ else root.Spinner = factory() } (this, function() { "use strict"; var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */ , animations = {} /* Animation rules keyed by their name */ , useCssAnimations /* Whether to use CSS animations or setTimeout */ /** * Utility function to create elements. If no tag name is given, * a DIV is created. Optionally properties can be passed. */ function createEl(tag, prop) { var el = document.createElement(tag || 'div') , n for(n in prop) el[n] = prop[n] return el } /** * Appends children and returns the parent. */ function ins(parent /* child1, child2, ...*/) { for (var i=1, n=arguments.length; i> 1) : parseInt(o.left, 10) + mid) + 'px', top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + 'px' }) } el.setAttribute('role', 'progressbar') self.lines(el, self.opts) if (!useCssAnimations) { // No CSS animation support, use setTimeout() instead var i = 0 , start = (o.lines - 1) * (1 - o.direction) / 2 , alpha , fps = o.fps , f = fps/o.speed , ostep = (1-o.opacity) / (f*o.trail / 100) , astep = f/o.lines ;(function anim() { i++; for (var j = 0; j < o.lines; j++) { alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity) self.opacity(el, j * o.direction + start, alpha, o) } self.timeout = self.el && setTimeout(anim, ~~(1000/fps)) })() } return self }, /** * Stops and removes the Spinner. */ stop: function() { var el = this.el if (el) { clearTimeout(this.timeout) if (el.parentNode) el.parentNode.removeChild(el) this.el = undefined } return this }, /** * Internal method that draws the individual lines. Will be overwritten * in VML fallback mode below. */ lines: function(el, o) { var i = 0 , start = (o.lines - 1) * (1 - o.direction) / 2 , seg function fill(color, shadow) { return css(createEl(), { position: 'absolute', width: (o.length+o.width) + 'px', height: o.width + 'px', background: color, boxShadow: shadow, transformOrigin: 'left', transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)', borderRadius: (o.corners * o.width>>1) + 'px' }) } for (; i < o.lines; i++) { seg = css(createEl(), { position: 'absolute', top: 1+~(o.width/2) + 'px', transform: o.hwaccel ? 'translate3d(0,0,0)' : '', opacity: o.opacity, animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite' }) if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'})) ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)'))) } return el }, /** * Internal method that adjusts the opacity of a single line. * Will be overwritten in VML fallback mode below. */ opacity: function(el, i, val) { if (i < el.childNodes.length) el.childNodes[i].style.opacity = val } }) function initVML() { /* Utility function to create a VML tag */ function vml(tag, attr) { return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr) } // No CSS transforms but VML support, add a CSS rule for VML elements: sheet.addRule('.spin-vml', 'behavior:url(#default#VML)') Spinner.prototype.lines = function(el, o) { var r = o.length+o.width , s = 2*r function grp() { return css( vml('group', { coordsize: s + ' ' + s, coordorigin: -r + ' ' + -r }), { width: s, height: s } ) } var margin = -(o.width+o.length)*2 + 'px' , g = css(grp(), {position: 'absolute', top: margin, left: margin}) , i function seg(i, dx, filter) { ins(g, ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}), ins(css(vml('roundrect', {arcsize: o.corners}), { width: r, height: o.width, left: o.radius, top: -o.width>>1, filter: filter }), vml('fill', {color: o.color, opacity: o.opacity}), vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change ) ) ) } if (o.shadow) for (i = 1; i <= o.lines; i++) seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)') for (i = 1; i <= o.lines; i++) seg(i) return ins(el, g) } Spinner.prototype.opacity = function(el, i, val, o) { var c = el.firstChild o = o.shadow && o.lines || 0 if (c && i+o < c.childNodes.length) { c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild if (c) c.opacity = val } } } var probe = css(createEl('group'), {behavior: 'url(#default#VML)'}) if (!vendor(probe, 'transform') && probe.adj) initVML() else useCssAnimations = vendor(probe, 'animation') return Spinner })); ; /** * Copyright (c) 2011-2013 Felix Gnass * Licensed under the MIT license */ /* Basic Usage: ============ $('#el').spin(); // Creates a default Spinner using the text color of #el. $('#el').spin({ ... }); // Creates a Spinner using the provided options. $('#el').spin(false); // Stops and removes the spinner. Using Presets: ============== $('#el').spin('small'); // Creates a 'small' Spinner using the text color of #el. $('#el').spin('large', '#fff'); // Creates a 'large' white Spinner. Adding a custom preset: ======================= $.fn.spin.presets.flower = { lines: 9 length: 10 width: 20 radius: 0 } $('#el').spin('flower', 'red'); */ (function(factory) { if (typeof exports == 'object') { // CommonJS factory(require('jquery'), require('spin')) } else if (typeof define == 'function' && define.amd) { // AMD, register as anonymous module define(['jquery', 'spin'], factory) } else { // Browser globals if (!window.Spinner) throw new Error('Spin.js not present') factory(window.jQuery, window.Spinner) } }(function($, Spinner) { $.fn.spin = function(opts, color) { return this.each(function() { var $this = $(this), data = $this.data(); if (data.spinner) { data.spinner.stop(); delete data.spinner; } if (opts !== false) { opts = $.extend( { color: color || $this.css('color') }, $.fn.spin.presets[opts] || opts ) // Begin WordPress Additions // To use opts.right, you need to have specified a length, width, and radius. if ( typeof opts.right !== 'undefined' && typeof opts.length !== 'undefined' && typeof opts.width !== 'undefined' && typeof opts.radius !== 'undefined' ) { var pad = $this.css( 'padding-left' ); pad = ( typeof pad === 'undefined' ) ? 0 : parseInt( pad, 10 ); opts.left = $this.outerWidth() - ( 2 * ( opts.length + opts.width + opts.radius ) ) - pad - opts.right; delete opts.right; } // End WordPress Additions data.spinner = new Spinner(opts).spin(this) } }) } $.fn.spin.presets = { tiny: { lines: 8, length: 2, width: 2, radius: 3 }, small: { lines: 8, length: 4, width: 3, radius: 5 }, large: { lines: 10, length: 8, width: 4, radius: 8 } } })); // Jetpack Presets Overrides: (function($){ $.fn.spin.presets.wp = { trail: 60, speed: 1.3 }; $.fn.spin.presets.small = $.extend( { lines: 8, length: 2, width: 2, radius: 3 }, $.fn.spin.presets.wp ); $.fn.spin.presets.medium = $.extend( { lines: 8, length: 4, width: 3, radius: 5 }, $.fn.spin.presets.wp ); $.fn.spin.presets.large = $.extend( { lines: 10, length: 6, width: 4, radius: 7 }, $.fn.spin.presets.wp ); $.fn.spin.presets['small-left'] = $.extend( { left: 5 }, $.fn.spin.presets.small ); $.fn.spin.presets['small-right'] = $.extend( { right: 5 }, $.fn.spin.presets.small ); $.fn.spin.presets['medium-left'] = $.extend( { left: 5 }, $.fn.spin.presets.medium ); $.fn.spin.presets['medium-right'] = $.extend( { right: 5 }, $.fn.spin.presets.medium ); $.fn.spin.presets['large-left'] = $.extend( { left: 5 }, $.fn.spin.presets.large ); $.fn.spin.presets['large-right'] = $.extend( { right: 5 }, $.fn.spin.presets.large ); })(jQuery); ; // @start-hide-in-jetpack if (typeof wpcom === "undefined") { var wpcom = {}; } wpcom.carousel = (function($) { var prebuilt_widths = jetpackCarouselStrings.widths; var pageviews_stats_args = jetpackCarouselStrings.stats_query_args; var findFirstLargeEnoughWidth = function(original_w, original_h, dest_w, dest_h) { var inverse_ratio = original_h / original_w; for ( var i = 0; i < prebuilt_widths.length; ++i ) { if ( prebuilt_widths[i] >= dest_w || prebuilt_widths[i] * inverse_ratio >= dest_h ) return prebuilt_widths[i]; } return original_w; }; var addWidthToImageURL = function(url, width) { width = parseInt(width, 10); // Give devices with a higher devicePixelRatio higher-res images (Retina display = 2, Android phones = 1.5, etc) if ('undefined' != typeof window.devicePixelRatio && window.devicePixelRatio > 1) width = Math.round( width * window.devicePixelRatio ); url = addArgToURL(url, 'w', width); url = addArgToURL(url, 'h', ''); return url; }; var addArgToURL = function(url, arg, value) { var re = new RegExp(arg+'=[^?&]+'); if ( url.match(re) ) { return url.replace(re, arg + '=' + value); } else { var divider = url.indexOf('?') !== -1 ? '&' : '?'; return url + divider + arg + '=' + value; } }; var stat = function ( names ) { if ( typeof names != 'string' ) names = names.join( ',' ); new Image().src = window.location.protocol + '//stats.wordpress.com/g.gif?v=wpcom-no-pv' + '&x_carousel=' + names + '&baba=' + Math.random(); }; var pageview = function ( post_id ) { new Image().src = window.location.protocol + '//stats.wordpress.com/g.gif?host=' + encodeURIComponent( window.location.host ) + '&ref=' + encodeURIComponent( document.referrer ) + '&rand=' + Math.random() + '&' + pageviews_stats_args + '&post=' + encodeURIComponent( post_id ); }; return { findFirstLargeEnoughWidth: findFirstLargeEnoughWidth, addWidthToImageURL: addWidthToImageURL, stat: stat, pageview: pageview }; })(jQuery); // @end-hide-in-jetpack jQuery(document).ready(function($) { // gallery faded layer and container elements var overlay, comments, gallery, container, nextButton, previousButton, info, title, transitionBegin, caption, resizeTimeout, mouseTimeout, photo_info, close_hint, commentInterval, screenPadding = 110, originalOverflow = $('body').css('overflow'), originalHOverflow = $('html').css('overflow'), proportion = 85, last_known_location_hash = ''; if ( window.innerWidth <= 760 ) { screenPadding = Math.round( ( window.innerWidth / 760 ) * 110 ); if ( screenPadding < 40 && ( ( 'ontouchstart' in window ) || window.DocumentTouch && document instanceof DocumentTouch ) ) screenPadding = 0; } var keyListener = function(e){ switch(e.which){ case 38: // up e.preventDefault(); container.scrollTop(container.scrollTop() - 100); break; case 40: // down e.preventDefault(); container.scrollTop(container.scrollTop() + 100); break; case 39: // right e.preventDefault(); gallery.jp_carousel('clearCommentTextAreaValue'); gallery.jp_carousel('next'); break; case 37: // left e.preventDefault(); gallery.jp_carousel('clearCommentTextAreaValue'); gallery.jp_carousel('previous'); break; case 27: // escape e.preventDefault(); gallery.jp_carousel('clearCommentTextAreaValue'); container.jp_carousel('close'); break; default: // making jslint happy break; } }; var resizeListener = function(e){ clearTimeout(resizeTimeout); resizeTimeout = setTimeout(function(){ gallery .jp_carousel('slides') .jp_carousel('fitSlide', true); gallery .jp_carousel('fitInfo', true) .jp_carousel('fitMeta', true); }, 200); }; var prepareGallery = function( dataCarouselExtra ){ if (!overlay) { overlay = $('
') .addClass('jp-carousel-overlay') .css({ 'position' : 'absolute', 'top' : 0, 'right' : 0, 'bottom' : 0, 'left' : 0 }); var buttons = '' + jetpackCarouselStrings.comment + ''; if ( 1 == jetpackCarouselStrings.is_logged_in ) { // @start-hide-in-jetpack if ( 1 == jetpackCarouselStrings.is_public ) buttons += '' + jetpackCarouselStrings.reblog + ''; // @end-hide-in-jetpack } buttons = $(''); caption = $('

'); photo_info = $('').append(caption); imageMeta = $('
') .addClass('jp-carousel-image-meta') .css({ 'float' : 'right', 'margin-top' : '20px', 'width' : '250px' }); imageMeta .append( buttons ) .append( "" ) .append( "" ) .append( "" ); titleAndDescription = $('
') .addClass('jp-carousel-titleanddesc') .css({ 'width' : '100%', 'margin-top' : imageMeta.css('margin-top') }); var commentFormMarkup = ''; commentForm = $(commentFormMarkup) .css({ 'width' : '100%', 'margin-top' : '20px', 'color' : '#999' }); comments = $('
') .addClass('jp-carousel-comments') .css({ 'width' : '100%', 'bottom' : '10px', 'margin-top' : '20px' }); commentsLoading = $('') .css({ 'width' : '100%', 'bottom' : '10px', 'margin-top' : '20px' }); leftWidth = ( $(window).width() - ( screenPadding * 2 ) ) - (imageMeta.width() + 40); leftWidth += 'px'; leftColWrapper = $('
') .addClass('jp-carousel-left-column-wrapper') .css({ 'width' : Math.floor( leftWidth ) }) .append(titleAndDescription) .append(commentForm) .append(comments) .append(commentsLoading); fadeaway = $('
') .addClass('jp-carousel-fadeaway'); info = $('
') .addClass('jp-carousel-info') .css({ 'top' : Math.floor( ($(window).height() / 100) * proportion ), 'left' : screenPadding, 'right' : screenPadding }) .append(photo_info) .append(imageMeta); if ( window.innerWidth <= 760 ) { photo_info.remove().insertAfter( titleAndDescription ); info.prepend( leftColWrapper ); } else { info.append( leftColWrapper ); } targetBottomPos = ( $(window).height() - parseInt( info.css('top'), 10 ) ) + 'px'; nextButton = $("
") .addClass('jp-carousel-next-button') .css({ 'right' : '15px', }); previousButton = $("
") .addClass('jp-carousel-previous-button') .css({ 'left' : 0, }); nextButton.add( previousButton ).css( { 'position' : 'fixed', 'top' : '40px', 'bottom' : targetBottomPos, 'width' : screenPadding } ); gallery = $('
') .addClass('jp-carousel') .css({ 'position' : 'absolute', 'top' : 0, 'bottom' : targetBottomPos, 'left' : 0, 'right' : 0 }); close_hint = $('') .css({ position : 'fixed' }); container = $("
") .addClass('jp-carousel-wrap') .addClass( 'jp-carousel-transitions' ); if ( 'white' == jetpackCarouselStrings.background_color ) container.addClass('jp-carousel-light'); container.css({ 'position' : 'fixed', 'top' : 0, 'right' : 0, 'bottom' : 0, 'left' : 0, 'z-index' : 2147483647, 'overflow-x' : 'hidden', 'overflow-y' : 'auto', 'direction' : 'ltr' }) .hide() .append(overlay) .append(gallery) .append(fadeaway) .append(info) .append(nextButton) .append(previousButton) .append(close_hint) .appendTo($('body')) .click(function(e){ var target = $(e.target), wrap = target.parents('div.jp-carousel-wrap'), data = wrap.data('carousel-extra'), slide = wrap.find('div.selected'), attachment_id = slide.data('attachment-id'); data = data || []; if ( target.is(gallery) || target.parents().add(target).is(close_hint) ) { container.jp_carousel('close'); // @start-hide-in-jetpack } else if ( target.hasClass('jp-carousel-reblog') ) { e.preventDefault(); e.stopPropagation(); if ( !target.hasClass('reblogged') ) { target.jp_carousel('show_reblog_box'); wpcom.carousel.stat('reblog_show_box'); } } else if ( target.parents('#carousel-reblog-box').length ) { if ( target.is('a.cancel') ) { e.preventDefault(); e.stopPropagation(); target.jp_carousel('hide_reblog_box'); wpcom.carousel.stat('reblog_cancel'); } else if ( target.is( 'input[type="submit"]' ) ) { e.preventDefault(); e.stopPropagation(); var note = $('#carousel-reblog-box textarea').val(); if ( jetpackCarouselStrings.reblog_add_thoughts == note ) note = ''; $('#carousel-reblog-submit').val( jetpackCarouselStrings.reblogging ); $('#carousel-reblog-submit').prop('disabled', true); $( '#carousel-reblog-box div.submit span.canceltext' ).spin( 'small' ); $.post( jetpackCarouselStrings.ajaxurl, { 'action': 'post_reblog', 'reblog_source': 'carousel', 'original_blog_id': $('#carousel-reblog-box input#carousel-reblog-blog-id').val(), 'original_post_id': $('.jp-carousel div.selected').data('attachment-id'), 'blog_id': $('#carousel-reblog-box select').val(), 'blog_url': $('#carousel-reblog-box input#carousel-reblog-blog-url').val(), 'blog_title': $('#carousel-reblog-box input#carousel-reblog-blog-title').val(), 'post_url': $('#carousel-reblog-box input#carousel-reblog-post-url').val(), 'post_title': $('#carousel-reblog-box input#carousel-reblog-post-title').val(), 'note': note, '_wpnonce': $('#carousel-reblog-box #_wpnonce').val() }, function(result) { $('#carousel-reblog-box').css({ 'height': $('#carousel-reblog-box').height() + 'px' }).slideUp('fast'); $('a.jp-carousel-reblog').html( jetpackCarouselStrings.reblogged ).removeClass( 'reblog' ).addClass( 'reblogged' ); $( '#carousel-reblog-box div.submit span.canceltext' ).spin( false ); $('#carousel-reblog-submit').val( jetpackCarouselStrings.post_reblog ); $('div.jp-carousel-info').children().not('#carousel-reblog-box').fadeIn('fast'); slide.data('reblogged', 1); $('div.gallery').find('img[data-attachment-id="' + slide.data('attachment-id') + '"]').data('reblogged', 1); }, 'json' ); wpcom.carousel.stat('reblog_submit'); } } else if ( target.hasClass( 'jp-carousel-image-download' ) ) { wpcom.carousel.stat( 'download_original_click' ); // @end-hide-in-jetpack } else if ( target.hasClass('jp-carousel-commentlink') ) { e.preventDefault(); e.stopPropagation(); $(window).unbind('keydown', keyListener); container.animate({scrollTop: parseInt(info.position()['top'], 10)}, 'fast'); $('#jp-carousel-comment-form-submit-and-info-wrapper').slideDown('fast'); $('#jp-carousel-comment-form-comment-field').focus(); } else if ( target.hasClass('jp-carousel-comment-login') ) { var url = jetpackCarouselStrings.login_url + '%23jp-carousel-' + attachment_id; window.location.href = url; } else if ( target.parents('#jp-carousel-comment-form-container').length ) { var textarea = $('#jp-carousel-comment-form-comment-field') .blur(function(){ $(window).bind('keydown', keyListener); }) .focus(function(){ $(window).unbind('keydown', keyListener); }); var emailField = $('#jp-carousel-comment-form-email-field') .blur(function(){ $(window).bind('keydown', keyListener); }) .focus(function(){ $(window).unbind('keydown', keyListener); }); var authorField = $('#jp-carousel-comment-form-author-field') .blur(function(){ $(window).bind('keydown', keyListener); }) .focus(function(){ $(window).unbind('keydown', keyListener); }); var urlField = $('#jp-carousel-comment-form-url-field') .blur(function(){ $(window).bind('keydown', keyListener); }) .focus(function(){ $(window).unbind('keydown', keyListener); }); if ( textarea && textarea.attr('id') == target.attr('id')) { // For first page load $(window).unbind('keydown', keyListener); $('#jp-carousel-comment-form-submit-and-info-wrapper').slideDown('fast'); } else if ( target.is( 'input[type="submit"]' ) ) { e.preventDefault(); e.stopPropagation(); $('#jp-carousel-comment-form-spinner').spin('small', 'white'); var ajaxData = { action: 'post_attachment_comment', nonce: jetpackCarouselStrings.nonce, blog_id: data['blog_id'], id: attachment_id, comment: textarea.val() }; if ( ! ajaxData['comment'].length ) { gallery.jp_carousel('postCommentError', {'field': 'jp-carousel-comment-form-comment-field', 'error': jetpackCarouselStrings.no_comment_text}); return; } if ( 1 != jetpackCarouselStrings.is_logged_in ) { ajaxData['email'] = emailField.val(); ajaxData['author'] = authorField.val(); ajaxData['url'] = urlField.val(); if ( 1 == jetpackCarouselStrings.require_name_email ) { if ( ! ajaxData['email'].length || ! ajaxData['email'].match('@') ) { gallery.jp_carousel('postCommentError', {'field': 'jp-carousel-comment-form-email-field', 'error': jetpackCarouselStrings.no_comment_email}); return; } else if ( ! ajaxData['author'].length ) { gallery.jp_carousel('postCommentError', {'field': 'jp-carousel-comment-form-author-field', 'error': jetpackCarouselStrings.no_comment_author}); return; } } } $.ajax({ type: 'POST', url: jetpackCarouselStrings.ajaxurl, data: ajaxData, dataType: 'json', success: function(response, status, xhr) { if ( 'approved' == response.comment_status ) { $('#jp-carousel-comment-post-results').slideUp('fast').html('' + jetpackCarouselStrings.comment_approved + '').slideDown('fast'); } else if ( 'unapproved' == response.comment_status ) { $('#jp-carousel-comment-post-results').slideUp('fast').html('' + jetpackCarouselStrings.comment_unapproved + '').slideDown('fast'); } else { // 'deleted', 'spam', false $('#jp-carousel-comment-post-results').slideUp('fast').html('' + jetpackCarouselStrings.comment_post_error + '').slideDown('fast'); } gallery.jp_carousel('clearCommentTextAreaValue'); gallery.jp_carousel('getComments', {attachment_id: attachment_id, offset: 0, clear: true}); $('#jp-carousel-comment-form-button-submit').val(jetpackCarouselStrings.post_comment); $('#jp-carousel-comment-form-spinner').spin(false); }, error: function(xhr, status, error) { // TODO: Add error handling and display here gallery.jp_carousel('postCommentError', {'field': 'jp-carousel-comment-form-comment-field', 'error': jetpackCarouselStrings.comment_post_error}); return; } }); } } else if ( ! target.parents( '.jp-carousel-info' ).length ) { container.jp_carousel('next'); } }) .bind('jp_carousel.afterOpen', function(){ $(window).bind('keydown', keyListener); $(window).bind('resize', resizeListener); gallery.opened = true; resizeListener(); }) .bind('jp_carousel.beforeClose', function(){ var scroll = $(window).scrollTop(); $(window).unbind('keydown', keyListener); $(window).unbind('resize', resizeListener); $(window).scrollTop(scroll); gallery.jp_carousel( 'hide_reblog_box' ); // @hide-in-jetpack }) .bind('jp_carousel.afterClose', function(){ if ( history.pushState ) { history.pushState("", document.title, window.location.pathname + window.location.search); } else { last_known_location_hash = ''; window.location.hash = ''; } gallery.opened = false; }) .on( 'transitionend.jp-carousel ', '.jp-carousel-slide', function ( e ) { // If the movement transitions take more than twice the allotted time, disable them. // There is some wiggle room in the 2x, since some of that time is taken up in // JavaScript, setting up the transition and calling the events. if ( 'transform' == e.originalEvent.propertyName ) { var transitionMultiplier = ( ( Date.now() - transitionBegin ) / 1000 ) / e.originalEvent.elapsedTime; container.off( 'transitionend.jp-carousel' ); if ( transitionMultiplier >= 2 ) $( '.jp-carousel-transitions' ).removeClass( 'jp-carousel-transitions' ); } } ); $( '.jp-carousel-wrap' ).touchwipe( { wipeLeft : function ( e ) { e.preventDefault(); gallery.jp_carousel( 'next' ); }, wipeRight : function ( e ) { e.preventDefault(); gallery.jp_carousel( 'previous' ); }, preventDefaultEvents : false } ); $( '.jetpack-likes-widget-unloaded' ).each( function() { jetpackLikesWidgetQueue.push( this.id ); }); nextButton.add(previousButton).click(function(e){ e.preventDefault(); e.stopPropagation(); if ( nextButton.is(this) ) { gallery.jp_carousel('next'); } else { gallery.jp_carousel('previous'); } }); } }; var methods = { testForData: function(gallery) { gallery = $( gallery ); // make sure we have it as a jQuery object. if ( ! gallery.length || undefined == gallery.data( 'carousel-extra' ) ) { return false; } return true; }, testIfOpened: function() { if ( 'undefined' != typeof(gallery) && 'undefined' != typeof(gallery.opened) && true == gallery.opened ) return true; return false; }, open: function(options) { var settings = { 'items_selector' : ".gallery-item [data-attachment-id], .tiled-gallery-item [data-attachment-id]", 'start_index': 0 }, data = $(this).data('carousel-extra'); if ( !data ) return; // don't run if the default gallery functions weren't used prepareGallery( data ); if ( gallery.jp_carousel( 'testIfOpened' ) ) return; // don't open if already opened // make sure to stop the page from scrolling behind the carousel overlay, so we don't trigger // infiniscroll for it when enabled (Reader, theme infiniscroll, etc). originalOverflow = $('body').css('overflow'); $('body').css('overflow', 'hidden'); // prevent html from overflowing on some of the new themes. originalHOverflow = $('html').css('overflow'); $('html').css('overflow', 'hidden'); // Re-apply inline-block style here and give an initial value for the width // This value will get replaced with a more appropriate value once the slide is loaded // This avoids the likes widget appearing initially full width below the comment button and then shuffling up jQuery( '.slim-likes-widget' ).find( 'iframe' ).css( 'display', 'inline-block' ).css( 'width', '60px' ); container.data('carousel-extra', data); // @start-hide-in-jetpack wpcom.carousel.stat( ['open', 'view_image'] ); // @end-hide-in-jetpack return this.each(function() { // If options exist, lets merge them // with our default settings var $this = $(this); if ( options ) $.extend( settings, options ); if ( -1 == settings.start_index ) settings.start_index = 0; //-1 returned if can't find index, so start from beginning container.trigger('jp_carousel.beforeOpen').fadeIn('fast',function(){ container.trigger('jp_carousel.afterOpen'); gallery .jp_carousel('initSlides', $this.find(settings.items_selector), settings.start_index) .jp_carousel('start', settings.start_index); }); gallery.html(''); }); }, start : function(start_index){ var slides = this.jp_carousel('slides'), selected = slides.eq(start_index); if ( 0 === selected.length ) selected = slides.eq(0); gallery.jp_carousel('selectSlide', selected, false); return this; }, close : function(){ // make sure to let the page scroll again $('body').css('overflow', originalOverflow); $('html').css('overflow', originalHOverflow); return container .trigger('jp_carousel.beforeClose') .fadeOut('fast', function(){ container.trigger('jp_carousel.afterClose'); }); }, next : function(){ var slide = gallery.jp_carousel( 'nextSlide' ); container.animate({scrollTop:0}, 'fast'); gallery.jp_carousel( 'hide_reblog_box' ); // @hide-in-jetpack if ( slide ) { this.jp_carousel('selectSlide', slide); wpcom.carousel.stat( ['next', 'view_image'] ); // @hide-in-jetpack } }, previous : function(){ var slide = gallery.jp_carousel( 'prevSlide' ); container.animate({scrollTop:0}, 'fast'); gallery.jp_carousel( 'hide_reblog_box' ); // @hide-in-jetpack if ( slide ) { this.jp_carousel('selectSlide', slide); wpcom.carousel.stat( ['previous', 'view_image'] ); // @hide-in-jetpack } }, resetButtons : function(current) { if ( current.data('liked') ) $('.jp-carousel-buttons a.jp-carousel-like').addClass('liked').text(jetpackCarouselStrings.unlike); else $('.jp-carousel-buttons a.jp-carousel-like').removeClass('liked').text(jetpackCarouselStrings.like); // @start-hide-in-jetpack if ( current.data( 'reblogged' ) ) $('.jp-carousel-buttons a.jp-carousel-reblog').addClass( 'reblogged' ).text( jetpackCarouselStrings.reblogged ); else $('.jp-carousel-buttons a.jp-carousel-reblog').removeClass( 'reblogged' ).text( jetpackCarouselStrings.reblog ); // Must also take care of reblog/reblogged here // @end-hide-in-jetpack }, selectedSlide : function(){ return this.find('.selected'); }, setSlidePosition : function(x) { transitionBegin = Date.now(); return this.css({ '-webkit-transform':'translate3d(' + x + 'px,0,0)', '-moz-transform':'translate3d(' + x + 'px,0,0)', '-ms-transform':'translate(' + x + 'px,0)', '-o-transform':'translate(' + x + 'px,0)', 'transform':'translate3d(' + x + 'px,0,0)' }); }, selectSlide : function(slide, animate){ var last = this.find('.selected').removeClass('selected'), slides = gallery.jp_carousel('slides').css({'position': 'fixed'}), current = $(slide).addClass('selected').css({'position': 'relative'}), attachmentId = current.data( 'attachment-id' ), previous = gallery.jp_carousel( 'prevSlide' ), next = gallery.jp_carousel( 'nextSlide' ), width = $(window).width(), previous_previous = previous.prev(), next_next = next.next(), galleryWidth = gallery.width(), currentWidth = current.width(), left = Math.floor( ( galleryWidth - currentWidth ) * 0.5 ), info_left, method, animated, info_min; // center the main image gallery.jp_carousel( 'loadFullImage', current ); caption.hide(); if ( next.length == 0 && slides.length <= 2 ) $( '.jp-carousel-next-button' ).hide(); else $( '.jp-carousel-next-button' ).show(); if ( previous.length == 0 && slides.length <= 2 ) $( '.jp-carousel-previous-button' ).hide(); else $( '.jp-carousel-previous-button' ).show(); method = 'css'; animated = current .add(previous) .add(previous_previous) .add(next) .add(next_next) .jp_carousel('loadSlide'); // slide the whole view to the x we want slides.not(animated).hide(); current.jp_carousel('setSlidePosition', left).show(); // minimum width gallery.jp_carousel('fitInfo', animate); // prep the slides var direction = last.is(current.prevAll()) ? 1 : -1; if ( 1 == direction ) { if ( ! next_next.is( previous ) ) next_next.jp_carousel('setSlidePosition', galleryWidth + next.width()).show(); if ( ! previous_previous.is( next ) ) previous_previous.jp_carousel('setSlidePosition', -previous_previous.width() - currentWidth ).show(); } else { if ( ! next_next.is( previous ) ) next_next.jp_carousel('setSlidePosition', galleryWidth + currentWidth ).show(); } previous.jp_carousel('setSlidePosition', Math.floor( -previous.width() + (screenPadding * 0.75 ) ) ).show(); next.jp_carousel('setSlidePosition', Math.ceil( galleryWidth - (screenPadding * 0.75 ) ) ).show(); gallery.jp_carousel('resetButtons', current); container.trigger('jp_carousel.selectSlide', [current]); gallery.jp_carousel( 'getTitleDesc', { title: current.data( 'title' ), desc: current.data( 'desc' ) } ); // Lazy-load the Likes iframe for the current, next, and previous slides. gallery.jp_carousel( 'loadLikes', attachmentId ); gallery.jp_carousel( 'updateLikesWidgetVisibility', attachmentId ) if ( next.length > 0 ) gallery.jp_carousel( 'loadLikes', next.data( 'attachment-id' ) ); if ( previous.length > 0 ) gallery.jp_carousel( 'loadLikes', previous.data( 'attachment-id' ) ); var imageMeta = current.data( 'image-meta' ); gallery.jp_carousel( 'updateExif', imageMeta ); gallery.jp_carousel( 'updateFullSizeLink', current ); gallery.jp_carousel( 'updateMap', imageMeta ); gallery.jp_carousel( 'testCommentsOpened', current.data( 'comments-opened' ) ); gallery.jp_carousel( 'getComments', { 'attachment_id': attachmentId, 'offset': 0, 'clear': true } ); $('#jp-carousel-comment-post-results').slideUp(); // $('
').text(sometext).html() is a trick to go to HTML to plain text (including HTML entities decode, etc) if ( current.data('caption') ) { if ( $('
').text(current.data('caption')).html() == $('
').text(current.data('title')).html() ) $('.jp-carousel-titleanddesc-title').fadeOut('fast').empty(); if ( $('
').text(current.data('caption')).html() == $('
').text(current.data('desc')).html() ) $('.jp-carousel-titleanddesc-desc').fadeOut('fast').empty(); caption.html( current.data('caption') ).fadeIn('slow'); } else { caption.fadeOut('fast').empty(); } wpcom.carousel.pageview( attachmentId ); // @hide-in-jetpack // Load the images for the next and previous slides. $( next ).add( previous ).each( function () { gallery.jp_carousel( 'loadFullImage', $( this ) ); } ); window.location.hash = last_known_location_hash = '#jp-carousel-' + attachmentId; }, slides : function(){ return this.find('.jp-carousel-slide'); }, slideDimensions : function(){ return { width: $(window).width() - (screenPadding * 2), height: Math.floor( $(window).height() / 100 * proportion - 60 ) }; }, loadSlide : function() { return this.each(function(){ var slide = $(this); slide.find('img') .one('load', function(){ // set the width/height of the image if it's too big slide .jp_carousel('fitSlide',false); }); }); }, bestFit : function(){ var max = gallery.jp_carousel('slideDimensions'), orig = this.jp_carousel('originalDimensions'), orig_ratio = orig.width / orig.height, w_ratio = 1, h_ratio = 1; if ( orig.width > max.width ) w_ratio = max.width / orig.width; if ( orig.height > max.height ) h_ratio = max.height / orig.height; if ( w_ratio < h_ratio ) { width = max.width; height = Math.floor( width / orig_ratio ); } else if ( h_ratio < w_ratio ) { height = max.height; width = Math.floor( height * orig_ratio ); } else { width = orig.width; height = orig.height; } return { width: width, height: height }; }, fitInfo : function(animated){ var current = this.jp_carousel('selectedSlide'), size = current.jp_carousel('bestFit'); photo_info.css({ 'left' : Math.floor( (info.width() - size.width) * 0.5 ), 'width' : Math.floor( size.width ) }); return this; }, fitMeta : function(animated){ var newInfoTop = { top: Math.floor( $(window).height() / 100 * proportion + 5 ) + 'px' }; var newLeftWidth = { width: ( info.width() - (imageMeta.width() + 80) ) + 'px' }; if (animated) { info.animate(newInfoTop); leftColWrapper.animate(newLeftWidth); } else { info.animate(newInfoTop); leftColWrapper.css(newLeftWidth); } }, fitSlide : function(animated){ return this.each(function(){ var selected = gallery.jp_carousel('selectedSlide'), $this = $(this), dimensions = $this.jp_carousel('bestFit'), method = 'css', max = gallery.jp_carousel('slideDimensions'); dimensions.left = 0; dimensions.top = Math.floor( (max.height - dimensions.height) * 0.5 ) + 40; $this[method](dimensions); }); }, texturize : function(text) { text = new String(text); // make sure we get a string. Title "1" came in as int 1, for example, which did not support .replace(). text = text.replace(/'/g, '’').replace(/'/g, '’').replace(/[\u2019]/g, '’'); text = text.replace(/"/g, '”').replace(/"/g, '”').replace(/"/g, '”').replace(/[\u201D]/g, '”'); text = text.replace(/([\w]+)=&#[\d]+;(.+?)&#[\d]+;/g, '$1="$2"'); // untexturize allowed HTML tags params double-quotes return $.trim(text); }, initSlides : function(items, start_index){ var width = this.jp_carousel('slideDimensions').width, x = 0; if ( items.length < 2 ) { $( '.jp-carousel-next-button, .jp-carousel-previous-button' ).hide(); } else { $( '.jp-carousel-next-button, .jp-carousel-previous-button' ).show(); } // Calculate the new src. items.each(function(i){ var src_item = $(this), orig_size = src_item.data('orig-size') || '', max = gallery.jp_carousel('slideDimensions'), parts = orig_size.split(','); orig_size = {width: parseInt(parts[0], 10), height: parseInt(parts[1], 10)}, medium_file = src_item.data('medium-file') || '', large_file = src_item.data('large-file') || ''; // @start-hide-in-jetpack if ( 'undefined' != typeof wpcom ) { src = src_item.attr('src') || src_item.attr('original') || src_item.data('original') || src_item.data('lazy-src'); if (src.indexOf("imgpress") != -1) src = src_item.data('orig-file'); src = wpcom.carousel.addWidthToImageURL( src, wpcom.carousel.findFirstLargeEnoughWidth( orig_size.width, orig_size.height, max.width, max.height ) ); } else { // @end-hide-in-jetpack src = src_item.data('orig-file'); src = gallery.jp_carousel('selectBestImageSize', { orig_file : src, orig_width : orig_size.width, orig_height : orig_size.height, max_width : max.width, max_height : max.height, medium_file : medium_file, large_file : large_file }); // @start-hide-in-jetpack } // end else of if ( 'undefined' != typeof wpcom ) // @end-hide-in-jetpack // Set the final src $(this).data( 'gallery-src', src ); }); // If the start_index is not 0 then preload the clicked image first. if ( 0 !== start_index ) $('')[0].src = $(items[start_index]).data('gallery-src'); var useInPageThumbnails = items.first().closest( '.tiled-gallery.type-rectangular' ).length > 0; // create the 'slide' items.each(function(i){ var src_item = $(this), liked = src_item.data('liked') || 0, // @hide-in-jetpack reblogged = src_item.data( 'reblogged' ) || 0, // @hide-in-jetpack attachment_id = src_item.data('attachment-id') || 0, comments_opened = src_item.data('comments-opened') || 0, image_meta = src_item.data('image-meta') || {}, orig_size = src_item.data('orig-size') || '', thumb_size = { width : src_item[0].naturalWidth, height : src_item[0].naturalHeight }, title = src_item.data('image-title') || '', description = src_item.data('image-description') || '', caption = src_item.parents('dl').find('dd.gallery-caption').html() || '', src = src_item.data('gallery-src') || '', medium_file = src_item.data('medium-file') || '', large_file = src_item.data('large-file') || '', orig_file = src_item.data('orig-file') || ''; var tiledCaption = src_item.parents('div.tiled-gallery-item').find('div.tiled-gallery-caption').html(); if ( tiledCaption ) caption = tiledCaption; if ( attachment_id && orig_size.length ) { title = gallery.jp_carousel('texturize', title); description = gallery.jp_carousel('texturize', description); caption = gallery.jp_carousel('texturize', caption); // Initially, the image is a 1x1 transparent gif. The preview is shown as a background image on the slide itself. var image = $( '' ) .attr( 'src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' ) .css( 'width', '100%' ) .css( 'height', '100%' ); var slide = $('') .hide() .css({ //'position' : 'fixed', 'left' : i < start_index ? -1000 : gallery.width() }) .append( image ) .appendTo(gallery) .data('src', src ) .data('title', title) .data('desc', description) .data('caption', caption) .data('attachment-id', attachment_id) .data('permalink', src_item.parents('a').attr('href')) .data('orig-size', orig_size) .data('comments-opened', comments_opened) .data('image-meta', image_meta) .data('medium-file', medium_file) .data('large-file', large_file) .data('orig-file', orig_file) .data('thumb-size', thumb_size) .data('liked', liked) // @hide-in-jetpack .data( 'reblogged', reblogged ) // @hide-in-jetpack ; if ( useInPageThumbnails ) { // Use the image already loaded in the gallery as a preview. slide .data( 'preview-image', src_item.attr( 'src' ) ) .css( { 'background-image' : 'url("' + src_item.attr( 'src' ) + '")', 'background-size' : '100% 100%', 'background-position' : 'center center' } ); } slide.jp_carousel( 'fitSlide', false ); } }); return this; }, selectBestImageSize: function(args) { if ( 'object' != typeof args ) args = {}; if ( 'undefined' == typeof args.orig_file ) return ''; if ( 'undefined' == typeof args.orig_width || 'undefined' == typeof args.max_width ) return args.orig_file; if ( 'undefined' == typeof args.medium_file || 'undefined' == typeof args.large_file ) return args.orig_file; var medium_size = args.medium_file.replace(/-([\d]+x[\d]+)\..+$/, '$1'), medium_size_parts = (medium_size != args.medium_file) ? medium_size.split('x') : [args.orig_width, 0], medium_width = parseInt( medium_size_parts[0], 10 ), medium_height = parseInt( medium_size_parts[1], 10 ), large_size = args.large_file.replace(/-([\d]+x[\d]+)\..+$/, '$1'), large_size_parts = (large_size != args.large_file) ? large_size.split('x') : [args.orig_width, 0], large_width = parseInt( large_size_parts[0], 10 ), large_height = parseInt( large_size_parts[1], 10 ); // Give devices with a higher devicePixelRatio higher-res images (Retina display = 2, Android phones = 1.5, etc) if ('undefined' != typeof window.devicePixelRatio && window.devicePixelRatio > 1) { args.max_width = args.max_width * window.devicePixelRatio; args.max_height = args.max_height * window.devicePixelRatio; } if ( large_width >= args.max_width || large_height >= args.max_height ) return args.large_file; if ( medium_width >= args.max_width || medium_height >= args.max_height ) return args.medium_file; return args.orig_file; }, // @start-hide-in-jetpack show_reblog_box: function() { $('#carousel-reblog-box textarea').val(jetpackCarouselStrings.reblog_add_thoughts); //t.addClass('selected'); $('#carousel-reblog-box p.response').remove(); $('#carousel-reblog-box div.submit, #carousel-reblog-box div.submit span.canceltext').show(); $('#carousel-reblog-box div.submit input[type=submit]').prop('disabled', false); var current = $('.jp-carousel div.selected'); $('#carousel-reblog-box input#carousel-reblog-post-url').val( current.data('permalink') ); $('#carousel-reblog-box input#carousel-reblog-post-title').val( $('div.jp-carousel-info').children('h2').text() ); $('div.jp-carousel-info').append( $('#carousel-reblog-box') ).children().fadeOut('fast'); $('#carousel-reblog-box').fadeIn('fast'); }, hide_reblog_box: function () { $( 'div.jp-carousel-info' ).children().not( '#carousel-reblog-box' ).fadeIn( 'fast' ); $( '#carousel-reblog-box' ).fadeOut( 'fast' ); }, // @end-hide-in-jetpack originalDimensions: function() { var splitted = $(this).data('orig-size').split(','); return {width: parseInt(splitted[0], 10), height: parseInt(splitted[1], 10)}; }, format: function( args ) { if ( 'object' != typeof args ) args = {}; if ( ! args.text || 'undefined' == typeof args.text ) return; if ( ! args.replacements || 'undefined' == typeof args.replacements ) return args.text; return args.text.replace(/{(\d+)}/g, function(match, number) { return typeof args.replacements[number] != 'undefined' ? args.replacements[number] : match; }); }, shutterSpeed: function(d) { if (d >= 1) return Math.round(d) + 's'; var df = 1, top = 1, bot = 1; var limit = 1e3; while (df != d && limit-- > 0) { if (df < d) { top += 1; } else { bot += 1; top = parseInt(d * bot, 10); } df = top / bot; } if (top > 1) { bot = Math.round(bot / top); top = 1; } if (bot <= 1) return '1s'; return top + '/' + bot + 's'; }, parseTitleDesc: function( value ) { if ( !value.match(' ') && value.match('_') ) return ''; // Prefix list originally based on http://commons.wikimedia.org/wiki/MediaWiki:Filename-prefix-blacklist var prefixes = $([ 'CIMG', // Casio 'DSC_', // Nikon 'DSCF', // Fuji 'DSCN', // Nikon 'DUW', // some mobile phones 'GEDC', // GE 'IMG', // generic 'JD', // Jenoptik 'MGP', // Pentax 'PICT', // misc. 'Imagen', // misc. 'Foto', // misc. 'DSC', // misc. 'Scan', // Scanners 'SANY', // Sanyo 'SAM', // Samsung 'Screen Shot [0-9]+' // Mac screenshots ]) .each(function(key, val){ regex = new RegExp('^' + val); if ( regex.test(value) ) { value = ''; return; } }); return value; }, getTitleDesc: function( data ) { var title ='', desc = '', markup = '', target, commentWrappere; target = $( 'div.jp-carousel-titleanddesc', 'div.jp-carousel-wrap' ); target.hide(); title = gallery.jp_carousel('parseTitleDesc', data.title) || ''; desc = gallery.jp_carousel('parseTitleDesc', data.desc) || ''; if ( title.length || desc.length ) { // $('
').text(sometext).html() is a trick to go to HTML to plain text (including HTML entities decode, etc) if ( $('
').text(title).html() == $('
').text(desc).html() ) title = ''; markup = ( title.length ) ? '' : ''; markup += ( desc.length ) ? '' : ''; target.html( markup ).fadeIn('slow'); } $( 'div#jp-carousel-comment-form-container' ).css('margin-top', '20px'); $( 'div#jp-carousel-comments-loading' ).css('margin-top', '20px'); }, updateLikesWidgetVisibility: function ( attachmentId ) { // Only do this if likes is enabled if ( "undefined" === typeof jetpackLikesWidgetQueue ) return; // Hide all likes widgets except for the one for the attachmentId passed in $( '.jp-carousel-buttons .jetpack-likes-widget-wrapper' ).css( 'display', 'none' ).each( function () { var widgetWrapper = $( this ); if ( widgetWrapper.attr( 'data-attachment-id' ) == attachmentId ) { widgetWrapper.css( 'display', 'inline-block' ); return false; } }); }, loadLikes : function ( attachmentId ) { var dataCarouselExtra = $( '.jp-carousel-wrap' ).data( 'carousel-extra' ); var blogId = dataCarouselExtra.likes_blog_id; if ( $( "#like-post-wrapper-" + blogId + "-" + attachmentId ).length == 0 ) { // Add the iframe the first time the slide is shown. var protocol = 'http'; var originDomain = 'http://wordpress.com'; if ( dataCarouselExtra.permalink.length ) { var protocol = dataCarouselExtra.permalink.split( ':' )[0]; if ( ( protocol != 'http' ) && ( protocol != 'https' ) ) protocol = 'http'; var parts = dataCarouselExtra.permalink.split( '/' ); if ( parts.length >= 2 ) originDomain = protocol + "://" + parts[2]; } var dataSource = protocol + "://widgets.wp.com/likes/#blog_id=" + encodeURIComponent( blogId ) + "&post_id=" + encodeURIComponent( attachmentId ) + "&slim=1&origin=" + encodeURIComponent( originDomain ); if ( 'en' !== jetpackCarouselStrings.lang ) dataSource += "&lang=" + encodeURIComponent( jetpackCarouselStrings.lang ); var likesWidget = $( "" ) .attr( "name", "like-post-frame-" + blogId + "-" + attachmentId ) .attr( 'src', dataSource ) .css( "display", "inline-block" ); var likesWidgetWrapper = $( "
" ) .addClass( "jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded slim-likes-widget" ) .attr( "id", "like-post-wrapper-" + blogId + "-" + attachmentId ) .attr( "data-src", dataSource ) .attr( "data-name", "like-post-frame-" + blogId + "-" + attachmentId ) .attr( "data-attachment-id", attachmentId ) .css( "display", "none" ) .css( "vertical-align", "middle" ) .append( likesWidget ) .append( "
" ); $( '.jp-carousel-buttons' ).append( likesWidgetWrapper ); } }, // updateExif updates the contents of the exif UL (.jp-carousel-image-exif) updateExif: function( meta ) { if ( !meta || 1 != jetpackCarouselStrings.display_exif ) return false; var $ul = $( "" ); $.each( meta, function( key, val ) { if ( 0 === parseFloat(val) || !val.length || -1 === $.inArray( key, [ 'camera', 'aperture', 'shutter_speed', 'focal_length' ] ) ) return; switch( key ) { case 'focal_length': val = val + 'mm'; break; case 'shutter_speed': val = gallery.jp_carousel('shutterSpeed', val); break; case 'aperture': val = 'f/' + val; break; } $ul.append( '
  • ' + jetpackCarouselStrings[key] + '
    ' + val + '
  • ' ); }); // Update (replace) the content of the ul $( 'div.jp-carousel-image-meta ul.jp-carousel-image-exif' ).replaceWith( $ul ); }, // updateFullSizeLink updates the contents of the jp-carousel-image-download link updateFullSizeLink: function(current) { if(!current || !current.data) return false; var original = current.data('orig-file').replace(/\?.+$/, ''), origSize = current.data('orig-size').split(','), permalink = $( ''+gallery.jp_carousel('format', {'text': jetpackCarouselStrings.download_original, 'replacements': origSize})+'' ) .addClass( 'jp-carousel-image-download' ) .attr( 'href', original ) .attr( 'target', '_blank' ); // Update (replace) the content of the anchor $( 'div.jp-carousel-image-meta a.jp-carousel-image-download' ).replaceWith( permalink ); }, updateMap: function( meta ) { if ( !meta.latitude || !meta.longitude || 1 != jetpackCarouselStrings.display_geo ) return; var latitude = meta.latitude, longitude = meta.longitude, $metabox = $( 'div.jp-carousel-image-meta', 'div.jp-carousel-wrap' ), $mapbox = $( '
    ' ), style = '&scale=2&style=feature:all|element:all|invert_lightness:true|hue:0x0077FF|saturation:-50|lightness:-5|gamma:0.91'; $mapbox .addClass( 'jp-carousel-image-map' ) .html( '\ \
    \ \ ' ) .prependTo( $metabox ); }, testCommentsOpened: function( opened ) { if ( 1 == parseInt( opened, 10 ) ) { // @start-hide-in-jetpack if ( 1 == jetpackCarouselStrings.is_logged_in ) $('.jp-carousel-commentlink').fadeIn('fast'); else // @end-hide-in-jetpack $('.jp-carousel-buttons').fadeIn('fast'); commentForm.fadeIn('fast'); } else { // @start-hide-in-jetpack if ( 1 == jetpackCarouselStrings.is_logged_in ) $('.jp-carousel-commentlink').fadeOut('fast'); else // @end-hide-in-jetpack $('.jp-carousel-buttons').fadeOut('fast'); commentForm.fadeOut('fast'); } }, getComments: function( args ) { clearInterval( commentInterval ); if ( 'object' != typeof args ) return; if ( 'undefined' == typeof args.attachment_id || ! args.attachment_id ) return; if ( ! args.offset || 'undefined' == typeof args.offset || args.offset < 1 ) args.offset = 0; var comments = $('.jp-carousel-comments'), commentsLoading = $('#jp-carousel-comments-loading').show(); if ( args.clear ) comments.hide().empty(); $.ajax({ type: 'GET', url: jetpackCarouselStrings.ajaxurl, dataType: 'json', data: { action: 'get_attachment_comments', nonce: jetpackCarouselStrings.nonce, id: args.attachment_id, offset: args.offset }, success: function(data, status, xhr) { if ( args.clear ) comments.fadeOut('fast').empty(); $( data ).each(function(){ var comment = $('
    ') .addClass('jp-carousel-comment') .attr('id', 'jp-carousel-comment-' + this['id']) .html( '
    ' + this['gravatar_markup'] + '
    ' + '
    ' + this['author_markup'] + '
    ' + '
    ' + this['date_gmt'] + '
    ' + '
    ' + this['content'] + '
    ' ); comments.append(comment); // Set the interval to check for a new page of comments. clearInterval( commentInterval ); commentInterval = setInterval( function() { if ( ( $('.jp-carousel-overlay').height() - 150 ) < $('.jp-carousel-wrap').scrollTop() + $(window).height() ) { gallery.jp_carousel('getComments',{ attachment_id: args.attachment_id, offset: args.offset + 10, clear: false }); clearInterval( commentInterval ); } }, 300 ); }); // Verify (late) that the user didn't repeatldy click the arrows really fast, in which case the requested // attachment id might no longer match the current attachment id by the time we get the data back or a now // registered infiniscroll event kicks in, so we don't ever display comments for the wrong image by mistake. var current = $('.jp-carousel div.selected'); if ( current && current.data && current.data('attachment-id') != args.attachment_id ) { comments.fadeOut('fast'); comments.empty(); return; } // Increase the height of the background, semi-transparent overlay to match the new length of the comments list. $('.jp-carousel-overlay').height( $(window).height() + titleAndDescription.height() + commentForm.height() + ( (comments.height() > 0) ? comments.height() : imageMeta.height() ) + 200 ); comments.show(); commentsLoading.hide(); }, error: function(xhr, status, error) { // TODO: proper error handling console.log( 'Comment get fail...', xhr, status, error ); comments.fadeIn('fast'); commentsLoading.fadeOut('fast'); } }); }, postCommentError: function(args) { if ( 'object' != typeof args ) args = {}; if ( ! args.field || 'undefined' == typeof args.field || ! args.error || 'undefined' == typeof args.error ) return; $('#jp-carousel-comment-post-results').slideUp('fast').html('').slideDown('fast'); $('#jp-carousel-comment-form-spinner').spin(false); }, setCommentIframeSrc: function(attachment_id) { var iframe = $('#jp-carousel-comment-iframe'); // Set the proper irame src for the current attachment id if (iframe && iframe.length) { iframe.attr('src', iframe.attr('src').replace(/(postid=)\d+/, '$1'+attachment_id) ); iframe.attr('src', iframe.attr('src').replace(/(%23.+)?$/, '%23jp-carousel-'+attachment_id) ); } }, clearCommentTextAreaValue: function() { var commentTextArea = $('#jp-carousel-comment-form-comment-field'); if ( commentTextArea ) commentTextArea.val(''); }, nextSlide : function () { var slides = this.jp_carousel( 'slides' ); var selected = this.jp_carousel( 'selectedSlide' ); if ( selected.length == 0 || ( slides.length > 2 && selected.is( slides.last() ) ) ) return slides.first(); return selected.next(); }, prevSlide : function () { var slides = this.jp_carousel( 'slides' ); var selected = this.jp_carousel( 'selectedSlide' ); if ( selected.length == 0 || ( slides.length > 2 && selected.is( slides.first() ) ) ) return slides.last(); return selected.prev(); }, loadFullImage : function ( slide ) { var image = slide.find( 'img:first' ); if ( ! image.data( 'loaded' ) ) { // If the width of the slide is smaller than the width of the "thumbnail" we're already using, // don't load the full image. image.on( 'load.jetpack', function () { image.off( 'load.jetpack' ); $( this ).closest( '.jp-carousel-slide' ).css( 'background-image', '' ); } ); if ( ! slide.data( 'preview-image' ) || ( slide.data( 'thumb-size' ) && slide.width() > slide.data( 'thumb-size' ).width ) ) image.attr( 'src', image.closest( '.jp-carousel-slide' ).data( 'src' ) ); else image.attr( 'src', slide.data( 'preview-image' ) ); image.data( 'loaded', 1 ); } } }; $.fn.jp_carousel = function(method){ // ask for the HTML of the gallery // Method calling logic if ( methods[method] ) { return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.open.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.jp_carousel' ); } }; // register the event listener for starting the gallery $( document.body ).on( 'click', 'div.gallery,div.tiled-gallery', function(e) { if ( ! $(this).jp_carousel( 'testForData', e.currentTarget ) ) return; if ( $(e.target).parent().hasClass('gallery-caption') ) return; e.preventDefault(); $(this).jp_carousel('open', {start_index: $(this).find('.gallery-item, .tiled-gallery-item').index($(e.target).parents('.gallery-item, .tiled-gallery-item'))}); }); // Makes carousel work on page load and when back button leads to same URL with carousel hash (ie: no actual document.ready trigger) $( window ).on( 'hashchange', function () { if ( ! window.location.hash || ! window.location.hash.match(/jp-carousel-(\d+)/) ) return; if ( window.location.hash == last_known_location_hash ) return; last_known_location_hash = window.location.hash; var gallery = $('div.gallery, div.tiled-gallery'), index = -1, n = window.location.hash.match(/jp-carousel-(\d+)/); if ( ! $(this).jp_carousel( 'testForData', gallery ) ) return; n = parseInt(n[1], 10); gallery.find('img').each(function(num, el){ if ( n && $(el).data('attachment-id') == n ) { // n cannot be 0 (zero) index = num; return false; } }); if ( index != -1 ) gallery.jp_carousel('open', {start_index: index}); // open method checks if already opened }); if ( window.location.hash ) $( window ).trigger( 'hashchange' ); }); /** * jQuery Plugin to obtain touch gestures from iPhone, iPod Touch and iPad, should also work with Android mobile phones (not tested yet!) * Common usage: wipe images (left and right to show the previous or next image) * * @author Andreas Waltl, netCU Internetagentur (http://www.netcu.de) * Version 1.1.1, modified to pass the touchmove event to the callbacks. */ (function($) { $.fn.touchwipe = function(settings) { var config = { min_move_x: 20, min_move_y: 20, wipeLeft: function(e) { }, wipeRight: function(e) { }, wipeUp: function(e) { }, wipeDown: function(e) { }, preventDefaultEvents: true }; if (settings) $.extend(config, settings); this.each(function() { var startX; var startY; var isMoving = false; function cancelTouch() { this.removeEventListener('touchmove', onTouchMove); startX = null; isMoving = false; } function onTouchMove(e) { if(config.preventDefaultEvents) { e.preventDefault(); } if(isMoving) { var x = e.touches[0].pageX; var y = e.touches[0].pageY; var dx = startX - x; var dy = startY - y; if(Math.abs(dx) >= config.min_move_x) { cancelTouch(); if(dx > 0) { config.wipeLeft(e); } else { config.wipeRight(e); } } else if(Math.abs(dy) >= config.min_move_y) { cancelTouch(); if(dy > 0) { config.wipeDown(e); } else { config.wipeUp(e); } } } } function onTouchStart(e) { if (e.touches.length == 1) { startX = e.touches[0].pageX; startY = e.touches[0].pageY; isMoving = true; this.addEventListener('touchmove', onTouchMove, false); } } if ('ontouchstart' in document.documentElement) { this.addEventListener('touchstart', onTouchStart, false); } }); return this; }; })(jQuery);; ( function($) { var TiledGallery = function() { this.resizeTimeout = null; this.populate(); var self = this; $( window ).on( 'resize', function () { clearTimeout( self.resizeTimeout ); self.resizeTimeout = setTimeout( function () { self.resize(); }, 150 ); } ); // Make any new galleries loaded by Infinite Scroll flexible $( 'body' ).on( 'post-load', $.proxy( self.initialize, self ) ); // Populate and set up captions on newdash galleries. $( document ).on( 'page-rendered.wpcom-newdash', $.proxy( self.populate, self ) ); this.resize(); }; TiledGallery.prototype.populate = function() { this.gallery = $( '.tiled-gallery' ); this.item = this.gallery.find( '.tiled-gallery-item' ); this.caption = this.gallery.find( '.tiled-gallery-caption' ); this.Captions(); }; TiledGallery.prototype.initialize = function() { var self = this; self.populate(); // After each image load, run resize in case all images in the gallery are loaded. self.gallery.find( 'img' ).off( 'load.tiled-gallery' ).on( 'load.tiled-gallery', function () { self.resize(); } ); // Run resize now in case all images loaded from cache. self.resize(); }; /** * Story */ TiledGallery.prototype.Captions = function() { /* Hide captions */ this.caption.hide(); this.item.hover( function() { $( this ).find( '.tiled-gallery-caption' ).slideDown( 'fast' ); }, function() { $( this ).find( '.tiled-gallery-caption' ).slideUp( 'fast' ); } ); }; TiledGallery.prototype.resize = function() { var resizeableElements = '.gallery-row, .gallery-group, .tiled-gallery-item img'; this.gallery.each( function ( galleryIndex, galleryElement ) { var thisGallery = $( galleryElement ); // All images must be loaded before proceeding. var imagesLoaded = true; thisGallery.find( 'img' ).each( function () { if ( ! this.complete ) { imagesLoaded = false; return false; } } ); if ( ! imagesLoaded ) { var loadCallback = arguments.callee; // Once all of the images have loaded, // re-call this containing function. $( window ).load( function () { loadCallback( null, thisGallery ); } ); return; } if ( ! thisGallery.data( 'sizes-set' ) ) { // Maintain a record of the original widths and heights of these elements // for proper scaling. thisGallery.data( 'sizes-set', true ); thisGallery.find( resizeableElements ).each( function () { var thisGalleryElement = $( this ); // Don't change margins, but remember what they were so they can be // accounted for in size calculations. When the screen width gets // small enough, ignoring the margins can cause images to overflow // into new rows. var extraWidth = ( parseInt( thisGalleryElement.css( 'marginLeft' ), 10 ) || 0 ) + ( parseInt( thisGalleryElement.css( 'marginRight' ), 10 ) || 0 ); var extraHeight = ( parseInt( thisGalleryElement.css( 'marginTop' ), 10 ) || 0 ) + ( parseInt( thisGalleryElement.css( 'marginBottom' ), 10 ) || 0 ) // In some situations, tiled galleries in Firefox have shown scrollbars on the images because // the .outerWidth() call on the image returns a value larger than the container. Restrict // widths used in the resizing functions to the maximum width of the container. var parentElement = $( thisGalleryElement.parents( resizeableElements ).get( 0 ) ); if ( parentElement && parentElement.data( 'original-width' ) ) { thisGalleryElement .data( 'original-width', Math.min( parentElement.data( 'original-width' ), thisGalleryElement.outerWidth( true ) ) ) .data( 'original-height', Math.min( parentElement.data( 'original-height' ), thisGalleryElement.outerHeight( true ) ) ); } else { thisGalleryElement .data( 'original-width', thisGalleryElement.outerWidth( true ) ) .data( 'original-height', thisGalleryElement.outerHeight( true ) ); } thisGalleryElement .data( 'extra-width', extraWidth ) .data( 'extra-height', extraHeight ); } ); } // Resize everything in the gallery based on the ratio of the current content width // to the original content width; var originalWidth = thisGallery.data( 'original-width' ); var currentWidth = thisGallery.parent().width(); var resizeRatio = Math.min( 1, currentWidth / originalWidth ); thisGallery.find( resizeableElements ).each( function () { var thisGalleryElement = $( this ); thisGalleryElement .width( Math.floor( resizeRatio * thisGalleryElement.data( 'original-width' ) ) - thisGalleryElement.data( 'extra-width' ) ) .height( Math.floor( resizeRatio * thisGalleryElement.data( 'original-height' ) ) - thisGalleryElement.data( 'extra-height' ) ); } ); thisGallery.removeClass( 'tiled-gallery-unresized' ); } ); }; /** * Ready, set... */ $( document ).ready( function() { // Instance! var TiledGalleryInstance = new TiledGallery; }); })(jQuery);; var WPCOMSharing = { done_urls : [], get_counts : function( url ) { if ( 'undefined' != typeof WPCOMSharing.done_urls[ WPCOM_sharing_counts[ url ] ] ) return; if ( jQuery( '#sharing-facebook-' + WPCOM_sharing_counts[ url ] ).length ) jQuery.getScript( 'https://api.facebook.com/method/fql.query?query=' + encodeURIComponent( "SELECT total_count, url FROM link_stat WHERE url='" + url + "'" ) + '&format=json&callback=WPCOMSharing.update_facebook_count' ); if ( jQuery( '#sharing-twitter-' + WPCOM_sharing_counts[ url ] ).length ) jQuery.getScript( window.location.protocol + '//cdn.api.twitter.com/1/urls/count.json?callback=WPCOMSharing.update_twitter_count&url=' + encodeURIComponent( url ) ); if ( jQuery( '#sharing-linkedin-' + WPCOM_sharing_counts[ url ] ).length ) jQuery.getScript( window.location.protocol + '//www.linkedin.com/countserv/count/share?format=jsonp&callback=WPCOMSharing.update_linkedin_count&url=' + encodeURIComponent( url ) ); WPCOMSharing.done_urls[ WPCOM_sharing_counts[ url ] ] = true; }, update_facebook_count : function( data ) { if ( 'undefined' != typeof data[0].total_count && ( data[0].total_count * 1 ) > 0 ) { WPCOMSharing.inject_share_count( 'sharing-facebook-' + WPCOM_sharing_counts[ data[0].url ], data[0].total_count ); } }, update_twitter_count : function( data ) { if ( 'undefined' != typeof data.count && ( data.count * 1 ) > 0 ) { WPCOMSharing.inject_share_count( 'sharing-twitter-' + WPCOM_sharing_counts[ data.url ], data.count ); } }, update_linkedin_count : function( data ) { if ( 'undefined' != typeof data.count && ( data.count * 1 ) > 0 ) { WPCOMSharing.inject_share_count( 'sharing-linkedin-' + WPCOM_sharing_counts[ data.url ], data.count ); } }, inject_share_count : function( dom_id, count ) { jQuery( '#' + dom_id + ' span' ).append( '' ); }, format_count : function( count ) { if ( count < 1000 ) return count; if ( count >= 1000 && count < 10000 ) return String( count ).substring( 0, 1 ) + 'K+'; return '10K+'; } }; (function($){ $.fn.extend( { share_is_email: function( value ) { return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test( this.val() ); } } ); $( document ).on( 'ready', WPCOMSharing_do ); $( document.body ).on( 'post-load', WPCOMSharing_do ); function WPCOMSharing_do() { if ( 'undefined' != typeof WPCOM_sharing_counts ) { for ( var url in WPCOM_sharing_counts ) { WPCOMSharing.get_counts( url ); } } var $more_sharing_buttons = $( '.sharedaddy a.sharing-anchor' ); $more_sharing_buttons.click( function() { return false; } ); $( '.sharedaddy a' ).each( function() { if ( $( this ).attr( 'href' ) && $( this ).attr( 'href' ).indexOf( 'share=' ) != -1 ) $( this ).attr( 'href', $( this ).attr( 'href' ) + '&nb=1' ); } ); // Show hidden buttons // Touchscreen device: use click. // Non-touchscreen device: use click if not already appearing due to a hover event $more_sharing_buttons.on( 'click', function() { var $more_sharing_button = $( this ), $more_sharing_pane = $more_sharing_button.parents( 'div:first' ).find( '.inner' ); if ( $more_sharing_pane.is( ':animated' ) ) { // We're in the middle of some other event's animation return; } if ( true === $more_sharing_pane.data( 'justSlid' ) ) { // We just finished some other event's animation - don't process click event so that slow-to-react-clickers don't get confused return; } $( '#sharing_email' ).slideUp( 200 ); $more_sharing_pane.css( { left: $more_sharing_button.position().left + 'px', top: $more_sharing_button.position().top + $more_sharing_button.height() + 3 + 'px' } ).slideToggle( 200 ); } ); if ( document.ontouchstart === undefined ) { // Non-touchscreen device: use hover/mouseout with delay $more_sharing_buttons.hover( function() { var $more_sharing_button = $( this ), $more_sharing_pane = $more_sharing_button.parents( 'div:first' ).find( '.inner' ); if ( !$more_sharing_pane.is( ':animated' ) ) { // Create a timer to make the area appear if the mouse hovers for a period var timer = setTimeout( function() { $( '#sharing_email' ).slideUp( 200 ); $more_sharing_pane.data( 'justSlid', true ); $more_sharing_pane.css( { left: $more_sharing_button.position().left + 'px', top: $more_sharing_button.position().top + $more_sharing_button.height() + 3 + 'px' } ).slideDown( 200, function() { // Mark the item as have being appeared by the hover $more_sharing_button.data( 'hasoriginal', true ).data( 'hasitem', false ); setTimeout( function() { $more_sharing_pane.data( 'justSlid', false ); }, 300 ); if ( $more_sharing_pane.find( '.share-google-plus-1' ).size() ) { // The pane needs to stay open for the Google+ Button return; } $more_sharing_pane.mouseleave( handler_item_leave ).mouseenter( handler_item_enter ); $more_sharing_button.mouseleave( handler_original_leave ).mouseenter( handler_original_enter ); } ); // The following handlers take care of the mouseenter/mouseleave for the share button and the share area - if both are left then we close the share area var handler_item_leave = function() { $more_sharing_button.data( 'hasitem', false ); if ( $more_sharing_button.data( 'hasoriginal' ) === false ) { var timer = setTimeout( close_it, 800 ); $more_sharing_button.data( 'timer2', timer ); } }; var handler_item_enter = function() { $more_sharing_button.data( 'hasitem', true ); clearTimeout( $more_sharing_button.data( 'timer2' ) ); } var handler_original_leave = function() { $more_sharing_button.data( 'hasoriginal', false ); if ( $more_sharing_button.data( 'hasitem' ) === false ) { var timer = setTimeout( close_it, 800 ); $more_sharing_button.data( 'timer2', timer ); } }; var handler_original_enter = function() { $more_sharing_button.data( 'hasoriginal', true ); clearTimeout( $more_sharing_button.data( 'timer2' ) ); }; var close_it = function() { $more_sharing_pane.data( 'justSlid', true ); $more_sharing_pane.slideUp( 200, function() { setTimeout( function() { $more_sharing_pane.data( 'justSlid', false ); }, 300 ); } ); // Clear all hooks $more_sharing_button.unbind( 'mouseleave', handler_original_leave ).unbind( 'mouseenter', handler_original_enter ); $more_sharing_pane.unbind( 'mouseleave', handler_item_leave ).unbind( 'mouseenter', handler_item_leave ); return false; }; }, 200 ); // Remember the timer so we can detect it on the mouseout $more_sharing_button.data( 'timer', timer ); } }, function() { // Mouse out - remove any timer $more_sharing_buttons.each( function() { clearTimeout( $( this ).data( 'timer' ) ); } ); $more_sharing_buttons.data( 'timer', false ); } ); } // Add click functionality $( '.sharedaddy ul' ).each( function( item ) { if ( 'yep' == $( this ).data( 'has-click-events' ) ) return; $( this ).data( 'has-click-events', 'yep' ); printUrl = function ( uniqueId, urlToPrint ) { $( 'body:first' ).append( '' ) }; // Print button $( this ).find( 'a.share-print' ).click( function() { ref = $( this ).attr( 'href' ); var do_print = function() { if ( ref.indexOf( '#print' ) == -1 ) { uid = new Date().getTime(); printUrl( uid , ref ); } else print(); } // Is the button in a dropdown? if ( $( this ).parents( '.sharing-hidden' ).length > 0 ) { $( this ).parents( '.inner' ).slideUp( 0, function() { do_print(); } ); } else do_print(); return false; } ); // Press This button $( this ).find( 'a.share-press-this' ).click( function() { var s = ''; if ( window.getSelection ) s = window.getSelection(); else if( document.getSelection ) s = document.getSelection(); else if( document.selection ) s = document.selection.createRange().text; if ( s ) $( this ).attr( 'href', $( this ).attr( 'href' ) + '&sel=' + encodeURI( s ) ); if ( !window.open( $( this ).attr( 'href' ), 't', 'toolbar=0,resizable=1,scrollbars=1,status=1,width=720,height=570' ) ) document.location.href = $( this ).attr( 'href' ); return false; } ); // Email button $( 'a.share-email', this ).on( 'click', function() { var url = $( this ).attr( 'href' ), key; if ( $( '#sharing_email' ).is( ':visible' ) ) $( '#sharing_email' ).slideUp( 200 ); else { $( '.sharedaddy .inner' ).slideUp(); $( '#sharing_email .response' ).remove(); $( '#sharing_email form' ).show(); $( '#sharing_email form input[type=submit]' ).removeAttr( 'disabled' ); $( '#sharing_email form a.sharing_cancel' ).show(); key = ''; if ( $( '#recaptcha_public_key' ).length > 0 ) key = $( '#recaptcha_public_key' ).val(); // Update the recaptcha Recaptcha.create( key, 'sharing_recaptcha', { lang : recaptcha_options.lang } ); // Show dialog $( '#sharing_email' ).css( { left: $( this ).offset().left + 'px', top: $( this ).offset().top + $( this ).height() + 'px' } ).slideDown( 200 ); // Hook up other buttons $( '#sharing_email a.sharing_cancel' ).unbind( 'click' ).click( function() { $( '#sharing_email .errors' ).hide(); $( '#sharing_email' ).slideUp( 200 ); $( '#sharing_background' ).fadeOut(); return false; } ); // Submit validation $( '#sharing_email input[type=submit]' ).unbind( 'click' ).click( function() { var form = $( this ).parents( 'form' ); // Disable buttons + enable loading icon $( this ).prop( 'disabled', true ); form.find( 'a.sharing_cancel' ).hide(); form.find( 'img.loading' ).show(); $( '#sharing_email .errors' ).hide(); $( '#sharing_email .error' ).removeClass( 'error' ); if ( $( '#sharing_email input[name=source_email]' ).share_is_email() == false ) $( '#sharing_email input[name=source_email]' ).addClass( 'error' ); if ( $( '#sharing_email input[name=target_email]' ).share_is_email() == false ) $( '#sharing_email input[name=target_email]' ).addClass( 'error' ); if ( $( '#sharing_email .error' ).length == 0 ) { // AJAX send the form $.ajax( { url: url, type: 'POST', data: form.serialize(), success: function( response ) { form.find( 'img.loading' ).hide(); if ( response == '1' || response == '2' || response == '3' ) { $( '#sharing_email .errors-' + response ).show(); form.find( 'input[type=submit]' ).removeAttr( 'disabled' ); form.find( 'a.sharing_cancel' ).show(); Recaptcha.reload(); } else { $( '#sharing_email form' ).hide(); $( '#sharing_email' ).append( response ); $( '#sharing_email a.sharing_cancel' ).click( function() { $( '#sharing_email' ).slideUp( 200 ); $( '#sharing_background' ).fadeOut(); return false; } ); } } } ); return false; } form.find( 'img.loading' ).hide(); form.find( 'input[type=submit]' ).removeAttr( 'disabled' ); form.find( 'a.sharing_cancel' ).show(); $( '#sharing_email .errors-1' ).show(); return false; } ); } return false; } ); } ); $( 'li.share-email, li.share-custom a.sharing-anchor' ).addClass( 'share-service-visible' ); } })( jQuery ); // Recaptcha code var RecaptchaTemplates={};RecaptchaTemplates.VertHtml='

    ';RecaptchaTemplates.CleanCss=".recaptchatable td img{display:block}.recaptchatable .recaptcha_image_cell center img{height:57px}.recaptchatable .recaptcha_image_cell center{height:57px}.recaptchatable .recaptcha_image_cell{background-color:white;height:57px;padding:7px!important}.recaptchatable,#recaptcha_area tr,#recaptcha_area td,#recaptcha_area th{margin:0!important;border:0!important;border-collapse:collapse!important;vertical-align:middle!important}.recaptchatable *{margin:0;padding:0;border:0;color:black;position:static;top:auto;left:auto;right:auto;bottom:auto;text-align:left!important}.recaptchatable #recaptcha_image{margin:auto;border:1px solid #dfdfdf!important}.recaptchatable a img{border:0}.recaptchatable a,.recaptchatable a:hover{-moz-outline:none;border:0!important;padding:0!important;text-decoration:none;color:blue;background:none!important;font-weight:normal}.recaptcha_input_area{position:relative!important;background:none!important}.recaptchatable label.recaptcha_input_area_text{border:1px solid #dfdfdf!important;margin:0!important;padding:0!important;position:static!important;top:auto!important;left:auto!important;right:auto!important;bottom:auto!important}.recaptcha_theme_red label.recaptcha_input_area_text,.recaptcha_theme_white label.recaptcha_input_area_text{color:black!important}.recaptcha_theme_blackglass label.recaptcha_input_area_text{color:white!important}.recaptchatable #recaptcha_response_field{font-size:11pt}.recaptcha_theme_blackglass #recaptcha_response_field,.recaptcha_theme_white #recaptcha_response_field{border:1px solid gray}.recaptcha_theme_red #recaptcha_response_field{border:1px solid #cca940}.recaptcha_audio_cant_hear_link{font-size:7pt;color:black}.recaptchatable{line-height:1em;border:1px solid #dfdfdf!important}.recaptcha_error_text{color:red}";RecaptchaTemplates.CleanHtml='
    ';RecaptchaTemplates.ContextHtml='

    ';RecaptchaTemplates.VertCss=".recaptchatable td img{display:block}.recaptchatable .recaptcha_r1_c1{background:url(IMGROOT/sprite.png) 0 -63px no-repeat;width:318px;height:9px}.recaptchatable .recaptcha_r2_c1{background:url(IMGROOT/sprite.png) -18px 0 no-repeat;width:9px;height:57px}.recaptchatable .recaptcha_r2_c2{background:url(IMGROOT/sprite.png) -27px 0 no-repeat;width:9px;height:57px}.recaptchatable .recaptcha_r3_c1{background:url(IMGROOT/sprite.png) 0 0 no-repeat;width:9px;height:63px}.recaptchatable .recaptcha_r3_c2{background:url(IMGROOT/sprite.png) -18px -57px no-repeat;width:300px;height:6px}.recaptchatable .recaptcha_r3_c3{background:url(IMGROOT/sprite.png) -9px 0 no-repeat;width:9px;height:63px}.recaptchatable .recaptcha_r4_c1{background:url(IMGROOT/sprite.png) -43px 0 no-repeat;width:171px;height:49px}.recaptchatable .recaptcha_r4_c2{background:url(IMGROOT/sprite.png) -36px 0 no-repeat;width:7px;height:57px}.recaptchatable .recaptcha_r4_c4{background:url(IMGROOT/sprite.png) -214px 0 no-repeat;width:97px;height:57px}.recaptchatable .recaptcha_r7_c1{background:url(IMGROOT/sprite.png) -43px -49px no-repeat;width:171px;height:8px}.recaptchatable .recaptcha_r8_c1{background:url(IMGROOT/sprite.png) -43px -49px no-repeat;width:25px;height:8px}.recaptchatable .recaptcha_image_cell center img{height:57px}.recaptchatable .recaptcha_image_cell center{height:57px}.recaptchatable .recaptcha_image_cell{background-color:white;height:57px}#recaptcha_area,#recaptcha_table{width:318px!important}.recaptchatable,#recaptcha_area tr,#recaptcha_area td,#recaptcha_area th{margin:0!important;border:0!important;padding:0!important;border-collapse:collapse!important;vertical-align:middle!important}.recaptchatable *{margin:0;padding:0;border:0;font-family:helvetica,sans-serif;font-size:8pt;color:black;position:static;top:auto;left:auto;right:auto;bottom:auto;text-align:left!important}.recaptchatable #recaptcha_image{margin:auto}.recaptchatable img{border:0!important;margin:0!important;padding:0!important}.recaptchatable a,.recaptchatable a:hover{-moz-outline:none;border:0!important;padding:0!important;text-decoration:none;color:blue;background:none!important;font-weight:normal}.recaptcha_input_area{position:relative!important;width:146px!important;height:45px!important;margin-left:20px!important;margin-right:5px!important;margin-top:4px!important;background:none!important}.recaptchatable label.recaptcha_input_area_text{margin:0!important;padding:0!important;position:static!important;top:auto!important;left:auto!important;right:auto!important;bottom:auto!important;background:none!important;height:auto!important;width:auto!important}.recaptcha_theme_red label.recaptcha_input_area_text,.recaptcha_theme_white label.recaptcha_input_area_text{color:black!important}.recaptcha_theme_blackglass label.recaptcha_input_area_text{color:white!important}.recaptchatable #recaptcha_response_field{width:145px!important;position:absolute!important;bottom:7px!important;padding:0!important;margin:0!important;font-size:10pt}.recaptcha_theme_blackglass #recaptcha_response_field,.recaptcha_theme_white #recaptcha_response_field{border:1px solid gray}.recaptcha_theme_red #recaptcha_response_field{border:1px solid #cca940}.recaptcha_audio_cant_hear_link{font-size:7pt;color:black}.recaptchatable{line-height:1em}#recaptcha_instructions_error{color:red!important}";var RecaptchaStr_en={visual_challenge:"Get a visual challenge",audio_challenge:"Get an audio challenge",refresh_btn:"Get a new challenge",instructions_visual:"Type the two words:",instructions_context:"Type the words in the boxes:",instructions_audio:"Type what you hear:",help_btn:"Help",play_again:"Play sound again",cant_hear_this:"Download sound as MP3",incorrect_try_again:"Incorrect. Try again."},RecaptchaStr_de={visual_challenge:"Visuelle Aufgabe generieren",audio_challenge:"Audio-Aufgabe generieren", refresh_btn:"Neue Aufgabe generieren",instructions_visual:"Gib die 2 W\u00f6rter ein:",instructions_context:"",instructions_audio:"Gib die 8 Ziffern ein:",help_btn:"Hilfe",incorrect_try_again:"Falsch. Nochmals versuchen!"},RecaptchaStr_es={visual_challenge:"Obt\u00e9n un reto visual",audio_challenge:"Obt\u00e9n un reto audible",refresh_btn:"Obt\u00e9n un nuevo reto",instructions_visual:"Escribe las 2 palabras:",instructions_context:"",instructions_audio:"Escribe los 8 n\u00fameros:",help_btn:"Ayuda", incorrect_try_again:"Incorrecto. Otro intento."},RecaptchaStr_fr={visual_challenge:"D\u00e9fi visuel",audio_challenge:"D\u00e9fi audio",refresh_btn:"Nouveau d\u00e9fi",instructions_visual:"Entrez les deux mots:",instructions_context:"",instructions_audio:"Entrez les huit chiffres:",help_btn:"Aide",incorrect_try_again:"Incorrect."},RecaptchaStr_nl={visual_challenge:"Test me via een afbeelding",audio_challenge:"Test me via een geluidsfragment",refresh_btn:"Nieuwe uitdaging",instructions_visual:"Type de twee woorden:", instructions_context:"",instructions_audio:"Type de acht cijfers:",help_btn:"Help",incorrect_try_again:"Foute invoer."},RecaptchaStr_pt={visual_challenge:"Obter um desafio visual",audio_challenge:"Obter um desafio sonoro",refresh_btn:"Obter um novo desafio",instructions_visual:"Escreva as 2 palavras:",instructions_context:"",instructions_audio:"Escreva os 8 numeros:",help_btn:"Ajuda",incorrect_try_again:"Incorrecto. Tenta outra vez."},RecaptchaStr_ru={visual_challenge:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443", audio_challenge:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0432\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443",refresh_btn:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443",instructions_visual:"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0432\u0430 \u0441\u043b\u043e\u0432\u0430:",instructions_context:"",instructions_audio:"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u043e\u0441\u0435\u043c\u044c \u0447\u0438\u0441\u0435\u043b:", help_btn:"\u041f\u043e\u043c\u043e\u0449\u044c",incorrect_try_again:"\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e."},RecaptchaStr_tr={visual_challenge:"G\u00f6rsel deneme",audio_challenge:"\u0130\u015fitsel deneme",refresh_btn:"Yeni deneme",instructions_visual:"\u0130ki kelimeyi yaz\u0131n:",instructions_context:"",instructions_audio:"Sekiz numaray\u0131 yaz\u0131n:",help_btn:"Yard\u0131m (\u0130ngilizce)",incorrect_try_again:"Yanl\u0131\u015f. Bir daha deneyin."},RecaptchaStr_it= {visual_challenge:"Modalit\u00e0 visiva",audio_challenge:"Modalit\u00e0 auditiva",refresh_btn:"Chiedi due nuove parole",instructions_visual:"Scrivi le due parole:",instructions_context:"",instructions_audio:"Trascrivi ci\u00f2 che senti:",help_btn:"Aiuto",incorrect_try_again:"Scorretto. Riprova."},RecaptchaLangMap={en:RecaptchaStr_en,de:RecaptchaStr_de,es:RecaptchaStr_es,fr:RecaptchaStr_fr,nl:RecaptchaStr_nl,pt:RecaptchaStr_pt,ru:RecaptchaStr_ru,tr:RecaptchaStr_tr,it:RecaptchaStr_it};var RecaptchaStr=RecaptchaStr_en,RecaptchaOptions,RecaptchaDefaultOptions={tabindex:0,theme:"red",callback:null,lang:"en",custom_theme_widget:null,custom_translations:null,includeContext:false},Recaptcha={widget:null,timer_id:-1,style_set:false,theme:null,type:"image",ajax_verify_cb:null,$:function(a){return typeof a=="string"?document.getElementById(a):a},create:function(a,b,c){Recaptcha.destroy();if(b)Recaptcha.widget=Recaptcha.$(b);Recaptcha._init_options(c);Recaptcha._call_challenge(a)},destroy:function(){var a= Recaptcha.$("recaptcha_challenge_field");a&&a.parentNode.removeChild(a);Recaptcha.timer_id!=-1&&clearInterval(Recaptcha.timer_id);Recaptcha.timer_id=-1;if(a=Recaptcha.$("recaptcha_image"))a.innerHTML="";if(Recaptcha.widget){if(Recaptcha.theme!="custom")Recaptcha.widget.innerHTML="";else Recaptcha.widget.style.display="none";Recaptcha.widget=null}},focus_response_field:function(){var a=Recaptcha.$;a=a("recaptcha_response_field");a.focus()},get_challenge:function(){if(typeof RecaptchaState=="undefined")return null; return RecaptchaState.challenge},get_response:function(){var a=Recaptcha.$;a=a("recaptcha_response_field");if(!a)return null;return a.value},ajax_verify:function(a){Recaptcha.ajax_verify_cb=a;a=Recaptcha._get_api_server()+"/ajaxverify?c="+encodeURIComponent(Recaptcha.get_challenge())+"&response="+encodeURIComponent(Recaptcha.get_response());Recaptcha._add_script(a)},_ajax_verify_callback:function(a){Recaptcha.ajax_verify_cb(a)},_get_api_server:function(){var a=window.location.protocol,b;b=typeof _RecaptchaOverrideApiServer!= "undefined"?_RecaptchaOverrideApiServer:"www.google.com/recaptcha/api";return a+"//"+b},_call_challenge:function(a){a=Recaptcha._get_api_server()+"/challenge?k="+a+"&ajax=1&cachestop="+Math.random();if(typeof RecaptchaOptions.extra_challenge_params!="undefined")a+="&"+RecaptchaOptions.extra_challenge_params;if(RecaptchaOptions.includeContext)a+="&includeContext=1";Recaptcha._add_script(a)},_add_script:function(a){var b=document.createElement("script");b.type="text/javascript";b.src=a;Recaptcha._get_script_area().appendChild(b)}, _get_script_area:function(){var a=document.getElementsByTagName("head");return a=!a||a.length<1?document.body:a[0]},_hash_merge:function(a){var b={};for(var c in a)for(var d in a[c])b[d]=a[c][d];if(b.theme=="context")b.includeContext=true;return b},_init_options:function(a){RecaptchaOptions=Recaptcha._hash_merge([RecaptchaDefaultOptions,a||{}])},challenge_callback:function(){Recaptcha._reset_timer();RecaptchaStr=Recaptcha._hash_merge([RecaptchaStr_en,RecaptchaLangMap[RecaptchaOptions.lang]||{},RecaptchaOptions.custom_translations|| {}]);window.addEventListener&&window.addEventListener("unload",function(){Recaptcha.destroy()},false);Recaptcha._is_ie()&&window.attachEvent&&window.attachEvent("onbeforeunload",function(){});if(navigator.userAgent.indexOf("KHTML")>0){var a=document.createElement("iframe");a.src="about:blank";a.style.height="0px";a.style.width="0px";a.style.visibility="hidden";a.style.border="none";var b=document.createTextNode("This frame prevents back/forward cache problems in Safari.");a.appendChild(b);document.body.appendChild(a)}Recaptcha._finish_widget()}, _add_css:function(a){var b=document.createElement("style");b.type="text/css";if(b.styleSheet)if(navigator.appVersion.indexOf("MSIE 5")!=-1)document.write("");else b.styleSheet.cssText=a;else if(navigator.appVersion.indexOf("MSIE 5")!=-1)document.write("");else{a=document.createTextNode(a);b.appendChild(a)}Recaptcha._get_script_area().appendChild(b)},_set_style:function(a){if(!Recaptcha.style_set){Recaptcha.style_set=true;Recaptcha._add_css(a+ "\n\n.recaptcha_is_showing_audio .recaptcha_only_if_image,.recaptcha_isnot_showing_audio .recaptcha_only_if_audio,.recaptcha_had_incorrect_sol .recaptcha_only_if_no_incorrect_sol,.recaptcha_nothad_incorrect_sol .recaptcha_only_if_incorrect_sol{display:none !important}")}},_init_builtin_theme:function(){var a=Recaptcha.$,b=RecaptchaStr,c=RecaptchaState,d,e;c=c.server;if(c[c.length-1]=="/")c=c.substring(0,c.length-1);var f=c+"/img/"+Recaptcha.theme;if(Recaptcha.theme=="clean"){c=RecaptchaTemplates.CleanCss; d=RecaptchaTemplates.CleanHtml;e="png"}else{if(Recaptcha.theme=="context"){c=RecaptchaTemplates.VertCss;d=RecaptchaTemplates.ContextHtml}else{c=RecaptchaTemplates.VertCss;d=RecaptchaTemplates.VertHtml}e="gif"}c=c.replace(/IMGROOT/g,f);Recaptcha._set_style(c);Recaptcha.widget.innerHTML="
    "+d+"
    ";a("recaptcha_reload").src=f+"/refresh."+e;a("recaptcha_switch_audio").src=f+"/audio."+e;a("recaptcha_switch_img").src=f+"/text."+e;a("recaptcha_whatsthis").src=f+"/help."+e;if(Recaptcha.theme== "clean"){a("recaptcha_logo").src=f+"/logo."+e;a("recaptcha_tagline").src=f+"/tagline."+e}a("recaptcha_reload").alt=b.refresh_btn;a("recaptcha_switch_audio").alt=b.audio_challenge;a("recaptcha_switch_img").alt=b.visual_challenge;a("recaptcha_whatsthis").alt=b.help_btn;a("recaptcha_reload_btn").href="javascript:Recaptcha.reload ();";a("recaptcha_reload_btn").title=b.refresh_btn;a("recaptcha_switch_audio_btn").href="javascript:Recaptcha.switch_type('audio');";a("recaptcha_switch_audio_btn").title=b.audio_challenge; a("recaptcha_switch_img_btn").href="javascript:Recaptcha.switch_type('image');";a("recaptcha_switch_img_btn").title=b.visual_challenge;a("recaptcha_whatsthis_btn").href=Recaptcha._get_help_link();a("recaptcha_whatsthis_btn").target="_blank";a("recaptcha_whatsthis_btn").title=b.help_btn;a("recaptcha_whatsthis_btn").onclick=function(){Recaptcha.showhelp();return false};a("recaptcha_table").className="recaptchatable recaptcha_theme_"+Recaptcha.theme;a("recaptcha_instructions_image")&&a("recaptcha_instructions_image").appendChild(document.createTextNode(b.instructions_visual)); a("recaptcha_instructions_context")&&a("recaptcha_instructions_context").appendChild(document.createTextNode(b.instructions_context));a("recaptcha_instructions_audio")&&a("recaptcha_instructions_audio").appendChild(document.createTextNode(b.instructions_audio));a("recaptcha_instructions_error")&&a("recaptcha_instructions_error").appendChild(document.createTextNode(b.incorrect_try_again))},_finish_widget:function(){var a=Recaptcha.$,b=RecaptchaState,c=RecaptchaOptions,d=c.theme;switch(d){case "red":case "white":case "blackglass":case "clean":case "custom":case "context":break; default:d="red";break}if(!Recaptcha.theme)Recaptcha.theme=d;Recaptcha.theme!="custom"?Recaptcha._init_builtin_theme():Recaptcha._set_style("");d=document.createElement("span");d.id="recaptcha_challenge_field_holder";d.style.display="none";a("recaptcha_response_field").parentNode.insertBefore(d,a("recaptcha_response_field"));a("recaptcha_response_field").setAttribute("autocomplete","off");a("recaptcha_image").style.width="300px";a("recaptcha_image").style.height="57px";Recaptcha.should_focus=false; Recaptcha._set_challenge(b.challenge,"image");if(c.tabindex){a("recaptcha_response_field").tabIndex=c.tabindex;if(Recaptcha.theme!="custom"){a("recaptcha_whatsthis_btn").tabIndex=c.tabindex;a("recaptcha_switch_img_btn").tabIndex=c.tabindex;a("recaptcha_switch_audio_btn").tabIndex=c.tabindex;a("recaptcha_reload_btn").tabIndex=c.tabindex}}if(Recaptcha.widget)Recaptcha.widget.style.display="";c.callback&&c.callback()},switch_type:function(a){var b=Recaptcha;b.type=a;b.reload(b.type=="audio"?"a":"v")}, reload:function(a){var b=Recaptcha,c=RecaptchaState;if(typeof a=="undefined")a="r";c=c.server+"reload?c="+c.challenge+"&k="+c.site+"&reason="+a+"&type="+b.type+"&lang="+RecaptchaOptions.lang;if(RecaptchaOptions.includeContext)c+="&includeContext=1";if(typeof RecaptchaOptions.extra_challenge_params!="undefined")c+="&"+RecaptchaOptions.extra_challenge_params;if(b.type=="audio")c+=RecaptchaOptions.audio_beta_12_08?"&audio_beta_12_08=1":"&new_audio_default=1";b.should_focus=a!="t";b._add_script(c)},finish_reload:function(a, b){RecaptchaState.is_incorrect=false;Recaptcha._set_challenge(a,b)},_set_challenge:function(a,b){var c=Recaptcha,d=RecaptchaState,e=c.$;d.challenge=a;c.type=b;e("recaptcha_challenge_field_holder").innerHTML="";if(b=="audio")e("recaptcha_image").innerHTML=Recaptcha.getAudioCaptchaHtml();else if(b=="image"){var f=d.server+"image?c="+d.challenge;e("recaptcha_image").innerHTML=""}Recaptcha._css_toggle("recaptcha_had_incorrect_sol","recaptcha_nothad_incorrect_sol",d.is_incorrect);Recaptcha._css_toggle("recaptcha_is_showing_audio","recaptcha_isnot_showing_audio",b=="audio");c._clear_input();c.should_focus&&c.focus_response_field();c._reset_timer()},_reset_timer:function(){var a=RecaptchaState;clearInterval(Recaptcha.timer_id);Recaptcha.timer_id=setInterval("Recaptcha.reload('t');",(a.timeout-300)*1E3)},showhelp:function(){window.open(Recaptcha._get_help_link(),"recaptcha_popup", "width=460,height=570,location=no,menubar=no,status=no,toolbar=no,scrollbars=yes,resizable=yes")},_clear_input:function(){var a=Recaptcha.$("recaptcha_response_field");a.value=""},_displayerror:function(a){var b=Recaptcha.$;b("recaptcha_image").innerHTML="";b("recaptcha_image").appendChild(document.createTextNode(a))},reloaderror:function(a){Recaptcha._displayerror(a)},_is_ie:function(){return navigator.userAgent.indexOf("MSIE")>0&&!window.opera},_css_toggle:function(a,b,c){var d=Recaptcha.widget; if(!d)d=document.body;var e=d.className;e=e.replace(RegExp("(^|\\s+)"+a+"(\\s+|$)")," ");e=e.replace(RegExp("(^|\\s+)"+b+"(\\s+|$)")," ");e+=" "+(c?a:b);d.className=e},_get_help_link:function(){var a=RecaptchaOptions.lang;return"http://recaptcha.net/popuphelp/"+(a=="en"?"":a+".html")},playAgain:function(){var a=Recaptcha.$;a("recaptcha_image").innerHTML=Recaptcha.getAudioCaptchaHtml()},getAudioCaptchaHtml:function(){var a=Recaptcha,b=RecaptchaState,c=b.server+"image?c="+b.challenge;if(c.indexOf("https://")== 0)c="http://"+c.substring(8);b=b.server+"/img/audiocaptcha.swf?v2";a=a._is_ie()?'
    ':' '; c=(Recaptcha.checkFlashVer()?'
    '+RecaptchaStr.play_again+"":"")+'
    '+RecaptchaStr.cant_hear_this+"";return a+c},gethttpwavurl:function(){var a=RecaptchaState;if(Recaptcha.type=="audio"){a=a.server+"image?c="+a.challenge;if(a.indexOf("https://")==0)a="http://"+a.substring(8);return a}return""},checkFlashVer:function(){var a= navigator.appVersion.indexOf("MSIE")!=-1?true:false,b=navigator.appVersion.toLowerCase().indexOf("win")!=-1?true:false,c=navigator.userAgent.indexOf("Opera")!=-1?true:false,d=-1;if(navigator.plugins!=null&&navigator.plugins.length>0){if(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]){a=navigator.plugins["Shockwave Flash 2.0"]?" 2.0":"";a=navigator.plugins["Shockwave Flash"+a].description;a=a.split(" ");a=a[2].split(".");d=a[0]}}else if(a&&b&&!c)try{var e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"), f=e.GetVariable("$version");d=f.split(" ")[1].split(",")[0]}catch(g){}return d>=9},getlang:function(){return RecaptchaOptions.lang}}; ;