(function($) { /* * Append social-js class to html element. This allows us to prevent JS FOUC * in an accessible way. * Run it ASAP. Doesn't need to run on domReady because the html element is * the first thing available. */ var c = document.getElementsByTagName('html')[0]; c.className += ' social-js'; $(function() { $('.social-login').click(function(e) { e.preventDefault(); var $window = $(this), $auth_window = window.open($(this).attr('href'), "ServiceAssociate", 'width=700,height=400'), auth_poll = null; auth_poll = setInterval(function() { if ($auth_window.closed) { clearInterval(auth_poll); if (!$window.hasClass('comments')) { window.location.reload(); } else { var $parent = $('.social-post'); $.post($parent.find('#reload_url').val(), {}, function(response) { if (response.result == 'success') { // Add logged-in body class since we're not going to be refreshing the page. $('body').addClass('logged-in'); var $cancel = $('#cancel-comment-reply-link'), $parent = $cancel.closest('li'), $clone = $cancel.clone(true); $cancel.click(); $('#respond').replaceWith(response.html); // replace the cancel button with the one we cloned, to retain actions $('#respond').find('#cancel-comment-reply-link').remove().end() .find('#reply-title small:first').append($clone); $parent.find('.comment-reply-link:first').click(); $('#primary').find('#social_login').parent().html(response.disconnect_url); } }, 'json'); } } }, 100); }); // comments.php if ($('#social').length) { // MCC Tabs var $prevLink = null, prevLink = null, $nextLink = null, nextLink = null; if ($('#comments .nav-previous a').length) { $prevLink = $('#comments .nav-previous a'); prevLink = $prevLink.attr('href'); } if ($('#comments .nav-next a').length) { $nextLink = $('#comments .nav-next a'); nextLink = $nextLink.attr('href'); } $('.social-nav a').click(function(e) { e.preventDefault(); $('#cancel-comment-reply-link').trigger('click'); $('.social-current-tab').removeClass('social-current-tab'); $(this).parent().addClass('social-current-tab'); $('.social-items').removeClass('social-comment-collapse'); var className = $(this).attr('rel'); if (className == 'social-all') { if (nextLink !== null) { $nextLink.attr('href', nextLink); } if (prevLink !== null) { $prevLink.attr('href', prevLink); } $('.social-commentlist li').removeClass('social-comment-collapse'); } else { $('.social-items:not(.' + className + ')').addClass('social-comment-collapse'); $('.social-commentlist li').each(function() { if (!$(this).hasClass(className)) { $(this).addClass('social-comment-collapse'); } else { $(this).removeClass('social-comment-collapse'); } }); if (prevLink !== null) { var _prevLink = prevLink.split('#comments'); if (_prevLink.indexOf('?') == -1) { _prevLink[0] = _prevLink[0] + '?'; } else { _prevLink[0] = _prevLink[0] + '&'; } $prevLink.attr('href', _prevLink[0] + 'social_tab=' + className + '#comments'); } if (nextLink !== null) { var _nextLink = nextLink.split('#comments'); if (_nextLink.indexOf('?') == -1) { _nextLink[0] = _nextLink[0] + '?'; } else { _nextLink[0] = _nextLink[0] + '&'; } $nextLink.attr('href', _nextLink[0] + 'social_tab=' + className + '#comments'); } } }); $('.social-current-tab a').trigger('click'); /** * Inserts the Twitter username for the reply to content. * * @param $author * @param $textarea * @param extraContent */ function insertTwitterUsername($author, $textarea, extraContent) { var username = $author.html() + ' '; if (username.substr(0, 1) != '@') { username = '@' + username; } if (extraContent !== undefined) { username += extraContent; } var val = $textarea.val(); if (val.substr(0, username.length) != username) { var content = ''; var content = (val.length > 0 ? username + val : username); var pos = content.length; $textarea.val(content); if ($textarea.get(0).setSelectionRange) { $textarea.focus(); $textarea.get(0).setSelectionRange(pos, pos); } else if ($textarea.createTextRange) { var range = $textarea.get(0).createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } } } /** * Removes the inserted Twitter username from the content. * * @param $author * @param $textarea */ function removeTwitterUsername($author, $textarea) { var username = $author.html() + ' '; if (username.substr(0, 1) != '@') { username = '@' + username; } var val = $textarea.val(); if (val.substr(0, username.length) == username) { var content = val.substr(username.length); var pos = content.length; $textarea.val(content); if ($textarea.get(0).setSelectionRange) { $textarea.focus(); $textarea.get(0).setSelectionRange(pos, pos); } else if ($textarea.createTextRange) { var range = $textarea.get(0).createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } } } $('.comment-reply-link').click(function() { $('.comment-reply-link').show(); $(this).hide(); var $title = $('#reply-title'), $cancel = null, $parent = $(this).closest('li'), $textarea = $parent.find('textarea'), $form = $('#commentform'); // set data attr for current title // set title to Sociali18n.commentReplyTitle $cancel = $title.find('small').hide().appendTo($title); $title.data('orig-title', $title.find('span').text()) .find('span').html(Sociali18n.commentReplyTitle + ' ') .append($cancel.show()); if ($parent.hasClass('social-twitter') || $parent.hasClass('social-facebook')) { var commentService = ($parent.hasClass('social-twitter') ? 'twitter' : 'facebook'); // check to see if the current user has a profile for the service if ($('#post_accounts option[data-type="' + commentService + '"]').size() == 0 && $form.find('.social-identity .social-' + commentService + '-icon').size() == 0) { return; } var username = '', matched = false, $option = false, $options = $('#post_accounts option[data-type="' + commentService + '"]'); switch (commentService) { case 'twitter': // look for a username at the beginning of the comment // if we have that account available, use it // if not, select the first account for that service var content = $.trim($parent.find('.social-comment-body:first').text()); if (content.substr(0, 1) == '@') { username = content.split(' ')[0].substr(1); } $options.each(function() { if ($(this).html() == username) { matched = true; $option = $(this); return false; } }); var $author = $parent.find('.social-comment-author a'), author_rel = $author.attr('rel').split(' '); $('#in_reply_to_status_id').val(author_rel[0]); // if click invoked programatically, do nothing. if ($textarea.size()) { insertTwitterUsername($author, $textarea); } break; case 'facebook': break; } if (!matched) { $options.each(function() { $option = $(this); return false; }); } if ($option) { $('#post_accounts').val($option.attr('value')).change(); } $('#post_to_service').prop('checked', true); } }); // some actions need the "live" treatment $(document).on('click', '#cancel-comment-reply-link', function() { $('.comment-reply-link').show(); $('#post_to_service').prop('checked', false); $('#in_reply_to_status_id').val(''); }); // due to the way WP's comment JS works, we can't run this on the "live" action above // by the time this runs, the node is moved and $parent is an empty set $('#cancel-comment-reply-link').click(function() { var $title = $('#reply-title'), $cancel = null, $parent = $(this).closest('li'), $textarea = $parent.find('textarea'), $author = $parent.find('.social-comment-author a'); // if click invoked programatically, do nothing. if ($textarea.size()) { // restore title $cancel = $title.find('small').hide().appendTo($title); $title.find('span').html($title.data('orig-title') + ' ').append($cancel); removeTwitterUsername($author, $textarea); } }); var $avatar = $('#commentform .avatar'); var original_avatar = $avatar.attr('src'); $(document).on('change', '#post_accounts', function() { $(this).find('option:selected').each(function() { var $parent = $(this).closest('li'), $textarea = $parent.find('textarea'), $author = $parent.find('.social-comment-author a'); if ($textarea.size()) { if ($(this).data('type') == 'twitter') { insertTwitterUsername($author, $textarea); } else { removeTwitterUsername($author, $textarea); } } var avatar = $(this).attr('rel'); if (avatar !== undefined) { $avatar.attr('src', avatar); } else { $avatar.attr('src', original_avatar); } var label = $(this).parent().attr('label'); if (label !== undefined) { $('#post_to').show().find('span').html(label); } else { $('#post_to').hide(); } }); }); $('#post_accounts').trigger('change'); } /** * Manual Aggregation */ var $social_comments_adminbar_item = $('#wp-admin-bar-social-find-comments'); if ($social_comments_adminbar_item.size()) { var $social_spinner = $social_comments_adminbar_item.find('.social-aggregation-spinner'); var $social_aggregation = $('#social_aggregation'); var $comment_adminbar_item = $('#wp-admin-bar-comments'); $social_aggregation.click(function(e) { if ($(this).attr('href') == '#') { e.preventDefault(); } }).removeClass('running-aggregation'); $comment_adminbar_item.removeClass('running-aggregation'); $social_comments_adminbar_item.find('a').click(function(e) { e.preventDefault(); if (!$comment_adminbar_item.hasClass('running-aggregation')) { $comment_adminbar_item.addClass('running-aggregation'); // remove old results (slide left) $('#wp-adminbar-comments-social').animate({ width: '0' }, function() { $(this).remove(); }); // show spinner $comment_adminbar_item.find('#ab-awaiting-mod').hide().end() .find('a:first').append($social_spinner); $social_spinner.show(); SocialLoadingInterval = setInterval(function() { var next = false; var $dots = jQuery('.social-aggregation-spinner').find('.social-dot'); $dots.each(function() { var active = jQuery(this).hasClass('dot-active'); if (next) { jQuery(this).addClass('dot-active'); } if (active) { jQuery(this).removeClass('dot-active'); next = true; } else { next = false; } }); if ($dots.filter('.dot-active').size() == 0) { $dots.filter(':first').addClass('dot-active'); } }, 425); // make AJAX call $.get( $(this).attr('href'), { render: 'false' }, function(response) { // hide spinner $social_spinner.hide(); $social_comments_adminbar_item.append($social_spinner); clearInterval(SocialLoadingInterval); // update count, show count $comment_adminbar_item.find('#ab-awaiting-mod') .html(response.total).show(); // show results (slide right) $comment_adminbar_item.addClass('social-comments-found').after(response.html); var $social_comments_found = $('#wp-adminbar-comments-social'); var found_width = $social_comments_found.width(); $social_comments_found.css({ position: 'relative', visibility: 'visible', width: 0 }).animate({ width: found_width + 'px' }); // set params for next call $social_aggregation.attr('href', response.link); $comment_adminbar_item.removeClass('running-aggregation'); }, 'json' ); } }); } $('#wp-admin-bar-social-add-tweet-by-url a').each(function() { $form = $(this).find('form'); $form.data('running-import', false).keydown(function(e) { e.stopPropagation(); }).submit(function() { if (!$(this).data('running-import')) { var $this = $(this), $inputs = $this.find('input'); $this.data('running-import', true); $inputs.attr('disabled', 'disabled'); var $loading = $('
') .height($this.height()) .width($this.width()); $this.hide().closest('li') .find('.msg').remove().end() .end() .after($loading); $.get($this.attr('action'), { url: $('input[name=url]').val() }, function(response) { var msg = msgClass = ''; switch (response) { case 'protected': case 'invalid': msg = socialAdminBarMsgs[response]; msgClass = ' error'; break; default: msg = socialAdminBarMsgs['success']; } $loading.remove(); $this.data('running-import', false).show() .after('

' + msg + '

'); $inputs.removeAttr('disabled').filter(':text').val('').focus(); }); } return false; }).appendTo($(this).closest('li')); }).click(function(e) { $(this).hide().closest('li').find('form').show().find(':text').focus().select(); return false; }); /** * Social items */ if ($('.social-items-and-more').length) { $('.social-items-and-more').click(function(e) { e.preventDefault(); $(this).parent().find('a').show(); $(this).hide(); }); } }); })(jQuery);