social-likes-nojq/social-likes.js

271 lines
7.8 KiB
JavaScript

/**
* Social Likes
* http://sapegin.github.com/social-likes
*
* Sharing buttons for Russian and worldwide social networks.
*
* @version 1.2.1
* @requires jQuery 1.4
* @author Artem Sapegin
* @copyright 2011 Artem Sapegin (sapegin.ru)
* @license http://creativecommons.org/licenses/by/3.0/
*/
(function($){
var socialLikes = function(){
this.init();
};
socialLikes.prototype = {
init: function() {
this.pageUrl = window.location.href.replace(window.location.hash, '');
this.container = $('.social-likes');
var this_ = this;
this.counters = {};
this.container.find('li').each(function(){
var buttonWrapper = $(this);
var classes = buttonWrapper[0].className.split(' ');
for (var classIdx = 0; classIdx < classes.length; classIdx++) {
var cls = classes[classIdx];
switch(cls) {
case 'twitter':
if (!this_.counters.twiter) {
$.getJSON('http://urls.api.twitter.com/1/urls/count.json?url=' + escape(this_.pageUrl) + '&callback=?', function(data){ this_.updateCount(cls, data.count); });
this_.counters.twiter = true;
}
this_.initButton({
urlParam: 'url',
textParam: 'text',
additionalParams: ['via', 'related'],
popupUrl: 'http://twitter.com/share',
pupupWidth: 550,
popupHeight: 450
}, buttonWrapper, cls);
break;
case 'facebook':
if (!this_.counters.facebook) {
$.getJSON('https://api.facebook.com/method/fql.query?query=select total_count from link_stat where url="' + escape(this_.pageUrl) + '"&format=json&callback=?', function(data){ this_.updateCount(cls, data[0].total_count); });
this_.counters.facebook = true;
}
this_.initButton({
urlParam: 'u',
textParam: 't',
popupUrl: 'http://www.facebook.com/sharer.php',
pupupWidth: 550,
popupHeight: 450
}, buttonWrapper, cls);
break;
case 'mailru':
if (!this_.counters.mailru) {
$.getJSON('http://connect.mail.ru/share_count?url_list=' + escape(this_.pageUrl) + '&callback=1&func=?', function(data){ this_.updateCount(cls, data[this_.pageUrl] && data[this_.pageUrl].shares); });
this_.counters.mailru = true;
}
this_.initButton({
urlParam: 'share_url',
popupUrl: 'http://connect.mail.ru/share',
pupupWidth: 550,
popupHeight: 360
}, buttonWrapper, cls);
break;
case 'vkontakte':
if (!this_.counters.vkontakte) {
window.VK = {Share: {count: function(junk, count) {
this_.updateCount(cls, count);
}}};
$.ajax({
url: 'http://vkontakte.ru/share.php?act=count&index=1&url=' + escape(this_.pageUrl),
dataType: 'jsonp'
});
this_.counters.vkontakte = true;
}
this_.initButton({
urlParam: 'url',
textParam: 'title',
popupUrl: 'http://vkontakte.ru/share.php',
pupupWidth: 550,
popupHeight: 330
}, buttonWrapper, cls);
break;
case 'odnoklassniki':
if (!this_.counters.odnoklassniki) {
window.ODKL = {updateCount: function(junk, count) {
this_.updateCount(cls, count);
}};
$.ajax({
url: 'http://www.odnoklassniki.ru/dk?st.cmd=extLike&uid=odklcnt0&ref=' + escape(this_.pageUrl),
dataType: 'jsonp'
});
this_.counters.odnoklassniki = true;
}
this_.initButton({
urlParam: 'st._surl',
popupUrl: 'http://www.odnoklassniki.ru/dk?st.cmd=addShare',
pupupWidth: 550,
popupHeight: 360
}, buttonWrapper, cls);
break;
case 'livejournal':
var button = buttonWrapper.find(':submit');
var newLink = $('<a href="#">' + button.val() + '</a>');
newLink.click(function(){ $(this).closest('form').submit(); });
if (button.attr('title')) {
newLink.attr('title', button.attr('title'));
}
button.hide();
button.after(newLink);
break;
case 'code':
var link = buttonWrapper.find('a');
link.click(function(){
var balloon = buttonWrapper.find('.social-balloon');
if (balloon.length) {
balloon.toggle();
}
else {
balloon = $([
'<div class="social-balloon">',
'<i></i>',
'Скопируйте код в&nbsp;буфер обмена:<br>',
'<textarea class="social-code-area"></textarea>',
'</div>'
].join(''));
link.after(balloon);
var textarea = buttonWrapper.find('textarea');
var messageField = this_.container.find('.livejournal input[name="event"]');
if (!messageField.length) messageField = this_.container.find('.code input[name="event"]');
textarea.val(messageField.val());
this_.selectTextInTextarea(textarea);
}
if (balloon.is(":visible")) {
$(document).bind('click.social-hide-code', function(e){
if (!$(e.target).hasClass('social-code-area')) {
balloon.hide();
$(document).unbind('click.social-hide-code');
}
return true;
});
}
return false;
});
break;
}
// Icon container
buttonWrapper.find('a').prepend('<i></i>');
}
});
},
initButton: function(params, buttonWrapper, buttonName) {
var link = buttonWrapper.find('a');
var query = {};
if (params.urlParam)
query[params.urlParam] = this.pageUrl;
if (params.textParam)
query[params.textParam] = document.title;
if (params.additionalParams) {
for (var paramIdx = 0; paramIdx < params.additionalParams.length; paramIdx++) {
var key = params.additionalParams[paramIdx];
if (link.attr('data-' + key))
query[key] = link.attr('data-' + key);
}
}
var this_ = this;
link.click(function(){
var paramsSeparator = params.popupUrl.indexOf('?') === -1 ? '?' : '&';
this_.openWindow(params.popupUrl + paramsSeparator + this_.getQuery(query), {
width: params.pupupWidth,
height: params.popupHeight,
name: 'share_' + buttonName
});
return false;
});
},
updateCount: function(buttonName, count) {
count = parseInt(count, 10);
var buttonWrapper = $('.' + buttonName, this.container);
var counter = buttonWrapper.find('b i i');
if (counter.length) {
counter.html(count);
}
else {
if (count) {
buttonWrapper.append('<b><i><i></i></i>' + count + '</b>');
}
}
},
openWindow: function(url, params) {
var left = Math.round((screen.width / 2) - (params.width / 2));
var top = 0;
if (screen.height > params.height) {
top = Math.round((screen.height / 3) - (params.height / 2));
}
var win = window.open(url, params.name, "left=" + left + ",top=" + top + ",width=" + params.width + ",height=" + params.height + ",personalbar=0,toolbar=0,scrollbars=1,resizable=1");
if (win) {
win.focus();
} else {
window.location.href = url;
}
},
getQuery: function(params) {
var query = [];
for (var key in params) {
query.push(key + '=' + encodeURIComponent(params[key]).replace(/\+/g, '%2B'));
}
return query.join('&');
},
selectTextInTextarea: function(elem) {
this.selectTextRange(elem, 0, elem.val().length);
},
selectTextRange: function(elem, start, end) {
elem = elem[0];
if (elem.setSelectionRange) {
elem.focus();
elem.setSelectionRange(start, end);
}
else if (elem.createTextRange) {
var range = elem.createTextRange();
range.collapse(true);
range.moveEnd('character', end);
range.moveStart('character', start);
range.select();
}
}
};
if (document.body) {
new socialLikes();
}
else {
$(function() { new socialLikes(); });
}
})(jQuery);