/files/wp-social/2.6/assets/social.js
JavaScript | 452 lines | 370 code | 34 blank | 48 comment | 72 complexity | 17ea404ef828585e26d70d5d1505be7e MD5 | raw file
- (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 = $('<div class="loading"></div>')
- .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('<p class="msg' + msgClass + '">' + msg + '</p>');
- $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);