/*! AutoResize v1.18.4 - 2014-01-11 Automatically adjust textarea height based on user input. (c) 2014 Jack Moore - http://www.jacklmoore.com/autosize Originally altered by mdawaffe. Current version altered by pento. license: http://www.opensource.org/licenses/mit-license.php */ (function ($) { var defaults = { className: 'autosizejs', append: '', callback: false, resizeDelay: 10, placeholder: true, animate: true, animateDuration: 150, animateCallback: function(){}, extraSpace: 20 }, // border:0 is unnecessary, but avoids a bug in Firefox on OSX copy = '<textarea aria-hidden="true" tabindex="-1" style="position:absolute; top:-999px; left:0; right:auto; bottom:auto; border:0; padding: 0; -moz-box-sizing:content-box; -webkit-box-sizing:content-box; box-sizing:content-box; word-wrap:break-word; height:0 !important; min-height:0 !important; overflow:hidden; transition:none; -webkit-transition:none; -moz-transition:none;"/>', // line-height is conditionally included because IE7/IE8/old Opera do not return the correct value. typographyStyles = [ 'fontFamily', 'fontSize', 'fontWeight', 'fontStyle', 'letterSpacing', 'textTransform', 'textDecoration', 'wordSpacing', 'textIndent' ], // to keep track which textarea is being mirrored when adjust() is called. mirrored, // the mirror element, which is used to calculate what size the mirrored element should be. mirror = $(copy).data('autosize', true)[0]; // test that line-height can be accurately copied. mirror.style.lineHeight = '99px'; if ($(mirror).css('lineHeight') === '99px') { typographyStyles.push('lineHeight'); } mirror.style.lineHeight = ''; $.fn.autoResize = function (options) { if (!this.length) { return this; } options = $.extend({}, defaults, options || {}); if (mirror.parentNode !== this.parentNode) { $(mirror).insertBefore(this); } return this.each(function () { var ta = this, $ta = $(ta), maxHeight, minHeight, boxOffset = 0, callback = $.isFunction(options.callback), originalStyles = { height: ta.style.height, overflow: ta.style.overflow, overflowY: ta.style.overflowY, wordWrap: ta.style.wordWrap, resize: ta.style.resize }, timeout, width = $ta.width(); if ($ta.data('autosize')) { // exit if autosize has already been applied, or if the textarea is the mirror element. return; } $ta.data('autosize', true); if ($ta.css('box-sizing') === 'border-box' || $ta.css('-moz-box-sizing') === 'border-box' || $ta.css('-webkit-box-sizing') === 'border-box'){ boxOffset = $ta.outerHeight() - $ta.height(); } // IE8 and lower return 'auto', which parses to NaN, if no min-height is set. minHeight = Math.max(parseInt($ta.css('minHeight'), 10) - boxOffset || 0, $ta.height()); $ta.css({ overflow: 'hidden', overflowY: 'hidden', wordWrap: 'break-word', // horizontal overflow is hidden, so break-word is necessary for handling words longer than the textarea width resize: ($ta.css('resize') === 'none' || $ta.css('resize') === 'vertical') ? 'none' : 'horizontal' }); // The mirror width must exactly match the textarea width, so using getBoundingClientRect because it doesn't round the sub-pixel value. // window.getComputedStyle, getBoundingClientRect returning a width are unsupported, but also unneeded in IE8 and lower. function setWidth() { var width; var style = window.getComputedStyle ? window.getComputedStyle(ta, null) : false; if (style) { width = ta.getBoundingClientRect().width; if (width === 0) { width = parseInt(style.width,10); } $.each(['paddingLeft', 'paddingRight', 'borderLeftWidth', 'borderRightWidth'], function(i,val){ width -= parseInt(style[val],10); }); } else { width = Math.max($ta.width(), 0); } mirror.style.width = width + 'px'; } function initMirror() { var styles = {}; mirrored = ta; mirror.className = options.className + " " + ta.className; maxHeight = parseInt($ta.css('maxHeight'), 10); // mirror is a duplicate textarea located off-screen that // is automatically updated to contain the same text as the // original textarea. mirror always has a height of 0. // This gives a cross-browser supported way getting the actual // height of the text, through the scrollTop property. $.each(typographyStyles, function(i,val){ styles[val] = $ta.css(val); }); $(mirror).css(styles); setWidth(); // Chrome-specific fix: // When the textarea y-overflow is hidden, Chrome doesn't reflow the text to account for the space // made available by removing the scrollbar. This workaround triggers the reflow for Chrome. if (window.chrome) { var width = ta.style.width; ta.style.width = '0px'; var ignore = ta.offsetWidth; ta.style.width = width; } } // Using mainly bare JS in this function because it is going // to fire very often while typing, and needs to very efficient. function adjust() { var height, original; if (mirrored !== ta) { initMirror(); } else { setWidth(); } if (!ta.value && options.placeholder) { // If the textarea is empty, copy the placeholder text into // the mirror control and use that for sizing so that we // don't end up with placeholder getting trimmed. mirror.value = ($ta.attr("placeholder") || '') + options.append; } else { mirror.value = ta.value + options.append; } mirror.style.overflowY = ta.style.overflowY; original = parseInt(ta.style.height,10); // Setting scrollTop to zero is needed in IE8 and lower for the next step to be accurately applied mirror.scrollTop = 0; mirror.scrollTop = 9e4; // Using scrollTop rather than scrollHeight because scrollHeight is non-standard and includes padding. height = mirror.scrollTop + options.extraSpace; if (maxHeight && height > maxHeight) { ta.style.overflowY = 'scroll'; height = maxHeight; } else { ta.style.overflowY = 'hidden'; if (height < minHeight) { height = minHeight; } } height += boxOffset; height = Math.floor( height ); if (original !== height) { if ( options.animate && $ta.css( 'display' ) === 'block' ) { $ta.stop().animate( {height: height}, options.animateDuration, options.animateCallback ); } else { ta.style.height = height + 'px'; options.animateCallback.call( this ); } if (callback) { options.callback.call(ta,ta); } } } function resize () { clearTimeout(timeout); timeout = setTimeout(function(){ var newWidth = $ta.width(); if (newWidth !== width) { width = newWidth; adjust(); } }, parseInt(options.resizeDelay,10)); } if ('onpropertychange' in ta) { if ('oninput' in ta) { // Detects IE9. IE9 does not fire onpropertychange or oninput for deletions, // so binding to onkeyup to catch most of those occasions. There is no way that I // know of to detect something like 'cut' in IE9. $ta.on('input.autosize keyup.autosize', adjust); } else { // IE7 / IE8 $ta.on('propertychange.autosize', function(){ if(event.propertyName === 'value'){ adjust(); } }); } } else { // Modern Browsers $ta.on('input.autosize', adjust); } // Set options.resizeDelay to false if using fixed-width textarea elements. // Uses a timeout and width check to reduce the amount of times adjust needs to be called after window resize. if (options.resizeDelay !== false) { $(window).on('resize.autosize', resize); } // Event for manual triggering if needed. // Should only be needed when the value of the textarea is changed through JavaScript rather than user input. $ta.on('autosize.resize', adjust); // Event for manual triggering that also forces the styles to update as well. // Should only be needed if one of typography styles of the textarea change, and the textarea is already the target of the adjust method. $ta.on('autosize.resizeIncludeStyle', function() { mirrored = null; adjust(); }); $ta.on('autosize.destroy', function(){ mirrored = null; clearTimeout(timeout); $(window).off('resize', resize); $ta .off('autosize') .off('.autosize') .css(originalStyles) .removeData('autosize'); }); // Call adjust in case the textarea already contains text. adjust(); }); }; }(window.jQuery || window.$)); // jQuery or jQuery-like library, such as Zepto ; var HighlanderComments = jQuery.extend( HighlanderComments, { autosaveInterval: false, commentList: null, initialHeight: 70, cookies: { facebook: 'wpc_fbc', twitter: 'wpc_tc', wordpress: 'wpc_wpc', googleplus: 'wpc_gpc' }, popups: { facebook: ',height=400,width=600', twitter: ',height=515,width=600', wordpress: ',height=500,width=500' }, temp_cookie_data: '', currentParent: false, currentParentId: false, currentParentMargins: {}, keyCodeReturn: 13, resizeCallback: function() {}, init : function() { jQuery( '#respond' ).addClass( 'js' ); HighlanderComments.commentList = jQuery( '#thecomments, .thecomments, #commentlist, #comment-list, #comments-list, .commentlist, .comment-list, .comments-list, .com-list, #comments' ).last(); jQuery( '#comment-form-nascar a' ).click( HighlanderComments.clickService ); jQuery( '#postas-wordpress' ).click( HighlanderComments.clickExternalTab ); jQuery( '#postas-facebook, #labelto-facebook' ).click( HighlanderComments.clickExternalTab ); jQuery( '#postas-twitter, #labelto-twitter' ).click( HighlanderComments.clickExternalTab ); pm.bind( 'googlePlusButtonClick', HighlanderComments.onGooglePlusButtonClick, 'https://public-api.wordpress.com' ); pm.bind( 'googlePlusSignIn', HighlanderComments.onGooglePlusSignIn, 'https://public-api.wordpress.com' ); jQuery( '#labelto-wordpress' ).click( HighlanderComments.checkPostToWordPress ); jQuery( '#comment-form-post-to-edit a' ).click( HighlanderComments.editShareText ); jQuery( window ).resize( HighlanderComments.toggleShareLabels ); HighlanderComments.toggleShareLabels(); HighlanderComments.restoreComment(); // HighlanderComments.autosaveInterval = setInterval( HighlanderComments.autosaveComment, 10000 ); jQuery.each( jQuery( '.comment-form-field input, textarea#comment' ), function() { if ( jQuery(this).val() !== '' ) { HighlanderComments.hideLabels( jQuery(this) ); } } ); jQuery( 'div.comment-form-fields input' ).change( function() { HighlanderComments.toggleLabel( jQuery(this) ); } ).focus( function() { HighlanderComments.hideLabels( jQuery(this) ); } ).blur( function() { HighlanderComments.showLabels( jQuery(this) ); } ); jQuery( 'div.comment-form-fields label' ).click( function() { HighlanderComments.hideLabels( jQuery(this).parent().children( '.comment-form-input input' ) ); } ); // Identity auto-fill from Gravatar Profiles jQuery( '#email' ).blur( function() { HighlanderComments.updateAvatarWithGravatar( '#email' ); if ( !jQuery( '#author' ).val() ) { Gravatar.autofill( jQuery( this ).val(), { 'displayName':'author', 'url':'url' // Their first available link, or profile URL if none } ); var afd = Gravatar.autofill_data; Gravatar.autofill_data = function( hash ) { afd.call( Gravatar, hash ); jQuery( 'input#url' ).change(); jQuery( 'input#author' ).change().click(); }; } } ); // Comment area auto-sizing and tab handling jQuery( 'textarea#comment' ) .autoResize({ animate: false, animateCallback: HighlanderComments.resizeCallback }) .css( 'resize', 'none' ) .trigger('change.dynSiz') .focus( function() { HighlanderComments.hideLabels( jQuery(this) ); } ) .blur( function() { HighlanderComments.showLabels( jQuery(this) ); } ) .keydown( function( e ) { if ( 'undefined' != typeof e.keyCode && 9 == e.keyCode ) { // TAB key e.preventDefault(); if ( 'guest' == jQuery( '#hc_post_as' ).val() ) { if ( 1 == HighlanderComments.comment_registration ) { jQuery( '#postas-wordpress' ).focus(); } else { jQuery( '#email' ).focus(); } } else { jQuery( '#comment-submit' ).focus(); } } if ( HighlanderComments.isCommandOrControlKeyDown( e ) && HighlanderComments.keyCodeReturn === e.which ) { jQuery( "#comment-submit" ).click(); } } ) .keyup( function() { HighlanderComments.fillShareText( jQuery(this) ); } ) .one( 'focus', function() { var googlePlusSignIn = jQuery( '#googleplus-sign-in' ); if ( googlePlusSignIn.length < 1 ) { return; } pm( { target: googlePlusSignIn[0].contentWindow, type: 'googlePlusLoadJS', data: 0, url: 'https://public-api.wordpress.com' } ); }); // Client-side form validation jQuery( '#commentform' ).submit( function() { var verified = true, email, author; // Comment text required if ( '' === jQuery( 'textarea#comment' ).val() ) { jQuery( 'label[for="comment"]' ).fadeOut( 'fast', function() { jQuery(this).text( HighlanderComments.enterACommentError ).fadeIn( 'fast').addClass('error'); } ); jQuery( '#comment-form-comment' ).addClass('error'); jQuery( 'textarea#comment' ).focus( function() { jQuery(this).parent( '#comment-form-comment' ).removeClass('error'); } ); verified = false; } // Only exists if email/name are required if ( 'guest' == jQuery( '#hc_post_as' ).val() && ( jQuery( '#comment-form-guest label span[class="required"]' ).size() || jQuery( '#comment-form-guest label[class="error"]' ).size() ) ) { email = jQuery( '#email' ).val(); if ( '' === email || !email.match( /^.*@.*\..*$/ ) ) { jQuery( 'label[for="email"]' ).fadeOut( 'fast', function() { var error; if ( '' == email ) { error = HighlanderComments.enterEmailError; } else { error = '<span class="nopublish">' + HighlanderComments.invalidEmailError + '</span>'; } jQuery(this).html( error ).css( 'opacity', 1 ).fadeIn( 'fast' ).addClass( 'error' ); }); jQuery( 'div.comment-form-email .comment-form-input' ).addClass('error'); jQuery( 'input#email' ).focus( function() { jQuery(this).parent().removeClass( 'error' ); } ); verified = false; } author = jQuery( '#author' ).val(); if ( '' === author ) { jQuery( 'label[for="author"]' ).fadeOut( 'fast', function() { jQuery(this).text( HighlanderComments.enterAuthorError ).fadeIn('fast').addClass( 'error' ); } ); jQuery( 'div.comment-form-author .comment-form-input' ).addClass('error'); jQuery( 'input#author' ).focus( function() { jQuery(this).parent().removeClass( 'error' ); } ); verified = false; } } // Don't allow "guest" comments if auth is required if ( '1' == HighlanderComments.comment_registration && 'guest' == jQuery( '#hc_post_as' ).val() ) { jQuery( '#comment-form-nascar > p' ).addClass( 'error' ).fadeOut( 'fast', function() { jQuery( this ).fadeIn( 'fast' ); } ); verified = false; } // Set a cookie to remember which was the last used tab HighlanderComments.writeCookie( 'hc_post_as', jQuery( '#hc_post_as' ).val(), 7, '.wordpress.com' ); if ( !verified ) { return false; } HighlanderComments.clickSubmit(); return true; } ); // Set up the identity block based on WP options, logged in state, etc if ( '1' == HighlanderComments.comment_registration ) { // Must be logged in to comment (guest commenting not allowed) jQuery('#comment-form-guest').hide(); if ( !HighlanderComments.isJetpack && !HighlanderComments.userIsLoggedIn ) { // Force to guest posting if they're not logged in, which should actually not allow itself HighlanderComments.clickGuestTab(); jQuery( '#comment-form-wordpress' ).removeClass( 'selected' ); jQuery( '#hc_post_as' ).val( 'guest' ); } } else { // Guest commenting is allowed if ( HighlanderComments.userIsLoggedIn && jQuery( '#comment-form-wordpress.selected' ).length ) { // User is logged in and we're looking at the WP UI already, get rid of guest commenting jQuery( '#comment-form-guest' ).slideUp( 'fast' ); } } if ( jQuery( '.comment-form-service.selected' ).not( '#comment-form-guest.selected' ).length ) { // Something other than Guest is selected, hide the auth strip jQuery( '#comment-form-nascar' ).hide(); } if ( 'undefined' !== typeof addComment ) { HighlanderComments._moveForm = addComment.moveForm; addComment.moveForm = HighlanderComments.moveForm; } // Hover Tooltips jQuery( '#comment-form-guest .comment-form-avatar' ).hover( function() { pos = jQuery( this ).offset(); if ( 'rtl' === HighlanderComments.text_direction ) { style = 'top:' + ( pos.top - 10 ) + 'px;left:' + ( pos.left - 130 ) + 'px;'; } else { style = 'top:' + ( pos.top - 10 ) + 'px;left:' + ( pos.left + 35 ) + 'px;'; } jQuery( 'body' ).append( '<div id="hltt-grav" class="highlander-tooltip" style="' + style + '">' + HighlanderComments.gravatarFromEmail + '</div>' ); }, function() { jQuery( '#hltt-grav' ).fadeOut( 'fast', function() { jQuery( this ).remove(); jQuery( '.highlander-tooltip' ).remove(); } ); } ); jQuery( '#comment-form-nascar ul' ).hover( function() { pos = jQuery( this ).offset(); if ( 'rtl' === HighlanderComments.text_direction ) { style = 'top:' + ( pos.top - 12 ) + 'px;left:' + ( pos.left + 125 ) + 'px;'; } else { style = 'top:' + ( pos.top - 12 ) + 'px;left:' + ( pos.left - 125 ) + 'px;'; } jQuery( 'body' ).append( '<div id="hltt-auth" class="highlander-tooltip" style="' + style + '">' + HighlanderComments.logInToExternalAccount + '</div>' ); }, function() { jQuery( '#hltt-auth' ).fadeOut( 'fast', function() { jQuery( this ).remove(); jQuery( '.highlander-tooltip' ).remove(); } ); } ); }, isCommandOrControlKeyDown: function( event ) { // event.metaKey will be true if Command key (⌘) or Windows key is down. return ( event.ctrlKey || event.metaKey ); }, _moveForm: null, moveForm: function( commId, parentId, respondId, postId ) { if ( null === HighlanderComments._moveForm ) { return; } var t = this, r = false, respond = jQuery( '#' + respondId ).css( { marginLeft: 0, marginRight: 0 } ), w, wTop, commElement, rHeight, cTop, rTop; if ( HighlanderComments.currentParent ) { if ( parentId === HighlanderComments.currentParentId ) { return false; } w = jQuery(window); wTop = w.scrollTop(); commElement = jQuery( '#' + commId ); cTop = commElement.offset().top; rTop = respond.offset().top; if ( rTop <= cTop ) { rHeight = respond.outerHeight( true ); respond.before( jQuery( '<div id="highlander-placeholder" />' ).css( { margin: 0, padding: 0, border: 0, height: rHeight, visibility: 'hidden', position: respond.css( 'position' ) } ) ); } r = HighlanderComments._moveForm.call( t, commId, parentId, respondId, postId ); if ( false !== r ) { return r; } HighlanderComments.currentParent.stop( true, true ).css( HighlanderComments.currentParentMargins ); jQuery( '#highlander-placeholder' ).remove(); if ( rTop <= cTop ) { jQuery( window ).scrollTop( wTop - rHeight ); } HighlanderComments.moveFormNow.call( t, commId, parentId, respondId ); } else { r = HighlanderComments._moveForm.call( t, commId, parentId, respondId, postId ); if ( false === r ) { HighlanderComments.moveFormNow.call( t, commId, parentId, respondId ); } } return r; }, moveFormNow: function( commId, parentId, respondId ) { HighlanderComments.currentParent = jQuery( '#comment-' + parentId ).parents( '.highlander-comment' ).andSelf().filter( '.highlander-comment' ).last(); if ( !HighlanderComments.currentParent.size() ) { HighlanderComments.currentParent = jQuery( '#comment-' + parentId ).parents( '.comment' ).andSelf().filter( '.comment' ).last(); } HighlanderComments.currentParentId = parentId; var respond = jQuery( '#' + respondId ); if ( !HighlanderComments.currentParent.find( respond ).size() ) { var betterParent = HighlanderComments.currentParent.parents( '.children:first' ); if ( !betterParent.size() ) { betterParent = HighlanderComments.currentParent.parents( '.highlander-comment:first' ); if ( !betterParent.size() ) { betterParent = HighlanderComments.currentParent.parents( '.comment:first' ); } } if ( betterParent.size() ) { HighlanderComments.currentParent = betterParent; } } HighlanderComments.currentParentMargins = { backgroundColor: HighlanderComments.currentParent.css( 'backgroundColor' ), marginLeft: HighlanderComments.currentParent.css( 'marginLeft' ), marginRight: HighlanderComments.currentParent.css( 'marginRight' ) }; var oldOff, newOff, offOrder, autoWidth = false; if ( 'rtl' === HighlanderComments.text_direction ) { offOrder = [ 'Left', 'Right' ]; } else { offOrder = [ 'Right', 'Left' ]; } jQuery.each( offOrder, function( i, v ) { if ( '0px' === HighlanderComments.currentParentMargins['margin' + v] ) { oldOff = HighlanderComments.currentParent.offset().left; if ( 'Right' === v ) { oldOff += HighlanderComments.currentParent.outerWidth(); } HighlanderComments.currentParent.css( 'margin' + v, 0 ); newOff = HighlanderComments.currentParent.offset().left; if ( 'Right' === v ) { newOff += HighlanderComments.currentParent.outerWidth(); } if ( oldOff !== newOff ) { newOff = 'Right' === v ? newOff - oldOff : oldOff - newOff; HighlanderComments.currentParent.css( 'margin' + v, newOff ); HighlanderComments.currentParentMargins['margin' + v] = newOff; autoWidth = true; } } } ); if ( autoWidth ) { HighlanderComments.currentParent.css( 'width', 'auto' ); HighlanderComments.currentParentMargins.width = 'auto'; } var rgbaTransparent = /rgba.*,\s*0\s*\)/, cp, bg, bgi; if ( 'transparent' === HighlanderComments.currentParentMargins.backgroundColor || HighlanderComments.currentParentMargins.backgroundColor.match( rgbaTransparent ) ) { cp = HighlanderComments.currentParent.get( 0 ); bg = 'transparent'; bgi = HighlanderComments.currentParent.css( 'backgroundImage' ); while ( 'none' === bgi && cp.parentNode && cp.parentNode != document && ( 'transparent' === bg || bg.match( rgbaTransparent ) ) ) { cp = cp.parentNode; bg = jQuery( cp ); bgi = bg.css( 'backgroundImage' ); bg = bg.css( 'backgroundColor' ); } HighlanderComments.currentParent.css( 'backgroundColor', bg ); } var cancel = document.getElementById( 'cancel-comment-reply-link' ), listOffsetSource = HighlanderComments.commentList, listOffset, parentOffset = HighlanderComments.currentParent.offset(), currentParentMargins = HighlanderComments.currentParentMargins, redoMargins = false, grandWidth; // Re-initialize the commentList if it was not found during init if ( ! listOffsetSource.length ) { HighlanderComments.commentList = jQuery( '#thecomments, .thecomments, #commentlist, #comment-list, #comments-list, .commentlist, .comment-list, .comments-list, .com-list, #comments' ).last(); listOffsetSource = HighlanderComments.commentList; } cp = HighlanderComments.currentParent; while ( !cp.is( HighlanderComments.commentList ) && !cp.is( document ) ) { if ( 'hidden' === cp.css( 'overflow' ) || 'hidden' === cp.css( 'overflow-x' ) ) { listOffsetSource = cp; break; } cp = cp.parent(); } listOffset = listOffsetSource.offset(); HighlanderComments._unmoveForm = cancel.onclick; cancel.onclick = function() { return HighlanderComments.unmoveForm.call( this ); }; if ( -1 < currentParentMargins.marginLeft.toString().indexOf( '%' ) ) { grandWidth = HighlanderComments.currentParent.parent().width(); currentParentMargins.marginLeft = parseFloat( currentParentMargins.marginLeft ) / 100 * grandWidth; redoMargins = true; } if ( -1 < currentParentMargins.marginRight.toString().indexOf( '%' ) ) { grandWidth = HighlanderComments.currentParent.parent().width(); currentParentMargins.marginRight = parseFloat( currentParentMargins.marginRight ) / 100 * grandWidth; redoMargins = true; } if ( redoMargins ) { HighlanderComments.currentParent.css( currentParentMargins ); } listOffset.right = listOffset.left + listOffsetSource.outerWidth(); parentOffset.left -= parseInt( HighlanderComments.currentParent.css( 'margin-left' ), 10 ); parentOffset.right = parentOffset.left + HighlanderComments.currentParent.outerWidth( true ); respond.hide(); HighlanderComments.currentParent.animate( { marginLeft: '-=' + ( parentOffset.left - listOffset.left ).toString(), marginRight: '-=' + ( listOffset.right - parentOffset.right ).toString() }, 350, function() { respond.slideDown( 350, function() { jQuery( '#' + commId + ' .comment-reply-link:first' ).focus(); jQuery( '#comment' ).focus(); HighlanderComments.resizeCallback(); } ); respond.children('form').after('<div class="clear" id="threaded-clear"></div>'); } ); }, _unmoveForm: null, unmoveForm: function() { var r = HighlanderComments._unmoveForm.call( this ); if ( false !== r ) { return r; } HighlanderComments.currentParent.stop( true, true ).animate( HighlanderComments.currentParentMargins, 350, function() { HighlanderComments.currentParent.css( HighlanderComments.currentParentMargins ); HighlanderComments.currentParent = HighlanderComments.currentParentId = false; } ); jQuery( '#respond' ).stop( true, true ).show(); jQuery( '#respond div#threaded-clear' ).remove(); HighlanderComments.resizeCallback(); return r; }, HTMLToText : function( string ) { return jQuery( '<span />' ).text( string ).html(); }, autosaveComment : function() { var oneDay = new Date(); oneDay.setTime( oneDay.getTime() + 86400000 ); document.cookie = 'comment-' + HighlanderComments.postID + '=' + encodeURIComponent( jQuery( '#comment' ).val() ) + '; expires=' + oneDay.toGMTString() + '; path=/'; }, unsaveComment : function() { var oneDay = new Date(); oneDay.setTime( oneDay.getTime() - 86400000 ); document.cookie = 'comment-' + HighlanderComments.postID + '= ; expires=' + oneDay.toGMTString() + '; path=/'; }, restoreComment : function() { var parts = document.cookie.split( ';' ), part; jQuery.each( parts, function(i) { part = parts[i].split( '=' ); if ( 'comment-' + HighlanderComments.postID === jQuery.trim( part[0] ) ) { if ( 'undefined' !== typeof part[1] && 'undefined' !== part[1] && '' !== decodeURIComponent( part[1] ) ) { jQuery( '#comment' ).val( decodeURIComponent( part[1] ) ); } return; } } ); }, switchAccount : function() { jQuery( '.comment-form-service' ).removeClass( 'selected' ).hide(); jQuery( '#hc_post_as' ).val( 'guest' ); jQuery( '#comment-form-nascar > p' ).removeClass( 'error' ); if ( '1' == HighlanderComments.comment_registration ) { jQuery( '#comment-form-nascar' ).show(); jQuery( '#comment-form-guest' ).hide(); // Guest commenting not allowed HighlanderComments.resizeCallback(); } else { jQuery( '#comment-form-nascar' ).show(); jQuery( '#comment-form-guest' ).slideDown( 'fast', HighlanderComments.resizeCallback ); HighlanderComments.clickGuestTab(); } }, setConnectingToText : function( serviceFriendlyName ) { jQuery( '#comment-form-load-service p' ).text( HighlanderComments.connectingToText.replace( '%s', serviceFriendlyName ) ); }, updateLoadServiceVisibility : function( tab ) { jQuery( '.comment-form-service' ) .css( 'visibility', 'hidden' ) .show() .removeClass( 'selected' ) .filter( tab ) .css( 'visibility', 'visible' ) .fadeIn( 'fast' ) .end() .not( tab ) .hide() .css( 'visibility', 'visible' ); }, clickService : function(e) { e.preventDefault(); // HighlanderComments.autosaveComment(); var tab = this.href.replace( /^.*#/, '#' ).split( ':' ); if ( '#comment-form-load-service' === tab[0] && tab[1] ) { HighlanderComments.setConnectingToText( tab[1] ); } else { jQuery( '#hc_post_as' ).val( tab[0].split( '-' ).pop() ); } HighlanderComments.updateLoadServiceVisibility( '#comment-form-load-service' ); jQuery( '#comment-form-nascar li.selected' ).removeClass( 'selected' ); jQuery( this ).parent().addClass( 'selected' ); HighlanderComments.resizeCallback(); }, clickGuestTab : function(e) { if ( '1' == HighlanderComments.comment_registration ) { jQuery( '#comment-form-guest' ).hide(); } if ( jQuery( '#email' ).length && -1 < jQuery( '#email' ).val().indexOf( '@twitter.example.com' ) ) { jQuery( '#email' ).val( '' ).blur(); } HighlanderComments.updateAvatarWithGravatar( '#email' ); // Reenable subscription options jQuery( '#comment-form-subscribe' ).css( 'opacity', '1' ).find( 'input' ).removeAttr( 'disabled' ); HighlanderComments.resizeCallback(); }, checkPostToWordPress: function(e) { HighlanderComments.clickExternalTab( 'wordpress' ); jQuery( '#wordpress-login-first' ).show(); }, updateAvatarWithGravatar: function(e) { var grav_base = ( 'https:' === location.protocol ? 'https://secure' : 'http://www' ) + '.gravatar.com/avatar/'; // When Avatars are disabled, Gravatar can be undefined, so we check against that first // and fall back to an unknown gravatar if it isn't var gravSource = grav_base + 'ad516503a11cd5ca435acc9bb6523536?s=25&forcedefault=1'; if ( 'undefined' !== typeof Gravatar && jQuery( e ).length ) { gravSource = grav_base + Gravatar.md5( jQuery.trim( jQuery( e ).val().toLowerCase() ) ) + '?s=25'; } if ( 'gravatar_default' !== HighlanderComments.gravDefault ) { gravSource += '&d=' + encodeURIComponent( HighlanderComments.gravDefault ); } jQuery( '#comment-form-guest .comment-form-avatar img' ).attr( 'src', gravSource ); }, getServiceData : function( service ) { var data = HighlanderComments.readCookie( HighlanderComments.cookies[service] ); if ( null === data || 'undefined' === typeof data.access_token || !data.access_token ) { return false; } return data; }, ext_win : false, ext_win_check : false, pollExternalWindow : function( service, from_tab ) { if ( !HighlanderComments.ext_win || HighlanderComments.ext_win.closed ) { // If the cookie is available, then we must have auth'd successfully if ( HighlanderComments.getServiceData( service ) ) { HighlanderComments.doExternalLoggedIn( service ); return; } HighlanderComments.doExternalCanceled( service, from_tab ); HighlanderComments.ext_win = false; clearInterval( HighlanderComments.ext_win_check ); } }, cancelExternalWindow : function() { if ( HighlanderComments.ext_win ) { HighlanderComments.ext_win.close(); } HighlanderComments.doExternalCanceled( jQuery( '#hc_post_as' ).val(), true ); }, clickExternalTab : function( e ) { if ( 'undefined' == typeof e ) { return; } jQuery( '#comment-form-guest' ).slideUp( 'fast', function() { jQuery( '#comment-form-nascar' ).hide(); HighlanderComments.resizeCallback(); clearInterval( HighlanderComments.ext_win_check ); jQuery( '.highlander-tooltip' ).remove(); var from_tab = 1; if ( 'string' == typeof e ) { var service = e; } else { var service = e.currentTarget.id.split( '-' )[1]; if ( e.currentTarget.nodeName != 'A' ) { from_tab = 0; } } if ( // Found commenting cookies null != HighlanderComments.readCookie( HighlanderComments.cookies[service] ) && ( // WordPress tab, and we're logged in 'wordpress' == service && HighlanderComments.userIsLoggedIn || // Not WordPress tab 'wordpress' != service ) ) { if ( from_tab ) { HighlanderComments.doExternalLoggedIn( service ); } } else if ( 'googleplus' == service ) { // Nothing to do - we're already logged in at this point } else { HighlanderComments.ext_win = window.open( HighlanderComments.connectURL + '&service=' + service, 'highconn', 'status=0,toolbar=0,location=1,menubar=0,directories=0,resizable=1,scrollbars=0' + HighlanderComments.popups[service] ); HighlanderComments.ext_win_check = setInterval( "HighlanderComments.pollExternalWindow( '" + service + "', " + from_tab + " )", 100 ); } } ); }, doExternalLoggedIn : function( service ) { clearInterval( HighlanderComments.ext_win_check ); var data = HighlanderComments.getServiceData( service ); if ( 'object' !== typeof data ) { return; } if ( 'wordpress' == service ) { // Allow subscription options jQuery( '#comment-form-subscribe' ).css( 'opacity', '1' ).find( 'input' ).removeAttr( 'disabled' ); // Set up Gravatar and flag as logged in. Load a page to trigger cookies etc jQuery( '#comment-form-' + service + ' .comment-form-avatar img' ).attr( 'src', data.avatar ); HighlanderComments.userIsLoggedIn = true; if ( !HighlanderComments.isJetpack ) { jQuery( 'body' ).append( '<iframe class="highlander-auth-init" height="1" width="1" style="display:none;" src="' + HighlanderComments.homeURL + 'highlander.login/" />' ); } } else { if ( 'twitter' == service ) { // Disable subscription options for Twitter since we don't have an email jQuery( '#comment-form-subscribe' ).css( 'opacity', '0.5' ).find( 'input' ).attr( 'disabled', 'disabled' ).removeAttr( 'checked' ); } // Run all external avatars through ImgPress to resize them jQuery( '#comment-form-' + service + ' .comment-form-avatar img' ) .attr( 'src', function() { var split, host, path, query, url; try { if ( data.avatar.match( /^(https?:)?\/\/i[012]\.wp\.com\// ) ) { return data.avatar.replace( /^https?:/, location.protocol ); } if ( data.avatar.match( /^(https?:)?\/\/(.*?\.)gravatar\.com\// ) ) { return data.avatar.replace( /^https?:/, location.protocol ); } split = data.avatar.split( '#' ); // Ignore fragment split = split[0].split( '?' ); query = split[1]; split = split[0].split( '//' ); // Ignore scheme split = split[1].split( '/' ); host = split[0]; path = split.slice( 1 ).join( '/' ); url = location.protocol + '//i0.wp.com/' + host + '/' + path + '?'; if ( 'graph.facebook.com' === host && query.length ) { url += 'q=' + encodeURIComponent( query ) + '&'; } return url + 'resize=25%2C25'; } catch ( error ) { return data.avatar; } } ); } jQuery( '#email' ).val( data.email ).change(); jQuery( '#author' ).val( data.name ).change(); jQuery( '#url' ).val( data.link ).change().click(); jQuery( '#' + service + '-avatar' ).val( data.avatar ); jQuery( '#' + service + '-user_id' ).val( data.uid ); jQuery( '#' + service + '-access_token' ).val( data.access_token ); jQuery( '#hc_post_as' ).val( service ); // The child of the li.selected can be a <A> (WP, FB, Twitter) or an <IFRAME> (Google) var selectedLink = jQuery( '#comment-form-nascar li.selected a' ); if ( selectedLink.length && service == selectedLink.attr( 'id' ).replace( 'postas-', '' ) ) { jQuery( '#comment-form-load-service' ).hide(); jQuery( '#comment-form-' + service ).show(); jQuery( '#comment-form-' + service + ' .comment-form-posting-as strong' ).text( data.name + ':' ); HighlanderComments.resizeCallback(); } var selectedIFrame = jQuery( '#comment-form-nascar li.selected iframe' ); if ( selectedIFrame.length && service == "googleplus" ) { jQuery( '#comment-form-load-service' ).hide(); jQuery( '#comment-form-' + service ).show(); jQuery( '#comment-form-' + service + ' .comment-form-posting-as strong' ).text( data.name + ':' ); HighlanderComments.resizeCallback(); } }, doExternalCanceled : function( service, from_tab ) { if ( from_tab ) { var gravSource = ( 'https:' === location.protocol ? 'https://secure' : 'http://www' ) + '.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=25'; if ( 'gravatar_default' !== HighlanderComments.gravDefault ) { gravSource += '&d=' + encodeURIComponent( HighlanderComments.gravDefault ); } jQuery( '#comment-form-' + service + ' .comment-form-avatar img' ).attr( 'src', gravSource ); jQuery( '.comment-meta-' + service ).val( '' ); jQuery( '#postas-' + service + ' span' ).html( ' ' ); jQuery( '#comment-form-' + service ).hide(); HighlanderComments.switchAccount(); } jQuery( '#postto-' + service ).prop( 'checked', false ); }, doExternalLogout : function( service ) { var hostname; if ( -1 !== document.location.hostname.indexOf( '.wordpress.com' ) ) { hostname = 'wordpress.com'; } else { hostname = document.location.hostname; } HighlanderComments.writeCookie( HighlanderComments.cookies[service], '', -10, hostname ); HighlanderComments.doExternalCanceled( service, true ); if ( 'wordpress' == service ) { HighlanderComments.userIsLoggedIn = false; jQuery( 'body' ).append( '<iframe height="1" width="1" style="display:none;" src="' + HighlanderComments.logoutURL + '" />' ); } if ( 'googleplus' == service ) { jQuery( 'body' ).append( '<iframe height="1" width="1" style="display:none;" src="https://accounts.google.com/logout" />' ); } }, clickSubmit : function(e) { HighlanderComments.unsaveComment(); jQuery( '#respond input#comment-submit' ).val( HighlanderComments.HTMLToText( HighlanderComments.submittingText ) ).addClass( 'disabled' ).attr( 'disabled', 'disabled' ).wrap( '<p id="comment-form-submitting" />' ); }, toggleLabel : function( input ) { if ( jQuery( window ).width() && jQuery( window ).width() <= 450 ) { return; } if ( !input.val().length ) { input.parents('div.comment-form-field').children('label').css( { opacity: 1 } ); } else { input.parents('div.comment-form-field').children('label').css( { opacity: 0.05 } ); } }, hideLabels: function( input ) { if ( jQuery( window ).width() == 0 || jQuery( window ).width() > 450 && !input.attr( 'placeholder' ) ) { input.parents('div.comment-form-field').children('label').animate( { opacity: 0 }, 150, function() { jQuery(this).hide(); } ); } input.parent().addClass('active'); }, showLabels: function( input ) { if ( jQuery( window ).width() == 0 || jQuery( window ).width() > 450 && !input.attr( 'placeholder' ) ) { if ( !input.val().length ) { input.parents('div.comment-form-field').children('label').show().animate( { opacity: 1 }, 150 ); } } input.parent().removeClass('active'); }, editShareText: function(e) { e.preventDefault(); if ( jQuery( '#comment-form-edit-share-text' ).is( ':hidden' ) ) { jQuery( '#comment-form-edit-share-text' ).slideDown( 'fast', HighlanderComments.resizeCallback ); } else { jQuery( '#comment-form-edit-share-text' ).slideUp( 'fast', HighlanderComments.resizeCallback ); } }, toggleShareLabels: function() { if ( jQuery( '#respond' ).outerWidth() > 450 ) { jQuery( '#comment-form-post-to label span' ).show().parent().css( { 'padding-right': 0 } ); } else { jQuery( '#comment-form-post-to label span' ).hide().parent().css( { 'padding-right': '20px' } ); } HighlanderComments.resizeCallback(); }, fillShareText: function( textarea ) { if ( !jQuery( '#comment-form-share-text-textarea' ).length ) { return; } var current = jQuery( '#comment-form-share-text-textarea' ).val().split( '": ' ); var shareComment = current[0] + '": ' + jQuery(textarea).val(); if ( shareComment.length > 280 ) { shareComment = shareComment.substr( 0, 276 ) + '...'; } jQuery( '#comment-form-share-text-textarea' ).val( shareComment ); }, // Google Sign-in is a little different than the other services // It uses its own JavaScript API loaded in its own iframe // (public.api/connect/?googleplus-sign-in=1) // We listen for messages from that iframe here onGooglePlusSignIn: function( message ) { var hostname; if ( -1 !== document.location.hostname.indexOf( '.wordpress.com' ) ) { hostname = 'wordpress.com'; } else { hostname = document.location.hostname; } if ( 'undefined' == typeof message.error) { var value = jQuery.param( message ).replace( /\+/g, '%20' ); value.name = encodeURIComponent( value.name ); HighlanderComments.writeCookie( 'wpc_gpc', value, 1, hostname ); jQuery( '#comment-form-nascar li.selected' ).removeClass( 'selected' ); jQuery( "#googleplus-sign-in" ).parent().addClass( 'selected' ); HighlanderComments.doExternalLoggedIn( 'googleplus' ); } else { HighlanderComments.doExternalLogout( 'googleplus' ); } }, onGooglePlusButtonClick: function( message ) { HighlanderComments.setConnectingToText( 'Google' ); HighlanderComments.updateLoadServiceVisibility( '#comment-form-load-service' ); HighlanderComments.clickExternalTab( 'googleplus' ); }, /* Read the contents of a named cookie, assuming they are query-string-style delimited, and return them as a JS hash. */ readCookie : function(c) { var nameEQ = c + "=", cookieStrings = document.cookie.split( ';' ), i, cookieString, num, chunk, pairs, pair, cookie_data; if( 'wpc_gpc' == c && !document.cookie ) { // Needed for IE because it doesn’t allow setting cookies in iframes from another domain, unless we send P3P headers cookieStrings = HighlanderComments.temp_cookie_data.split( ';' ); } for ( i = 0; i < cookieStrings.length; i++ ) { cookieString = cookieStrings[ i ]; while ( cookieString.charAt( 0 ) === ' ' ) { cookieString = cookieString.substring( 1, cookieString.length ); } if ( cookieString.indexOf( nameEQ ) === 0 ) { chunk = cookieString.substring( nameEQ.length, cookieString.length ); pairs = chunk.split( '&' ); cookie_data = {}; for ( num = pairs.length - 1; num >= 0; num-- ) { pair = pairs[ num ].split( '=' ); cookie_data[ pair[0] ] = decodeURIComponent( pair[1] ); } return cookie_data; } } return null; }, writeCookie : function( name, value, days, domain ) { var expires; if ( days ) { var date = new Date(); date.setTime( date.getTime() + ( days * 24 * 60 * 60 * 1000 ) ); expires = "; expires=" + date.toGMTString(); } else { expires = ""; } if ( domain ) { domain = "; domain=" + domain; } else { domain = ''; } HighlanderComments.temp_cookie_data = document.cookie = name + "=" + value + expires + "; path=/" + domain; } } ); jQuery( HighlanderComments.init ); ;