diff --git a/app/views/content_viewer/view_page.html.erb b/app/views/content_viewer/view_page.html.erb index 036f6b5..55bca32 100644 --- a/app/views/content_viewer/view_page.html.erb +++ b/app/views/content_viewer/view_page.html.erb @@ -42,6 +42,7 @@ <%= render :partial => 'shared/disabled_enterprise' %> +<%= @plugins.dispatch(:social_buttons_javascript, @page).collect { |content| instance_exec(&content) }.join("") %> <% if NOOSFERO_CONF['addthis_enabled'] %> <%= render :partial => 'addthis' %> <% end %> diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index e966ae3..720733e 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -394,6 +394,12 @@ class Noosfero::Plugin nil end + # -> Adds social networks share buttons to content + # returns = lambda block that creates html code + def social_buttons_javascript(environment) + nil + end + # -> Adds fields to the signup form # returns = proc that creates html code def signup_extra_contents diff --git a/plugins/social_share_privacy/controllers/social_share_privacy_plugin_admin_controller.rb b/plugins/social_share_privacy/controllers/social_share_privacy_plugin_admin_controller.rb new file mode 100644 index 0000000..0968588 --- /dev/null +++ b/plugins/social_share_privacy/controllers/social_share_privacy_plugin_admin_controller.rb @@ -0,0 +1,18 @@ +class SocialSharePrivacyPluginAdminController < AdminController + append_view_path File.join(File.dirname(__FILE__) + '/../views') + + def index + available_networks = Dir[SocialSharePrivacyPlugin.root_path + 'public/javascripts/modules/*.js'].map { |entry| entry.split('/').last.gsub(/\.js$/,'') } + @selected = environment.socialshare + @tags = available_networks - @selected + if request.post? + networks = params[:networks].map{ |network| network.strip } if params[:networks] + environment.socialshare = networks + if environment.save + session[:notice] = _('Saved the selected social buttons') + redirect_to :controller => 'plugins', :action => 'index' + end + end + end + +end diff --git a/plugins/social_share_privacy/lib/ext/environment.rb b/plugins/social_share_privacy/lib/ext/environment.rb new file mode 100644 index 0000000..bf277e4 --- /dev/null +++ b/plugins/social_share_privacy/lib/ext/environment.rb @@ -0,0 +1,8 @@ +require_dependency 'environment' + +class Environment + + settings_items :socialshare, :type => Array, :default => [] + +end + diff --git a/plugins/social_share_privacy/lib/social_share_privacy_plugin.rb b/plugins/social_share_privacy/lib/social_share_privacy_plugin.rb new file mode 100644 index 0000000..3cd560d --- /dev/null +++ b/plugins/social_share_privacy/lib/social_share_privacy_plugin.rb @@ -0,0 +1,24 @@ +class SocialSharePrivacyPlugin < Noosfero::Plugin + + def self.plugin_name + "Social Share Privacy" + end + + def self.plugin_description + _("A plugin that adds share buttons from other networks.") + end + + def stylesheet? + true + end + + def social_buttons_javascript(article) + proc do + javascript_include_tag('plugins/social_share_privacy/javascripts/socialshareprivacy.js') + + javascript_include_tag(environment.socialshare.map { |service| "plugins/social_share_privacy/javascripts/modules/#{service}.js" }) + + javascript_tag("jQuery.fn.socialSharePrivacy.settings.path_prefix = '../../plugins/social_share_privacy/'; jQuery.fn.socialSharePrivacy.settings.order = #{environment.socialshare}; jQuery(document).ready(function () { jQuery('.social-buttons').socialSharePrivacy({perma_option: false, info_link_target: '_blank'});});") + + content_tag(:div, '',:class => "social-buttons") + end + end + +end diff --git a/plugins/social_share_privacy/public/images/box_fbshare.png b/plugins/social_share_privacy/public/images/box_fbshare.png new file mode 100644 index 0000000..0d722c1 Binary files /dev/null and b/plugins/social_share_privacy/public/images/box_fbshare.png differ diff --git a/plugins/social_share_privacy/public/images/box_mail.png b/plugins/social_share_privacy/public/images/box_mail.png new file mode 100644 index 0000000..f2692c0 Binary files /dev/null and b/plugins/social_share_privacy/public/images/box_mail.png differ diff --git a/plugins/social_share_privacy/public/images/box_tumblr.png b/plugins/social_share_privacy/public/images/box_tumblr.png new file mode 100644 index 0000000..1689426 Binary files /dev/null and b/plugins/social_share_privacy/public/images/box_tumblr.png differ diff --git a/plugins/social_share_privacy/public/images/de/dummy_box_facebook.png b/plugins/social_share_privacy/public/images/de/dummy_box_facebook.png new file mode 100644 index 0000000..23000bd Binary files /dev/null and b/plugins/social_share_privacy/public/images/de/dummy_box_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/de/dummy_facebook.png b/plugins/social_share_privacy/public/images/de/dummy_facebook.png new file mode 100644 index 0000000..7a220b8 Binary files /dev/null and b/plugins/social_share_privacy/public/images/de/dummy_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_buffer.png b/plugins/social_share_privacy/public/images/dummy_box_buffer.png new file mode 100644 index 0000000..3b5a630 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_buffer.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_delicious.png b/plugins/social_share_privacy/public/images/dummy_box_delicious.png new file mode 100644 index 0000000..28333a3 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_delicious.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_disqus.png b/plugins/social_share_privacy/public/images/dummy_box_disqus.png new file mode 100644 index 0000000..16f0819 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_disqus.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_facebook.png b/plugins/social_share_privacy/public/images/dummy_box_facebook.png new file mode 100644 index 0000000..5bed654 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_flattr.png b/plugins/social_share_privacy/public/images/dummy_box_flattr.png new file mode 100644 index 0000000..bc22c8f Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_flattr.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_gplus.png b/plugins/social_share_privacy/public/images/dummy_box_gplus.png new file mode 100644 index 0000000..56907e1 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_gplus.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_hackernews.png b/plugins/social_share_privacy/public/images/dummy_box_hackernews.png new file mode 100644 index 0000000..d9b68c3 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_hackernews.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_linkedin.png b/plugins/social_share_privacy/public/images/dummy_box_linkedin.png new file mode 100644 index 0000000..07049e3 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_linkedin.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_pinterest.png b/plugins/social_share_privacy/public/images/dummy_box_pinterest.png new file mode 100644 index 0000000..7523008 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_pinterest.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_reddit.png b/plugins/social_share_privacy/public/images/dummy_box_reddit.png new file mode 100644 index 0000000..80449e9 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_reddit.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_stumbleupon.png b/plugins/social_share_privacy/public/images/dummy_box_stumbleupon.png new file mode 100644 index 0000000..f585e5e Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_stumbleupon.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_twitter.png b/plugins/social_share_privacy/public/images/dummy_box_twitter.png new file mode 100644 index 0000000..84f7c6d Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_twitter.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_box_xing.png b/plugins/social_share_privacy/public/images/dummy_box_xing.png new file mode 100644 index 0000000..5540388 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_box_xing.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_buffer.png b/plugins/social_share_privacy/public/images/dummy_buffer.png new file mode 100644 index 0000000..c0f46eb Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_buffer.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_delicious.png b/plugins/social_share_privacy/public/images/dummy_delicious.png new file mode 100644 index 0000000..c81ef75 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_delicious.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_disqus.png b/plugins/social_share_privacy/public/images/dummy_disqus.png new file mode 100644 index 0000000..d821173 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_disqus.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_facebook.png b/plugins/social_share_privacy/public/images/dummy_facebook.png new file mode 100644 index 0000000..0efb45c Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_flattr.png b/plugins/social_share_privacy/public/images/dummy_flattr.png new file mode 100644 index 0000000..2f1ffa5 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_flattr.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_gplus.png b/plugins/social_share_privacy/public/images/dummy_gplus.png new file mode 100644 index 0000000..5ced5dc Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_gplus.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_gplus_alt.png b/plugins/social_share_privacy/public/images/dummy_gplus_alt.png new file mode 100644 index 0000000..64b9a9e Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_gplus_alt.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_hackernews.png b/plugins/social_share_privacy/public/images/dummy_hackernews.png new file mode 100644 index 0000000..a946131 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_hackernews.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_linkedin.png b/plugins/social_share_privacy/public/images/dummy_linkedin.png new file mode 100644 index 0000000..5d6f965 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_linkedin.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_pinterest.png b/plugins/social_share_privacy/public/images/dummy_pinterest.png new file mode 100644 index 0000000..7ff138d Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_pinterest.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_reddit.png b/plugins/social_share_privacy/public/images/dummy_reddit.png new file mode 100644 index 0000000..6433355 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_reddit.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_stumbleupon.png b/plugins/social_share_privacy/public/images/dummy_stumbleupon.png new file mode 100644 index 0000000..aba0d14 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_stumbleupon.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_twitter.png b/plugins/social_share_privacy/public/images/dummy_twitter.png new file mode 100644 index 0000000..2865660 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_twitter.png differ diff --git a/plugins/social_share_privacy/public/images/dummy_xing.png b/plugins/social_share_privacy/public/images/dummy_xing.png new file mode 100644 index 0000000..5b969f1 Binary files /dev/null and b/plugins/social_share_privacy/public/images/dummy_xing.png differ diff --git a/plugins/social_share_privacy/public/images/es/dummy_box_facebook.png b/plugins/social_share_privacy/public/images/es/dummy_box_facebook.png new file mode 100644 index 0000000..78c4093 Binary files /dev/null and b/plugins/social_share_privacy/public/images/es/dummy_box_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/es/dummy_facebook.png b/plugins/social_share_privacy/public/images/es/dummy_facebook.png new file mode 100644 index 0000000..ce6c90e Binary files /dev/null and b/plugins/social_share_privacy/public/images/es/dummy_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/fbshare.png b/plugins/social_share_privacy/public/images/fbshare.png new file mode 100644 index 0000000..5e2a84c Binary files /dev/null and b/plugins/social_share_privacy/public/images/fbshare.png differ diff --git a/plugins/social_share_privacy/public/images/fr/dummy_box_facebook.png b/plugins/social_share_privacy/public/images/fr/dummy_box_facebook.png new file mode 100644 index 0000000..0ad503e Binary files /dev/null and b/plugins/social_share_privacy/public/images/fr/dummy_box_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/fr/dummy_facebook.png b/plugins/social_share_privacy/public/images/fr/dummy_facebook.png new file mode 100644 index 0000000..772ab1b Binary files /dev/null and b/plugins/social_share_privacy/public/images/fr/dummy_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/fr/dummy_twitter.png b/plugins/social_share_privacy/public/images/fr/dummy_twitter.png new file mode 100644 index 0000000..bae309d Binary files /dev/null and b/plugins/social_share_privacy/public/images/fr/dummy_twitter.png differ diff --git a/plugins/social_share_privacy/public/images/mail.png b/plugins/social_share_privacy/public/images/mail.png new file mode 100644 index 0000000..690cc66 Binary files /dev/null and b/plugins/social_share_privacy/public/images/mail.png differ diff --git a/plugins/social_share_privacy/public/images/nl/dummy_box_facebook.png b/plugins/social_share_privacy/public/images/nl/dummy_box_facebook.png new file mode 100644 index 0000000..77edbee Binary files /dev/null and b/plugins/social_share_privacy/public/images/nl/dummy_box_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/nl/dummy_facebook.png b/plugins/social_share_privacy/public/images/nl/dummy_facebook.png new file mode 100644 index 0000000..b8e15e5 Binary files /dev/null and b/plugins/social_share_privacy/public/images/nl/dummy_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/nl/dummy_twitter.png b/plugins/social_share_privacy/public/images/nl/dummy_twitter.png new file mode 100644 index 0000000..392a5c6 Binary files /dev/null and b/plugins/social_share_privacy/public/images/nl/dummy_twitter.png differ diff --git a/plugins/social_share_privacy/public/images/pt/dummy_box_facebook.png b/plugins/social_share_privacy/public/images/pt/dummy_box_facebook.png new file mode 100644 index 0000000..9f6a226 Binary files /dev/null and b/plugins/social_share_privacy/public/images/pt/dummy_box_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/pt/dummy_box_twitter.png b/plugins/social_share_privacy/public/images/pt/dummy_box_twitter.png new file mode 100644 index 0000000..ad809fd Binary files /dev/null and b/plugins/social_share_privacy/public/images/pt/dummy_box_twitter.png differ diff --git a/plugins/social_share_privacy/public/images/pt/dummy_facebook.png b/plugins/social_share_privacy/public/images/pt/dummy_facebook.png new file mode 100644 index 0000000..6f69ed7 Binary files /dev/null and b/plugins/social_share_privacy/public/images/pt/dummy_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/pt/dummy_twitter.png b/plugins/social_share_privacy/public/images/pt/dummy_twitter.png new file mode 100644 index 0000000..09cae2f Binary files /dev/null and b/plugins/social_share_privacy/public/images/pt/dummy_twitter.png differ diff --git a/plugins/social_share_privacy/public/images/ru/dummy_box_facebook.png b/plugins/social_share_privacy/public/images/ru/dummy_box_facebook.png new file mode 100644 index 0000000..6b43084 Binary files /dev/null and b/plugins/social_share_privacy/public/images/ru/dummy_box_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/ru/dummy_facebook.png b/plugins/social_share_privacy/public/images/ru/dummy_facebook.png new file mode 100644 index 0000000..5a46d95 Binary files /dev/null and b/plugins/social_share_privacy/public/images/ru/dummy_facebook.png differ diff --git a/plugins/social_share_privacy/public/images/settings.png b/plugins/social_share_privacy/public/images/settings.png new file mode 100644 index 0000000..3016b7b Binary files /dev/null and b/plugins/social_share_privacy/public/images/settings.png differ diff --git a/plugins/social_share_privacy/public/images/socialshareprivacy_info.png b/plugins/social_share_privacy/public/images/socialshareprivacy_info.png new file mode 100644 index 0000000..733238d Binary files /dev/null and b/plugins/social_share_privacy/public/images/socialshareprivacy_info.png differ diff --git a/plugins/social_share_privacy/public/images/socialshareprivacy_on_off.png b/plugins/social_share_privacy/public/images/socialshareprivacy_on_off.png new file mode 100644 index 0000000..8e9e725 Binary files /dev/null and b/plugins/social_share_privacy/public/images/socialshareprivacy_on_off.png differ diff --git a/plugins/social_share_privacy/public/images/tumblr.png b/plugins/social_share_privacy/public/images/tumblr.png new file mode 100644 index 0000000..c8c759c Binary files /dev/null and b/plugins/social_share_privacy/public/images/tumblr.png differ diff --git a/plugins/social_share_privacy/public/javascripts/autoload.js b/plugins/social_share_privacy/public/javascripts/autoload.js new file mode 100644 index 0000000..1c43bec --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/autoload.js @@ -0,0 +1,4 @@ +jQuery(document).ready(function ($) { + $('*[data-social-share-privacy=true]:not([data-init=true])'). + socialSharePrivacy().attr('data-init','true'); +}); diff --git a/plugins/social_share_privacy/public/javascripts/localstorage.js b/plugins/social_share_privacy/public/javascripts/localstorage.js new file mode 100644 index 0000000..239fb1c --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/localstorage.js @@ -0,0 +1,31 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + $.extend($.fn.socialSharePrivacy.settings, { + // Set perma_option to true. + // Initially it is only set to true if jQuery.cookie is available. + perma_option: true, + set_perma_option: function (service_name) { + localStorage.setItem('socialSharePrivacy_'+service_name, 'perma_on'); + }, + del_perma_option: function (service_name) { + localStorage.removeItem('socialSharePrivacy_'+service_name); + }, + // Only one of the two methods "get_perma_options" and "get_perma_option" has + // to be implemented. Though the other has to be set to null, so the default + // cookie based method is not used. + get_perma_options: null, + get_perma_option: function (service_name) { + return localStorage.getItem('socialSharePrivacy_'+service_name) === 'perma_on'; + } + }); +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/buffer.js b/plugins/social_share_privacy/public/javascripts/modules/buffer.js new file mode 100644 index 0000000..93989e2 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/buffer.js @@ -0,0 +1,54 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + function get (self, options, uri, settings, name) { + var value = options[name]; + if (typeof value === "function") { + return value.call(self, options, uri, settings); + } + return String(value); + } + + $.fn.socialSharePrivacy.settings.services.buffer = { + 'status' : true, + 'dummy_line_img' : 'images/dummy_buffer.png', + 'dummy_box_img' : 'images/dummy_box_buffer.png', + 'dummy_alt' : '"Buffer"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Buffer button will be enabled once you click here. Activating the button already sends data to Buffer – see i.', + 'txt_off' : 'not connected to Buffer', + 'txt_on' : 'connected to Buffer', + 'perma_option' : true, + 'display_name' : 'Buffer', + 'referrer_track' : '', + 'via' : '', + 'text' : $.fn.socialSharePrivacy.getTitle, + 'picture' : $.fn.socialSharePrivacy.getImage, + 'button' : function (options, uri, settings) { + return $('').attr( + 'src', 'https://widgets.bufferapp.com/button/?'+$.param({ + count : settings.layout === 'line' ? 'horizontal' : 'vertical', + via : get(this, options, uri, settings, 'via'), + text : $.fn.socialSharePrivacy.abbreviateText( + get(this, options, uri, settings, 'text'), 120), + picture : get(this, options, uri, settings, 'picture'), + url : uri + options.referrer_track, + source : 'button' + })); + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/delicious.js b/plugins/social_share_privacy/public/javascripts/modules/delicious.js new file mode 100644 index 0000000..d8502d4 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/delicious.js @@ -0,0 +1,85 @@ +/* + * jquery.socialshareprivacy.js + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Code inspired by Delicious Button v1.1: + * http://code.google.com/p/delicious-button/ + * + * Warning: this button uses plaintext http and can be harmful to users under opressive regimes + * + */ +(function ($, undefined) { + "use strict"; + + $.fn.socialSharePrivacy.settings.services.delicious = { + 'status' : true, + 'dummy_line_img' : 'images/dummy_delicious.png', + 'dummy_box_img' : 'images/dummy_box_delicious.png', + 'dummy_alt' : '"Delicious"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Delicious button will be enabled once you click here. Activating the button already sends data to Delicious – see i.', + 'txt_off' : 'not connected to Delicious', + 'txt_on' : 'connected to Delicious', + 'perma_option' : true, + 'display_name' : 'Delicious', + 'txt_button' : 'Save', + 'referrer_track' : '', + 'title' : $.fn.socialSharePrivacy.getTitle, + 'button' : function (options, uri, settings) { + var $button = $('
'); + var url = uri + options.referrer_track; + + $.ajax({ + url: "http://feeds.delicious.com/v2/json/urlinfo/data", + data: {url: url}, + dataType: "jsonp", + success: function (counts) { + var hash, total_posts, title, txt_button; + for (var i = 0; i < counts.length; ++ i) { + var count = counts[i]; + if (count.url === url) { + total_posts = parseInt(count.total_posts, 10); + hash = count.hash; + title = count.title; + break; + } + } + if (total_posts) txt_button = $.fn.socialSharePrivacy.formatNumber(total_posts); + else txt_button = options.txt_button; + var save_url = "http://delicious.com/save?"+$.param({ + v: "5", + url: url, + title: (typeof options.title === "function" ? + options.title.call(this, options, uri, settings) : + String(options.title)) || title + }); + + $button.html('
'); + $button.find('i').text(options.txt_button); + $button.find('b').text(txt_button); + $button.find('a.icon').attr("href", hash ? "http://delicious.com/url/" + hash : save_url); + var $count = $button.find('a.count').attr("href", save_url).click(function (event) { + window.open(save_url + "&noui&jump=close", "delicious", "toolbar=no,width=555,height=555"); + event.preventDefault(); + }); + + if (total_posts) { + $count.hover(function () { + var $self = $(this); + $self.find("b").stop(1, 1).css("display", "none"); + $self.find("i").fadeIn(); + }, function () { + var $self = $(this); + $self.find("i").stop(1, 1).css("display", "none"); + $self.find("b").fadeIn(); + }); + } + } + }); + + return $button; + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/disqus.js b/plugins/social_share_privacy/public/javascripts/modules/disqus.js new file mode 100644 index 0000000..f8e60b5 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/disqus.js @@ -0,0 +1,77 @@ +/* + * jquery.socialshareprivacy.js + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + */ +(function ($, undefined) { + "use strict"; + + var DISQUSWIDGETS = { + displayCount: function (data) { + $('.social_share_privacy_area .disqus .disqus-widget:not(.init)').each(function () { + var $widget = $(this); + var uri = data.counts[0].id; + if ($widget.attr("data-uri") === uri) { + var key = $widget.attr("data-count"); + var count = data.counts[0][key]; + var text = data.text[key]; + var scount = $.fn.socialSharePrivacy.formatNumber(count); + $widget.attr('title', count === 0 ? text.zero : count === 1 ? text.one : text.multiple.replace('{num}', scount)); + $widget.find('.count a').text(scount); + $widget.addClass('init'); + } + }); + } + }; + + $.fn.socialSharePrivacy.settings.services.disqus = { + 'status' : true, + 'dummy_line_img' : 'images/dummy_disqus.png', + 'dummy_box_img' : 'images/dummy_box_disqus.png', + 'dummy_alt' : '"Disqus"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Disqus button will be enabled once you click here. Activating the button already sends data to Disqus – see i.', + 'txt_off' : 'not connected to Disqus', + 'txt_on' : 'connected to Disqus', + 'perma_option' : true, + 'display_name' : 'Disqus', + 'referrer_track' : '', + 'shortname' : '', + 'count' : 'comments', + 'onclick' : null, + 'button' : function (options, uri, settings) { + var shortname = options.shortname || window.disqus_shortname || ''; + var $code; + if (settings.layout === 'line') { + $code = $('
'+ + 'Disqus'+ + ' 
'); + } + else { + $code = $('
'+ + ''+ + 'Disqus
'); + } + + $code.attr({ + 'data-count' : options.count, + 'data-shortname' : shortname, + 'data-uri' : uri + options.referrer_track + }); + + if (options.onclick) { + $code.find('a').click(typeof options.onclick === "function" ? + options.onclick : new Function("event", options.onclick)); + } + + // this breaks every other usage of the disqus count API: + window.DISQUSWIDGETS = DISQUSWIDGETS; + + $.getScript('https://'+shortname+'.disqus.com/count-data.js?2='+encodeURIComponent(uri + options.referrer_track)); + + return $code; + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/facebook.js b/plugins/social_share_privacy/public/javascripts/modules/facebook.js new file mode 100644 index 0000000..d2d05c3 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/facebook.js @@ -0,0 +1,81 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + var locales = {"af":["ZA"],"ar":["AR"],"az":["AZ"],"be":["BY"],"bg":["BG"],"bn":["IN"],"bs":["BA"],"ca":["ES"],"cs":["CZ"],"cy":["GB"],"da":["DK"],"de":["DE"],"el":["GR"],"en":["GB","PI","UD","US"],"eo":["EO"],"es":["ES","LA"],"et":["EE"],"eu":["ES"],"fa":["IR"],"fb":["LT"],"fi":["FI"],"fo":["FO"],"fr":["CA","FR"],"fy":["NL"],"ga":["IE"],"gl":["ES"],"he":["IL"],"hi":["IN"],"hr":["HR"],"hu":["HU"],"hy":["AM"],"id":["ID"],"is":["IS"],"it":["IT"],"ja":["JP"],"ka":["GE"],"km":["KH"],"ko":["KR"],"ku":["TR"],"la":["VA"],"lt":["LT"],"lv":["LV"],"mk":["MK"],"ml":["IN"],"ms":["MY"],"nb":["NO"],"ne":["NP"],"nl":["NL"],"nn":["NO"],"pa":["IN"],"pl":["PL"],"ps":["AF"],"pt":["BR","PT"],"ro":["RO"],"ru":["RU"],"sk":["SK"],"sl":["SI"],"sq":["AL"],"sr":["RS"],"sv":["SE"],"sw":["KE"],"ta":["IN"],"te":["IN"],"th":["TH"],"tl":["PH"],"tr":["TR"],"uk":["UA"],"vi":["VN"],"zh":["CN","HK","TW"]}; + + $.fn.socialSharePrivacy.settings.services.facebook = { + 'status' : true, + 'button_class' : 'fb_like', + 'dummy_line_img' : 'images/dummy_facebook.png', + 'dummy_box_img' : 'images/dummy_box_facebook.png', + 'dummy_alt' : 'Facebook "Like"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Facebook Like button will be enabled once you click here. Activating the button already sends data to Facebook – see i.', + 'txt_off' : 'not connected to Facebook', + 'txt_on' : 'connected to Facebook', + 'perma_option' : true, + 'display_name' : 'Facebook Like/Recommend', + 'referrer_track' : '', + 'action' : 'like', + 'colorscheme' : 'light', + 'font' : '', + 'button' : function (options, uri, settings) { + // ensure a locale that is supported by facebook + // otherwise facebook renders nothing + var match = /^([a-z]{2})_([A-Z]{2})$/.exec(options.language); + var locale = "en_US"; + + if (match) { + if (match[1] in locales) { + var subs = locales[match[1]]; + if ($.inArray(match[2], subs) !== -1) { + locale = options.language; + } + else { + locale = match[1]+"_"+subs[0]; + } + } + } + else if (options.language in locales) { + locale = options.language+"_"+locales[options.language][0]; + } + + var params = { + locale : locale, + href : uri + options.referrer_track, + send : 'false', + show_faces : 'false', + action : options.action, + colorscheme: options.colorscheme + }; + if (options.font) params.font = options.font; + + if (settings.layout === 'line') { + params.width = '120'; + params.height = '20'; + params.layout = 'button_count'; + } + else { + params.width = 62; + params.height = 61; + params.layout = 'box_count'; + } + return $('').attr( + 'src', 'https://www.facebook.com/plugins/like.php?'+$.param(params)); + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/fbshare.js b/plugins/social_share_privacy/public/javascripts/modules/fbshare.js new file mode 100644 index 0000000..09ddc8f --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/fbshare.js @@ -0,0 +1,38 @@ +/* + * Facebook share module for jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * Fbshare module: + * copyright (c) 2013 zzzen.com + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + $.fn.socialSharePrivacy.settings.services.fbshare = { + 'status' : true, + 'privacy' : 'safe', + 'button_class' : 'fbshare', + 'line_img' : 'images/fbshare.png', + 'box_img' : 'images/box_fbshare.png', + 'txt_info' : 'Share via facebook.', + 'txt_button' : 'Facebook Share', + 'display_name' : 'Facebook Share', + 'referrer_track' : '', + 'button' : function (options, uri, settings) { + return $('', {target: '_blank', href: 'https://www.facebook.com/sharer/sharer.php?'+$.param({u:uri + options.referrer_track})}).append( + $('', {alt: options.txt_button, + src: options.path_prefix + (settings.layout === 'line' ? options.line_img : options.box_img)})); + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/flattr.js b/plugins/social_share_privacy/public/javascripts/modules/flattr.js new file mode 100644 index 0000000..636764e --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/flattr.js @@ -0,0 +1,72 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ + +(function ($, undefined) { + "use strict"; + + function get (self, options, uri, settings, name) { + var value = options[name]; + if (typeof value === "function") { + return value.call(self, options, uri, settings); + } + return String(value); + } + + // using an unsupported language breaks the flattr button + var langs = {en:true,sq:true,ar:true,be:true,bg:true,ca:true,zh:true,hr:true,cs:true,da:true,nl:true,eo:true,et:true,fi:true,fr:true,es:true,de:true,el:true,iw:true,hi:true,hu:true,is:true,'in':true,ga:true,it:true,ja:true,ko:true,lv:true,lt:true,mk:true,ms:true,mt:true,no:true,nn:true,fa:true,pl:true,pt:true,ro:true,ru:true,sr:true,sk:true,sl:true,sv:true,th:true,tr:true,uk:true,vi:true}; + + $.fn.socialSharePrivacy.settings.services.flattr = { + 'status' : true, + 'button_class' : 'flattr', + 'dummy_line_img' : 'images/dummy_flattr.png', + 'dummy_box_img' : 'images/dummy_box_flattr.png', + 'dummy_alt' : '"Flattr"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Flattr button will be enabled once you click here. Activating the button already sends data to Flattr – see i.', + 'txt_off' : 'not connected to Flattr', + 'txt_on' : 'connected to Flattr', + 'perma_option' : true, + 'display_name' : 'Flattr', + 'referrer_track' : '', + 'title' : $.fn.socialSharePrivacy.getTitle, + 'description' : $.fn.socialSharePrivacy.getDescription, + 'uid' : '', + 'category' : '', + 'tags' : '', + 'popout' : '', + 'hidden' : '', + 'button' : function (options, uri, settings) { + var attrs = { + href : uri + options.referrer_track, + title : get(this, options, uri, settings, 'title') + }; + if (options.uid) attrs['data-flattr-uid'] = options.uid; + if (options.hidden) attrs['data-flattr-hidden'] = options.hidden; + if (options.popout) attrs['data-flattr-popout'] = options.popout; + if (options.category) attrs['data-flattr-category'] = options.category; + if (options.tags) attrs['data-flattr-tags'] = options.tags; + if (options.language) { + var lang = String(options.language).replace('-','_'); + var baselang = lang.split('_')[0]; + if (langs[baselang] === true) { + attrs['data-flattr-language'] = attrs.lang = lang; + } + } + if (settings.layout === 'line') attrs['data-flattr-button'] = 'compact'; + + var $code = $('' + get(this, options, uri, settings, 'description') + + ''); + + $code.filter('a').attr(attrs); + + return $code; + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/gplus.js b/plugins/social_share_privacy/public/javascripts/modules/gplus.js new file mode 100644 index 0000000..5cf21e5 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/gplus.js @@ -0,0 +1,44 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + $.fn.socialSharePrivacy.settings.services.gplus = { + 'status' : true, + 'button_class' : 'gplusone', + 'dummy_line_img' : 'images/dummy_gplus.png', + 'dummy_box_img' : 'images/dummy_box_gplus.png', + 'dummy_alt' : '"Google+1"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Google+ button will be enabled once you click here. Activating the button already sends data to Google – see i.', + 'txt_off' : 'not connected to Google+', + 'txt_on' : 'connected to Google+', + 'perma_option' : true, + 'display_name' : 'Google+', + 'referrer_track' : '', + 'button' : function (options, uri, settings) { + // we use the Google+ "asynchronous" code, standard code is flaky if inserted into dom after load + var $code = $('
'); + $code.filter('.g-plusone').attr({ + 'data-href': uri + options.referrer_track, + 'data-size': settings.layout === 'line' ? 'medium' : 'tall' + }); + return $code; + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/hackernews.js b/plugins/social_share_privacy/public/javascripts/modules/hackernews.js new file mode 100644 index 0000000..563c920 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/hackernews.js @@ -0,0 +1,68 @@ +/* + * jquery.socialshareprivacy.js + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + */ +(function ($, undefined) { + "use strict"; + + $.fn.socialSharePrivacy.settings.services.hackernews = { + 'status' : true, + 'dummy_line_img' : 'images/dummy_hackernews.png', + 'dummy_box_img' : 'images/dummy_box_hackernews.png', + 'dummy_alt' : '"Hacker News"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Hacker News button will be enabled once you click here. Activating the button already sends data to Hacker News – see i.', + 'txt_off' : 'not connected to Hacker News', + 'txt_on' : 'connected to Hacker News', + 'perma_option' : true, + 'display_name' : 'Hacker News', + 'txt_n_points' : '{points} points', + 'txt_one_point' : '1 point', + 'referrer_track' : '', + 'title' : $.fn.socialSharePrivacy.getTitle, + 'button' : function (options, uri, settings) { + var url = uri + options.referrer_track; + var title = typeof(options.title) === 'function' ? + options.title.call(this, options, uri, settings) : + String(options.title); + + var $code; + if (settings.layout === 'line') { + $code = $('
'+ + 'Y'+ + 'submit
'); + } + else { + $code = $('
'+ + ''+ + 'Y
'); + } + + $code.find("a").attr("href", "https://news.ycombinator.com/submitlink?"+$.param({ + "u": url, + "t": title + })); + + $.ajax("https://api.thriftdb.com/api.hnsearch.com/items/_search?filter[fields][url][]="+encodeURIComponent(url), { + dataType: "jsonp", + success: function (data) { + var item = data.results[0]; + if (item) { + item = item.item; + var points = $.fn.socialSharePrivacy.formatNumber(item.points); + $code.find("a").attr("href", "https://news.ycombinator.com/item?id="+item.id); + $code.find(".points a").text(points).attr('title', + item.points === 1 ? + options.txt_one_point : + options.txt_n_points.replace(/{points}/g, points)); + } + } + }); + + return $code; + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/linkedin.js b/plugins/social_share_privacy/public/javascripts/modules/linkedin.js new file mode 100644 index 0000000..43e5961 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/linkedin.js @@ -0,0 +1,53 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + $.fn.socialSharePrivacy.settings.services.linkedin = { + 'status' : true, + 'dummy_line_img' : 'images/dummy_linkedin.png', + 'dummy_box_img' : 'images/dummy_box_linkedin.png', + 'dummy_alt' : '"LinkedIn"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Linked in button will be enabled once you click here. Activating the button already sends data to Linked in – see i.', + 'txt_off' : 'not connected to LinkedIn', + 'txt_on' : 'connected to LinkedIn', + 'perma_option' : true, + 'display_name' : 'LinkedIn', + 'referrer_track' : '', + 'onsuccess' : null, + 'onerror' : null, + 'showzero' : false, + 'button' : function (options, uri, settings) { + var attrs = { + 'data-counter' : settings.layout === 'line' ? 'right' : 'top', + 'data-url' : uri + options.referrer_track, + 'data-showzero': String(options.showzero) + }; + if (options.onsuccess) attrs['data-onsuccess'] = options.onsuccess; + if (options.onerror) attrs['data-onerror'] = options.onerror; + var $code = $('').attr(attrs); + + if (window.IN && window.IN.parse) { + $code = $code.add(''); + } + else if ($('script[src^="https://platform.linkedin.com/"]').length === 0) { + $code = $code.add(''); + } + + return $code; + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/mail.js b/plugins/social_share_privacy/public/javascripts/modules/mail.js new file mode 100644 index 0000000..9d73ca2 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/mail.js @@ -0,0 +1,50 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + function get (self, options, uri, settings, name) { + var value = options[name]; + if (typeof value === "function") { + value = value.call(self, options, uri, settings); + } + return String(value); + } + + var getDescription = $.fn.socialSharePrivacy.getDescription; + + function getBody (options, uri, settings) { + return getDescription.call(this, options, uri, settings) + '\n\n' + uri + options.referrer_track; + } + + $.fn.socialSharePrivacy.settings.services.mail = { + 'status' : true, + 'privacy' : 'safe', + 'button_class' : 'mail', + 'line_img' : 'images/mail.png', + 'box_img' : 'images/box_mail.png', + 'txt_info' : 'Send this via email to a friend.', + 'txt_button' : 'Send Email', + 'display_name' : 'Mail', + 'referrer_track' : '', + 'subject' : $.fn.socialSharePrivacy.getTitle, + 'body' : getBody, + 'button' : function (options, uri, settings) { + return $('').attr( + 'href', 'mailto:?'+$.param({ + subject : get(this, options, uri, settings, 'subject'), + body : get(this, options, uri, settings, 'body') + }).replace(/\+/g,'%20')).append($('', { + alt: options.txt_button, + src: options.path_prefix + (settings.layout === 'line' ? options.line_img : options.box_img) + })); + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/pinterest.js b/plugins/social_share_privacy/public/javascripts/modules/pinterest.js new file mode 100644 index 0000000..7e57c20 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/pinterest.js @@ -0,0 +1,83 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ + +(function ($, undefined) { + "use strict"; + + function get (self, options, uri, settings, name) { + var value = options[name]; + if (typeof value === "function") { + return value.call(self, options, uri, settings); + } + return String(value); + } + + var loadingScript = false; + function loadScript () { + // prevent already loaded buttons from being broken: + $('.social_share_privacy_area .pinterest .pinit a[data-pin-log]').attr('data-pin-do','ignore'); + $.ajax({ + url : 'https://assets.pinterest.com/js/pinit.js', + dataType : 'script', + cache : true + }); + // because there is no callback yet I have no choice but to do this now: + loadingScript = false; + } + + $.fn.socialSharePrivacy.settings.services.pinterest = { + 'status' : true, + 'button_class' : 'pinit', + 'dummy_line_img' : 'images/dummy_pinterest.png', + 'dummy_box_img' : 'images/dummy_box_pinterest.png', + 'dummy_alt' : '"Pin it"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Pin it button will be enabled once you click here. Activating the button already sends data to Pinterest – see i.', + 'txt_off' : 'not connected to Pinterest', + 'txt_on' : 'connected to Pinterest', + 'perma_option' : true, + 'display_name' : 'Pinterest', + 'referrer_track' : '', + 'title' : $.fn.socialSharePrivacy.getTitle, + 'description' : $.fn.socialSharePrivacy.getDescription, + 'media' : $.fn.socialSharePrivacy.getImage, + 'button' : function (options, uri, settings) { + var params = { + url : uri + options.referrer_track, + media : get(this, options, uri, settings, 'media') + }; + var title = get(this, options, uri, settings, 'title'); + var description = get(this, options, uri, settings, 'description'); + if (title) params.title = title; + if (description) params.description = description; + + var $code = $(''); + + $code.filter('a').attr({ + 'data-pin-config' : settings.layout === 'line' ? 'beside' : 'above', + href : 'https://pinterest.com/pin/create/button/?'+$.param(params) + }).find('img').attr('src', 'https://assets.pinterest.com/images/pidgets/pin_it_button.png'); + + // This way when the user has permanently enabled pinterest and there are several pinterest + // buttons on one webpage it will load the script only once and so the buttons will work: + if (!loadingScript) { + loadingScript = true; + setTimeout(loadScript, 10); + } + + return $code; + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/reddit.js b/plugins/social_share_privacy/public/javascripts/modules/reddit.js new file mode 100644 index 0000000..1692981 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/reddit.js @@ -0,0 +1,72 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ + +(function ($, undefined) { + "use strict"; + + function get (self, options, uri, settings, name) { + var value = options[name]; + if (typeof value === "function") { + return value.call(self, options, uri, settings); + } + return String(value); + } + + $.fn.socialSharePrivacy.settings.services.reddit = { + 'status' : true, + 'button_class' : 'reddit', + 'dummy_line_img' : 'images/dummy_reddit.png', + 'dummy_box_img' : 'images/dummy_box_reddit.png', + 'dummy_alt' : '"Reddit this!"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The reddit this! button will be enabled once you click here. Activating the button already sends data to reddit – see i.', + 'txt_off' : 'not connected to reddit', + 'txt_on' : 'connected to reddit', + 'perma_option' : true, + 'display_name' : 'Reddit', + 'referrer_track' : '', + 'title' : $.fn.socialSharePrivacy.getTitle, + 'target' : '', + 'newwindow' : '1', + 'bgcolor' : 'transparent', + 'bordercolor' : '', + 'button' : function (options, uri, settings) { + var base_url, w, layout; + if (settings.layout === 'line') { + w = 120; + layout = '/button/button1.html?'; + } + else { + w = 58; + layout = '/button/button2.html?'; + } + base_url = 'https://redditstatic.s3.amazonaws.com'; + var params = { + url : uri + options.referrer_track, + width : String(w) + }; + var title = get(this, options, uri, settings, 'title'); + var target = get(this, options, uri, settings, 'target'); + if (title) params.title = title; + if (target) params.target = target; + if (options.bgcolor) params.bgcolor = options.bgcolor; + if (options.bordercolor) params.bordercolor = options.bordercolor; + if (options.newwindow) params.newwindow = options.newwindow; + + return $('').attr( + 'src', base_url+layout+$.param(params)); + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/stumbleupon.js b/plugins/social_share_privacy/public/javascripts/modules/stumbleupon.js new file mode 100644 index 0000000..9a634d9 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/stumbleupon.js @@ -0,0 +1,55 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Warning: this button uses plaintext http and can be harmful to users under opressive regimes + * + */ + +(function ($, undefined) { + "use strict"; + + $.fn.socialSharePrivacy.settings.services.stumbleupon = { + 'status' : true, + 'button_class' : 'stumbleupon', + 'dummy_line_img' : 'images/dummy_stumbleupon.png', + 'dummy_box_img' : 'images/dummy_box_stumbleupon.png', + 'dummy_alt' : '"Stumble!"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Stumble! button will be enabled once you click here. Activating the button already sends data to StumbleUpon – see i.', + 'txt_off' : 'not connected to StumbleUpon', + 'txt_on' : 'connected to StumbleUpon', + 'perma_option' : true, + 'display_name' : 'Stumble Upon', + 'referrer_track' : '', + 'button' : function (options, uri, settings) { + var base_url = 'https:' === document.location.protocol ? 'https://' : 'http://'; + var w, h; + + if (settings.layout === 'line') { + w = '74'; + h = '18'; + base_url += 'badge.stumbleupon.com/badge/embed/1/?'; + } + else { + w = '50'; + h = '60'; + base_url += 'badge.stumbleupon.com/badge/embed/5/?'; + } + + return $('').attr({ + src: base_url+$.param({url: uri + options.referrer_track}), + width: w, + height: h + }); + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/tumblr.js b/plugins/social_share_privacy/public/javascripts/modules/tumblr.js new file mode 100644 index 0000000..5d6e794 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/tumblr.js @@ -0,0 +1,113 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + function getQuote (options, uri, settings) { + var text = $.trim($('article, p').text()); + + if (text.length <= 600) { + return text; + } + + var abbrev = text.slice(0, 597); + if (/^\w+$/.test(text.slice(596,598))) { + var match = /^(.*)\s\S*$/.exec(abbrev); + if (match) { + abbrev = match[1]; + } + } + return $.trim(abbrev) + "\u2026"; + } + + function getClickthru (options, uri) { + return uri + options.referrer_track; + } + + function get (self, options, uri, settings, name) { + var value = options[name]; + if (typeof value === "function") { + return value.call(self, options, uri, settings); + } + return String(value); + } + + function openTumblr (event) { + var winx = window.screenX || window.screenLeft; + var winy = window.screenY || window.screenTop; + var winw = window.outerWidth || window.innerWidth; + var winh = window.outerHeight || window.innerHeight; + var width = 450; + var height = 430; + var x = Math.round(winx + (winw - width) * 0.5); + var y = Math.round(winy + (winh - height) * 0.5); + window.open(this.href, 't', 'left='+x+',top='+y+',toolbar=0,resizable=0,status=0,menubar=0,width='+width+',height='+height); + event.preventDefault(); + } + + $.fn.socialSharePrivacy.settings.services.tumblr = { + 'status' : true, + 'privacy' : 'safe', + 'button_class' : 'tumblr', + 'line_img' : 'images/tumblr.png', + 'box_img' : 'images/box_tumblr.png', + 'txt_info' : 'Post this on Tumblr.', + 'txt_button' : 'Share on Tubmlr', + 'display_name' : 'Tumblr', + 'referrer_track' : '', + 'type' : 'link', // possible values are 'link', 'quote', 'photo' or 'video' + // type: 'link': + 'name' : $.fn.socialSharePrivacy.getTitle, + 'description' : $.fn.socialSharePrivacy.getDescription, + // type: 'quote': + 'quote' : getQuote, + // type: 'photo': + 'photo' : $.fn.socialSharePrivacy.getImage, + 'clickthrou' : getClickthru, + // type: 'video': + 'embed' : $.fn.socialSharePrivacy.getEmbed, + // type: 'photo' or 'video': + 'caption' : $.fn.socialSharePrivacy.getDescription, + 'button' : function (options, uri, settings) { + var $code = $('').click(openTumblr); + $('', { + alt: options.txt_button, + src: options.path_prefix + (settings.layout === 'line' ? options.line_img : options.box_img) + }).appendTo($code); + switch (options.type) { + case 'link': + return $code.attr('href', 'https://www.tumblr.com/share/link?'+$.param({ + url : uri + options.referrer_track, + name : get(this, options, uri, settings, 'name'), + description : get(this, options, uri, settings, 'description') + })); + + case 'quote': + return $code.attr('href', 'https://www.tumblr.com/share/quote?'+$.param({ + source : uri + options.referrer_track, + quote : get(this, options, uri, settings, 'quote') + })); + + case 'photo': + return $code.attr('href', 'https://www.tumblr.com/share/photo?'+$.param({ + source : get(this, options, uri, settings, 'photo'), + caption : get(this, options, uri, settings, 'caption'), + clickthrou : get(this, options, uri, settings, 'clickthrou') + })); + + case 'video': + return $code.attr('href', 'https://www.tumblr.com/share/video?'+$.param({ + embed : get(this, options, uri, settings, 'embed'), + caption : get(this, options, uri, settings, 'caption') + })); + } + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/twitter.js b/plugins/social_share_privacy/public/javascripts/modules/twitter.js new file mode 100644 index 0000000..815cfc7 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/twitter.js @@ -0,0 +1,62 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ + +(function ($, undefined) { + "use strict"; + + $.fn.socialSharePrivacy.settings.services.twitter = { + 'status' : true, + 'button_class' : 'tweet', + 'dummy_line_img' : 'images/dummy_twitter.png', + 'dummy_box_img' : 'images/dummy_box_twitter.png', + 'dummy_alt' : '"Tweet this"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The Tweet this button will be enabled once you click here. Activating the button already sends data to Twitter – see i.', + 'txt_off' : 'not connected to Twitter', + 'txt_on' : 'connected to Twitter', + 'perma_option' : true, + 'display_name' : 'Twitter', + 'referrer_track' : '', + 'via' : '', + 'related' : '', + 'hashtags' : '', + 'dnt' : true, + 'text' : $.fn.socialSharePrivacy.getTitle, + 'button' : function (options, uri, settings) { + var text = typeof(options.text) === 'function' ? + options.text.call(this, options, uri, settings) : + String(options.text); + // 120 is the max character count left after twitters automatic + // url shortening with t.co + text = $.fn.socialSharePrivacy.abbreviateText(text, 120); + + var params = { + url : uri + options.referrer_track, + counturl: uri, + text : text, + count : settings.layout === 'line' ? 'horizontal' : 'vertical', + lang : options.language + }; + if (options.via) params.via = options.via; + if (options.related) params.related = options.related; + if (options.hashtags) params.hashtags = options.hashtags; + if (options.dnt) params.dnt = options.dnt; + + return $('').attr( + 'src', 'https://platform.twitter.com/widgets/tweet_button.html?' + + $.param(params).replace(/\+/g,'%20')); + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/modules/xing.js b/plugins/social_share_privacy/public/javascripts/modules/xing.js new file mode 100644 index 0000000..a958bf7 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/modules/xing.js @@ -0,0 +1,40 @@ +/* + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + $.fn.socialSharePrivacy.settings.services.xing = { + 'status' : true, + 'dummy_line_img' : 'images/dummy_xing.png', + 'dummy_box_img' : 'images/dummy_box_xing.png', + 'dummy_alt' : '"XING"-Dummy', + 'txt_info' : 'Two clicks for more privacy: The XING button will be enabled once you click here. Activating the button already sends data to XING – see i.', + 'txt_off' : 'not connected to XING', + 'txt_on' : 'connected to XING', + 'perma_option' : true, + 'display_name' : 'XING', + 'referrer_track' : '', + 'button' : function (options, uri, settings) { + var $code = $('').attr({ + 'data-counter' : settings.layout === 'line' ? 'right' : 'top', + 'data-url' : uri + options.referrer_track, + 'data-lang' : options.language + }); + + return $code.add(""); + } + }; +})(jQuery); diff --git a/plugins/social_share_privacy/public/javascripts/settings.js b/plugins/social_share_privacy/public/javascripts/settings.js new file mode 100644 index 0000000..f7efd77 --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/settings.js @@ -0,0 +1,23 @@ +/** + * @license + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * Copyright (c) 2012-2013 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ + +// load global settings +jQuery(document).ready(function ($) { + "use strict"; + + $('script[type="application/x-social-share-privacy-settings"]').each(function () { + var settings = (new Function('return ('+(this.textContent||this.innerText||this.text)+');')).call(this); + + if (typeof settings === "object") { + $.extend(true, $.fn.socialSharePrivacy.settings, settings); + } + }); +}); diff --git a/plugins/social_share_privacy/public/javascripts/socialshareprivacy.js b/plugins/social_share_privacy/public/javascripts/socialshareprivacy.js new file mode 100644 index 0000000..576688e --- /dev/null +++ b/plugins/social_share_privacy/public/javascripts/socialshareprivacy.js @@ -0,0 +1,803 @@ +/** + * @license + * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz + * + * http://www.heise.de/extras/socialshareprivacy/ + * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html + * + * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, + * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de + * + * Copyright (c) 2012-2013 Mathias Panzenböck + * + * is released under the MIT License http://www.opensource.org/licenses/mit-license.php + * + * Spread the word, link to us if you can. + */ +(function ($, undefined) { + "use strict"; + + /* + * helper functions + */ + + /** + * Build an absolute url using a base url. + * The provided base url has to be a valid absolute url. It will not be validated! + * If no base url is given the document location is used. + * Schemes that behave other than http might not work. + * This function tries to support file:-urls, but might fail in some cases. + * email:-urls aren't supported at all (don't make sense anyway). + */ + function absurl (url, base) { + if (!base) base = document.baseURI || $("html > head > base").last().attr("href") || document.location.href; + if (!url) { + return base; + } + else if (/^[a-z][-+\.a-z0-9]*:/i.test(url)) { + // The scheme actually could contain any kind of alphanumerical unicode + // character, but JavaScript regular expressions don't support unicode + // character classes. Maybe /^[^:]+:/ or even /^.*:/ would be sufficient? + return url; + } + else if (url.slice(0,2) === '//') { + return /^[^:]+:/.exec(base)[0]+url; + } + + var ch = url.charAt(0); + if (ch === '/') { + if (/^file:/i.test(base)) { + // file scheme has no hostname + return 'file://'+url; + } + else { + return /^[^:]+:\/*[^\/]+/i.exec(base)[0]+url; + } + } + else if (ch === '#') { + // assume "#" only occures at the end indicating the fragment + return base.replace(/#.*$/,'')+url; + } + else if (ch === '?') { + // assume "?" and "#" only occure at the end indicating the query + // and the fragment + return base.replace(/[\?#].*$/,'')+url; + } + else { + var path; + if (/^file:/i.test(base)) { + path = base.replace(/^file:\/{0,2}/i,''); + base = "file://"; + } + else { + var match = /^([^:]+:\/*[^\/]+)(\/.*?)?(\?.*?)?(#.*)?$/.exec(base); + base = match[1]; + path = match[2]||"/"; + } + + path = path.split("/"); + path.pop(); + if (path.length === 0) { + // Ensure leading "/". Of course this is only valid on + // unix like filesystems. More magic would be needed to + // support other filesystems. + path.push(""); + } + path.push(url); + return base+path.join("/"); + } + } + + function formatNumber (number) { + number = Number(number); + + var prefix = ""; + var suffix = ""; + if (number < 0) { + prefix = "-"; + number = -number; + } + + if (number === Infinity) { + return prefix + "Infinity"; + } + + if (number > 9999) { + number = number / 1000; + suffix = "K"; + } + + number = Math.round(number); + if (number === 0) { + return "0"; + } + + var buf = []; + while (number > 0) { + var part = String(number % 1000); + + number = Math.floor(number / 1000); + if (number) { + while (part.length < 3) { + part = "0"+part; + } + } + + buf.unshift(part); + } + + return prefix + buf.join(",") + suffix; + } + + // helper function that gets the title of the current page + function getTitle (options, uri, settings) { + var title = settings && settings.title; + if (typeof title === "function") { + title = title.call(this, options, uri, settings); + } + + if (title) { + return title; + } + + var title = $('meta[name="DC.title"]').attr('content'); + var creator = $('meta[name="DC.creator"]').attr('content'); + + if (title && creator) { + return title + ' - ' + creator; + } else { + return title || $('meta[property="og:title"]').attr('content') || $('title').text(); + } + } + + function getDescription (options, uri, settings) { + var description = settings && settings.description; + if (typeof description === "function") { + description = description.call(this, options, uri, settings); + } + + if (description) { + return description; + } + + return abbreviateText( + $('meta[name="twitter:description"]').attr('content') || + $('meta[itemprop="description"]').attr('content') || + $('meta[name="description"]').attr('content') || + $.trim($('article, p').first().text()) || $.trim($('body').text()), 3500); + } + + var IMAGE_ATTR_MAP = { + META : 'content', + IMG : 'src', + A : 'href', + IFRAME : 'src', + LINK : 'href' + }; + + // find the largest image of the website + // if no image at all is found use googles favicon service, which + // defaults to a small globe (so there is always some image) + function getImage (options, uri, settings) { + var imgs, img = settings && settings.image; + if (typeof img === "function") { + img = img.call(this, options, uri, settings); + } + + if (!img) { + imgs = $('meta[property="image"], meta[property="og:image"], meta[property="og:image:url"], meta[name="twitter:image"], link[rel="image_src"], itemscope *[itemprop="image"]').first(); + if (imgs.length > 0) { + img = imgs.attr(IMAGE_ATTR_MAP[imgs[0].nodeName]); + } + } + + if (img) { + return absurl(img); + } + + imgs = $('img').filter(':visible').filter(function () { + return $(this).parents('.social_share_privacy_area').length === 0; + }); + if (imgs.length === 0) { + img = $('link[rel~="shortcut"][rel~="icon"]').attr('href'); + if (img) return absurl(img); + return 'http://www.google.com/s2/favicons?'+$.param({domain:location.hostname}); + } + imgs.sort(function (lhs, rhs) { + return rhs.offsetWidth * rhs.offsetHeight - lhs.offsetWidth * lhs.offsetHeight; + }); + // browser makes src absolute: + return imgs[0].src; + } + + // abbreviate at last blank before length and add "\u2026" (horizontal ellipsis) + function abbreviateText (text, length) { + // length of UTF-8 encoded string + if (unescape(encodeURIComponent(text)).length <= length) { + return text; + } + + // "\u2026" is actually 3 bytes long in UTF-8 + // TODO: if any of the last 3 characters is > 1 byte long this truncates too much + var abbrev = text.slice(0, length - 3); + + if (!/\W/.test(text.charAt(length - 3))) { + var match = /^(.*)\s\S*$/.exec(abbrev); + if (match) { + abbrev = match[1]; + } + } + return abbrev + "\u2026"; + } + + var HTML_CHAR_MAP = { + '<': '<', + '>': '>', + '&': '&', + '"': '"', + "'": ''' + }; + + function escapeHtml (s) { + return s.replace(/[<>&"']/g, function (ch) { + return HTML_CHAR_MAP[ch]; + }); + } + + function getEmbed (options, uri, settings) { + var embed = settings && settings.embed; + if (typeof embed === "function") { + embed = embed.call(this, options, uri, settings); + } + + if (embed) { + return embed; + } + + embed = [''); + return embed.join(''); + } + + // build URI from rel="canonical" or document.location + function getURI (options) { + var uri = document.location.href; + var canonical = $("link[rel=canonical]").attr("href") || $('head meta[property="og:url"]').attr("content"); + + if (canonical) { + uri = absurl(canonical); + } + else if (options && options.ignore_fragment) { + uri = uri.replace(/#.*$/,''); + } + + return uri; + } + + function buttonClickHandler (service_name) { + function onclick (event) { + var $container = $(this).parents('li.help_info').first(); + var $share = $container.parents('.social_share_privacy_area').first().parent(); + var options = $share.data('social-share-privacy-options'); + var service = options.services[service_name]; + var button_class = service.button_class || service_name; + var uri = options.uri; + if (typeof uri === 'function') { + uri = uri.call($share[0], options); + } + var $switch = $container.find('span.switch'); + if ($switch.hasClass('off')) { + $container.addClass('info_off'); + $switch.addClass('on').removeClass('off').html(service.txt_on||'\u00a0'); + $container.find('img.privacy_dummy').replaceWith( + typeof(service.button) === "function" ? + service.button.call($container.parent().parent()[0],service,uri,options) : + service.button); + $share.trigger({type: 'socialshareprivacy:enable', serviceName: service_name, isClick: !event.isTrigger}); + } else { + $container.removeClass('info_off'); + $switch.addClass('off').removeClass('on').html(service.txt_off||'\u00a0'); + $container.find('.dummy_btn').empty(). + append($('').addClass(button_class+'_privacy_dummy privacy_dummy'). + attr({ + alt: service.dummy_alt, + src: service.path_prefix + (options.layout === 'line' ? + service.dummy_line_img : service.dummy_box_img) + }).click(onclick)); + $share.trigger({type: 'socialshareprivacy:disable', serviceName: service_name, isClick: !event.isTrigger}); + } + }; + return onclick; + } + + // display info-overlays a tiny bit delayed + function enterHelpInfo () { + var $info_wrapper = $(this); + if ($info_wrapper.hasClass('info_off')) return; + var timeout_id = window.setTimeout(function () { + $info_wrapper.addClass('display'); + $info_wrapper.removeData('timeout_id'); + }, 500); + $info_wrapper.data('timeout_id', timeout_id); + } + + function leaveHelpInfo () { + var $info_wrapper = $(this); + var timeout_id = $info_wrapper.data('timeout_id'); + if (timeout_id !== undefined) { + window.clearTimeout(timeout_id); + } + $info_wrapper.removeClass('display'); + } + + function permCheckChangeHandler () { + var $input = $(this); + var $share = $input.parents('.social_share_privacy_area').first().parent(); + var options = $share.data('social-share-privacy-options'); + if ($input.is(':checked')) { + options.set_perma_option($input.attr('data-service'), options); + $input.parent().addClass('checked'); + } else { + options.del_perma_option($input.attr('data-service'), options); + $input.parent().removeClass('checked'); + } + } + + function enterSettingsInfo () { + var $settings = $(this); + var timeout_id = window.setTimeout(function () { + $settings.find('.settings_info_menu').removeClass('off').addClass('on'); + $settings.removeData('timeout_id'); + }, 500); + $settings.data('timeout_id', timeout_id); + } + + function leaveSettingsInfo () { + var $settings = $(this); + var timeout_id = $settings.data('timeout_id'); + if (timeout_id !== undefined) { + window.clearTimeout(timeout_id); + } + $settings.find('.settings_info_menu').removeClass('on').addClass('off'); + } + + function setPermaOption (service_name, options) { + $.cookie('socialSharePrivacy_'+service_name, 'perma_on', options.cookie_expires, options.cookie_path, options.cookie_domain); + } + + function delPermaOption (service_name, options) { + $.cookie('socialSharePrivacy_'+service_name, null, -1, options.cookie_path, options.cookie_domain); + } + + function getPermaOption (service_name, options) { + return !!options.get_perma_options(options)[service_name]; + } + + function getPermaOptions (options) { + var cookies = $.cookie(); + var permas = {}; + for (var name in cookies) { + var match = /^socialSharePrivacy_(.+)$/.exec(name); + if (match) { + permas[match[1]] = cookies[name] === 'perma_on'; + } + } + return permas; + } + + + // extend jquery with our plugin function + function socialSharePrivacy (options) { + + if (typeof options === "string") { + var command = options; + if (arguments.length === 1) { + switch (command) { + case "enable": + this.find('.switch.off').click(); + break; + + case "disable": + this.find('.switch.on').click(); + break; + + case "toggle": + this.find('.switch').click(); + break; + + case "options": + return this.data('social-share-privacy-options'); + + case "destroy": + this.trigger({type: 'socialshareprivacy:destroy'}); + this.children('.social_share_privacy_area').remove(); + this.removeData('social-share-privacy-options'); + break; + + case "enabled": + var enabled = {}; + this.each(function () { + var $self = $(this); + var options = $self.data('social-share-privacy-options'); + for (var name in options.services) { + enabled[name] = $self.find('.'+(options.services[name].class_name||name)+' .switch').hasClass('on'); + } + }); + return enabled; + + case "disabled": + var disabled = {}; + this.each(function () { + var $self = $(this); + var options = $self.data('social-share-privacy-options'); + for (var name in options.services) { + disabled[name] = $self.find('.'+(options.services[name].class_name||name)+' .switch').hasClass('off'); + } + }); + return disabled; + + default: + throw new Error("socialSharePrivacy: unknown command: "+command); + } + } + else { + var arg = arguments[1]; + switch (command) { + case "enable": + this.each(function () { + var $self = $(this); + var options = $self.data('social-share-privacy-options'); + $self.find('.'+(options.services[arg].class_name||arg)+' .switch.off').click(); + }); + break; + + case "disable": + this.each(function () { + var $self = $(this); + var options = $self.data('social-share-privacy-options'); + $self.find('.'+(options.services[arg].class_name||arg)+' .switch.on').click(); + }); + break; + + case "toggle": + this.each(function () { + var $self = $(this); + var options = $self.data('social-share-privacy-options'); + $self.find('.'+(options.services[arg].class_name||arg)+' .switch').click(); + }); + break; + + case "option": + if (arguments.length > 2) { + var value = {}; + value[arg] = arguments[2]; + this.each(function () { + $.extend(true, $(this).data('social-share-privacy-options'), value); + }); + } + else { + return this.data('social-share-privacy-options')[arg]; + } + break; + + case "options": + $.extend(true, options, arg); + break; + + case "enabled": + var options = this.data('social-share-privacy-options'); + return this.find('.'+(options.services[arg].class_name||arg)+' .switch').hasClass('on'); + + case "disabled": + var options = this.data('social-share-privacy-options'); + return this.find('.'+(options.services[arg].class_name||arg)+' .switch').hasClass('off'); + + default: + throw new Error("socialSharePrivacy: unknown command: "+command); + } + } + return this; + } + + return this.each(function () { + // parse options passed via data-* attributes: + var data = {}; + if (this.lang) data.language = this.lang; + for (var i = 0, attrs = this.attributes; i < attrs.length; ++ i) { + var attr = attrs[i]; + if (/^data-./.test(attr.name)) { + var path = attr.name.slice(5).replace(/-/g,"_").split("."); + var ctx = data, j = 0; + for (; j < path.length-1; ++ j) { + var name = path[j]; + if (name in ctx) { + ctx = ctx[name]; + if (typeof ctx === "string") { + ctx = (new Function("$", "return ("+ctx+");")).call(this, $); + } + } + else { + ctx = ctx[name] = {}; + } + } + var name = path[j]; + if (typeof ctx[name] === "object") { + ctx[name] = $.extend(true, (new Function("$", "return ("+attr.value+");")).call(this, $), ctx[name]); + } + else { + ctx[name] = attr.value; + } + } + } + // parse global option values: + if ('cookie_expires' in data) data.cookie_expires = Number(data.cookie_expires); + if ('perma_option' in data) data.perma_option = $.trim(data.perma_option).toLowerCase() === "true"; + if ('ignore_fragment' in data) data.ignore_fragment = $.trim(data.ignore_fragment).toLowerCase() === "true"; + if ('set_perma_option' in data) { + data.set_perma_option = new Function("service_name", "options", data.set_perma_option); + } + if ('del_perma_option' in data) { + data.del_perma_option = new Function("service_name", "options", data.del_perma_option); + } + if ('get_perma_option' in data) { + data.get_perma_option = new Function("service_name", "options", data.get_perma_option); + } + if ('get_perma_options' in data) { + data.get_perma_options = new Function("options", data.get_perma_options); + } + if ('order' in data) { + data.order = $.trim(data.order); + if (data.order) { + data.order = data.order.split(/\s+/g); + } + else { + delete data.order; + } + } + if (typeof data.services === "string") { + data.services = (new Function("$", "return ("+data.services+");")).call(this, $); + } + if ('options' in data) { + data = $.extend(data, (new Function("$", "return ("+data.options+");")).call(this, $)); + delete data.options; + } + if ('services' in data) { + for (var service_name in data.services) { + var service = data.services[service_name]; + if (typeof service === "string") { + data.services[service_name] = (new Function("$", "return ("+service+");")).call(this, $); + } + // only values of common options are parsed: + if (typeof service.status === "string") { + service.status = $.trim(service.status).toLowerCase() === "true"; + } + if (typeof service.perma_option === "string") { + service.perma_option = $.trim(service.perma_option).toLowerCase() === "true"; + } + } + } + // overwrite default values with user settings + var this_options = $.extend(true,{},socialSharePrivacy.settings,options,data); + var order = this_options.order || []; + + var dummy_img = this_options.layout === 'line' ? 'dummy_line_img' : 'dummy_box_img'; + var any_on = false; + var any_perm = false; + var any_unsafe = false; + var unordered = []; + for (var service_name in this_options.services) { + var service = this_options.services[service_name]; + if (service.status) { + any_on = true; + if ($.inArray(service_name, order) === -1) { + unordered.push(service_name); + } + if (service.privacy !== 'safe') { + any_unsafe = true; + if (service.perma_option) { + any_perm = true; + } + } + } + if (!('language' in service)) { + service.language = this_options.language; + } + if (!('path_prefix' in service)) { + service.path_prefix = this_options.path_prefix; + } + if (!('referrer_track' in service)) { + service.referrer_track = ''; + } + } + unordered.sort(); + order = order.concat(unordered); + + // check if at least one service is activated + if (!any_on) { + return; + } + + // insert stylesheet into document and prepend target element + if (this_options.css_path) { + var css_path = (this_options.path_prefix||"") + this_options.css_path; + // IE fix (needed for IE < 9 - but done for all IE versions) + if (document.createStyleSheet) { + document.createStyleSheet(css_path); + } else if ($('link[href="'+css_path+'"]').length === 0) { + $('',{rel:'stylesheet',type:'text/css',href:css_path}).appendTo(document.head); + } + } + + // get stored perma options + var permas; + if (this_options.perma_option && any_perm) { + if (this_options.get_perma_options) { + permas = this_options.get_perma_options(this_options); + } + else { + permas = {}; + for (var service_name in this_options.services) { + permas[service_name] = this_options.get_perma_option(service_name, this_options); + } + } + } + + // canonical uri that will be shared + var uri = this_options.uri; + if (typeof uri === 'function') { + uri = uri.call(this, this_options); + } + + var $context = $('').addClass(this_options.layout); + var $share = $(this); + + $share.prepend($context).data('social-share-privacy-options',this_options); + + for (var i = 0; i < order.length; ++ i) { + var service_name = order[i]; + var service = this_options.services[service_name]; + + if (service && service.status) { + var class_name = service.class_name || service_name; + var button_class = service.button_class || service_name; + var $help_info; + + if (service.privacy === 'safe') { + $help_info = $('
  • ' + + service.txt_info + '
  • ').addClass(class_name); + $help_info.find('.dummy_btn'). + addClass(button_class). + append(service.button.call(this,service,uri,this_options)); + } + else { + $help_info = $('
  • ' + + service.txt_info + '
    ' + (service.txt_off||'\u00a0') + + '
  • ').addClass(class_name); + $help_info.find('.dummy_btn'). + addClass(button_class). + append($('').addClass(button_class+'_privacy_dummy privacy_dummy'). + attr({ + alt: service.dummy_alt, + src: service.path_prefix + service[dummy_img] + })); + + $help_info.find('.dummy_btn img.privacy_dummy, span.switch').click( + buttonClickHandler(service_name)); + } + $context.append($help_info); + } + } + + // + // append Info/Settings-area + // + if (any_unsafe) { + var $settings_info = $('
  • '); + var $info_link = $settings_info.find('> .settings_info_menu > a').attr('href', this_options.info_link); + if (this_options.info_link_target) { + $info_link.attr("target",this_options.info_link_target); + } + $context.append($settings_info); + + $context.find('.help_info').on('mouseenter', enterHelpInfo).on('mouseleave', leaveHelpInfo); + + // menu for permanently enabling of service buttons + if (this_options.perma_option && any_perm) { + + // define container + var $container_settings_info = $context.find('li.settings_info'); + + // remove class that fomrats the i-icon, because perma-options are shown + var $settings_info_menu = $container_settings_info.find('.settings_info_menu'); + $settings_info_menu.removeClass('perma_option_off'); + + // append perma-options-icon (.settings) and form (hidden) + $settings_info_menu.append( + '' + this_options.txt_settings + '
    ' + + this_options.settings_perma + '
    '); + + // write services with and