/*! * Sharrre.com - Make your sharing widget! * Version: beta 1.3.5 * Author: Julien Hany * License: MIT http://en.wikipedia.org/wiki/MIT_License or GPLv2 http://en.wikipedia.org/wiki/GNU_General_Public_License */ ; (function($, window, document, undefined) { /* Defaults ================================================== */ var pluginName = 'sharrre', defaults = { className: 'sharrre', share: { googlePlus: false, facebook: false, twitter: false, digg: false, delicious: false, stumbleupon: false, linkedin: false, pinterest: false }, shareTotal: 0, template: '', title: '', url: document.location.href, text: document.title, urlCurl: 'sharrre.php', //PHP script for google plus... count: {}, //counter by social network total: 0, //total of sharing shorterTotal: true, //show total by k or M when number is to big enableHover: true, //disable if you want to personalize hover event with callback enableCounter: true, //disable if you just want use buttons enableTracking: false, //tracking with google analitycs hover: function() {}, //personalize hover event with this callback function hide: function() {}, //personalize hide event with this callback function click: function() {}, //personalize click event with this callback function render: function() {}, //personalize render event with this callback function buttons: { //settings for buttons googlePlus: { //http://www.google.com/webmasters/+1/button/ url: '', //if you need to personnalize button url urlCount: false, //if you want to use personnalize button url on global counter size: 'medium', lang: 'en-US', annotation: '' }, facebook: { //http://developers.facebook.com/docs/reference/plugins/like/ url: '', //if you need to personalize url button urlCount: false, //if you want to use personnalize button url on global counter action: 'like', layout: 'button_count', width: '', send: 'false', faces: 'false', colorscheme: '', font: '', lang: 'en_US' }, twitter: { //http://twitter.com/about/resources/tweetbutton url: '', //if you need to personalize url button urlCount: false, //if you want to use personnalize button url on global counter count: 'horizontal', hashtags: '', via: '', related: '', lang: 'en' }, digg: { //http://about.digg.com/downloads/button/smart url: '', //if you need to personalize url button urlCount: false, //if you want to use personnalize button url on global counter type: 'DiggCompact' }, delicious: { url: '', //if you need to personalize url button urlCount: false, //if you want to use personnalize button url on global counter size: 'medium' //medium or tall }, stumbleupon: { //http://www.stumbleupon.com/badges/ url: '', //if you need to personalize url button urlCount: false, //if you want to use personnalize button url on global counter layout: '1' }, linkedin: { //http://developer.linkedin.com/plugins/share-button url: '', //if you need to personalize url button urlCount: false, //if you want to use personnalize button url on global counter counter: '' }, pinterest: { //http://pinterest.com/about/goodies/ url: '', //if you need to personalize url button media: '', description: '', layout: 'horizontal' } } }, /* Json URL to get count number ================================================== */ urlJson = { googlePlus: "", //new FQL method by Sire facebook: "https://graph.facebook.com/fql?q=SELECT%20url,%20normalized_url,%20share_count,%20like_count,%20comment_count,%20total_count,commentsbox_count,%20comments_fbid,%20click_count%20FROM%20link_stat%20WHERE%20url=%27{url}%27&callback=?", //old method facebook: "http://graph.facebook.com/?id={url}&callback=?", //facebook : "http://api.ak.facebook.com/restserver.php?v=1.0&method=links.getStats&urls={url}&format=json" twitter: "http://cdn.api.twitter.com/1/urls/count.json?url={url}&callback=?", digg: "http://services.digg.com/2.0/story.getInfo?links={url}&type=javascript&callback=?", delicious: 'http://feeds.delicious.com/v2/json/urlinfo/data?url={url}&callback=?', //stumbleupon: "http://www.stumbleupon.com/services/1.01/badge.getinfo?url={url}&format=jsonp&callback=?", stumbleupon: "", linkedin: "http://www.linkedin.com/countserv/count/share?format=jsonp&url={url}&callback=?", pinterest: "http://api.pinterest.com/v1/urls/count.json?url={url}&callback=?" }, /* Load share buttons asynchronously ================================================== */ loadButton = { googlePlus: function(self) { var sett = self.options.buttons.googlePlus; //$(self.element).find('.buttons').append('
'); $(self.element).find('.buttons').append('
'); window.___gcfg = { lang: self.options.buttons.googlePlus.lang }; var loading = 0; if (typeof gapi === 'undefined' && loading == 0) { loading = 1; (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = '//apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })(); } else { gapi.plusone.go(); } }, facebook: function(self) { var sett = self.options.buttons.facebook; $(self.element).find('.buttons').append('
'); var loading = 0; if (typeof FB === 'undefined' && loading == 0) { loading = 1; (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) { return; } js = d.createElement(s); js.id = id; js.src = '//connect.facebook.net/' + sett.lang + '/all.js#xfbml=1'; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); } else { FB.XFBML.parse(); } }, twitter: function(self) { var sett = self.options.buttons.twitter; $(self.element).find('.buttons').append('
Tweet
'); var loading = 0; if (typeof twttr === 'undefined' && loading == 0) { loading = 1; (function() { var twitterScriptTag = document.createElement('script'); twitterScriptTag.type = 'text/javascript'; twitterScriptTag.async = true; twitterScriptTag.src = '//platform.twitter.com/widgets.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(twitterScriptTag, s); })(); } else { $.ajax({ url: '//platform.twitter.com/widgets.js', dataType: 'script', cache: true }); //http://stackoverflow.com/q/6536108 } }, digg: function(self) { var sett = self.options.buttons.digg; $(self.element).find('.buttons').append('
'); var loading = 0; if (typeof __DBW === 'undefined' && loading == 0) { loading = 1; (function() { var s = document.createElement('SCRIPT'), s1 = document.getElementsByTagName('SCRIPT')[0]; s.type = 'text/javascript'; s.async = true; s.src = '//widgets.digg.com/buttons.js'; s1.parentNode.insertBefore(s, s1); })(); } }, delicious: function(self) { if (self.options.buttons.delicious.size == 'tall') { //tall var css = 'width:50px;', cssCount = 'height:35px;width:50px;font-size:15px;line-height:35px;', cssShare = 'height:18px;line-height:18px;margin-top:3px;'; } else { //medium var css = 'width:93px;', cssCount = 'float:right;padding:0 3px;height:20px;width:26px;line-height:20px;', cssShare = 'float:left;height:20px;line-height:20px;'; } var count = self.shorterTotal(self.options.count.delicious); if (typeof count === "undefined") { count = 0; } $(self.element).find('.buttons').append( '
' + '
' + count + '
' + '
' + 'Delicious Add
'); $(self.element).find('.delicious').on('click', function() { self.openPopup('delicious'); }); }, stumbleupon: function(self) { var sett = self.options.buttons.stumbleupon; $(self.element).find('.buttons').append('
'); var loading = 0; if (typeof STMBLPN === 'undefined' && loading == 0) { loading = 1; (function() { var li = document.createElement('script'); li.type = 'text/javascript'; li.async = true; li.src = '//platform.stumbleupon.com/1/widgets.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(li, s); })(); s = window.setTimeout(function() { if (typeof STMBLPN !== 'undefined') { STMBLPN.processWidgets(); clearInterval(s); } }, 500); } else { STMBLPN.processWidgets(); } }, linkedin: function(self) { var sett = self.options.buttons.linkedin; $(self.element).find('.buttons').append('
'); var loading = 0; if (typeof window.IN === 'undefined' && loading == 0) { loading = 1; (function() { var li = document.createElement('script'); li.type = 'text/javascript'; li.async = true; li.src = '//platform.linkedin.com/in.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(li, s); })(); } else { window.IN.init(); } }, pinterest: function(self) { var sett = self.options.buttons.pinterest; $(self.element).find('.buttons').append('
Pin It
'); (function() { var li = document.createElement('script'); li.type = 'text/javascript'; li.async = true; li.src = '//assets.pinterest.com/js/pinit.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(li, s); })(); } }, /* Tracking for Google Analytics ================================================== */ tracking = { googlePlus: function() {}, facebook: function() { //console.log('facebook'); fb = window.setInterval(function() { if (typeof FB !== 'undefined') { FB.Event.subscribe('edge.create', function(targetUrl) { _gaq.push(['_trackSocial', 'facebook', 'like', targetUrl]); }); FB.Event.subscribe('edge.remove', function(targetUrl) { _gaq.push(['_trackSocial', 'facebook', 'unlike', targetUrl]); }); FB.Event.subscribe('message.send', function(targetUrl) { _gaq.push(['_trackSocial', 'facebook', 'send', targetUrl]); }); //console.log('ok'); clearInterval(fb); } }, 1000); }, twitter: function() { //console.log('twitter'); tw = window.setInterval(function() { if (typeof twttr !== 'undefined') { twttr.events.bind('tweet', function(event) { if (event) { _gaq.push(['_trackSocial', 'twitter', 'tweet']); } }); //console.log('ok'); clearInterval(tw); } }, 1000); }, digg: function() { //if somenone find a solution, mail me ! /*$(this.element).find('.digg').on('click', function(){ _gaq.push(['_trackSocial', 'digg', 'add']); });*/ }, delicious: function() {}, stumbleupon: function() {}, linkedin: function() { function LinkedInShare() { _gaq.push(['_trackSocial', 'linkedin', 'share']); } }, pinterest: function() { //if somenone find a solution, mail me ! } }, /* Popup for each social network ================================================== */ popup = { googlePlus: function(opt) { window.open("https://plus.google.com/share?hl=" + opt.buttons.googlePlus.lang + "&url=" + encodeURIComponent((opt.buttons.googlePlus.url !== '' ? opt.buttons.googlePlus.url : opt.url)), "", "toolbar=0, status=0, width=900, height=500"); }, facebook: function(opt) { window.open("http://www.facebook.com/sharer/sharer.php?u=" + encodeURIComponent((opt.buttons.facebook.url !== '' ? opt.buttons.facebook.url : opt.url)) + "&t=" + opt.text + "", "", "toolbar=0, status=0, width=900, height=500"); }, twitter: function(opt) { window.open("https://twitter.com/intent/tweet?text=" + encodeURIComponent(opt.text) + "&url=" + encodeURIComponent((opt.buttons.twitter.url !== '' ? opt.buttons.twitter.url : opt.url)) + (opt.buttons.twitter.via !== '' ? '&via=' + opt.buttons.twitter.via : ''), "", "toolbar=0, status=0, width=650, height=360"); }, digg: function(opt) { window.open("http://digg.com/tools/diggthis/submit?url=" + encodeURIComponent((opt.buttons.digg.url !== '' ? opt.buttons.digg.url : opt.url)) + "&title=" + opt.text + "&related=true&style=true", "", "toolbar=0, status=0, width=650, height=360"); }, delicious: function(opt) { window.open('http://www.delicious.com/save?v=5&noui&jump=close&url=' + encodeURIComponent((opt.buttons.delicious.url !== '' ? opt.buttons.delicious.url : opt.url)) + '&title=' + opt.text, 'delicious', 'toolbar=no,width=550,height=550'); }, stumbleupon: function(opt) { window.open('http://www.stumbleupon.com/badge/?url=' + encodeURIComponent((opt.buttons.stumbleupon.url !== '' ? opt.buttons.stumbleupon.url : opt.url)), 'stumbleupon', 'toolbar=no,width=550,height=550'); }, linkedin: function(opt) { window.open('https://www.linkedin.com/cws/share?url=' + encodeURIComponent((opt.buttons.linkedin.url !== '' ? opt.buttons.linkedin.url : opt.url)) + '&token=&isFramed=true', 'linkedin', 'toolbar=no,width=550,height=550'); }, pinterest: function(opt) { window.open('http://pinterest.com/pin/create/button/?url=' + encodeURIComponent((opt.buttons.pinterest.url !== '' ? opt.buttons.pinterest.url : opt.url)) + '&media=' + encodeURIComponent(opt.buttons.pinterest.media) + '&description=' + opt.buttons.pinterest.description, 'pinterest', 'toolbar=no,width=700,height=300'); } }; /* Plugin constructor ================================================== */ function Plugin(element, options) { this.element = element; this.options = $.extend(true, {}, defaults, options); this.options.share = options.share; //simple solution to allow order of buttons this._defaults = defaults; this._name = pluginName; this.init(); }; /* Initialization method ================================================== */ Plugin.prototype.init = function() { var self = this; if (this.options.urlCurl !== '') { urlJson.googlePlus = this.options.urlCurl + '?url={url}&type=googlePlus'; // PHP script for GooglePlus... urlJson.stumbleupon = this.options.urlCurl + '?url={url}&type=stumbleupon'; // PHP script for Stumbleupon... } $(this.element).addClass(this.options.className); //add class //HTML5 Custom data if (typeof $(this.element).data('title') !== 'undefined') { this.options.title = $(this.element).attr('data-title'); } if (typeof $(this.element).data('url') !== 'undefined') { this.options.url = $(this.element).data('url'); } if (typeof $(this.element).data('text') !== 'undefined') { this.options.text = $(this.element).data('text'); } //how many social website have been selected $.each(this.options.share, function(name, val) { if (val === true) { self.options.shareTotal++; } }); if (self.options.enableCounter === true) { //if for some reason you don't need counter //get count of social share that have been selected $.each(this.options.share, function(name, val) { if (val === true) { //self.getSocialJson(name); try { self.getSocialJson(name); } catch (e) {} } }); } else if (self.options.template !== '') { //for personalized button (with template) this.options.render(this, this.options); } else { // if you want to use official button like example 3 or 5 this.loadButtons(); } //add hover event $(this.element).hover(function() { //load social button if enable and 1 time if ($(this).find('.buttons').length === 0 && self.options.enableHover === true) { self.loadButtons(); } self.options.hover(self, self.options); }, function() { self.options.hide(self, self.options); }); //click event $(this.element).click(function() { self.options.click(self, self.options); return false; }); }; /* loadButtons methode ================================================== */ Plugin.prototype.loadButtons = function() { var self = this; $(this.element).append('
'); $.each(self.options.share, function(name, val) { if (val == true) { loadButton[name](self); if (self.options.enableTracking === true) { //add tracking tracking[name](); } } }); }; /* getSocialJson methode ================================================== */ Plugin.prototype.getSocialJson = function(name) { var self = this, count = 0, url = urlJson[name].replace('{url}', encodeURIComponent(this.options.url)); if (this.options.buttons[name].urlCount === true && this.options.buttons[name].url !== '') { url = urlJson[name].replace('{url}', this.options.buttons[name].url); } //console.log('name : ' + name + ' - url : '+url); //debug if (url != '' && self.options.urlCurl !== '') { //urlCurl = '' if you don't want to used PHP script but used social button $.getJSON(url, function(json) { if (typeof json.count !== "undefined") { //GooglePlus, Stumbleupon, Twitter, Pinterest and Digg var temp = json.count + ''; temp = temp.replace('\u00c2\u00a0', ''); //remove google plus special chars count += parseInt(temp, 10); } //get the FB total count (shares, likes and more) else if (json.data && json.data.length > 0 && typeof json.data[0].total_count !== "undefined") { //Facebook total count count += parseInt(json.data[0].total_count, 10); } else if (typeof json[0] !== "undefined") { //Delicious count += parseInt(json[0].total_posts, 10); } else if (typeof json[0] !== "undefined") { //Stumbleupon } self.options.count[name] = count; self.options.total += count; self.renderer(); self.rendererPerso(); //console.log(json); //debug }) .error(function() { self.options.count[name] = 0; self.rendererPerso(); }); } else { self.renderer(); self.options.count[name] = 0; self.rendererPerso(); } }; /* launch render methode ================================================== */ Plugin.prototype.rendererPerso = function() { //check if this is the last social website to launch render var shareCount = 0; for (e in this.options.count) { shareCount++; } if (shareCount === this.options.shareTotal) { this.options.render(this, this.options); } }; /* render methode ================================================== */ Plugin.prototype.renderer = function() { var total = this.options.total, template = this.options.template; if (this.options.shorterTotal === true) { //format number like 1.2k or 5M total = this.shorterTotal(total); } if (template !== '') { //if there is a template template = template.replace('{total}', total); $(this.element).html(template); } else { //template by defaults $(this.element).html( '
' + total + '' + (this.options.title !== '' ? '' + this.options.title + '' : '') + '
' ); } }; /* format total numbers like 1.2k or 5M ================================================== */ Plugin.prototype.shorterTotal = function(num) { if (num >= 1e6) { num = (num / 1e6).toFixed(2) + "M" } else if (num >= 1e3) { num = (num / 1e3).toFixed(1) + "k" } return num; }; /* Methode for open popup ================================================== */ Plugin.prototype.openPopup = function(site) { popup[site](this.options); //open if (this.options.enableTracking === true) { //tracking! var tracking = { googlePlus: { site: 'Google', action: '+1' }, facebook: { site: 'facebook', action: 'like' }, twitter: { site: 'twitter', action: 'tweet' }, digg: { site: 'digg', action: 'add' }, delicious: { site: 'delicious', action: 'add' }, stumbleupon: { site: 'stumbleupon', action: 'add' }, linkedin: { site: 'linkedin', action: 'share' }, pinterest: { site: 'pinterest', action: 'pin' } }; _gaq.push(['_trackSocial', tracking[site].site, tracking[site].action]); } }; /* Methode for add +1 to a counter ================================================== */ Plugin.prototype.simulateClick = function() { var html = $(this.element).html(); $(this.element).html(html.replace(this.options.total, this.options.total + 1)); }; /* Methode for add +1 to a counter ================================================== */ Plugin.prototype.update = function(url, text) { if (url !== '') { this.options.url = url; } if (text !== '') { this.options.text = text; } }; /* A really lightweight plugin wrapper around the constructor, preventing against multiple instantiations ================================================== */ $.fn[pluginName] = function(options) { var args = arguments; if (options === undefined || typeof options === 'object') { return this.each(function() { if (!$.data(this, 'plugin_' + pluginName)) { $.data(this, 'plugin_' + pluginName, new Plugin(this, options)); } }); } else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') { return this.each(function() { var instance = $.data(this, 'plugin_' + pluginName); if (instance instanceof Plugin && typeof instance[options] === 'function') { instance[options].apply(instance, Array.prototype.slice.call(args, 1)); } }); } }; })(jQuery, window, document);