<?php
/**
 * Plugin Name: AddToAny Share Buttons
 * Plugin URI: https://www.addtoany.com/
 * Description: Share buttons for your pages including AddToAny's universal sharing button, Facebook, Mastodon, LinkedIn, Pinterest, WhatsApp and many more.
 * Version: 1.8.11
 * Author: AddToAny
 * Author URI: https://www.addtoany.com/
 * Text Domain: add-to-any
 * Domain Path: /languages
 */

// Explicitly globalize to support bootstrapped WordPress.
global $A2A_locale, $A2A_FOLLOW_services,
	$A2A_SHARE_SAVE_options, $A2A_SHARE_SAVE_plugin_dir, $A2A_SHARE_SAVE_plugin_url, 
	$A2A_SHARE_SAVE_services, $A2A_3p_consent;

$A2A_SHARE_SAVE_plugin_dir = untrailingslashit( plugin_dir_path( __FILE__ ) );
$A2A_SHARE_SAVE_plugin_url = untrailingslashit( plugin_dir_url( __FILE__ ) );

// Set AddToAny locale (JavaScript).
$A2A_locale = ! isset ( $A2A_locale ) ? '' : $A2A_locale;
// Set plugin options.
$A2A_SHARE_SAVE_options = get_option( 'addtoany_options', array() );

include_once $A2A_SHARE_SAVE_plugin_dir . '/addtoany.compat.php';
include_once $A2A_SHARE_SAVE_plugin_dir . '/addtoany.services.php';

function A2A_SHARE_SAVE_init() {
	global $A2A_SHARE_SAVE_plugin_dir,
		$A2A_SHARE_SAVE_options;
	
	// Load the textdomain for translations.
	load_plugin_textdomain( 'add-to-any', false, plugin_basename( dirname( __FILE__ ) ) . '/languages/' );
	
	// Update plugin options.
	$options = $A2A_SHARE_SAVE_options;
	$old_buttons = array( 
		'share_save_256_24.gif|256|24', 'share_save_171_16.gif|171|16', 'share_save_120_16.gif|120|16',
		'share_save_256_24.png|256|24', 'share_save_171_16.png|171|16', 'share_save_120_16.png|120|16',
		'share_16_16.png|16|16', 'favicon.png|16|16',
	);
	
	// If old button enabled.
	if ( ! empty( $options['button'] ) && in_array( $options['button'], $old_buttons ) ) {
		include_once $A2A_SHARE_SAVE_plugin_dir . '/addtoany.update.php';
		addtoany_update_options();
	}
}
add_filter( 'init', 'A2A_SHARE_SAVE_init' );

function A2A_SHARE_SAVE_link_vars( $args = array() ) {
	global $post;
	
	$linkname = empty( $args['linkname'] ) ? '' : $args['linkname'];
	$linkurl = empty( $args['linkurl'] ) ? '' : $args['linkurl'];
	$linkmedia = empty( $args['linkmedia'] ) ? '' : $args['linkmedia'];
	$use_current_page = isset( $args['use_current_page'] ) ? $args['use_current_page'] : false;

	// Set linkname if needed, and not a Follow kit.
	if ( ! $linkname && empty( $args['is_follow'] ) ) {
		if ( $use_current_page ) {
			$linkname = is_home() || is_front_page() ? get_bloginfo( 'name' ) : rtrim( wp_title( '', false, 'right' ) );
		} elseif ( isset( $post ) ) {
			$linkname = html_entity_decode( strip_tags( get_the_title( $post->ID ) ), ENT_QUOTES, 'UTF-8' );
		} else {
			$linkname = '';
		}
	}
	
	$linkname_enc = rawurlencode( $linkname );
	
	// Set linkurl if needed, and not a Follow kit.
	if ( ! $linkurl && empty( $args['is_follow'] ) ) {
		if ( $use_current_page ) {
			$linkurl = esc_url_raw( home_url( $_SERVER['REQUEST_URI'] ) );
		} elseif ( isset( $post ) ) {
			$linkurl = get_permalink( $post->ID );
		} else {
			$linkurl = '';
		}
	}
	
	$linkurl_enc = rawurlencode( $linkurl );
	
	// Set linkmedia (only applies to services that explicitly accept media; Pinterest does, most do not).
	$linkmedia_enc = ! empty( $args['linkmedia'] ) ? rawurlencode( $args['linkmedia'] ) : '';
	
	return compact( 'linkname', 'linkname_enc', 'linkurl', 'linkurl_enc', 'linkmedia', 'linkmedia_enc', 'use_current_page' );
}

// Combine ADDTOANY_SHARE_SAVE_ICONS and ADDTOANY_SHARE_SAVE_BUTTON.
function ADDTOANY_SHARE_SAVE_KIT( $args = array() ) {
	$options = get_option( 'addtoany_options', array() );
	
	$args = array_merge( $args, A2A_SHARE_SAVE_link_vars( $args ) ); // linkname_enc, etc.
	
	$defaults = array(
		'output_later'     => false,
		'icon_size'        => isset( $options['icon_size'] ) ? $options['icon_size'] : '32',
		'is_follow'        => false,
	);
	
	$args = wp_parse_args( $args, $defaults );
	
	// If universal button disabled, and not manually disabled through args.
	if ( isset( $options['button'] ) && $options['button'] == 'NONE' && ! isset( $args['no_universal_button'] ) ) {
		// Pass this setting on to ADDTOANY_SHARE_SAVE_BUTTON,
		// and only via this ADDTOANY_SHARE_SAVE_KIT function because it is used for automatic placement.
		$args['no_universal_button'] = true;
	}
	
	// Custom icons enabled?
	$custom_icons = ( isset( $options['custom_icons'] ) && $options['custom_icons'] == 'url' && isset( $options['custom_icons_url'] ) ) ? true : false;
	
	$kit_additional_classes = '';
	$kit_data_media = empty( $args['linkmedia'] ) ? '' : ' data-a2a-media="' . esc_attr( $args['linkmedia'] ) . '"';
	$kit_data_title = empty( $args['linkname'] ) || $args['use_current_page'] ? '' : ' data-a2a-title="' . esc_attr( $args['linkname'] ) . '"';
	$kit_data_url = empty( $args['linkurl'] ) || $args['use_current_page'] ? '' : ' data-a2a-url="' . esc_attr( $args['linkurl'] ) . '"';
	$kit_data_scroll_show = empty( $args['scroll_show'] ) ? '' : ' data-a2a-scroll-show="' . esc_attr( $args['scroll_show'] ) . '"';
	$kit_style = '';
	
	// Add additional classNames to .a2a_kit.
	if ( ! empty( $args['kit_additional_classes'] ) ) {
		// Append space and className(s).
		$kit_additional_classes .= ' ' . $args['kit_additional_classes'];
	}
	
	// Set a2a_kit_size_## class name.
	if ( $custom_icons ) {
		// If vertical style (.a2a_vertical_style)
		if ( strpos( $kit_additional_classes, 'a2a_vertical_style' ) !== false ) {
			// Use width (if specified) for .a2a_kit_size_## class name to size default service counters.
			$icon_size_classname = isset( $options['custom_icons_width'] ) ? ' a2a_kit_size_' . $options['custom_icons_width'] : '';
		} else {
			// Use height (if specified) for .a2a_kit_size_## class name to size default service counters.
			$icon_size_classname = isset( $options['custom_icons_height'] ) ? ' a2a_kit_size_' . $options['custom_icons_height'] : '';
		}
	// Set a2a_kit_size_## icon size.
	} else {
		$icon_size_classname = ' a2a_kit_size_' . $args['icon_size'];
	}
	
	// Add addtoany_list className unless disabled (for floating buttons).
	if ( ! isset( $args['no_addtoany_list_classname'] ) ) {
		$kit_additional_classes .= ' addtoany_list';
	}
	
	// Add style attribute if set.
	if ( ! empty( $args['kit_style'] ) ) {
		$kit_style = ' style="' . esc_attr( $args['kit_style'] ) . '"';
	}
	
	if ( ! isset( $args['html_container_open'] ) ) {
		$args['html_container_open'] = '<div class="a2a_kit' . esc_attr( $icon_size_classname . $kit_additional_classes ) . '"'
			. $kit_data_url . $kit_data_title . $kit_data_media . $kit_data_scroll_show . $kit_style . '>';
		$args['is_kit'] = true;
	}
	if ( ! isset( $args['html_container_close'] ) )
		$args['html_container_close'] = "</div>";
	// Close container element in ADDTOANY_SHARE_SAVE_BUTTON, not prematurely in ADDTOANY_SHARE_SAVE_ICONS.
	// Cache for _BUTTON.
	$html_container_close = $args['html_container_close'];
	// Avoid passing to ADDTOANY_SHARE_SAVE_ICONS since set in _BUTTON.
	unset( $args['html_container_close'] );
				
	if ( ! isset( $args['html_wrap_open'] ) )
		$args['html_wrap_open'] = "";
	if ( ! isset( $args['html_wrap_close'] ) )
		$args['html_wrap_close'] = "";
	
	$kit_html = ADDTOANY_SHARE_SAVE_ICONS( $args );
	
	// Set again because it was unset above for _ICONS.
	$args['html_container_close'] = $html_container_close;
	// Avoid passing to ADDTOANY_SHARE_SAVE_BUTTON since set in _ICONS.
	unset( $args['html_container_open'] );
	
	$kit_html .= ADDTOANY_SHARE_SAVE_BUTTON( $args );
	
	if ( true == $args['output_later'] )
		return $kit_html;
	else
		echo wp_kses_post( $kit_html );
}

function ADDTOANY_SHARE_SAVE_ICONS( $args = array() ) {
	// $args array: output_later, html_container_open, html_container_close, html_wrap_open, html_wrap_close, linkname, linkurl
	
	global $A2A_SHARE_SAVE_services,
		$A2A_FOLLOW_services;
	
	$options = get_option( 'addtoany_options', array() );
	
	$args = array_merge( $args, A2A_SHARE_SAVE_link_vars( $args ) ); // linkname_enc, etc.
	
	$defaults = array(
		'linkname'             => '',
		'linkurl'              => '',
		'linkmedia'            => '',
		'linkname_enc'         => '',
		'linkurl_enc'          => '',
		'linkmedia_enc'        => '',
		'output_later'         => false,
		'html_container_open'  => '',
		'html_container_close' => '',
		'html_wrap_open'       => '',
		'html_wrap_close'      => '',
		'icon_size'			   => isset( $options['icon_size'] ) ? $options['icon_size'] : '32',
		'is_follow'            => false,
		'no_universal_button'  => false,
		'basic_html'           => false,
		'buttons'              => array(),
	);
	
	$args = wp_parse_args( $args, $defaults );
	
	$is_amp = function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ? true : false;
	
	// Use large icons except for AMP.
	$large_icons = $is_amp ? false : true;

	// Make the color of the icons extensible, primariliy for AMP use cases.
	$icon_bg_color_filtered = apply_filters( 'addtoany_icons_bg_color', '' );
	
	// Directory of either custom icons or the packaged icons
	if ( isset( $options['custom_icons'] ) && $options['custom_icons'] == 'url' && isset( $options['custom_icons_url'] ) ) {
		// Custom icons expected at a specified URL, i.e. //example.com/blog/uploads/addtoany/icons/custom/
		$icons_dir = $options['custom_icons_url'];
		$icons_type = ( isset( $options['custom_icons_type'] ) ) ? $options['custom_icons_type'] : 'png';
		$icons_width = ( isset( $options['custom_icons_width'] ) ) ? $options['custom_icons_width'] : '';
		$icons_height = ( isset( $options['custom_icons_height'] ) ) ? $options['custom_icons_height'] : '';
		$custom_icons = true;
	} else {
		// Default to local SVGs.
		$icons_dir = plugins_url('/icons/', __FILE__ );
		$icons_type = 'svg';
	}
	
	// If Follow kit
	if ( $args['is_follow'] ) {
		// Make available services extensible via plugins, themes (functions.php), etc.
		$services = apply_filters( 'A2A_FOLLOW_services', $A2A_FOLLOW_services );
		$service_codes = ( is_array( $services ) ) ? array_keys( $services ) : array();
		
		// Services set by "buttons" arg
		$active_services = empty( $args['buttons'] ) ? array() : array_keys( $args['buttons'] );
	// Else Share kit
	} else {
		// Make available services extensible via plugins, themes (functions.php), etc.
		$services = apply_filters( 'A2A_SHARE_SAVE_services', $A2A_SHARE_SAVE_services );
		$service_codes = ( is_array( $services ) ) ? array_keys( $services ) : array();
		
		// Include Facebook Like and Twitter Tweet etc. unless no_special_services arg is true.
		if ( ! isset( $args['no_special_services'] ) || false == $args['no_special_services'] ) {
			array_unshift( $service_codes, 'facebook_like', 'twitter_tweet', 'pinterest_pin' );
		}
	
		// Use default services if services have not been selected yet.
		$active_services = isset( $options['active_services'] ) ? $options['active_services'] : array( 'facebook', 'mastodon', 'email' );
		// Services set by "buttons" arg? Then use "buttons" arg instead.
		$active_services = empty( $args['buttons'] ) ? $active_services : $args['buttons'];
	}
	
	$ind_html = "" . $args['html_container_open'];
	
	foreach( $active_services as $active_service ) {
		
		$custom_service = false;
		
		if ( ! in_array( $active_service, $service_codes ) )
			continue;

		if ( $active_service == 'facebook_like' || $active_service == 'twitter_tweet' || $active_service == 'pinterest_pin' ) {
			$special_args = $args;
			$special_args['output_later'] = true;
			$link = ADDTOANY_SHARE_SAVE_SPECIAL( $active_service, $special_args );
		} else {
			$service = $services[ $active_service ];
			$code_name = $active_service;
			$name = $service['name'];
			
			// If Follow kit and HREF specified
			if ( $args['is_follow'] && isset( $service['href'] ) ) {
				$follow_id = $args['buttons'][ $active_service ]['id'];
				$is_url = in_array( parse_url( $follow_id, PHP_URL_SCHEME ), array( 'http', 'https' ) );
				
				// If it's a URL instead of a service ID
				if ( $is_url ) {
					// Just use the given URL instead of the URL template.
					$href = $follow_id;
				} else {
					// Replace the ID placeholder in the URL template.
					$href = str_replace( '${id}', $follow_id, $service['href'] );
				}
				$href = ( 'feed' == $code_name ) ? $follow_id : $href;
				
				// If icon_url is set, presume custom service.
				if ( isset( $service['icon_url'] ) ) {
					$custom_service = true;
				}
			// Else if Share Kit and HREF specified, presume custom service.
			} elseif ( isset( $service['href'] ) ) {
				$custom_service = true;
				$href = $service['href'];
				if ( isset( $service['href_js_esc'] ) ) {
					$href_linkurl = str_replace( "'", "\'", $args['linkurl'] );
					$href_linkname = str_replace( "'", "\'", $args['linkname'] );
				} else {
					$href_linkurl = $args['linkurl_enc'];
					$href_linkname = $args['linkname_enc'];
				}
				$href = str_replace( "A2A_LINKURL", $href_linkurl, $href );
				$href = str_replace( "A2A_LINKNAME", $href_linkname, $href );
				$href = str_replace( " ", "%20", $href );
			}
			
			// AddToAny counter enabled?
			$counter_enabled = ( ! $args['is_follow'] // Disable counters on Follow Kits
				&& in_array( $active_service, array( 'pinterest', 'reddit', 'tumblr' ) )
				&& isset( $options['special_' . $active_service . '_options'] )
				&& isset( $options['special_' . $active_service . '_options']['show_count'] ) 
				&& $options['special_' . $active_service . '_options']['show_count'] == '1' 
			) ? true : false;
			
			$icon = isset( $service['icon'] ) ? $service['icon'] : 'default'; // Just the icon filename
			$icon_url = isset( $service['icon_url'] ) ? $service['icon_url'] : false;
			$icon_url = $is_amp && ! $icon_url ? 'https://static.addtoany.com/buttons/' . $icon . '.svg' : $icon_url;
			$width_attr = isset( $service['icon_width'] ) ? ' width="' . esc_attr( $service['icon_width'] ) . '"' : ' width="16"';
			$width_attr = $is_amp && ! empty( $args['icon_size'] ) ? ' width="' . esc_attr( $args['icon_size'] ) . '"' : $width_attr;
			$height_attr = isset( $service['icon_height'] ) ? ' height="' . esc_attr( $service['icon_height'] ) . '"' : ' height="16"';
			$height_attr = $is_amp && ! empty( $args['icon_size'] ) ? ' height="' . esc_attr( $args['icon_size'] ) . '"' : $height_attr;
			
			$img_style_attr_bg_color = ! empty( $service['color'] ) ? '#' . $service['color'] : '';
			$img_style_attr_bg_color = ! empty( $icon_bg_color_filtered ) ? $icon_bg_color_filtered : $img_style_attr_bg_color;
			$img_style_attr = $is_amp && ! empty( $img_style_attr_bg_color ) ? ' style="background-color:' . esc_attr( $img_style_attr_bg_color ) . ';"' : '';
			
			$url = isset( $href ) ? $href : 'https://www.addtoany.com/add_to/' . $code_name . '?linkurl=' . $args['linkurl_enc'] .'&amp;linkname=' . $args['linkname_enc'];
			$src = $icon_url ? $icon_url : $icons_dir . $icon . '.' . $icons_type;
			$counter = $counter_enabled ? ' a2a_counter' : '';
			$class_attr = $custom_service ? '' : ' class="a2a_button_' . esc_attr( $code_name ) . $counter . '"';
			$href_attr = $args['basic_html'] && ! isset( $href ) ? '' : ' href="' . esc_attr( $url ) . '"';
			$title_attr = $args['basic_html'] ? '' : ' title="' . esc_attr( $name ) . '"';

			if ( isset( $service['target'] ) ) {
				$target_attr = empty( $service['target'] ) ? '' : ' target="' . esc_attr( $service['target'] ) . '"';
			} elseif ( ! $args['basic_html'] ) {
				$target_attr = ' target="_blank"';
			} else {
				$target_attr = '';
			}
			
			// Use rel="noopener" for links that open in a new tab/window.
			$rel_noopener = $custom_service || ! $target_attr ? '' : ' noopener';
			$rel_noopener_only = $rel_noopener || $target_attr ? ' rel="noopener"' : '';
			$rel_attr = $args['is_follow'] ? $rel_noopener_only : ' rel="nofollow' . $rel_noopener . '"'; // ($args['is_follow'] indicates a Follow Kit. 'nofollow' is for search crawlers. Different things)
			$rel_attr = $args['basic_html'] ? '' : $rel_attr;

			// Use AMP's "print" action.
			if ( $is_amp && 'print' === $code_name ) {
				$amp_on_attr = ' on="tap:AMP.print()"';
				$href_attr = ' href="#print"';
				$target_attr = '';
			} else {
				$amp_on_attr = '';
			}

			// Set dimension attributes if using custom icons and dimension is specified.
			if ( isset( $custom_icons ) && ! $is_amp ) {
				$width_attr = ! empty( $icons_width ) ? ' width="' . $icons_width . '"' : '';
				$height_attr = ! empty( $icons_height ) ? ' height="' . $icons_height . '"' : '';
			}
			
			$link = $args['html_wrap_open'] . "<a$class_attr$href_attr$title_attr$rel_attr$target_attr$amp_on_attr>";
			$link .= ( $large_icons && ! isset( $custom_icons ) && ! $custom_service ) ? '' : '<img' . $img_style_attr . ' src="' . esc_attr( $src ) . '"' . $width_attr . $height_attr . ' alt="' . esc_attr( $name ) . '">';
			$link .= "</a>" . $args['html_wrap_close'];
		}
		
		$ind_html .= $link;
	}
	
	$ind_html .= $args['html_container_close'];
	
	if ( true == $args['output_later'] )
		return $ind_html;
	else
		echo wp_kses_post( $ind_html );
}

function ADDTOANY_SHARE_SAVE_BUTTON( $args = array() ) {
	
	// $args array = output_later, html_container_open, html_container_close, html_wrap_open, html_wrap_close, linkname, linkurl, no_universal_button
	
	$options = get_option( 'addtoany_options', array() );

	$args = array_merge( $args, A2A_SHARE_SAVE_link_vars( $args ) ); // linkname_enc, etc.
	
	$defaults = array(
		'linkname' => '',
		'linkurl' => '',
		'linkmedia' => '',
		'linkname_enc' => '',
		'linkurl_enc' => '',
		'linkmedia_enc' => '',
		'use_current_page' => false,
		'output_later' => false,
		'is_kit' => false,
		'html_container_open' => '',
		'html_container_close' => '',
		'html_wrap_open' => '',
		'html_wrap_close' => '',
		'html_content' => '',
		'button_additional_classes' => '',
		'icon_size'	=> isset( $options['icon_size'] ) ? $options['icon_size'] : '32',
		'no_universal_button' => false,
	);
	
	$args = wp_parse_args( $args, $defaults );
	
	$is_feed = is_feed();
	$is_amp = function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ? true : false;
	// Make the color of the icons extensible, primariliy for AMP use cases.
	$icon_bg_color_filtered = apply_filters( 'addtoany_icons_bg_color', '#0166ff' );
	$button_class = '';
	$button_data_media = $args['is_kit'] || empty( $args['linkmedia'] ) ? '' : ' data-a2a-media="' . esc_attr( $args['linkmedia'] ) . '"';
	$button_data_title = $args['is_kit'] || empty( $args['linkname'] ) ? '' : ' data-a2a-title="' . esc_attr( $args['linkname'] ) . '"';
	$button_data_url = $args['is_kit'] || empty( $args['linkurl'] ) ? '' : ' data-a2a-url="' . esc_attr( $args['linkurl'] ) . '"';
	$button_target = $is_amp ? ' target="_blank"' : '';
	$button_href_querystring = ($is_feed || $is_amp) ? '#url=' . $args['linkurl_enc'] . '&amp;title=' . $args['linkname_enc'] : '';
	
	// If universal button is enabled
	if ( ! $args['no_universal_button'] ) {
		
		if ( isset( $options['button'] ) && 'CUSTOM' == $options['button'] ) {
			// Custom button.
			$button_src		= $options['button_custom'];
			$button_width	= '';
			$button_height	= '';
			$button_style   = '';
		} else if ( isset( $options['button'] ) && 'TEXT' == $options['button'] ) {
			// Text-only button.
			$button_text	= stripslashes( $options[ 'button_text'] );
			// Do not display universal icon.
			$button_class  .= ' addtoany_no_icon';
		} else {
			// Default AddToAny button.
			if ( $is_amp ) {
				// AMP (Accelerated Mobile Page).
				$button_src    = 'https://static.addtoany.com/buttons/a2a.svg';
				$button_width  = ! empty( $args['icon_size'] ) ? ' width="' . $args['icon_size'] .'"'  : ' width="32"';
				$button_height = ! empty( $args['icon_size'] ) ? ' height="' . $args['icon_size'] .'"'  : ' height="32"';
				$button_style  = ! empty( $icon_bg_color_filtered ) ? ' style="background-color:' . esc_attr( $icon_bg_color_filtered ) . '"' : '';
			}
		}
		
		if ( ! empty( $html_content ) ) {
			$button = $html_content;
		} elseif ( ! empty( $button_text ) ) {
			$button = $button_text;
		} elseif ( ! empty( $button_src ) ) {
			$button	= '<img src="' . esc_url( $button_src ) . '"' . $button_width . $button_height . $button_style . ' alt="Share">';
		} else {
			$button = '';
		}
		
		// Add additional classNames to .a2a_dd.
		$button_additional_classes = ! empty( $args['button_additional_classes'] ) ? ' ' . $args['button_additional_classes'] : '';
		
		if ( isset( $options['button_show_count'] ) && $options['button_show_count'] == '1' ) {
			$button_class .= ' a2a_counter';
		}
		
		$button_html = $args['html_container_open'] . $args['html_wrap_open'] . '<a class="a2a_dd' . $button_class . $button_additional_classes . ' addtoany_share_save addtoany_share" href="' 
			. esc_url( 'https://www.addtoany.com/share' .$button_href_querystring ) . '"'
			. $button_data_url . $button_data_title . $button_data_media . $button_target
			. '>' . $button . '</a>';
	
	} else {
		// Universal button disabled.
		$button_html = '';
	}
	
	// Closing tags come after <script> to validate in case the container is a list element.
	$button_html .= $args['html_wrap_close'] . $args['html_container_close'];
	
	if ( isset( $args['output_later'] ) && $args['output_later'] == true )
		return $button_html;
	else
		echo wp_kses_post( $button_html );
}

function ADDTOANY_SHARE_SAVE_SPECIAL( $special_service_code, $args = array() ) {
	// $args array = output_later, linkname, linkurl
	
	if ( is_feed() ) {
		return;
	}
	
	$options = get_option( 'addtoany_options', array() );
	
	$args = array_merge( $args, A2A_SHARE_SAVE_link_vars( $args ) ); // linkname_enc, etc.
	
	$special_anchor_template = '<a class="%1$s_%2$s addtoany_special_service"%3$s></a>';
	$custom_attributes = '';

	global $A2A_3p_consent;
	$a2a_prefix = $A2A_3p_consent === false ? 'a2a_disabled' : 'a2a_button';

	if ( $special_service_code == 'facebook_like' ) {
		$custom_attributes .= ( isset( $options['special_facebook_like_options']['verb'] )
			&& 'recommend' == $options['special_facebook_like_options']['verb'] ) ? ' data-action="recommend"' : '';
		$custom_attributes .= ( isset( $options['special_facebook_like_options']['show_count'] )
			&& $options['special_facebook_like_options']['show_count'] == '1' ) ? '' : ' data-layout="button"';
		$custom_attributes .= ' data-href="' . esc_attr( $args['linkurl'] ) . '"';
		$special_html = sprintf( $special_anchor_template, $a2a_prefix, $special_service_code, $custom_attributes );
	} elseif ( $special_service_code == 'twitter_tweet' ) {
		$custom_attributes .= ' data-url="' . esc_attr( $args['linkurl'] ) . '"';
		$custom_attributes .= ' data-text="' . esc_attr( $args['linkname'] ) . '"';
		$special_html = sprintf( $special_anchor_template, $a2a_prefix, $special_service_code, $custom_attributes );
	} elseif ( $special_service_code == 'pinterest_pin' ) {
		$custom_attributes .= ( isset( $options['special_pinterest_pin_options']['show_count'] )
			&& $options['special_pinterest_pin_options']['show_count'] == '1' ) ? '' : ' data-pin-config="none"';
		$custom_attributes .= ' data-url="' . esc_attr( $args['linkurl'] ) . '"';
		$custom_attributes .= ( empty( $args['linkmedia'] ) ) ? '' : ' data-media="' . esc_attr( $args['linkmedia'] ) . '"';
		$special_html = sprintf( $special_anchor_template, $a2a_prefix, $special_service_code, $custom_attributes );
	}
	
	if ( isset( $args['output_later'] ) && $args['output_later'] == true )
		return $special_html;
	else
		echo wp_kses_post( $special_html );
}

function addtoany_menu_locale_escaped() {
	global $A2A_locale;
	$locale = get_locale();
	if ( $locale == 'en_US' || $locale == 'en' || $A2A_locale != '' )
		return false;
		
	$A2A_locale = 'a2a_localize = {
	Share: "' . __( "Share", 'add-to-any' ) . '",
	Save: "' . __( "Save", 'add-to-any' ) . '",
	Subscribe: "' . __( "Subscribe", 'add-to-any' ) . '",
	Email: "' . __( "Email", 'add-to-any' ) . '",
	Bookmark: "' . __( "Bookmark", 'add-to-any' ) . '",
	ShowAll: "' . __( "Show all", 'add-to-any' ) . '",
	ShowLess: "' . __( "Show less", 'add-to-any' ) . '",
	FindServices: "' . __( "Find service(s)", 'add-to-any' ) . '",
	FindAnyServiceToAddTo: "' . __( "Instantly find any service to add to", 'add-to-any' ) . '",
	PoweredBy: "' . __( "Powered by", 'add-to-any' ) . '",
	ShareViaEmail: "' . __( "Share via email", 'add-to-any' ) . '",
	SubscribeViaEmail: "' . __( "Subscribe via email", 'add-to-any' ) . '",
	BookmarkInYourBrowser: "' . __( "Bookmark in your browser", 'add-to-any' ) . '",
	BookmarkInstructions: "' . __( "Press Ctrl+D or \u2318+D to bookmark this page", 'add-to-any' ) . '",
	AddToYourFavorites: "' . __( "Add to your favorites", 'add-to-any' ) . '",
	SendFromWebOrProgram: "' . __( "Send from any email address or email program", 'add-to-any' ) . '",
	EmailProgram: "' . __( "Email program", 'add-to-any' ) . '",
	More: "' . __( "More&#8230;", 'add-to-any' ) . '",
	ThanksForSharing: "' . __( "Thanks for sharing!", 'add-to-any' ) . '",
	ThanksForFollowing: "' . __( "Thanks for following!", 'add-to-any' ) . '"
};
';
	return $A2A_locale;
}

function ADDTOANY_FOLLOW_KIT( $args = array() ) {
	$options = get_option( 'addtoany_options', array() );
	
	// Args are passed on to ADDTOANY_SHARE_SAVE_KIT.
	$defaults = array(
		'buttons' => array(),
		'linkname' => '',
		'linkurl' => '',
		'linkname_enc' => '',
		'linkurl_enc' => '',
		'use_current_page' => false,
		'output_later' => false,
		'is_follow' => true,
		'is_kit' => true,
		'no_special_services' => true,
		'no_universal_button' => true,
		'kit_additional_classes' => '',
		'kit_style' => '',
		'icon_size'	=> isset( $options['icon_size'] ) ? $options['icon_size'] : '32',
		'services' => array(),
	);
	
	$args = wp_parse_args( $args, $defaults );
	
	// Add a2a_follow className to Kit classes.
	$args['kit_additional_classes'] = trim( $args['kit_additional_classes'] . ' a2a_follow' );
	
	// If $args['buttons']['feed']['id'] is set.
	$buttons = $args['buttons'];
	if ( ! empty( $buttons['feed'] ) && ! empty( $buttons['feed']['id'] ) ) {
		$args['linkurl'] = $buttons['feed']['id'];
		$args['linkname'] = get_bloginfo( 'name' );
	}
	
	$follow_html = ADDTOANY_SHARE_SAVE_KIT( $args );
	
	if ( isset( $args['output_later'] ) && $args['output_later'] == true )
		return $follow_html;
	else
		echo wp_kses_post( $follow_html );
}

function ADDTOANY_SHARE_SAVE_FLOATING( $args = array() ) {
	$options = get_option( 'addtoany_options', array() );
	
	$floating_html = '';

	// Overridable by args below.
	$vertical_type = ( isset( $options['floating_vertical'] ) && 'none' != $options['floating_vertical']
		&& ! in_array( $options['floating_vertical'], array( 'left_attached', 'right_attached' ) )
	) ? $options['floating_vertical'] : false;
	$horizontal_type = ( isset( $options['floating_horizontal'] ) && 'none' != $options['floating_horizontal'] ) ? $options['floating_horizontal'] : false;

	$sharing_disabled = false;
	if ( is_singular() ) {
		// Sharing disabled for this singular post?
		$sharing_disabled = get_post_meta( get_the_ID(), 'sharing_disabled', true );
	}
	// Sharing disabled programmatically?
	$sharing_disabled = apply_filters( 'addtoany_sharing_disabled', $sharing_disabled );	
	if ( ! empty( $sharing_disabled ) ) {
		// Overridable by args below.
		$vertical_type   = false;
		$horizontal_type = false;
	}

	// Args are passed on to ADDTOANY_SHARE_SAVE_KIT.
	$defaults = array(
		'linkname' => '',
		'linkurl' => '',
		'linkname_enc' => '',
		'linkurl_enc' => '',
		'use_current_page' => true,
		'output_later' => false,
		'is_floating' => true,
		'is_kit' => true,
		'no_addtoany_list_classname' => true,
		'no_special_services' => true,
		'kit_additional_classes' => '',
		'kit_style' => '',
	);
	
	$args = wp_parse_args( $args, $defaults );
	
	// Individual floating type args can override saved options.
	if ( isset( $args['vertical_type'] ) && $args['vertical_type'] === true ) {
		$vertical_type = true;
	}
	if ( isset( $args['horizontal_type'] ) && $args['horizontal_type'] === true ) {
		$horizontal_type = true;
	}

	// If either floating type is enabled,
	// expect either a string from options, or a boolean from args.
	if ( $vertical_type || $horizontal_type ) {
		// Vertical type?
		if ( $vertical_type ) {
			// Prevent overwriting of $args.
			$vertical_args = $args;
			
			// Top position.
			$position = ( isset( $options['floating_vertical_position'] ) ) ? $options['floating_vertical_position'] . 'px' : '100px';
			// Left or right offset.
			$offset = ( isset( $options['floating_vertical_offset'] ) ) ? $options['floating_vertical_offset'] . 'px' : '0px';
			// Icon size.
			$vertical_args['icon_size'] = ( isset( $options['floating_vertical_icon_size'] ) ) ? $options['floating_vertical_icon_size'] : '32';
			
			// Show on scroll value from the top.
			$vertical_scroll_show_top = isset( $options['floating_vertical_scroll_top'] ) && '1' == $options['floating_vertical_scroll_top']
				&& isset( $options['floating_vertical_scroll_top_pixels'] ) 
				&& is_numeric( $options['floating_vertical_scroll_top_pixels'] ) ? $options['floating_vertical_scroll_top_pixels'] : '';
			// Show on scroll value from the bottom.
			$vertical_scroll_show_bottom = isset( $options['floating_vertical_scroll_bottom'] ) && '1' == $options['floating_vertical_scroll_bottom']
				&& isset( $options['floating_vertical_scroll_bottom_pixels'] ) 
				&& is_numeric( $options['floating_vertical_scroll_bottom_pixels'] ) ? $options['floating_vertical_scroll_bottom_pixels'] : '';
			// Merge values as required.
			if ( ! empty( $vertical_scroll_show_bottom ) ) {
				$vertical_args['scroll_show'] = empty( $vertical_scroll_show_top ) ? '0,' . $vertical_scroll_show_bottom : $vertical_scroll_show_top . ',' . $vertical_scroll_show_bottom;
			} elseif ( ! empty( $vertical_scroll_show_top ) ) {
				$vertical_args['scroll_show'] = $vertical_scroll_show_top;
			}
		
			// Add a2a_vertical_style className to Kit classes.
			$vertical_args['kit_additional_classes'] = trim( $args['kit_additional_classes'] . ' a2a_floating_style a2a_vertical_style' );
			
			// Add declarations to Kit style attribute.
			if ( 'left_docked' === $vertical_type ) {
				$vertical_args['kit_style'] = 'left:' . $offset . ';top:' . $position . ';';
			} elseif ( 'right_docked' === $vertical_type ) {
				$vertical_args['kit_style'] = 'right:' . $offset . ';top:' . $position . ';';
			}
			// Set background color.
			if ( ! empty( $options['floating_vertical_bg'] ) && 'custom' === $options['floating_vertical_bg'] ) {
				$vertical_args['kit_style'] .= ! empty( $options['floating_vertical_bg_color'] ) ? 'background-color:' . $options['floating_vertical_bg_color'] . ';' : '';
			} else {
				$vertical_args['kit_style'] .= 'background-color:transparent;';
			}
			
			$floating_html .= ADDTOANY_SHARE_SAVE_KIT( $vertical_args );
		}
		
		// Horizontal type?
		if ( $horizontal_type ) {
			// Prevent overwriting of $args values.
			$horizontal_args = $args;
			
			// Left or right position.
			$position = ( isset( $options['floating_horizontal_position'] ) ) ? $options['floating_horizontal_position'] . 'px' : '0px';
			// Bottom offset.
			$offset = ( isset( $options['floating_horizontal_offset'] ) ) ? $options['floating_horizontal_offset'] . 'px' : '0px';
			// Icon size.
			$horizontal_args['icon_size'] = ( isset( $options['floating_horizontal_icon_size'] ) ) ? $options['floating_horizontal_icon_size'] : '32';
			// Show on scroll value from the top.
			$horizontal_scroll_show_top = isset( $options['floating_horizontal_scroll_top'] ) && '1' == $options['floating_horizontal_scroll_top']
				&& isset( $options['floating_horizontal_scroll_top_pixels'] ) 
				&& is_numeric( $options['floating_horizontal_scroll_top_pixels'] ) ? $options['floating_horizontal_scroll_top_pixels'] : '';
			// Show on scroll value from the bottom.
			$horizontal_scroll_show_bottom = isset( $options['floating_horizontal_scroll_bottom'] ) && '1' == $options['floating_horizontal_scroll_bottom']
				&& isset( $options['floating_horizontal_scroll_bottom_pixels'] ) 
				&& is_numeric( $options['floating_horizontal_scroll_bottom_pixels'] ) ? $options['floating_horizontal_scroll_bottom_pixels'] : '';
			// Merge values as required.
			if ( ! empty( $horizontal_scroll_show_bottom ) ) {
				$horizontal_args['scroll_show'] = empty( $horizontal_scroll_show_top ) ? '0,' . $horizontal_scroll_show_bottom : $horizontal_scroll_show_top . ',' . $horizontal_scroll_show_bottom;
			} elseif ( ! empty( $horizontal_scroll_show_top ) ) {
				$horizontal_args['scroll_show'] = $horizontal_scroll_show_top;
			}

			// Add a2a_default_style className to Kit classes.
			$horizontal_args['kit_additional_classes'] = trim( $args['kit_additional_classes'] . ' a2a_floating_style a2a_default_style' );
			
			// Add declarations to Kit style attribute.
			if ( 'left_docked' === $horizontal_type ) {
				$horizontal_args['kit_style'] = 'bottom:' . $offset . ';left:' . $position . ';';
			} elseif ( 'right_docked' === $horizontal_type ) {
				$horizontal_args['kit_style'] = 'bottom:' . $offset . ';right:' . $position . ';';
			} elseif ( 'center_docked' === $horizontal_type ) {
				$horizontal_args['kit_style'] = 'bottom:' . $offset . ';left:50%;transform:translateX(-50%);';
			}
			// Background color.
			if ( ! empty( $options['floating_horizontal_bg'] ) && 'custom' === $options['floating_horizontal_bg'] ) {
				$horizontal_args['kit_style'] .= ! empty( $options['floating_horizontal_bg_color'] ) ? 'background-color:' . $options['floating_horizontal_bg_color'] . ';' : '';
			} else {
				$horizontal_args['kit_style'] .= 'background-color:transparent;';
			}
			
			$floating_html .= ADDTOANY_SHARE_SAVE_KIT( $horizontal_args );
		}
	}
	
	if ( isset( $args['output_later'] ) && $args['output_later'] == true ) {
		return $floating_html;
	}
	else {
		// Output escaped HTML without stripping out AMP attributes and positional styles as wp_kses* does.
		echo addtoany_kses( $floating_html );
	}
}

function A2A_SHARE_SAVE_footer_script() {
	if ( is_admin() || is_feed() )
		return;
	
	$floating_html = ADDTOANY_SHARE_SAVE_FLOATING( array( 'output_later' => true ) );
	
	// Output escaped HTML without stripping out AMP attributes and positional styles as wp_kses* does.
	echo addtoany_kses( $floating_html );
}

add_action( 'wp_footer', 'A2A_SHARE_SAVE_footer_script' );


function A2A_SHARE_SAVE_add_to_content( $content ) {
	global $wp_current_filter;
	
	// Don't add to get_the_excerpt because it's too early and strips tags (adding to the_excerpt is allowed).
	if ( in_array( 'get_the_excerpt', (array) $wp_current_filter ) ) {
		// Return early.
		return $content;
	}
	
	$sharing_disabled = get_post_meta( get_the_ID(), 'sharing_disabled', true );
	$sharing_disabled = apply_filters( 'addtoany_sharing_disabled', $sharing_disabled );
	
	if ( 
		// Private post?
		get_post_status( get_the_ID() ) == 'private' ||
		// Sharing disabled on post?
		! empty( $sharing_disabled ) 
	) {
		// Return early
		return $content;
	}
	
	$is_feed = is_feed();
	$options = get_option( 'addtoany_options', array() );
	$post_type = get_post_type( get_the_ID() );
	
	if ( 
		( 
			// Legacy tags?
			// <!--sharesave--> tag
			strpos( $content, '<!--sharesave-->' ) === false || 
			// <!--nosharesave--> tag
			strpos( $content, '<!--nosharesave-->' ) !== false
		) &&
		(
			// Posts
			// All posts.
			( is_singular('post') && isset( $options['display_in_posts'] ) && $options['display_in_posts'] == '-1' ) ||
			// Front page posts.
			( is_home() && isset( $options['display_in_posts_on_front_page'] ) && $options['display_in_posts_on_front_page'] == '-1' ) ||
			// Archive page posts (Category, Tag, Author and Date pages).
			( is_archive() && isset( $options['display_in_posts_on_archive_pages'] ) && $options['display_in_posts_on_archive_pages'] == '-1' ) ||
			// Search results posts (same as Archive page posts option).
			( is_search() && isset( $options['display_in_posts_on_archive_pages'] ) && $options['display_in_posts_on_archive_pages'] == '-1' ) || 
			// Excerpt (the_excerpt is the current filter).
			( 'the_excerpt' == current_filter() && isset( $options['display_in_excerpts'] ) && $options['display_in_excerpts'] == '-1' ) ||
			// Posts in feed.
			( $is_feed && isset( $options['display_in_feed'] ) && $options['display_in_feed'] == '-1' ) ||
			
			// Custom post types.
			( $post_type && isset( $options['display_in_cpt_' . $post_type] ) && $options['display_in_cpt_' . $post_type] == '-1' ) ||
			
			// Pages
			// Individual pages.
			( is_singular('page') && isset( $options['display_in_pages'] ) && $options['display_in_pages'] == '-1' ) ||
			// Attachment (media) pages.
			( is_attachment() && isset( $options['display_in_attachments'] ) && $options['display_in_attachments'] == '-1' ) ||
			// <!--nosharesave--> legacy tag.
			( (strpos( $content, '<!--nosharesave-->') !== false ) )
		)
	) {
		// Return early.
		return $content;
	}
	
	$kit_args = array(
		"output_later" => true,
		"is_kit" => ( $is_feed ) ? false : true,
	);
	
	// If a Sharing Header is set
	if ( ! empty( $options['header'] ) ) {
		$html_header = '<div class="addtoany_header">' . stripslashes( $options['header'] ) . '</div>';
	} else {
		$html_header = '';
	}
	
	if ( $is_feed ) {
		$container_wrap_open = '<p>';
		$container_wrap_close = '</p>';
		$kit_args['html_container_open'] = '';
		$kit_args['html_container_close'] = '';
		$kit_args['html_wrap_open'] = '';
		$kit_args['html_wrap_close'] = '';
	} else {
		$container_wrap_open = '<div class="addtoany_share_save_container addtoany_content %s">'; // Contains placeholder
		$container_wrap_open .= $html_header;
		$container_wrap_close = '</div>';
	}
	
	$options['position'] = isset( $options['position'] ) ? $options['position'] : 'bottom';
	
	if ($options['position'] == 'both' || $options['position'] == 'top') {
		// Prepend to content.
		$content = sprintf( $container_wrap_open, 'addtoany_content_top' ) . ADDTOANY_SHARE_SAVE_KIT($kit_args) . $container_wrap_close . $content;
	}
	if ( $options['position'] == 'bottom' || $options['position'] == 'both') {
		// Append to content.
		$content .= sprintf( $container_wrap_open, 'addtoany_content_bottom' ) . ADDTOANY_SHARE_SAVE_KIT($kit_args) . $container_wrap_close;
	}
	
	return $content;
}


function A2A_SHARE_SAVE_pre_get_posts( $query ) {
	if ( $query->is_main_query() ) {
		// Hook to change the standard buttons' priority number in content.
		// Example: add_filter( 'addtoany_content_priority', 20 );
		$priority = apply_filters( 'addtoany_content_priority', 98 );

		add_filter( 'the_content', 'A2A_SHARE_SAVE_add_to_content', $priority );
		add_filter( 'the_excerpt', 'A2A_SHARE_SAVE_add_to_content', $priority );
	}
}

add_action( 'pre_get_posts', 'A2A_SHARE_SAVE_pre_get_posts' );


// [addtoany url="https://www.example.com/page.html" title="Example Page"]
function A2A_SHARE_SAVE_shortcode( $attributes ) {
	$attributes = shortcode_atts( array(
		'url'     => '',
		'title'   => '',
		'media'   => '',
		'buttons' => '',
	), $attributes, 'addtoany' );
	
	$linkname =  $attributes['title'];
	$linkurl = $attributes['url'];
	$linkmedia = $attributes['media'];
	$buttons = ! empty( $attributes['buttons'] ) ? explode( ',', $attributes['buttons'] ) : array();
	
	$output_later = true;

	return '<div class="addtoany_shortcode">'
		. ADDTOANY_SHARE_SAVE_KIT( compact( 'linkname', 'linkurl', 'linkmedia', 'output_later', 'buttons' ) )
		. '</div>';
}

add_shortcode( 'addtoany', 'A2A_SHARE_SAVE_shortcode' );


function A2A_SHARE_SAVE_stylesheet() {
	// Hook to disable script output.
	// Example: add_filter( 'addtoany_script_disabled', '__return_true' );
	$script_disabled = apply_filters( 'addtoany_script_disabled', false );
	
	if (is_admin() || $script_disabled)
		return;

	global $A2A_SHARE_SAVE_options;
	
	$options = $A2A_SHARE_SAVE_options;
	
	// Prepare inline CSS.
	$inline_css = '';
	$is_amp = function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ? true : false;
	$html_amp = $is_amp ? 'html[amp] ' : '';

	// Load AMP stylesheet first so its declarations are overridable by the main stylesheet.
	if ( $is_amp ) {
		wp_enqueue_style( 'addtoany-amp', plugins_url('/addtoany.amp.css', __FILE__ ), false, '1.0' );
	}

	// Load main stylesheet last so its declarations can override the AMP stylesheet.
	wp_enqueue_style( 'addtoany', plugins_url('/addtoany.min.css', __FILE__ ), false, '1.16' );
	
	$vertical_type = ( isset( $options['floating_vertical'] ) && 'none' != $options['floating_vertical'] ) ? $options['floating_vertical'] : false;
	$horizontal_type = ( isset( $options['floating_horizontal'] ) && 'none' != $options['floating_horizontal'] ) ? $options['floating_horizontal'] : false;
	
	// If vertical bar is enabled
	if ( $vertical_type && 
		// and respsonsiveness is enabled
		( ! isset( $options['floating_vertical_responsive'] ) || '-1' != $options['floating_vertical_responsive'] )
	) {
		// Get min-width for media query.
		$vertical_max_width = ( 
			isset( $options['floating_vertical_responsive_max_width'] ) && 
			is_numeric( $options['floating_vertical_responsive_max_width'] ) 
		) ? $options['floating_vertical_responsive_max_width'] : '980';
		
		// Set media query.
		$inline_css .= '@media screen and (max-width:' . $vertical_max_width . 'px){' . "\n"
			. $html_amp . '.a2a_floating_style.a2a_vertical_style{display:none;}' . "\n"
			. '}';
	}
	
	// If horizontal bar is enabled
	if ( $horizontal_type && 
		// and respsonsiveness is enabled
		( ! isset( $options['floating_horizontal_responsive'] ) || '-1' != $options['floating_horizontal_responsive'] )
	) {
		// Get max-width for media query.
		$horizontal_min_width = ( 
			isset( $options['floating_horizontal_responsive_min_width'] ) && 
			is_numeric( $options['floating_horizontal_responsive_min_width'] ) 
		) ? $options['floating_horizontal_responsive_min_width'] : '981';
		
		// Insert newline if there is inline CSS already.
		$inline_css = 0 < strlen( $inline_css ) ? $inline_css . "\n" : $inline_css;
		
		// Set media query.
		$inline_css .= '@media screen and (min-width:' . $horizontal_min_width . 'px){' . "\n"
			. $html_amp . '.a2a_floating_style.a2a_default_style{display:none;}' . "\n"
			. '}';
	}
	
	// If additional CSS (custom CSS for AddToAny) is set
	if ( ! empty( $options['additional_css'] ) ) {
		$custom_css = stripslashes( $options['additional_css'] );
		
		// Insert newline if there is inline CSS already.
		$inline_css = 0 < strlen( $inline_css ) ? $inline_css . "\n" : $inline_css;
		
		$inline_css .= $custom_css;
	}
	
	// If there is inline CSS
	if ( 0 < strlen( $inline_css ) ) {
		// Strip any HTML tags.
		$inline_css = strip_tags( $inline_css );
		// Insert inline CSS.
		wp_add_inline_style( 'addtoany', $inline_css );
	}
}

add_action( 'wp_enqueue_scripts', 'A2A_SHARE_SAVE_stylesheet', 20 );

function A2A_SHARE_SAVE_enqueue_script() {
	// Hook to disable script output.
	// Example: add_filter( 'addtoany_script_disabled', '__return_true' );
	$script_disabled = apply_filters( 'addtoany_script_disabled', false );

	$is_amp = function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ? true : false;
	
	if ( is_admin() || is_feed() || $script_disabled || $is_amp )
		return;

	$sharing_disabled = false;
	if ( is_singular() ) {
		// Sharing disabled for this singular post?
		$sharing_disabled = get_post_meta( get_the_ID(), 'sharing_disabled', true );
	}
	// Sharing disabled programmatically?
	$sharing_disabled = apply_filters( 'addtoany_sharing_disabled', $sharing_disabled );
		
	$options = get_option( 'addtoany_options', array() );

	// Use local cache?
	$cache = ! empty( $options['cache'] ) && '1' == $options['cache'] ? true : false;
	$upload_dir = wp_upload_dir();
	$cached_file = ! empty( $upload_dir['basedir'] ) && file_exists( $upload_dir['basedir'] . '/addtoany/page.js' ) ? $upload_dir['basedir'] . '/addtoany/page.js' : false;
	$querystring = '';
	// Is page.js actually cached?
	if ( $cache && $cached_file ) {
		// Is page.js recently cached, within 2 days (172800 seconds)?
		$modified_time = filemtime( $cached_file );
		$cache = $modified_time && time() - $modified_time < 172800 ? true : false;
		// If cache is recent
		if ( $cache ) {
			// Set a "ver" parameter's value to the file's modified time for cache management.
			$querystring = '?ver=' . $modified_time;
		} else {
			// Revert the cache option.
			A2A_SHARE_SAVE_revert_cache();
		}
	}
	
	// Set static server.
	$static_server = $cache ? $upload_dir['baseurl'] . '/addtoany' : 'https://static.addtoany.com/menu';
	
	// Icon colors.
	$icon_bg = ! empty( $options['icon_bg'] ) && in_array( $options['icon_bg'], array( 'custom', 'transparent' ) ) ? $options['icon_bg'] : false;
	$icon_bg_color = 'custom' === $icon_bg && ! empty( $options['icon_bg_color'] ) ? $options['icon_bg_color'] : '';
	$icon_bg_color = 'transparent' === $icon_bg ? 'transparent' : $icon_bg_color;
	$icon_fg = ! empty( $options['icon_fg'] ) && 'custom' === $options['icon_fg'] ? true : false;
	$icon_fg_color = $icon_fg && ! empty( $options['icon_fg_color'] ) ? ',' . $options['icon_fg_color'] : '';
	// Use "unset" keyword for background if only the foreground is set.
	$icon_bg_color = empty( $icon_bg_color ) && ! empty( $icon_fg_color ) ? 'unset' : $icon_bg_color;
	$icon_color = $icon_bg_color . $icon_fg_color;

	// Floating vertical relative to content.
	$floating_js_escaped = '';
	if (
		isset( $options['floating_vertical'] )
		&& in_array( $options['floating_vertical'], array( 'left_attached', 'right_attached' ) )
		&& ! empty( $options['floating_vertical_attached_to'] )
		&& empty( $sharing_disabled )
	) {
		// Top position.
		$floating_js_position = ( isset( $options['floating_vertical_position'] ) ) ? $options['floating_vertical_position'] . 'px' : '100px';
		// Left or right offset.
		$floating_js_offset = ( isset( $options['floating_vertical_offset'] ) ) ? $options['floating_vertical_offset'] . 'px' : '0px';
		
		// Style attribute (accepts "left" attached only).
		$floating_js_kit_style = 'left_attached' === $options['floating_vertical'] ? 'margin-left:' . $floating_js_offset . ';' : '';
		$floating_js_kit_style .= 'top:' . $floating_js_position . ';';

		$floating_js_escaped = "\n"
			. 'a2a_config.callbacks.push({'
				. 'ready: function(){'
					. 'var d=document;'
					. 'function a(){'
						. 'var c,e=d.createElement("div");'
						. 'e.innerHTML=' . wp_json_encode( ADDTOANY_SHARE_SAVE_FLOATING( array( 
							'output_later' => true,
							'basic_html' => true,
							'kit_style' => $floating_js_kit_style,
							'vertical_type' => true,
						) ) ) . ';'
						. 'c=d.querySelector(' . wp_json_encode( stripslashes( $options['floating_vertical_attached_to'] ) ) . ');'
						. 'if(c)c.appendChild(e.firstChild);'
						. 'a2a.init("page");'
					. '}'
					. 'if("loading"!==d.readyState)a();else d.addEventListener("DOMContentLoaded",a,false);'
				. '}'
			. '});';
	}
	$has_threads_service = isset( $options['active_services'] ) && in_array( 'threads', $options['active_services'] );
	/** JS that removes empty services until Firefox supports :has() in CSS. */
	$empty_services_js_static = $has_threads_service ? "\n"
		. 'a2a_config.callbacks.push({ready:function(){'
			. 'document.querySelectorAll(".a2a_s_undefined").forEach(function(emptyIcon){'
				. 'emptyIcon.parentElement.style.display="none";'
			. '})'
		. '}});' : '';
	
	// Enternal script call + initial JS + set-once variables.
	$additional_js = ( isset( $options['additional_js_variables'] ) ) ? $options['additional_js_variables'] : '';
	$script_configs_escaped = ( ( $cache ) ? "\n" . 'a2a_config.static_server=' . wp_json_encode( esc_url( $static_server ), JSON_UNESCAPED_SLASHES ) . ';' : '' )
		. ( $icon_color ? "\n" . 'a2a_config.icon_color="' . $icon_color . '";' : '' )
		. ( $additional_js ? "\n" . stripslashes( $additional_js ) : '' );
	
	$inline_javascript = "\n"
		. 'window.a2a_config=window.a2a_config||{};'
		. 'a2a_config.callbacks=[];a2a_config.overlays=[];'
		. 'a2a_config.templates={};'
		. addtoany_menu_locale_escaped()
		. $floating_js_escaped
		. $empty_services_js_static
		. $script_configs_escaped
		. "\n";
	
	// Name the handle `addtoany-core` instead of `addtoany` which was previously only used for the local addtoany.min.js file.
	$script_handle = 'addtoany-core';
	$script_src = $static_server . '/page.js' . $querystring;

	// Require an empty `addtoany-core` script to be enqueued because wp_add_inline_script() below requires a queued script.
	wp_register_script( $script_handle, $script_src, array(), null );
	wp_enqueue_script( $script_handle );
	
	// Add inline JavaScript. Arbitrary JavaScript is expected from users with the `unfiltered_html` capability.
	wp_add_inline_script( $script_handle, $inline_javascript, 'before' );
	
	// Load script that depends on jQuery only if jQuery is registered.
	if ( wp_script_is( 'jquery', 'registered' ) ) {
		wp_enqueue_script( 'addtoany-jquery', plugins_url('/addtoany.min.js', __FILE__ ), array( 'jquery' ), '1.1' );
	}

	// Adjust script tag attributes.
	add_filter( 'script_loader_tag', function ( $tag, $handle, $src ) {
		$script_handles = array( 'addtoany-core', 'addtoany-jquery' );
		if ( in_array( $handle, $script_handles ) ) {
			// Add defer attribute to the script tags with the src attribute.
			$tag = preg_replace( '/ src=/', ' defer src=', $tag, 1 );
		}
		return $tag;
	}, 10, 3 );
}

add_action( 'wp_enqueue_scripts', 'A2A_SHARE_SAVE_enqueue_script' );

/**
 * AddToAny caching.
 */

function A2A_SHARE_SAVE_refresh_cache() {
	$contents = wp_remote_fopen( 'https://www.addtoany.com/ext/updater/files_list/' );
	$file_urls = explode( "\n", $contents, 20 );
	$upload_dir = wp_upload_dir();
	
	// Try to create directory if it doesn't already exist.
	if ( ! wp_mkdir_p( dirname( $upload_dir['basedir'] . '/addtoany/foo' ) ) ) {
		// Handle directory creation issue.
		// Revert cache option.
		A2A_SHARE_SAVE_revert_cache();
	}
	
	if ( count( $file_urls ) > 0 ) {
		for ( $i = 0; $i < count( $file_urls ); $i++ ) {
			// Download files.
			$file_url = trim( $file_urls[ $i ] );
			$file_name = substr( strrchr( $file_url, '/' ), 1, 99 );
			
			// Place files in uploads/addtoany directory.
			$response = wp_remote_get( $file_url, array(
				'filename' => $upload_dir['basedir'] . '/addtoany/' . $file_name,
				'stream'   => true, // Required to use `filename` arg.
			) );

			// Handle error.
			if ( is_wp_error( $response ) ) {
				// Revert cache option.
				A2A_SHARE_SAVE_revert_cache();
			}
		}
	}
}

add_action( 'addtoany_refresh_cache', 'A2A_SHARE_SAVE_refresh_cache' );

function A2A_SHARE_SAVE_schedule_cache() {
	// Unschedule if already scheduled.
	A2A_SHARE_SAVE_unschedule_cache();

	// Try to schedule daily cache refreshes, running once now.
	$result = wp_schedule_event( time(), 'daily', 'addtoany_refresh_cache' );

	// Revert cache option if the event didn't get scheduled.
	if ( false === $result ) {
		A2A_SHARE_SAVE_revert_cache();
	}
}

function A2A_SHARE_SAVE_unschedule_cache() {
	// Unschedule if scheduled.
	wp_clear_scheduled_hook( 'addtoany_refresh_cache' );
}

function A2A_SHARE_SAVE_revert_cache() {
	// Unschedule.
	A2A_SHARE_SAVE_unschedule_cache();

	// Get all existing AddToAny options.
	$options = get_option( 'addtoany_options', array() );

	// Revert cache option.
	$options['cache'] = '-1';	
	update_option( 'addtoany_options', $options );
}

/**
 * Activation hook.
 */

function addtoany_activation() {
	// Get all existing AddToAny options
	$options = get_option( 'addtoany_options', array() );
	
	// If the local cache option is enabled
	if ( isset( $options['cache'] ) && $options['cache'] == '1' ) {
		// Schedule and run the local cache refresh
		A2A_SHARE_SAVE_schedule_cache();
	}
}

register_activation_hook( __FILE__, 'addtoany_activation' );

/**
 * Deactivation hook.
 */

function addtoany_deactivation() {
	// Unschedule if scheduled
	A2A_SHARE_SAVE_unschedule_cache();
}

register_deactivation_hook( __FILE__, 'addtoany_deactivation' );

/**
 * Admin Options.
 */

if ( is_admin() ) {
	include_once $A2A_SHARE_SAVE_plugin_dir . '/addtoany.admin.php';
}

function A2A_SHARE_SAVE_add_menu_link() {
	$page = add_options_page(
		__( 'AddToAny Share Settings', 'add-to-any' ),
		__( 'AddToAny', 'add-to-any' ),
		'manage_options',
		'addtoany',
		'A2A_SHARE_SAVE_options_page'
	);
}

add_filter( 'admin_menu', 'A2A_SHARE_SAVE_add_menu_link' );

function A2A_SHARE_SAVE_widgets_init() {
	global $A2A_SHARE_SAVE_plugin_dir;
	
	include_once $A2A_SHARE_SAVE_plugin_dir . '/addtoany.widgets.php';
	register_widget( 'A2A_SHARE_SAVE_Widget' );
	register_widget( 'A2A_Follow_Widget' );
}

add_action( 'widgets_init', 'A2A_SHARE_SAVE_widgets_init' );

// Place in Option List on Settings > Plugins page.
function A2A_SHARE_SAVE_actlinks( $links, $file ) {
	// Static so we don't call plugin_basename on every plugin row.
	static $this_plugin;
	
	if ( ! $this_plugin ) {
		$this_plugin = plugin_basename( __FILE__ );
	}
	
	if ( $file == $this_plugin ) {
		$settings_link = '<a href="options-general.php?page=addtoany">' . __( 'Settings', 'add-to-any' ) . '</a>';
		array_unshift( $links, $settings_link ); // Before other links.
	}
	
	return $links;
}

add_filter( 'plugin_action_links', 'A2A_SHARE_SAVE_actlinks', 10, 2 );
