Example #1
0
 /**
  * Toolbox for Menu Pages.
  *
  * @package s2Member\Menu_Pages
  * @since 131108
  *
  * @return null
  */
 public static function display()
 {
     do_action("ws_plugin__optimizemember_during_menu_pages_before_toolbox_sections", get_defined_vars());
     ob_start();
     // output buffer these so we can display a toggler conditionally.
     if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["menu_pages"]["updates"]) {
         echo '<a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Newsletter")) . '" target="_blank"><i class="fa fa-envelope"></i> s2 Updates (via Email)</a>';
     }
     if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["menu_pages"]["upsell-pro"]) {
         echo '<a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" style="font-size:120%; font-weight:bold;"><i class="fa fa-money"></i> s2MemberĀ® Pro (Upgrade)</a>' . "\n";
     }
     if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["menu_pages"]["installation"]) {
         echo '<a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Professional Installation URI")) . '" target="_blank"><i class="fa fa-wrench"></i> Professional Installation Service</a>' . "\n";
     }
     if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["menu_pages"]["kb"]) {
         echo '<a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Knowledge Base")) . '" target="_blank"><i class="fa fa-lightbulb-o"></i> Knowledge Base</a>' . "\n";
     }
     if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["menu_pages"]["videos"]) {
         echo '<a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Video Tutorials")) . '" target="_blank"><i class="fa fa-film"></i> Video Tutorials</a>' . "\n";
     }
     if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["menu_pages"]["support"]) {
         echo '<a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Forum URI")) . '" target="_blank"><i class="fa fa-comments-o"></i> Community</a>' . "\n";
     }
     if ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["menu_pages"]["donations"]) {
         echo '<a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Donate link")) . '" target="_blank"><i class="fa fa-heart-o"></i> Contribute</a>' . "\n";
     }
     if ($links = ob_get_clean()) {
         $links = '<div class="links">' . $links . '</div>';
         echo $links;
         // output content now; w/ possible toggler.
     }
     do_action("ws_plugin__optimizemember_during_menu_pages_after_toolbox_sections", get_defined_vars());
     return;
 }
 /**
  * optimizeMember's PayPal Auto-Return/PDT handler ( inner processing routine ).
  *
  * @package optimizeMember\PayPal
  * @since 110720
  *
  * @param array $vars Required. An array of defined variables passed by {@link optimizeMember\PayPal\c_ws_plugin__optimizemember_paypal_return_in::paypal_return()}.
  * @return array|bool The original ``$paypal`` array passed in ( extracted ) from ``$vars``, or false when conditions do NOT apply.
  */
 public static function cp($vars = array())
 {
     extract($vars);
     /* Extract all vars passed in from: ``c_ws_plugin__optimizemember_paypal_notify_in::paypal_notify()``. */
     /**/
     eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
     do_action("ws_plugin__optimizemember_during_paypal_return_before_explicit_x_preview", get_defined_vars());
     unset($__refs, $__v);
     /* Unset defined __refs, __v. */
     /**/
     $paypal["optimizemember_log"][] = "Test preview of Return Page `proxy_use`: ( `x_preview` ).";
     /**/
     eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
     do_action("ws_plugin__optimizemember_during_paypal_return_during_explicit_x_preview", get_defined_vars());
     unset($__refs, $__v);
     /* Unset defined __refs, __v. */
     /**/
     if ($custom_success_redirection) {
         /* Using a custom success redirection URL? */
         $paypal["optimizemember_log"][] = "Redirecting Customer to a custom URL on success: " . $custom_success_redirection . ". Test preview of Return Page `proxy_use`: ( `x_preview` ).";
     } else {
         /* Else we use the default redirection URL for this scenario, which is the Home Page. */
         $paypal["optimizemember_log"][] = "Redirecting Customer to the Home Page. Test preview of Return Page `proxy_use`: ( `x_preview` ).";
     }
     /**/
     echo c_ws_plugin__optimizemember_return_templates::return_template($paypal["subscr_gateway"], sprintf(_x('<strong>Thank you! ( this is a preview, no action necessary ).</strong><br /><br />* Note: each of your Customers are returned back to your site immediately after they complete checkout. This Return Page displays a message and instructions for the Customer. optimizeMember may change the message and instructions dynamically, based on what the Customer is actually doing <em>( i.e. based on the type of transaction that is taking place )</em>.<br /><br /><em>* With <a href="%s" target="_blank">optimizeMember Pro</a> installed, it is possible to customize this Return Page in various ways.</em>', "s2member-front", "s2member"), esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices"))), _x("Continue ( Click Here )", "s2member-front", "s2member"), $custom_success_redirection ? $custom_success_redirection : home_url("/"));
     /**/
     eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
     do_action("ws_plugin__optimizemember_during_paypal_return_after_explicit_x_preview", get_defined_vars());
     unset($__refs, $__v);
     /* Unset defined __refs, __v. */
     /**/
     return apply_filters("c_ws_plugin__optimizemember_paypal_return_in_proxy_x_preview", $paypal, get_defined_vars());
 }
Example #3
0
 public function __construct()
 {
     if (is_object($user = wp_get_current_user()) && ($user_id = $user->ID)) {
         echo '<form id="ws-updates-form" action="http://websharks-inc.us1.list-manage1.com/subscribe/post?u=8f347da54d66b5298d13237d9&amp;id=19e9d213bc" method="post" target="_blank">' . "\n";
         /**/
         if (!is_ssl() && !c_ws_plugin__optimizemember_utils_conds::is_localhost()) {
             echo '<div class="ws-menu-page-r-group-header">' . "\n";
             echo '<ins class="open">-</ins>Latest News<em>!</em>' . "\n";
             echo '</div>' . "\n";
             /**/
             echo '<div class="ws-menu-page-r-group" style="display:block;">' . "\n";
             echo '<script type="text/javascript" src="http://feeds.feedburner.com/s2member-updates?format=sigpro&amp;nItems=3&amp;openLinks=new&amp;displayTitle=false&amp;displayFeedIcon=false&amp;displayExcerpts=false&amp;displayAuthor=false&amp;displayDate=false&amp;displayEnclosures=false&amp;displayLinkToFeed=false"></script>' . "\n";
             echo '</div>' . "\n";
         }
         /**/
         echo '<div class="ws-menu-page-r-group-header">' . "\n";
         echo '<ins>+</ins>Email Updates<em>!</em>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '<div class="ws-menu-page-r-group">' . "\n";
         /**/
         echo '<div id="ws-updates-div-fname">' . "\n";
         echo '<label for="ws-updates-fname">First Name: *</label><br />' . "\n";
         echo '<input type="text" aria-required="true" autocomplete="off" name="FNAME" id="ws-updates-fname" value="' . esc_attr($user->first_name) . '" />' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '<div id="ws-updates-div-lname">' . "\n";
         echo '<label for="ws-updates-lname">Last Name: *</label><br />' . "\n";
         echo '<input type="text" aria-required="true" autocomplete="off" name="LNAME" id="ws-updates-lname" value="' . esc_attr($user->last_name) . '" />' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '<div id="ws-updates-div-email">' . "\n";
         echo '<label for="ws-updates-email">Email Address: *</label><br />' . "\n";
         echo '<input type="text" aria-required="true" autocomplete="off" name="EMAIL" id="ws-updates-email" value="' . format_to_edit($user->user_email) . '" />' . "\n";
         echo '</div>' . "\n";
         /**/
         if (!is_ssl() && !c_ws_plugin__optimizemember_utils_conds::is_localhost()) {
             echo '<div id="ws-updates-div-subs">' . "\n";
             echo '<script type="text/javascript" src="http://websharks-inc.us1.list-manage.com/subscriber-count?b=31&u=8c67d547-edf6-41c5-807d-2d2d0e6cffd1&id=19e9d213bc"></script>' . "\n";
             echo '</div>' . "\n";
         }
         /**/
         echo '<div id="ws-updates-div-priv">' . "\n";
         echo '( <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Privacy URI")) . '" target="_blank">we DO respect your privacy</a> )' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '<div id="ws-updates-div-submit">' . "\n";
         echo '<input type="submit" value="Subscribe" name="subscribe" />' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         echo '</form>' . "\n";
     }
 }
Example #4
0
 public function __construct()
 {
     echo '<div class="wrap ws-menu-page">' . "\n";
     /**/
     echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
     echo '<h2>OptimizeMember Information</h2>' . "\n";
     /**/
     echo '<table class="ws-menu-page-table">' . "\n";
     echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
     echo '<tr class="ws-menu-page-table-tr">' . "\n";
     echo '<td class="ws-menu-page-table-l">' . "\n";
     /**/
     echo '<img src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/brand-icon.png" class="ws-menu-page-brand-icon" alt="." />' . "\n";
     /**/
     echo '<a href="' . esc_attr(add_query_arg("c_check_ver", urlencode(c_ws_plugin__optimizemember_readmes::parse_readme_value("Version")), c_ws_plugin__optimizemember_readmes::parse_readme_value("Plugin URI"))) . '" target="_blank"><img src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/brand-updates.png" class="ws-menu-page-brand-updates" alt="." /></a>' . "\n";
     /**/
     do_action("ws_plugin__optimizemember_during_info_page_before_left_sections", get_defined_vars());
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_info_page_during_left_sections_display_readme", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_info_page_during_left_sections_before_readme", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-readme">' . "\n";
         do_action("ws_plugin__optimizemember_during_info_page_during_left_sections_during_readme", get_defined_vars());
         echo c_ws_plugin__optimizemember_readmes::parse_readme() . "\n";
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_info_page_during_left_sections_after_readme", get_defined_vars());
     }
     /**/
     do_action("ws_plugin__optimizemember_during_info_page_after_left_sections", get_defined_vars());
     /**/
     echo '</td>' . "\n";
     /**/
     echo '<td class="ws-menu-page-table-r">' . "\n";
     c_ws_plugin__optimizemember_menu_pages_rs::display();
     echo '</td>' . "\n";
     /**/
     echo '</tr>' . "\n";
     echo '</tbody>' . "\n";
     echo '</table>' . "\n";
     /**/
     echo '</div>' . "\n";
 }
Example #5
0
 public function __construct()
 {
     echo '<div class="wrap ws-menu-page op-bsw-wizard op-bsw-content">' . "\n";
     /**/
     echo '<div class="op-bsw-header">';
     echo '<div class="op-logo"><img src="' . $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images/" . 'logo-optimizepress.png" alt="OptimizePress" height="50" class="animated flipInY"></div>';
     echo '</div>';
     echo '<div class="op-bsw-main-content">';
     echo '<h2>NEW General Options</h2>' . "\n";
     echo '<p>' . _('Use these options to customize styling and functionality of your pages. Ensure you also create and assign menus to your blog Menus within the <a href="nav-menus.php">Wordpress Menus admin panel</a> if you want to use navigation menus on your pages.') . '</p>';
     /**/
     echo '<table class="ws-menu-page-table">' . "\n";
     echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
     echo '<tr class="ws-menu-page-table-tr">' . "\n";
     echo '<td class="ws-menu-page-table-l">' . "\n";
     /**/
     echo '<form method="post" name="ws_plugin__optimizemember_new_options_form" id="ws-plugin--optimizemember-new-options-form">' . "\n";
     echo '<input type="hidden" name="ws_plugin__optimizemember_options_save" id="ws-plugin--optimizemember-options-save" value="' . esc_attr(wp_create_nonce("ws-plugin--optimizemember-options-save")) . '" />' . "\n";
     echo '<input type="hidden" name="ws_plugin__optimizemember_configured" id="ws-plugin--optimizemember-configured" value="1" />' . "\n";
     echo '<input type="hidden" name="action" value="optimizemember-new-options" />' . "\n";
     /**/
     do_action("ws_plugin__optimizemember_during_gen_ops_page_before_left_sections", get_defined_vars());
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_gen_ops_page_during_left_sections_display_membership_levels", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_gen_ops_page_during_left_sections_before_membership_levels", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Define Membership Levels And Packages">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-membership-levels-section">' . "\n";
         echo '<h3>Membership Levels and Packages ( required, please customize these )</h3>' . "\n";
         echo '<p>The default Membership Levels are labeled generically; feel free to modify them as needed. optimizeMember supports Free Subscribers <em>( at Level #0 )</em>, along with several Primary Roles for paid Membership <em>( i.e. Levels 1-4 )</em>, created by the optimizeMember plugin.' . (!is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site() ? ' optimizeMember also supports unlimited Custom Capability Packages <em>( see <code>optimizeMember -> API Scripting -> Custom Capabilities</code> )</em>' : '') . '. That being said, you don\'t have to use all of the Membership Levels if you don\'t want to. To use only 1 or 2 of these Levels, just design your Membership Options Page, so it only includes Payment Buttons for the Levels being used.</p>' . "\n";
         echo !is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site() ? '<p><em><strong>TIP:</strong> <strong>Unlimited Membership Levels</strong> are only possible with <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro</a>. However, Custom Capabilities are possible in all versions of optimizeMember, including the free version. Custom Capabilities are a great way to extend optimizeMember in creative ways. If you\'re an advanced site owner, a theme designer, or a web developer integrating optimizeMember for a client, please check your Dashboard, under: <code>optimizeMember -> API Scripting -> Custom Capabilities</code>. </em></p>' . "\n" : '';
         do_action("ws_plugin__optimizemember_during_gen_ops_page_during_left_sections_during_membership_levels", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         /**/
         for ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
             $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-level' . $n . '-label">' . "\n";
             echo $n === 0 ? 'Level #' . $n . ' <em>( Free Subscribers )</em>:' . "\n" : 'Level #' . $n . ' Members:' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<input type="text" autocomplete="off" name="ws_plugin__optimizemember_level' . $n . '_label" id="ws-plugin--optimizemember-level' . $n . '-label" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_label"]) . '" /><br />' . "\n";
             echo 'This is the Label for Level #' . $n . ($n === 0 ? ' ( Free Subscribers )' : ' Members') . '.<br />' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
         }
         /**/
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-membership-levels-section">' . "\n";
         echo '<h3>Packages</h3>' . "\n";
         echo '<p>Packages are a great way to protect individual products or content.  You can protect any content to a particular package by using the admin options on the page and this will ensure only users with that package added to their account will be given access</p>' . "\n";
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th style="padding-top:0;">' . "\n";
         echo '<label for="ws-plugin--optimizemember-ccp">' . "\n";
         echo 'Add new package:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<input type="hidden" name="ws_plugin__optimizemember_ccp[]" value="update-signal" />' . "\n";
         echo '<td>' . "\n";
         echo '<input type="text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \\-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" name="ws_plugin__optimizemember_ccp[]" id="ws-plugin--optimizemember-ccp" value="" />';
         if (count($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"]) > 0) {
             echo '<h3>Available packages</h3>' . "\n";
             foreach ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"] as $key => $val) {
                 if (!empty($val)) {
                     echo '<input type="hidden" name="ws_plugin__optimizemember_ccp[]" value="' . $val . '" />' . "\n";
                     echo $val . '<br />' . "\n";
                 }
             }
         }
         //echo 'This affects your administrative Dashboard only <em>( i.e. your list of Users )</em>.<br />optimizeMember can force WordPress to use your Labels instead of referencing Roles by `optimizeMember Level #`. If this is your first installation of optimizeMember, we suggest leaving this set to <code>no</code> until you\'ve had a chance to get acclimated with optimizeMember\'s functionality. In fact, many site owners choose to leave this off, because they find it less confusing when Roles are referred to by their optimizeMember Level #.' . "\n";
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '<table class="form-table" style="margin-top:0;display:none;">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th style="padding-top:0;">' . "\n";
         echo '<label for="ws-plugin--optimizemember-apply-label-translations">' . "\n";
         echo 'Force WordPress to use your Labels?' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<input type="radio" name="ws_plugin__optimizemember_apply_label_translations" id="ws-plugin--optimizemember-apply-label-translations-" value="1" checked="checked" />';
         //echo '<input type="radio" name="ws_plugin__optimizemember_apply_label_translations" id="ws-plugin--optimizemember-apply-label-translations-0" value="0"' . ((!$GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["apply_label_translations"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--optimizemember-apply-label-translations-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__optimizemember_apply_label_translations" id="ws-plugin--optimizemember-apply-label-translations-1" value="1"' . (($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["apply_label_translations"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--optimizemember-apply-label-translations-1">Yes, force WordPress to use my Labels.</label><br />' . "\n";
         echo 'This affects your administrative Dashboard only <em>( i.e. your list of Users )</em>.<br />optimizeMember can force WordPress to use your Labels instead of referencing Roles by `optimizeMember Level #`. If this is your first installation of optimizeMember, we suggest leaving this set to <code>no</code> until you\'ve had a chance to get acclimated with optimizeMember\'s functionality. In fact, many site owners choose to leave this off, because they find it less confusing when Roles are referred to by their optimizeMember Level #.' . "\n";
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-filter-wp-query">' . "\n";
         echo 'Hide links?' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         //echo '<div class="ws-menu-page-scrollbox" style="height:105px;">' . "\n";
         echo '<input type="hidden" name="ws_plugin__optimizemember_filter_wp_query[]" value="update-signal" />' . "\n";
         foreach (array("all" => "<strong>Hide links to protected content for non-members</strong>") as $ws_plugin__optimizemember_temp_s_value => $ws_plugin__optimizemember_temp_s_label) {
             echo '<input type="checkbox" name="ws_plugin__optimizemember_filter_wp_query[]" id="ws-plugin--optimizemember-filter-wp-query-' . esc_attr(preg_replace("/[^a-z0-9_\\-]/", "-", $ws_plugin__optimizemember_temp_s_value)) . '" value="' . esc_attr($ws_plugin__optimizemember_temp_s_value) . '"' . (in_array($ws_plugin__optimizemember_temp_s_value, $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["filter_wp_query"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--optimizemember-filter-wp-query-' . esc_attr(preg_replace("/[^a-z0-9_\\-]/", "-", $ws_plugin__optimizemember_temp_s_value)) . '">' . $ws_plugin__optimizemember_temp_s_label . '</label><br />' . "\n";
             break;
         }
         echo 'This option will hide links to any protected content for members who do not have access to that content<br />' . "\n";
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         /**/
         echo '<input type="button" value="Reset Roles/Capabilities" class="ws-menu-page-right ws-plugin--optimizemember-reset-roles-button button" style="min-width:175px;" />' . "\n";
         echo '<p>The button to the right, is a nifty tool, which allows you to reset optimizeMember\'s internal Roles and Capabilities that integrate with WordPress. If you, or a developer working with you, has made attempts to alter the default <em>internal</em> Role/Capability sets that come with optimizeMember, and you need to reset them back to the way optimizeMember expects them to be, please use this tool. <em>Attn Developers: it is also possible lock-in your modified Roles/Capabilities with an optimizeMember Filter. </em></p>' . "\n";
         /**/
         echo '<p class="submit"><input id="opmNewSave" type="submit" class="op-pb-button green" value="Save Changes" /></p>' . "\n";
         echo '<p id="msg"><p>';
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_gen_ops_page_during_left_sections_after_membership_levels", get_defined_vars());
     }
     if (apply_filters("ws_plugin__optimizemember_during_gen_ops_page_during_left_sections_display_list_server_integration", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_gen_ops_page_during_left_sections_before_list_server_integration", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Define Mailing List/Autoresponder Configurations">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-list-server-integration-section">' . "\n";
         echo '<h3>Mailing List/Autoresponder Configurations</h3>' . "\n";
         echo '<p>To enable and configure email marketing service go to <a href="' . admin_url() . 'admin.php?page=optimizepress#email_marketing_services">OP theme/plugin Dashboard settings</a></p>' . "\n";
         do_action("ws_plugin__optimizemember_during_gen_ops_page_during_left_sections_during_list_server_integration", get_defined_vars());
         /**/
         $providers = op_assets_provider_list();
         $providersDetails = array();
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         /**/
         for ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
             $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
             $provider = format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_provider"]);
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<h4>' . ($n === 0 ? 'Level #' . $n . ' <em>(Free Subscribers)</em>' . "\n" : 'Level #' . $n . ' Members') . '</h4>' . "\n";
             echo '</th>' . "\n";
             echo '</tr>' . "\n";
             /**/
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws_plugin__optimizemember_level' . $n . '_provider" id="ws_plugin__optimizemember_level' . $n . '_provider_label">' . "\n";
             echo 'List Provider:' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             echo '<th>' . "\n";
             echo '<label for="ws_plugin__optimizemember_level' . $n . '_list" id="ws_plugin__optimizemember_level' . $n . '_list_label">' . "\n";
             if ($provider === 'infusionsoft') {
                 echo 'Follow up sequence:' . "\n";
             } else {
                 echo 'List:' . "\n";
             }
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<select data-level="' . $n . '" name="ws_plugin__optimizemember_level' . $n . '_provider" id="ws_plugin__optimizemember_level' . $n . '_provider" class="ws_plugin__optimizemember_level_provider">' . "\n";
             echo '<option value="0">Select provider</option>' . "\n";
             if (count($providers) > 0) {
                 foreach ($providers as $providerId => $providerName) {
                     /*
                      * Subscribing is happening on their URL and can't be done in background
                      */
                     if ($providerId === 'oneshoppingcart') {
                         continue;
                     }
                     echo '<option value="' . $providerId . '"' . selected($providerId, $provider, false) . '>' . $providerName . '</option>' . "\n";
                 }
             }
             echo '</select><br />' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<select data-level="' . $n . '" name="ws_plugin__optimizemember_level' . $n . '_list" id="ws_plugin__optimizemember_level' . $n . '_list" class="ws_plugin__optimizemember_level_list">' . "\n";
             $provider = format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_provider"]);
             if (!empty($provider)) {
                 $list = format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_list"]);
                 if (isset($providersDetails[$provider])) {
                     $details = $providersDetails[$provider];
                 } else {
                     $details = op_assets_provider_items($provider, true);
                     if (count($details) > 0) {
                         $details = $details['lists'];
                         $providersDetails[$provider] = $details;
                     }
                 }
                 foreach ($details as $listId => $item) {
                     echo '<option value="' . $listId . '"' . selected($list, $listId, false) . '>' . $item['name'] . '</option>' . "\n";
                 }
             } else {
                 echo '<option value="0">Select provider first</option>' . "\n";
             }
             echo '</select><br />' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
         }
         /**/
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         /**/
         echo '<p class="submit"><input id="opmNewSave" type="submit" class="op-pb-button green" value="Save Changes" /></p>' . "\n";
         echo '<p class="save_info"><p>';
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_gen_ops_page_during_left_sections_after_list_server_integration", get_defined_vars());
     }
     /**/
     /**/
     do_action("ws_plugin__optimizemember_during_gen_ops_page_after_left_sections", get_defined_vars());
     /**/
     //echo '<div class="ws-menu-page-hr"></div>' . "\n";
     /**/
     //echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>' . "\n";
     /**/
     echo '</form>' . "\n";
     /**/
     echo '</td>' . "\n";
     /**/
     echo '<td class="ws-menu-page-table-r">' . "\n";
     c_ws_plugin__optimizemember_menu_pages_rs::display();
     echo '</td>' . "\n";
     /**/
     echo '</tr>' . "\n";
     echo '</tbody>' . "\n";
     echo '</table>' . "\n";
     /**/
     echo '</div>' . "\n";
     echo '</div>' . "\n";
 }
Example #6
0
 public function __construct()
 {
     echo '<div class="wrap ws-menu-page op-bsw-wizard op-bsw-content">' . "\n";
     /**/
     echo '<div class="op-bsw-header">';
     echo '<div class="op-logo"><img src="' . $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images/" . 'logo-optimizepress.png" alt="OptimizePress" height="50" class="animated flipInY"></div>';
     echo '</div>';
     echo '<div class="op-bsw-main-content">';
     echo '<h2>Restriction Options</h2>' . "\n";
     /**/
     echo '<table class="ws-menu-page-table">' . "\n";
     echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
     echo '<tr class="ws-menu-page-table-tr">' . "\n";
     echo '<td class="ws-menu-page-table-l">' . "\n";
     /**/
     echo '<form method="post" name="ws_plugin__optimizemember_options_form" id="ws-plugin--optimizemember-options-form">' . "\n";
     echo '<input type="hidden" name="ws_plugin__optimizemember_options_save" id="ws-plugin--optimizemember-options-save" value="' . esc_attr(wp_create_nonce("ws-plugin--optimizemember-options-save")) . '" />' . "\n";
     echo '<input type="hidden" name="ws_plugin__optimizemember_configured" id="ws-plugin--optimizemember-configured" value="1" />' . "\n";
     /**/
     do_action("ws_plugin__optimizemember_during_res_ops_page_before_left_sections", get_defined_vars());
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_post_level_access", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_post_level_access", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Post Access Restrictions">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-post-level-access-section">' . "\n";
         echo '<h3>Post Level Access Restrictions ( optional )</h3>' . "\n";
         echo '<p>Here you can specify Posts that are restricted to certain Membership Access Levels. optimizeMember also supports Custom <a href="http://codex.wordpress.org/Post_Types" target="_blank" rel="external">Post Types</a> here. If you have a theme or plugin installed, which has enabled Custom Post Types <em>( i.e. Music/Videos or something else )</em>, you can put the IDs for those Posts here.</p>' . "\n";
         echo '<p><em><strong>*Note*</strong> Protecting individual Posts, ONLY protects the Permalinks for those Posts. It is still possible for excerpts of protected content to be seen in search results generated by WordPress, feeds, and Archive views; such as your Home Page, inside a Category listing, or through other queries formulated by your theme. This is the intended functionality. Excerpts are a great way to "tease" public visitors. In other words, public visitors may have access to excerpts introduced by your theme, but any attempt to view the full Post ( i.e. the Permalink ) will result in an automatic redirect to your Membership Options Page; requiring registration.</em></p>' . "\n";
         echo '<p><em><strong>*Note*</strong> If you would like to protect many Posts at once ( including Archive views ), you can use Category Level Restrictions, Tag Level Restrictions, or have a look down below at optimizeMember\'s options for "Alternative View Protection", which deals with search results, as well as feeds.</em></p>' . "\n";
         //echo ((!is_multisite () || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm () || is_main_site ()) && empty($GLOBALS["WS_PLUGIN__"]["wp_show_ids"])) ? '<p><em><strong>*Tip*</strong> Can\'t find your Post IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_post_level_access", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         /**/
         for ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
             $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-level' . $n . '-posts">' . "\n";
             echo $n === $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"] ? 'Posts That Require Highest Level' . $labelText . ':' . "\n" : 'Posts That Require Level ' . $labelText . ' Or Higher:' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<input type="text" autocomplete="off" name="ws_plugin__optimizemember_level' . $n . '_posts" id="ws-plugin--optimizemember-level' . $n . '-posts" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_posts"]) . '" /><br />' . "\n";
             echo 'Post IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code> ā€” or you can type: <code>all</code>.<br />' . "\n";
             echo 'You can also include all Post IDs of a specific <a href="http://codex.wordpress.org/Post_Types" target="_blank" rel="external">Post Type</a>. Ex: <code>1,2,3,34,all-newspapers</code>.<br />' . "\n";
             echo '<em>( which protects several Post IDs, and <code>all</code> Posts of type: <code>newspaper</code> )</em>' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
         }
         /**/
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_post_level_access", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_page_level_access", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_page_level_access", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Page Access Restrictions">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-page-level-access-section">' . "\n";
         echo '<h3>Page Level Access Restrictions ( optional )</h3>' . "\n";
         echo '<p>Here you can specify Pages that are restricted to certain Membership Access Levels.</p>' . "\n";
         //echo ((!is_multisite () || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_page_level_access", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         /**/
         for ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
             $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-level' . $n . '-pages">' . "\n";
             echo $n === $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"] ? 'Pages That Require Highest Level ' . $labelText . ':' . "\n" : 'Pages That Require Level ' . $labelText . ' Or Higher:' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<input type="text" autocomplete="off" name="ws_plugin__optimizemember_level' . $n . '_pages" id="ws-plugin--optimizemember-level' . $n . '-pages" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_pages"]) . '" /><br />' . "\n";
             echo 'Page IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code> ā€” or you can type: <code>all</code>.' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
         }
         /**/
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_page_level_access", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_tag_level_access", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_tag_level_access", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Tag Access Restrictions">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-tag-level-access-section">' . "\n";
         echo '<h3>Tag Level Access Restrictions ( optional )</h3>' . "\n";
         echo '<p>Here you can specify Tags that are restricted to certain Membership Access Levels. This is very similar to Category Level Access. When you restrict access to a Tag Archive, it also restricts access to any Post having that Tag; even if a Post has other Tags. <em>*Tip*</em> ... Tags can be applied to any Post, without affecting your Category structure at all. If you\'d like to use Tags with Pages, get <a href="http://wordpress.org/extend/plugins/page-tagger/" target="_blank" rel="external">Page Tagger</a>.</p>' . "\n";
         echo '<p>Tags are caSe sensitive. The Tag <code>members only</code> is NOT the same as <code>Members Only</code>.</p>' . "\n";
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_tag_level_access", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         /**/
         for ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
             $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-level' . $n . '-ptags">' . "\n";
             echo $n === $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"] ? 'Tags That Require Highest Level ' . $labelText . ':' . "\n" : 'Tags That Require Level ' . $labelText . ' Or Higher:' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<input type="text" autocomplete="off" name="ws_plugin__optimizemember_level' . $n . '_ptags" id="ws-plugin--optimizemember-level' . $n . '-ptags" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_ptags"]) . '" /><br />' . "\n";
             echo 'Tags in comma-delimited format. Example: ' . ($n === 0 ? '<code>free,subscribers only</code>' : '<code>members,members only</code>') . ' ā€” or you can type: <code>all</code>.' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
         }
         /**/
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_tag_level_access", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_category_level_access", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_category_level_access", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Category Access Restrictions">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-category-level-access-section">' . "\n";
         echo '<h3>Category Level Access Restrictions ( optional )</h3>' . "\n";
         echo '<p>Here you can specify Categories that are restricted to certain Membership Access Levels. Category restrictions are a bit more complex. When you restrict access to a Category, it also restricts access to any child Categories it may have <em>( aka: sub-Categories )</em>. In other words, restricting a Category, protects a Category Archive, all of its child Category Archives, and any Posts contained within the Category, or its child Categories. This is a VERY powerful form of protection, so please be careful. It\'s very easy to protect too much content by accident.</p>' . "\n";
         //echo ((!is_multisite () || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Category IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_category_level_access", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         /**/
         for ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
             $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-level' . $n . '-catgs">' . "\n";
             echo $n === $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"] ? 'Categories That Require Highest Level ' . $labelText . ':' . "\n" : 'Categories That Require Level ' . $labelText . ' Or Higher:' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<input type="text" autocomplete="off" name="ws_plugin__optimizemember_level' . $n . '_catgs" id="ws-plugin--optimizemember-level' . $n . '-catgs" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_catgs"]) . '" /><br />' . "\n";
             echo 'Category IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code> ā€” or you can type: <code>all</code>.' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
             /**/
             echo '<tr>' . "\n";
         }
         /**/
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_category_level_access", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_uri_level_access", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_uri_level_access", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="URI Restrictions ( typical w/BuddyPress )">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-uri-level-access-section">' . "\n";
         echo '<h3>URI Level Access Restrictions ( optional )</h3>' . "\n";
         echo '<p>Here you can specify URIs <em>( or word fragments found in URIs )</em> that are restricted to certain Membership Access Levels. Control over URIs is a little more complex. This section is intended for advanced webmasters only. That being said, here are the basics... A <code>REQUEST_URI</code>, is the portion of a <code>URL</code> that comes immediately after the domain. This is a URL <code>http://www.example.com/path/to/file.php</code>, and this is the URI: <code>/path/to/file.php</code>. In other words, a <code>REQUEST_URI</code> is the full path to a real <em>( or virtual )</em> directory and/or file on your domain.</p>' . "\n";
         echo '<p>In the fields below, you can provide a list <em>( one per line )</em> of URIs on your site that should be off-limits based on Membership Level. You can also use word fragments instead of a full URI. If a word fragment is found anywhere in the URI, it will be protected. Wildcards and other regex patterns are NOT supported here, and therefore you don\'t need to escape special characters or anything. Please note, these ARE caSe sensitive. You must be specific with respect to case sensitivity. The word fragment <code>some-path/</code> would NOT match a URI that contains <code>some-Path/</code>. <em>A few <a href="#" onclick="alert(\'URI Replacement Codes:\\n\\n%%current_user_login%% = The current User\\\'s Username, lowercase.\\n%%current_user_id%% = The current User\\\'s ID.\\n%%current_user_level%% = The current User\\\'s optimizeMember Level.\\n%%current_user_role%% = The current User\\\'s WordPress Role.' . (!is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site() ? '\\n%%current_user_ccaps%% = The current User\\\'s Custom Capabilities.' : '') . '\\n%%current_user_logins%% = Number of times the current User has logged in.\\n\\nFor example, if you\\\'re using BuddyPress, and want to protect BuddyPress Groups, you could add URI protection, like this: /members/%%current_user_login%%/groups/\'); return false;">Replacement Codes</a> are also supported here.</em></p>' . "\n";
         echo '<p><em><strong>*BuddyPress ( and similar )*</strong> URI Restrictions work great with plugins like BuddyPress that add new areas to your site ( where those new areas are NOT necessarily a Post/Page/Tag/Category ). In other words, anytime you\'d like to protect a specific feature offered by BuddyPress ( or other plugins ), you\'ll need to nail down specific word fragments found in the URIs associated with those areas. For instance, with BuddyPress you might have: [ <a href="#" onclick="alert(\'/members/\\n/groups/\\n/blogs/\\n/activity/\\n/messages/\\n/profile/\\n/friends/\\n/settings/\'); return false;">click for example</a> ].</em></p>' . "\n";
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_uri_level_access", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         /**/
         for ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
             $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-level' . $n . '-ruris">' . "\n";
             echo $n === $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"] ? 'URIs That Require Highest Level ' . $labelText . ':' . "\n" : 'URIs That Require Level ' . $labelText . ' Or Higher:' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<textarea name="ws_plugin__optimizemember_level' . $n . '_ruris" id="ws-plugin--optimizemember-level' . $n . '-ruris" rows="3" wrap="off" spellcheck="false">' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_ruris"]) . '</textarea><br />' . "\n";
             echo 'URIs and/or word fragments found in URIs. One per line please.' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
         }
         /**/
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_uri_level_access", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_query_level_access", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_query_level_access", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Alternative View Protection ( please read )">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-query-level-access-section">' . "\n";
         echo '<h3>Alternative View Protection ( optional / experimental )</h3>' . "\n";
         echo '<p>optimizeMember protects Categories, Tags, Posts, Pages, Files, URIs &amp; more. BUT, even with all of those security restrictions, it\'s still possible for protected content excerpts to be seen through XML feeds, in search results generated by WordPress; and/or <em>( depending on your theme )</em>, possibly in other Archive views; which might include: Posts by Author, Posts by Date, a list of featured items formulated by your theme, OR even through other widgets/plugins adding functionality to your site. ~ We refer to all of these collectively, as "Alternative Views".</p>' . "\n";
         echo '<p>Using the options below, you can tell optimizeMember to protect some <em>( or all )</em> of these "Alternative Views", by filtering WordPress database queries for you. optimizeMember can automatically hide protected content that is NOT available to the current User/Member. In other words, optimizeMember is capable of pre-filtering ALL database queries, so that excerpts of protected content will not be allowed to slip through. This is marked "experimental", because we\'re still testing this against MANY widget/plugin/theme combinations. Please <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Forum URI")) . '" target="_blank">report</a> all bugs.</p>' . "\n";
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_uri_level_access", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-filter-wp-query">' . "\n";
         echo 'Protect Alternative Views?' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<div class="ws-menu-page-scrollbox" style="height:105px;">' . "\n";
         echo '<input type="hidden" name="ws_plugin__optimizemember_filter_wp_query[]" value="update-signal" />' . "\n";
         foreach (array("all" => "<strong>Filter ALL WordPress queries</strong>; protecting all Alternative Views.", "searches" => "&#9492;&#9472; Searches ( hide protected content in search results )", "feeds" => "&#9492;&#9472; Feeds ( hide protected content in standard XML/RSS/ATOM feeds )", "comment-feeds" => "&#9492;&#9472; Comment Feeds ( hide comments associated with protected content, in comment feeds )", "nav-menus" => "&#9492;&#9472; Nav Menus ( hide protected content in menus generated with <em>WordPress -> Appearance -> Menus</em> )") as $ws_plugin__optimizemember_temp_s_value => $ws_plugin__optimizemember_temp_s_label) {
             echo '<input type="checkbox" name="ws_plugin__optimizemember_filter_wp_query[]" id="ws-plugin--optimizemember-filter-wp-query-' . esc_attr(preg_replace("/[^a-z0-9_\\-]/", "-", $ws_plugin__optimizemember_temp_s_value)) . '" value="' . esc_attr($ws_plugin__optimizemember_temp_s_value) . '"' . (in_array($ws_plugin__optimizemember_temp_s_value, $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["filter_wp_query"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--optimizemember-filter-wp-query-' . esc_attr(preg_replace("/[^a-z0-9_\\-]/", "-", $ws_plugin__optimizemember_temp_s_value)) . '">' . $ws_plugin__optimizemember_temp_s_label . '</label><br />' . "\n";
         }
         echo '</div>' . "\n";
         echo '<strong>Attn Developers:</strong> Filters can be suppressed dynamically, using this technique:<br />' . "\n";
         echo '<code><a href="http://codex.wordpress.org/Function_Reference/query_posts" target="_blank" rel="external">query_posts</a>("suppress_filters=true");</code><br />' . "\n";
         echo '<code><a href="http://codex.wordpress.org/Function_Reference/get_posts" target="_blank" rel="external">get_posts</a>()</code> auto-suppresses filters.<br />' . "\n";
         //echo 'Also see <a href="http://www.optimizepress.com/codex/stable/s2member/api_functions/package-functions/#src_doc_attach_optimizemember_query_filters()" target="_blank" rel="external">this article</a> in the optimizeMember Codex.' . "\n";
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_query_level_access", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_sp_access", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_sp_access", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Specific Post/Page Access Restrictions">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-sp-access-section">' . "\n";
         echo '<h3>Specific Post/Page Access Restrictions ( optional )</h3>' . "\n";
         echo '<p>optimizeMember now supports an additional layer of functionality <em>( very powerful )</em>, which allows you to sell access to specific Posts/Pages that you\'ve created in WordPress. Specific Post/Page Access works independently from Member Level Access. That is, you can sell an unlimited number of Posts/Pages using "Buy Now" Buttons, and your Customers will NOT be required to have a Membership Account with your site in order to receive access. If they are already a Member, that\'s fine, but they won\'t need to be.</p>' . "\n";
         echo '<p>In other words, Customers will NOT need to login, just to receive access to the Specific Post/Page they purchased access to. optimizeMember will immediately redirect the Customer to the Specific Post/Page after checkout is completed successfully. An email is also sent to the Customer with a link ( see: <code>optimizeMember -> PayPal Options -> Specific Post/Page Email</code> ). Authentication is handled automatically through self-expiring links, good for 72 hours by default.</p>' . "\n";
         echo '<p>Specific Post/Page Access, is sort of like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress. A Specific Post/Page that is protected by optimizeMember, might contain a download link for your eBook, access to file &amp; music downloads, access to additional support services, and the list goes on and on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress Post/Page that you\'ve created.</p>' . "\n";
         echo '<p>Very simple. All you do is protect the Specific Post/Page IDs that are being sold on your site. Then, you can go to <code>optimizeMember -> PayPal Buttons -> Specific Post/Page</code> to generate "Buy Now" Buttons that you can insert into your WordPress Editor, and make available on your site. The Button Generator for optimizeMember, will even let you Package Additional Posts/Pages together into one transaction.</p>' . "\n";
         //echo ((!is_multisite () || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm () || is_main_site ()) && !$GLOBALS["WS_PLUGIN__"]["wp_show_ids"]) ? '<p><em><strong>*Tip*</strong> Can\'t find your Post/Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_sp_access", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-specific-ids">' . "\n";
         echo 'Specific Post/Page IDs Being Sold On Your Site:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<input type="text" autocomplete="off" name="ws_plugin__optimizemember_specific_ids" id="ws-plugin--optimizemember-specific-ids" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["specific_ids"]) . '" /><br />' . "\n";
         echo 'Post/Page IDs in comma-delimited format. Example: <code>1,2,3,34,8,21</code> * Note... the word <code>all</code> does NOT work here. Also, please be careful not to create a conflict with other Access Restrictions. If you are going to sell Specific Post/Page Access, you should enter specific Post/Page IDs here; and <strong>make SURE that you\'ve NOT already protected any of these Posts/Pages with Member Level Access Restrictions</strong>. In other words, if you configure optimizeMember, in such as a way, that a Post/Page requires Membership Level Access, you cannot sell that same Post/Page through Specific Post/Page Access. Doing so, would create a conflict. Customers that purchased Specific Post/Page Access, would be unable to access the Post/Page - without also having a Membership. Not good. So please be careful.' . "\n";
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_sp_access", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_brute_force_restrictions", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_brute_force_restrictions", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Brute Force IP/Login Restrictions">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-brute-force-restrictions-section">' . "\n";
         echo '<h3>Brute Force IP/Login Restrictions ( prevents username/password guessing )</h3>' . "\n";
         echo '<input type="button" id="ws-plugin--optimizemember-brute-force-restrictions-reset-button" value="Reset Brute Force Logs" class="ws-menu-page-right button" style="min-width:175px;" />' . "\n";
         echo '<p>As with any Membership system, it is possible for someone to try and guess Username/Password combinations by attempting a <a href="http://en.wikipedia.org/wiki/Brute-force_attack" target="_blank" rel="external">Brute Force Attack</a>; whereby multiple/repeated logins are strategically attempted with various Username/Password combinations until a correct guess is made. It is NOT likely that you\'ll be attacked in this way, but it\'s still a good idea to protect your system; just in case somebody tries this. optimizeMember thwarts this behavior by monitoring failed login attempts that occur within a short period of time. Whenever optimizeMember detects an IP address <em>( i.e. a remote user )</em> that is consistently failing to enter a valid Username/Password, a temporary ban is created; preventing additional attempts from taking place for 30 minutes. This temporary ban, will ONLY affect the offending IP address.</p>' . "\n";
         echo '<p><em>*Note* an empty IP address ( associated with someone browsing anonymously ), is also considered a unique IP address, so it cannot circumvent optimizeMember\'s security.</em></p>' . "\n";
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_ip_restrictions", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-max-failed-login-attempts">' . "\n";
         echo 'Maximum Failed Login Attempts:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<select name="ws_plugin__optimizemember_max_failed_login_attempts" id="ws-plugin--optimizemember-max-failed-login-attempts">' . "\n";
         $ws_plugin__optimizemember_temp_s = apply_filters("ws_plugin__optimizemember_track_failed_logins__exp_time", "30 minutes");
         echo '<option value="1"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 1 ? ' selected="selected"' : '') . '>Allow 1 failed login attempt ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="2"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 2 ? ' selected="selected"' : '') . '>Allow 2 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="3"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 3 ? ' selected="selected"' : '') . '>Allow 3 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="4"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 4 ? ' selected="selected"' : '') . '>Allow 4 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="5"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 5 ? ' selected="selected"' : '') . '>Allow 5 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="10"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 10 ? ' selected="selected"' : '') . '>Allow 10 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="20"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 20 ? ' selected="selected"' : '') . '>Allow 20 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="30"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 30 ? ' selected="selected"' : '') . '>Allow 30 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="40"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 40 ? ' selected="selected"' : '') . '>Allow 40 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="50"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 50 ? ' selected="selected"' : '') . '>Allow 50 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="75"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 75 ? ' selected="selected"' : '') . '>Allow 75 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="100"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 100 ? ' selected="selected"' : '') . '>Allow 100 failed login attempts ( then punish for ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="0"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_failed_login_attempts"] == 0 ? ' selected="selected"' : '') . '>Allow infinite failed logins ( Brute Force Restrictions disabled )</option>' . "\n";
         echo '</select><br />' . "\n";
         echo 'When/if you change this, you should also <strong>Reset Brute Force Logs</strong> ( click button above ).' . "\n";
         echo !is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site() ? '<br /><br />The default period of "30 minutes" could be modified through this WordPress Filter:<br /><code>ws_plugin__optimizemember_track_failed_logins__exp_time</code>' . "\n" : '';
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_ip_restrictions", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_display_ip_restrictions", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_before_ip_restrictions", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Unique IP Access Restrictions">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-ip-restrictions-section">' . "\n";
         echo '<h3>Unique IP Access Restrictions ( prevents username/link sharing )</h3>' . "\n";
         echo '<input type="button" id="ws-plugin--optimizemember-ip-restrictions-reset-button" value="Reset IP Restriction Logs" class="ws-menu-page-right button" style="min-width:175px;" />' . "\n";
         echo '<p>As with any Membership system, it is possible for one Member to signup, and then share their Username with someone else; or even post it online for the whole world to see. This is known as Link Sharing <em>( aka: Username Sharing )</em>. It is NOT likely that you\'ll be attacked in this way, but it\'s still a good idea to protect your system; just in case somebody tries this. optimizeMember\'s IP Restrictions work for Membership Level Access <em>( account logins )</em>, Specific Post/Page Access, Registration Links, and other secure Entry Points. In all cases, the rules are simple. A single Username, Access Link, and/or Entry Point ... is only valid for a certain number of unique IP addresses. Once that limit is reached, optimizeMember assumes there has been a security breach. At that time, optimizeMember will place a temporary ban <em>( preventing access )</em> to a Specific Post/Page, or to an account associated with a particular Username. This temporary ban, will ONLY affect the offending Link and/or Username associated with the security breach. You can fine-tune this behavior, using the options below.</p>' . "\n";
         echo '<p><em>*Note* an empty IP address ( associated with someone browsing anonymously ), is also considered a unique IP address, so it cannot circumvent optimizeMember\'s security.</em></p>' . "\n";
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_during_ip_restrictions", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-max-ip-restriction">' . "\n";
         echo 'Maximum Unique IP Addresses Allowed:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<select name="ws_plugin__optimizemember_max_ip_restriction" id="ws-plugin--optimizemember-max-ip-restriction">' . "\n";
         $ws_plugin__optimizemember_temp_s = apply_filters("ws_plugin__optimizemember_ip_restrictions__concurrency_time_per_ip", "30 days");
         echo '<option value="1"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 1 ? ' selected="selected"' : '') . '>Allow up to 1 unique IP per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="2"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 2 ? ' selected="selected"' : '') . '>Allow up to 2 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="3"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 3 ? ' selected="selected"' : '') . '>Allow up to 3 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="4"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 4 ? ' selected="selected"' : '') . '>Allow up to 4 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="5"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 5 ? ' selected="selected"' : '') . '>Allow up to 5 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="10"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 10 ? ' selected="selected"' : '') . '>Allow up to 10 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="20"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 20 ? ' selected="selected"' : '') . '>Allow up to 20 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="30"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 30 ? ' selected="selected"' : '') . '>Allow up to 30 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="40"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 40 ? ' selected="selected"' : '') . '>Allow up to 40 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="50"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 50 ? ' selected="selected"' : '') . '>Allow up to 50 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="75"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 75 ? ' selected="selected"' : '') . '>Allow up to 75 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="100"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 100 ? ' selected="selected"' : '') . '>Allow up to 100 different IPs per Customer ( every ' . $ws_plugin__optimizemember_temp_s . ' )</option>' . "\n";
         echo '<option value="0"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction"] == 0 ? ' selected="selected"' : '') . '>Allow infinite IPs ( all IP Restrictions are disabled )</option>' . "\n";
         echo '</select>' . "\n";
         echo !is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site() ? '<br />The default period of "30 days" could be modified through this WordPress Filter:<br /><code>ws_plugin__optimizemember_ip_restrictions__concurrency_time_per_ip</code>' . "\n" : '';
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-max-ip-restriction-time">' . "\n";
         echo 'Security Breach Timeout Period:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<select name="ws_plugin__optimizemember_max_ip_restriction_time" id="ws-plugin--optimizemember-max-ip-restriction-time">' . "\n";
         echo '<option value="300"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 300 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 5 mins )</option>' . "\n";
         echo '<option value="900"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 900 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 15 mins )</option>' . "\n";
         echo '<option value="1800"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 1800 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 30 mins )</option>' . "\n";
         echo '<option value="3600"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 3600 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 1 hour )</option>' . "\n";
         echo '<option value="7200"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 7200 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 2 hours )</option>' . "\n";
         echo '<option value="14400"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 14400 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 4 hours )</option>' . "\n";
         echo '<option value="21600"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 21600 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 6 hours )</option>' . "\n";
         echo '<option value="28800"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 28800 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 8 hours )</option>' . "\n";
         echo '<option value="43200"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 43200 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 12 hours )</option>' . "\n";
         echo '<option value="86400"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 86400 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 24 hours )</option>' . "\n";
         echo '<option value="172800"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 172800 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 2 days )</option>' . "\n";
         echo '<option value="345600"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 345600 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 4 days )</option>' . "\n";
         echo '<option value="604800"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 604800 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 1 week )</option>' . "\n";
         echo '<option value="1209600"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 1209600 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 2 weeks )</option>' . "\n";
         echo '<option value="2629743"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 2629743 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 1 month )</option>' . "\n";
         echo '<option value="5259487"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 5259487 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 2 months )</option>' . "\n";
         echo '<option value="7889231"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 7889231 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 3 months )</option>' . "\n";
         echo '<option value="15778463"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 15778463 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 6 months )</option>' . "\n";
         echo '<option value="31556926"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["max_ip_restriction_time"] == 31556926 ? ' selected="selected"' : '') . '>If limit is exceeded ( punish for 1 year )</option>' . "\n";
         echo '</select><br />' . "\n";
         echo 'When/if you change this, you should also <strong>Reset IP Restriction Logs</strong> ( click button above ).' . "\n";
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_res_ops_page_during_left_sections_after_ip_restrictions", get_defined_vars());
     }
     /**/
     do_action("ws_plugin__optimizemember_during_res_ops_page_after_left_sections", get_defined_vars());
     /**/
     //echo '<div class="ws-menu-page-hr"></div>' . "\n";
     /**/
     echo '<p class="submit"><input type="submit" class="op-pb-button green" value="Save All Changes" /></p>' . "\n";
     /**/
     echo '</form>' . "\n";
     /**/
     echo '</td>' . "\n";
     /**/
     echo '<td class="ws-menu-page-table-r">' . "\n";
     c_ws_plugin__optimizemember_menu_pages_rs::display();
     echo '</td>' . "\n";
     /**/
     echo '</tr>' . "\n";
     echo '</tbody>' . "\n";
     echo '</table>' . "\n";
     /**/
     echo '</div>' . "\n";
     echo '</div>' . "\n";
 }
Example #7
0
 public function __construct()
 {
     echo '<div class="wrap ws-menu-page op-bsw-wizard op-bsw-content">' . "\n";
     /**/
     echo '<div class="op-bsw-header">';
     echo '<div class="op-logo"><img src="' . $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images/" . 'logo-optimizepress.png" alt="OptimizePress" height="50" class="animated flipInY"></div>';
     echo '</div>';
     echo '<div class="op-bsw-main-content">';
     echo '<h2>OptimizeMember API / Tracking</h2>' . "\n";
     /**/
     echo '<table class="ws-menu-page-table">' . "\n";
     echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
     echo '<tr class="ws-menu-page-table-tr">' . "\n";
     echo '<td class="ws-menu-page-table-l">' . "\n";
     /**/
     echo '<form method="post" name="ws_plugin__optimizemember_options_form" id="ws-plugin--optimizemember-options-form">' . "\n";
     echo '<input type="hidden" name="ws_plugin__optimizemember_options_save" id="ws-plugin--optimizemember-options-save" value="' . esc_attr(wp_create_nonce("ws-plugin--optimizemember-options-save")) . '" />' . "\n";
     echo '<input type="hidden" name="ws_plugin__optimizemember_configured" id="ws-plugin--optimizemember-configured" value="1" />' . "\n";
     /**/
     do_action("ws_plugin__optimizemember_during_trk_ops_page_before_left_sections", get_defined_vars());
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_display_signup_tracking", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_before_signup_tracking", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Signup Tracking Codes">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-signup-tracking-section">' . "\n";
         echo '<h3>Signup Tracking Codes ( optional )</h3>' . "\n";
         echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' and/or PHP') . ' code that you enter below, will be loaded up in a web browser, after a "new", "paying" Member, completes Signup through your Payment Gateway. This is marked `Signup`, because Signup Tracking Codes will be displayed each time a "new", "paying" Member, signs up. Depending on your fee structure, this may include a first Initial Payment that establishes their Subscription, or it may not.</p>' . "\n";
         echo '<p>Signup Tracking Codes will only be displayed once for each Member. Signup Tracking Codes are displayed right after a "new", "paying" Member, signs up successfully through your Payment Gateway, regardless of whether any money has actually been transacted initially. In other words, Signup Tracking Codes are displayed anytime a "new", "paying" Member, signs up, even if you provided them with a 100% Free Trial Period <em>( e.g. no money is being transacted intially )</em>.</p>' . "\n";
         echo '<p>optimizeMember will display your Signup Tracking Codes in one of four possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Registration Form, after returning from your Payment Gateway. <em>Note. If you offer a 100% free Trial Period, Tracking Codes will be displayed in location #2 when using PayPal Standard Button integration.</em> <strong>3.</strong> Otherwise, if possible, on the Login Form after Registration is completed. <strong>4.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>( immediately with optimizeMember Pro Form integration )</em>; or after the Customer\'s very first login.</p>' . "\n";
         echo '<p>Signup Tracking Codes are displayed for all types of Membership Level Access. Including Recurring Subscriptions <em>( with or without a Free Trial Period )</em>, Non-Recurring Subscriptions <em>( with or without a Free Trial Period )</em>, Lifetime Subscriptions, and even Fixed-Term Subscriptions. All of these are supported by optimizeMember\'s Button/Form Generators.</p>' . "\n";
         echo '<p>Signup Tracking Codes will NOT be processed for Free Subscribers that register without going through your Payment Gateway at all. Signup Tracking Codes will NOT be processed when an "existing" User/Member pays for a new Subscription <em>( see: Modification Tracking Codes for that scenario )</em>.' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' And, Signup Tracking Codes will NOT be processed on Buy Now transactions for Independent Custom Capabilities <em>( see: Capability Tracking Codes for that scenario )</em>.') . '</p>' . "\n";
         echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e. the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with optimizeMember\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scene (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <code>optimizeMember -> API / Notifications</code>.</em></p>' . "\n";
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_during_signup_tracking", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-signup-tracking-codes">' . "\n";
         echo 'Integrate Signup Tracking Codes:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<textarea name="ws_plugin__optimizemember_signup_tracking_codes" id="ws-plugin--optimizemember-signup-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["signup_tracking_codes"]) . '</textarea><br />' . "\n";
         echo 'Any valid XHTML / JavaScript' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' ( or even PHP )') . ' code will work just fine here. Just try not to put anything here that would actually be visible to the Customer. Things like 1x1 pixel images that load up silently and/or JavaScript tracking routines will be fine. Google Analytics code works just fine, AdSense performance tracking, as well as Yahoo tracking and other affiliate network codes are all OK here.<br /><br />' . "\n";
         echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%subscr_id%%</code> = The Paid Subscription ID, which remains constant throughout any &amp; all future payments. [ <a href="#" onclick="alert(\'There is one exception. If you are selling Lifetime or Fixed-Term ( non-recurring ) access, using Buy Now functionality; the %%subscr_id%% is actually set to the Transaction ID for the purchase. Payment Gateways do not provide a specific Subscription ID for Buy Now purchases. Since Lifetime &amp; Fixed-Term Subscriptions are NOT recurring ( i.e. there is only ONE payment ), using the Transaction ID as the Subscription ID is a graceful way to deal with this minor conflict.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%initial%%</code> = The Initial Fee charged during signup. If you offered a 100% Free Trial Period, this will be <code>0</code>. [ <a href="#" onclick="alert(\'This will always represent the amount of money the Customer spent, whenever they initially signed up, no matter what. If a Customer signs up, under the terms of a 100% Free Trial Period, this will be 0.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%regular%%</code> = The Regular Amount of the Subscription. This value is <code>always > 0</code>, no matter what. [ <a href="#" onclick="alert(\'This is how much the Subscription costs after an Initial Period expires. The %%regular%% rate is always > 0. If you did NOT offer an Initial Period at a different price, %%initial%% and %%regular%% will be equal to the same thing.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%recurring%%</code> = This is the amount that will be charged on a recurring basis, or <code>0</code> if non-recurring. [ <a href="#" onclick="alert(\'If Recurring Payments have not been required, this will be equal to 0. That being said, %%regular%% &amp; %%recurring%% are usually the same value. This variable can be used in two different ways. You can use it to determine what the Regular Recurring Rate is, or to determine whether the Subscription will recur or not. If it is going to recur, %%recurring%% will be > 0.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%first_name%%</code> = The First Name of the Customer who purchased the Membership Subscription.</li>' . "\n";
         echo '<li><code>%%last_name%%</code> = The Last Name of the Customer who purchased the Membership Subscription.</li>' . "\n";
         echo '<li><code>%%full_name%%</code> = The Full Name ( First &amp; Last ) of the Customer who purchased the Membership Subscription.</li>' . "\n";
         echo '<li><code>%%payer_email%%</code> = The Email Address of the Customer who purchased the Membership Subscription.</li>' . "\n";
         echo '<li><code>%%user_ip%%</code> = The Customer\'s IP Address, detected during checkout via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>' . "\n";
         echo '<li><code>%%item_number%%</code> = The Item Number ( colon separated <code><em>level:custom_capabilities:fixed term</em></code> ) that the Subscription is for.</li>' . "\n";
         echo '<li><code>%%item_name%%</code> = The Item Name ( as provided by the <code>desc=""</code> attribute in your Shortcode, which briefly describes the Item Number ).</li>' . "\n";
         echo '<li><code>%%initial_term%%</code> = This is the term length of the Initial Period. This will be a numeric value, followed by a space, then a single letter. [ <a href="#" onclick="alert(\'Here are some examples:\\n\\n%%initial_term%% = 1 D ( this means 1 Day )\\n%%initial_term%% = 1 W ( this means 1 Week )\\n%%initial_term%% = 1 M ( this means 1 Month )\\n%%initial_term%% = 1 Y ( this means 1 Year )\\n\\nThe Initial Period never recurs, so this only lasts for the term length specified, then it is over.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%regular_term%%</code> = This is the term length of the Regular Period. This will be a numeric value, followed by a space, then a single letter. [ <a href="#" onclick="alert(\'Here are some examples:\\n\\n%%regular_term%% = 1 D ( this means 1 Day )\\n%%regular_term%% = 1 W ( this means 1 Week )\\n%%regular_term%% = 1 M ( this means 1 Month )\\n%%regular_term%% = 1 Y ( this means 1 Year )\\n%%regular_term%% = 1 L ( this means 1 Lifetime )\\n\\nThe Regular Term is usually recurring. So the Regular Term value represents the period ( or duration ) of each recurring period. If %%recurring%% = 0, then the Regular Term only applies once, because it is not recurring. So if it is not recurring, the value of %%regular_term%% simply represents how long their Membership privileges are going to last after the %%initial_term%% has expired, if there was an Initial Term. The value of this variable ( %%regular_term%% ) will never be empty, it will always be at least: 1 D, meaning 1 day. No exceptions.\'); return false;">?</a> ]</li>' . "\n";
         echo '</ul>' . "\n";
         /**/
         echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
         echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>' . "\n";
         echo '</ul>' . "\n";
         echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />' . "\n";
         echo '<em>( The campaign ( i.e. christmas-promo ) could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
         echo '<code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|christmas-promo"</code>' . "\n";
         /**/
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><em><strong>*Tip*</strong> With <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with optimizeMember Pro. Please check your Dashboard here: <code>optimizeMember -> Pro Coupon Codes -> Affiliate Coupon Codes</code>. This is a VERY powerful feature.</em></p>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_after_signup_tracking", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_display_modification_tracking", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_before_modification_tracking", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Modification Tracking Codes">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-modification-tracking-section">' . "\n";
         echo '<h3>Modification Tracking Codes ( optional )</h3>' . "\n";
         echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' and/or PHP') . ' code that you enter below, will be loaded up in a web browser, each time a Subscription Modification occurs. This is marked `Modification`, because Modification Tracking Codes are displayed each time an "existing" User/Member <em>( even if they are/were a Free Subscriber )</em> signs up for a paid Subscription <em>( i.e. a Modification takes place against an existing account within WordPress )</em>, or an "existing" Member modifies their paid Subscription terms <em>( again, a Modification takes places against an existing account within WordPress )</em>. Depending on your fee structure, this may include a first Initial Payment that establishes their Subscription, or it may not.</p>' . "\n";
         echo '<p>Modification Tracking Codes are displayed right after a Member signs up and/or modifies billing terms successfully through your Payment Gateway, regardless of whether any money has actually been transacted initially. In other words, Modification Tracking Codes are displayed, even if you provided them with a 100% Free Trial Period <em>( e.g. no money is being transacted intially )</em>.</p>' . "\n";
         echo '<p>optimizeMember will display your Modification Tracking Codes in one of three possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Login Form after returning from your Payment Gateway <em>( i.e. when the Customer is asked to log back in )</em>. <strong>3.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>( immediately with optimizeMember Pro Form integration )</em>; or after the Customer\'s next login.</p>' . "\n";
         echo '<p>Modification Tracking Codes are displayed for all types of Membership Level Access. Including Recurring Subscriptions <em>( with or without a Free Trial Period )</em>, Non-Recurring Subscriptions <em>( with or without a Free Trial Period )</em>, Lifetime Subscriptions, and even Fixed-Term Subscriptions. All of these are supported by optimizeMember\'s Button/Form Generators.</p>' . "\n";
         echo '<p>Modification Tracking Codes will NOT be processed for Free Subscribers that register without going through your Payment Gateway at all. Modification Tracking Codes will NOT be processed when a "new" User/Member signs up <em>( see: Signup Tracking Codes for that scenario )</em>.' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' And, Modification Tracking Codes will NOT be processed on Buy Now transactions for Independent Custom Capabilities <em>( see: Capability Tracking Codes for that scenario )</em>.') . '</p>' . "\n";
         echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e. the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with optimizeMember\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scene (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <code>optimizeMember -> API / Notifications</code>.</em></p>' . "\n";
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_during_modification_tracking", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-modification-tracking-codes">' . "\n";
         echo 'Integrate Modification Tracking Codes:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<textarea name="ws_plugin__optimizemember_modification_tracking_codes" id="ws-plugin--optimizemember-modification-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["modification_tracking_codes"]) . '</textarea><br />' . "\n";
         echo 'Any valid XHTML / JavaScript' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' ( or even PHP )') . ' code will work just fine here. Just try not to put anything here that would actually be visible to the Customer. Things like 1x1 pixel images that load up silently and/or JavaScript tracking routines will be fine. Google Analytics code works just fine, AdSense performance tracking, as well as Yahoo tracking and other affiliate network codes are all OK here.<br /><br />' . "\n";
         echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%subscr_id%%</code> = The Paid Subscription ID, which remains constant throughout any &amp; all future payments. [ <a href="#" onclick="alert(\'There is one exception. If you are selling Lifetime or Fixed-Term ( non-recurring ) access, using Buy Now functionality; the %%subscr_id%% is actually set to the Transaction ID for the purchase. Payment Gateways do not provide a specific Subscription ID for Buy Now purchases. Since Lifetime &amp; Fixed-Term Subscriptions are NOT recurring ( i.e. there is only ONE payment ), using the Transaction ID as the Subscription ID is a graceful way to deal with this minor conflict.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%initial%%</code> = The Initial Fee charged during signup. If you offered a 100% Free Trial Period, this will be <code>0</code>. [ <a href="#" onclick="alert(\'This will always represent the amount of money the Customer spent, whenever they initially signed up, no matter what. If a Customer signs up, under the terms of a 100% Free Trial Period, this will be 0.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%regular%%</code> = The Regular Amount of the Subscription. This value is <code>always > 0</code>, no matter what. [ <a href="#" onclick="alert(\'This is how much the Subscription costs after an Initial Period expires. The %%regular%% rate is always > 0. If you did NOT offer an Initial Period at a different price, %%initial%% and %%regular%% will be equal to the same thing.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%recurring%%</code> = This is the amount that will be charged on a recurring basis, or <code>0</code> if non-recurring. [ <a href="#" onclick="alert(\'If Recurring Payments have not been required, this will be equal to 0. That being said, %%regular%% &amp; %%recurring%% are usually the same value. This variable can be used in two different ways. You can use it to determine what the Regular Recurring Rate is, or to determine whether the Subscription will recur or not. If it is going to recur, %%recurring%% will be > 0.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%first_name%%</code> = The First Name of the Customer who purchased the Membership Subscription.</li>' . "\n";
         echo '<li><code>%%last_name%%</code> = The Last Name of the Customer who purchased the Membership Subscription.</li>' . "\n";
         echo '<li><code>%%full_name%%</code> = The Full Name ( First &amp; Last ) of the Customer who purchased the Membership Subscription.</li>' . "\n";
         echo '<li><code>%%payer_email%%</code> = The Email Address of the Customer who purchased the Membership Subscription.</li>' . "\n";
         echo '<li><code>%%item_number%%</code> = The Item Number ( colon separated <code><em>level:custom_capabilities:fixed term</em></code> ) that the Subscription is for.</li>' . "\n";
         echo '<li><code>%%item_name%%</code> = The Item Name ( as provided by the <code>desc=""</code> attribute in your Shortcode, which briefly describes the Item Number ).</li>' . "\n";
         echo '<li><code>%%initial_term%%</code> = This is the term length of the Initial Period. This will be a numeric value, followed by a space, then a single letter. [ <a href="#" onclick="alert(\'Here are some examples:\\n\\n%%initial_term%% = 1 D ( this means 1 Day )\\n%%initial_term%% = 1 W ( this means 1 Week )\\n%%initial_term%% = 1 M ( this means 1 Month )\\n%%initial_term%% = 1 Y ( this means 1 Year )\\n\\nThe Initial Period never recurs, so this only lasts for the term length specified, then it is over.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%regular_term%%</code> = This is the term length of the Regular Period. This will be a numeric value, followed by a space, then a single letter. [ <a href="#" onclick="alert(\'Here are some examples:\\n\\n%%regular_term%% = 1 D ( this means 1 Day )\\n%%regular_term%% = 1 W ( this means 1 Week )\\n%%regular_term%% = 1 M ( this means 1 Month )\\n%%regular_term%% = 1 Y ( this means 1 Year )\\n%%regular_term%% = 1 L ( this means 1 Lifetime )\\n\\nThe Regular Term is usually recurring. So the Regular Term value represents the period ( or duration ) of each recurring period. If %%recurring%% = 0, then the Regular Term only applies once, because it is not recurring. So if it is not recurring, the value of %%regular_term%% simply represents how long their Membership privileges are going to last after the %%initial_term%% has expired, if there was an Initial Term. The value of this variable ( %%regular_term%% ) will never be empty, it will always be at least: 1 D, meaning 1 day. No exceptions.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%user_first_name%%</code> = The First Name listed on their User account. This might be different than what is on file with your Payment Gateway.</li>' . "\n";
         echo '<li><code>%%user_last_name%%</code> = The Last Name listed on their User account. This might be different than what is on file with your Payment Gateway.</li>' . "\n";
         echo '<li><code>%%user_full_name%%</code> = The Full Name listed on their User account. This might be different than what is on file with your Payment Gateway.</li>' . "\n";
         echo '<li><code>%%user_email%%</code> = The Email Address associated with their User account. This might be different than what is on file with your Payment Gateway.</li>' . "\n";
         echo '<li><code>%%user_login%%</code> = The Username associated with their account. The Customer created this during registration.</li>' . "\n";
         echo '<li><code>%%user_ip%%</code> = The Customer\'s original IP Address, during checkout/registration via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>' . "\n";
         echo '<li><code>%%user_id%%</code> = A unique WordPress User ID that references this account in the WordPress database.</li>' . "\n";
         echo '</ul>' . "\n";
         /**/
         echo '<strong>Custom Registration/Profile Fields are also supported in this Notification:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>' . "\n";
         echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>' . "\n";
         echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>' . "\n";
         echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> optimizeMember -> General Options -> Registration/Profile Fields</em>.</li>' . "\n";
         echo '</ul>' . "\n";
         /**/
         echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
         echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>' . "\n";
         echo '</ul>' . "\n";
         echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />' . "\n";
         echo '<em>( The campaign ( i.e. christmas-promo ) could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
         echo '<code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|christmas-promo"</code>' . "\n";
         /**/
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><em><strong>*Tip*</strong> With <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with optimizeMember Pro. Please check your Dashboard here: <code>optimizeMember -> Pro Coupon Codes -> Affiliate Coupon Codes</code>. This is a VERY powerful feature.</em></p>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_after_modification_tracking", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_display_ccap_tracking", !is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site(), get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_before_ccap_tracking", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Capability Tracking Codes">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-ccap-tracking-section">' . "\n";
         echo '<h3>Capability Tracking Codes ( optional )</h3>' . "\n";
         echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' and/or PHP') . ' code that you enter below, will be loaded up in a web browser, each time Independent Custom Capabilities are purchased. This is marked `Capability`, because Capability Tracking Codes are displayed each time an "existing" User/Member <em>( even if they are/were a Free Subscriber )</em> pays you for Independent Custom Capabilities through a Buy Now transaction. This is the only circumstance in which your Capability Tracking Codes will be displayed.</p>' . "\n";
         echo '<p>optimizeMember will display your Capability Tracking Codes in one of three possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, if possible, on the Login Form after returning from your Payment Gateway <em>( i.e. when the Customer is asked to log back in )</em>. <strong>3.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>( immediately with optimizeMember Pro Form integration )</em>; or after the Customer\'s next login.</p>' . "\n";
         echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e. the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with optimizeMember\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scene (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <code>optimizeMember -> API / Notifications</code>.</em></p>' . "\n";
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_during_ccap_tracking", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-ccap-tracking-codes">' . "\n";
         echo 'Integrate Capability Tracking Codes:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<textarea name="ws_plugin__optimizemember_ccap_tracking_codes" id="ws-plugin--optimizemember-ccap-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccap_tracking_codes"]) . '</textarea><br />' . "\n";
         echo 'Any valid XHTML / JavaScript' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' ( or even PHP )') . ' code will work just fine here. Just try not to put anything here that would actually be visible to the Customer. Things like 1x1 pixel images that load up silently and/or JavaScript tracking routines will be fine. Google Analytics code works just fine, AdSense performance tracking, as well as Yahoo tracking and other affiliate network codes are all OK here.<br /><br />' . "\n";
         echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%txn_id%%</code> = The Payment Transaction ID, which is always unique for each payment received.</li>' . "\n";
         echo '<li><code>%%amount%%</code> = The Amount of the payment. Most affiliate programs calculate commissions from this.</li>' . "\n";
         echo '<li><code>%%first_name%%</code> = The First Name of the Customer who purchased the Independent Custom Capabilities.</li>' . "\n";
         echo '<li><code>%%last_name%%</code> = The Last Name of the Customer who purchased the Independent Custom Capabilities.</li>' . "\n";
         echo '<li><code>%%full_name%%</code> = The Full Name ( First &amp; Last ) of the Customer who purchased the Independent Custom Capabilities.</li>' . "\n";
         echo '<li><code>%%payer_email%%</code> = The Email Address of the Customer who purchased the Independent Custom Capabilities.</li>' . "\n";
         echo '<li><code>%%item_number%%</code> = The Item Number ( colon separated <code><em>*level:custom_capabilities:fixed term</em></code> ) that the payment is for. [ <a href="#" onclick="alert(\'With Independent Custom Capabilities, the `level` portion of this string will be an asterisk ( `*` ), since the Membership Level is irrelevant, and remains `as it was`.\'); return false;">?</a> ]</li>' . "\n";
         echo '<li><code>%%item_name%%</code> = The Item Name ( as provided by the <code>desc=""</code> attribute in your Shortcode, which briefly describes the Item Number ).</li>' . "\n";
         echo '<li><code>%%user_first_name%%</code> = The First Name listed on their User account. This might be different than what is on file with your Payment Gateway.</li>' . "\n";
         echo '<li><code>%%user_last_name%%</code> = The Last Name listed on their User account. This might be different than what is on file with your Payment Gateway.</li>' . "\n";
         echo '<li><code>%%user_full_name%%</code> = The Full Name listed on their User account. This might be different than what is on file with your Payment Gateway.</li>' . "\n";
         echo '<li><code>%%user_email%%</code> = The Email Address associated with their User account. This might be different than what is on file with your Payment Gateway.</li>' . "\n";
         echo '<li><code>%%user_login%%</code> = The Username associated with their account. The Customer created this during registration.</li>' . "\n";
         echo '<li><code>%%user_ip%%</code> = The Customer\'s original IP Address, during checkout/registration via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>' . "\n";
         echo '<li><code>%%user_id%%</code> = A unique WordPress User ID that references this account in the WordPress database.</li>' . "\n";
         echo '</ul>' . "\n";
         /**/
         echo '<strong>Custom Registration/Profile Fields are also supported in this Notification:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%date_of_birth%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>date_of_birth</code>.</li>' . "\n";
         echo '<li><code>%%street_address%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>street_address</code>.</li>' . "\n";
         echo '<li><code>%%country%%</code> would be valid; if you have a Custom Registration/Profile Field with the ID <code>country</code>.</li>' . "\n";
         echo '<li><em><code>%%etc, etc...%%</code> <strong>see:</strong> optimizeMember -> General Options -> Registration/Profile Fields</em>.</li>' . "\n";
         echo '</ul>' . "\n";
         /**/
         echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
         echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>' . "\n";
         echo '</ul>' . "\n";
         echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />' . "\n";
         echo '<em>( The campaign ( i.e. christmas-promo ) could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
         echo '<code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|christmas-promo"</code>' . "\n";
         /**/
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><em><strong>*Tip*</strong> With <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with optimizeMember Pro. Please check your Dashboard here: <code>optimizeMember -> Pro Coupon Codes -> Affiliate Coupon Codes</code>. This is a VERY powerful feature.</em></p>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_after_ccap_tracking", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_display_sp_tracking", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_before_sp_tracking", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Specific Post/Page Tracking Codes">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-sp-tracking-section">' . "\n";
         echo '<h3>Tracking Codes For Specific Post/Page Access ( optional )</h3>' . "\n";
         echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' and/or PHP') . ' code that you enter below, will be loaded up in a web browser, after a Customer completes a successful transaction through your Payment Gateway; specifically for Post/Page Access. These Codes are NOT injected for any type of Membership Level Access' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' or Independent Custom Capabilities') . '. These are only for Specific Post/Page transactions. The Tracking Codes that you enter below, will be displayed in one of two possible locations... <strong>1.</strong> If possible, on the Thank-You Return Page, after returning from your Payment Gateway. <strong>2.</strong> Otherwise, in the footer of your WordPress theme, as soon as possible <em>( immediately with optimizeMember Pro Form integration )</em>.</p>' . "\n";
         echo '<p><em><strong>AD BLOCKERS:</strong> If a web browser has ad blockers enabled (i.e. the web browser has an ad blocking extension or add-on), Tracking Codes from popular online advertising companies (including many affiliate networks) may NOT be shown. Ad blockers can prevent your Tracking Codes from being loaded in a customer\'s browser. If you\'d like to avoid this problem, consider integrating with optimizeMember\'s API Notifications instead of with Tracking Codes. API Notifications occur silently behind-the-scene (more reliably), whereas Tracking Codes are loaded in a customer\'s browser. For more information, please see: <code>optimizeMember -> API / Notifications</code>.</em></p>' . "\n";
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_during_sp_tracking", get_defined_vars());
         /**/
         echo '<table class="form-table">' . "\n";
         echo '<tbody>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<th>' . "\n";
         echo '<label for="ws-plugin--optimizemember-sp-tracking-codes">' . "\n";
         echo 'Specific Post/Page Tracking Codes:' . "\n";
         echo '</label>' . "\n";
         echo '</th>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '<tr>' . "\n";
         /**/
         echo '<td>' . "\n";
         echo '<textarea name="ws_plugin__optimizemember_sp_tracking_codes" id="ws-plugin--optimizemember-sp-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["sp_tracking_codes"]) . '</textarea><br />' . "\n";
         echo 'Any valid XHTML / JavaScript' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' ( or even PHP )') . ' code will work just fine here. Just try not to put anything here that would actually be visible to the Customer. Things like 1x1 pixel images that load up silently and/or JavaScript tracking routines will be fine. Google Analytics code works just fine, AdSense performance tracking, as well as Yahoo tracking and other affiliate network codes are all OK here.<br /><br />' . "\n";
         echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%txn_id%%</code> = The Paid Transaction ID. Payment Gateways assign a unique identifier for every purchase.</li>' . "\n";
         echo '<li><code>%%amount%%</code> = The full Amount that you charged for Specific Post/Page Access. This value will <code>always be > 0</code>.</li>' . "\n";
         echo '<li><code>%%first_name%%</code> = The First Name of the Customer who purchased Specific Post/Page Access.</li>' . "\n";
         echo '<li><code>%%last_name%%</code> = The Last Name of the Customer who purchased Specific Post/Page Access.</li>' . "\n";
         echo '<li><code>%%full_name%%</code> = The Full Name ( First &amp; Last ) of the Customer who purchased Specific Post/Page Access.</li>' . "\n";
         echo '<li><code>%%payer_email%%</code> = The Email Address of the Customer who purchased Specific Post/Page Access.</li>' . "\n";
         echo '<li><code>%%user_ip%%</code> = The Customer\'s IP Address, detected during checkout via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>' . "\n";
         echo '<li><code>%%item_number%%</code> = The Item Number. Ex: <code><em>sp:13,24,36:72</em></code> ( translates to: <code><em>sp:comma-delimited IDs:expiration hours</em></code> ).</li>' . "\n";
         echo '<li><code>%%item_name%%</code> = The Item Name ( as provided by the <code>desc=""</code> attribute in your Shortcode, which briefly describes the Item Number ).</li>' . "\n";
         echo '</ul>' . "\n";
         /**/
         echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
         echo '<ul>' . "\n";
         echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
         echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>' . "\n";
         echo '</ul>' . "\n";
         echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />' . "\n";
         echo '<em>( The campaign ( i.e. christmas-promo ) could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
         echo '<code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|christmas-promo"</code>' . "\n";
         /**/
         echo '</td>' . "\n";
         /**/
         echo '</tr>' . "\n";
         echo '</tbody>' . "\n";
         echo '</table>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><em><strong>*Tip*</strong> With <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro Forms</a>, it\'s possible to integrate Affiliate Coupon Codes. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with optimizeMember Pro. Please check your Dashboard here: <code>optimizeMember -> Pro Coupon Codes -> Affiliate Coupon Codes</code>. This is a VERY powerful feature.</em></p>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_after_sp_tracking", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_display_integrations_header", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_before_integrations_header", get_defined_vars());
         /**/
         echo '<div style="border-bottom:1px solid #DFDFDF; margin:-20px 0 9px 0; padding:0;">&nbsp;</div>' . "\n";
         // echo '<div id="icon-tools" class="icon32" style="margin-top:0; margin-bottom:0; padding-top:0; padding-bottom:0;"><br /></div>' . "\n";
         echo '<h2 style="margin-top:30px;">API / Tracking Integrations</h2>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_after_integrations_header", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_display_idev", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_before_idev", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Integrating iDevAffiliate">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-idev-section">' . "\n";
         echo '<h3>Integrating iDevAffiliate ( affiliate program management )</h3>' . "\n";
         echo '<a href="http://www.optimizepress.com/idev-affiliate" target="_blank"><img src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/idev-logo.gif" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
         echo '<p>Adding affiliate tracking software to your site is one of the most effective ways to achieve more sales, more traffic, and more search engine ranking. <a href="http://www.optimizepress.com/idev-affiliate" target="_blank" rel="external">iDevAffiliate</a> ( an affiliate management portal ), installs in just minutes, and can be integrated seamlessly with optimizeMember. We recommend <a href="http://www.optimizepress.com/idev-affiliate" target="_blank" rel="external">iDevAffiliate Standard</a> ( $99 ) because of its proven track record, and its ability to integrate with optimizeMember using a variety of techniques. The most popular being a Hidden Image Tag.</p>' . "\n";
         echo '<p>If you choose to <a href="http://www.optimizepress.com/idev-affiliate" target="_blank" rel="external">install iDevAffiliate</a>, you will need to configure your <code>iDevAffiliate -> Shopping Cart Integration</code>. Please choose <code>Generic Tracking Pixel</code>. Then, grab your Hidden Image Tag, and pop the code provided by iDevAffiliate into one of the fields for Tracking Codes <em>( at the top of this page )</em>. You MUST also add Replacement Codes to your Hidden Image Tag. To save you some trouble, we\'ve provided some examples below, one for each of optimizeMember\'s Tracking Code integrations.</p>' . "\n";
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_during_idev", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><strong>Signup Tracking Code, for iDevAffiliate integration:</strong></p>' . "\n";
         echo '<p>idev_saleamt=<strong>%%initial%%</strong><br />idev_ordernum=<strong>%%subscr_id%%</strong></p>' . "\n";
         echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/idev-signup-tracking-code.x-php")) . '</p>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><strong>Modification Tracking Code, for iDevAffiliate integration:</strong></p>' . "\n";
         echo '<p>idev_saleamt=<strong>%%initial%%</strong><br />idev_ordernum=<strong>%%subscr_id%%</strong></p>' . "\n";
         echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/idev-modification-tracking-code.x-php")) . '</p>' . "\n";
         /**/
         if (!is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site()) {
             echo '<div class="ws-menu-page-hr"></div>' . "\n";
             echo '<p><strong>Capability Tracking Code, for iDevAffiliate integration:</strong></p>' . "\n";
             echo '<p>idev_saleamt=<strong>%%amount%%</strong><br />idev_ordernum=<strong>%%txn_id%%</strong></p>' . "\n";
             echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/idev-ccap-tracking-code.x-php")) . '</p>' . "\n";
         }
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><strong>Specific Post/Page Tracking Code, for iDevAffiliate integration:</strong></p>' . "\n";
         echo '<p>idev_saleamt=<strong>%%amount%%</strong><br />idev_ordernum=<strong>%%txn_id%%</strong></p>' . "\n";
         echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/idev-sp-tracking-code.x-php")) . '</p>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p>Your <code>profile</code> ID will be assigned by iDevAffiliate. Be sure to replace <code>profile=123</code> with your own profile ID.</p>' . "\n";
         echo '<p><em><strong>*Tip*</strong> iDevAffiliate also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <code>optimizeMember -> API Notifications.</code> A 3rd-party call, is essentially an HTTP connection that runs silently behind-the-scene, as opposed to being loaded in a browser. It\'s a bit more powerful (and reliable), but also more advanced.</em></p>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><em><strong>*Tip*</strong> With <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with optimizeMember Pro. Please check your Dashboard here: <code>optimizeMember -> Pro Coupon Codes -> Affiliate Coupon Codes</code>. This is a VERY powerful feature.</em></p>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_after_idev", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_display_shareasale", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_before_shareasale", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Integrating ShareASale">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-shareasale-section">' . "\n";
         echo '<h3>Integrating ShareASale ( affiliate program management )</h3>' . "\n";
         echo '<a href="http://www.optimizepress.com/shareasale" target="_blank"><img src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/sas-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
         echo '<p>Established in 2000, <a href="http://www.optimizepress.com/shareasale" target="_blank" rel="external">ShareASale</a> provides award winning technology and service; which will enable you to connect with a network of established affiliates, as well as recruit new ones. Joining ShareASale, maximizes your ability to reach the greatest number of affiliates, with the least amount of work. At ShareASale, you\'ll have access to an existing affiliate-base. You place your site on the market, and let their existing affiliates promote your products/services.</p>' . "\n";
         echo '<p>If you <a href="http://www.optimizepress.com/shareasale" target="_blank" rel="external">become a Merchant at ShareASale</a>, you will need to configure your <code>ShareASale -> Sale Tracking</code>. Grab your Hidden Image Tag, and pop the code provided by ShareASale into one of the fields for Tracking Codes <em>( at the top of this page )</em>. You MUST also add Replacement Codes to your Hidden Image Tag. To save you some trouble, we\'ve provided some examples below, one for each of optimizeMember\'s Tracking Code integrations.</p>' . "\n";
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_during_shareasale", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><strong>Signup Tracking Code, for ShareASale integration:</strong></p>' . "\n";
         echo '<p>amount=<strong>%%initial%%</strong><br />tracking=<strong>%%subscr_id%%</strong></p>' . "\n";
         echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/sas-signup-tracking-code.x-php")) . '</p>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><strong>Modification Tracking Code, for ShareASale integration:</strong></p>' . "\n";
         echo '<p>amount=<strong>%%initial%%</strong><br />tracking=<strong>%%subscr_id%%</strong></p>' . "\n";
         echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/sas-modification-tracking-code.x-php")) . '</p>' . "\n";
         /**/
         if (!is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site()) {
             echo '<div class="ws-menu-page-hr"></div>' . "\n";
             echo '<p><strong>Capability Tracking Code, for ShareASale integration:</strong></p>' . "\n";
             echo '<p>amount=<strong>%%amount%%</strong><br />tracking=<strong>%%txn_id%%</strong></p>' . "\n";
             echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/sas-ccap-tracking-code.x-php")) . '</p>' . "\n";
         }
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><strong>Specific Post/Page Tracking Code, for ShareASale integration:</strong></p>' . "\n";
         echo '<p>amount=<strong>%%amount%%</strong><br />tracking=<strong>%%txn_id%%</strong></p>' . "\n";
         echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/sas-sp-tracking-code.x-php")) . '</p>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p>Your <code>merchantID</code> will be assigned by ShareASale. Be sure to replace <code>merchantID=123</code> with the one they assign you.</p>' . "\n";
         echo '<p><em><strong>*Tip*</strong> ShareASale also provides an alternative method, using a 3rd-party call. The alternative 3rd-party call, could be used with <code>optimizeMember -> API Notifications.</code> A 3rd-party call, is essentially an HTTP connection that runs silently behind-the-scene, as opposed to being loaded in a browser. It\'s a bit more powerful (and reliable), but also more advanced.</em></p>' . "\n";
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><em><strong>*Tip*</strong> With <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with ShareASale. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with optimizeMember Pro. Please check your Dashboard here: <code>optimizeMember -> Pro Coupon Codes -> Affiliate Coupon Codes</code>. This is a VERY powerful feature.</em></p>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_after_shareasale", get_defined_vars());
     }
     /**/
     if (apply_filters("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_display_other_methods", true, get_defined_vars())) {
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_before_other_methods", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-group" title="Other Tracking Methods Available">' . "\n";
         /**/
         echo '<div class="ws-menu-page-section ws-plugin--optimizemember-other-methods-section">' . "\n";
         echo '<h3>Other Tracking Methods Are Available ( there\'s always a way )</h3>' . "\n";
         echo '<p>Check the optimizeMember API Notifications panel. You\'ll find additional layers of automation available through the use of the `Signup`, `Registration`, `Payment`, `Modification`, `EOT/Deletion`, `Refund/Reversal`, and `Specific Post/Page` Notifications that are available to you through the optimizeMember API. The optimizeMember API Notifications make it possible to integrate with 3rd party applications; like list servers, affiliate programs, and other back-office routines; in more advanced ways. Since optimizeMember API Notifications operate silently on the back-end, they tend to be more reliable and also more versatile. That being said, nothing replaces the simplicity of Tracking Codes. The more advanced API Notifications are NOT always the best tool for the job. For instance, API Notifications will NOT work with Google Analytics, or 1 pixel &lt;img&gt; tags. They operate silently behind-the-scene, using HTTP connections, as opposed to being loaded in a browser.</p>' . "\n";
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_during_other_methods", get_defined_vars());
         /**/
         echo '<div class="ws-menu-page-hr"></div>' . "\n";
         echo '<p><em><strong>*Tip*</strong> With <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro Forms</a>, it\'s possible to integrate Affiliate Coupon Codes with iDevAffiliate. Each of your affiliates can add their affiliate ID onto the end of any valid Coupon Code that you\'ve configured with optimizeMember Pro. Please check your Dashboard here: <code>optimizeMember -> Pro Coupon Codes -> Affiliate Coupon Codes</code>. This is a VERY powerful feature.</em></p>' . "\n";
         echo '</div>' . "\n";
         /**/
         echo '</div>' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_trk_ops_page_during_left_sections_after_other_methods", get_defined_vars());
     }
     /**/
     do_action("ws_plugin__optimizemember_during_trk_ops_page_after_left_sections", get_defined_vars());
     /**/
     // echo '<div class="ws-menu-page-hr"></div>' . "\n";
     /**/
     echo '<p class="submit"><input type="submit" class="op-pb-button green" value="Save All Changes" /></p>' . "\n";
     /**/
     echo '</form>' . "\n";
     /**/
     echo '</td>' . "\n";
     /**/
     echo '<td class="ws-menu-page-table-r">' . "\n";
     c_ws_plugin__optimizemember_menu_pages_rs::display();
     echo '</td>' . "\n";
     /**/
     echo '</tr>' . "\n";
     echo '</tbody>' . "\n";
     echo '</table>' . "\n";
     /**/
     echo '</div>' . "\n";
     echo '</div>' . "\n";
 }
Example #8
0
 public function __construct()
 {
     echo '<div class="wrap ws-menu-page op-bsw-wizard op-bsw-content">' . "\n";
     /**/
     echo '<div class="op-bsw-header">';
     echo '<div class="op-logo"><img src="' . $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images/" . 'logo-optimizepress.png" alt="OptimizePress" height="50" class="animated flipInY"></div>';
     echo '</div>';
     echo '<div class="op-bsw-main-content">';
     echo '<h2>Multisite (Configuration)</h2>' . "\n";
     /**/
     echo '<table class="ws-menu-page-table">' . "\n";
     echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
     echo '<tr class="ws-menu-page-table-tr">' . "\n";
     echo '<td class="ws-menu-page-table-l">' . "\n";
     /**/
     if (is_multisite() && is_main_site()) {
         echo '<form method="post" name="ws_plugin__optimizemember_options_form" id="ws-plugin--optimizemember-options-form">' . "\n";
         echo '<input type="hidden" name="ws_plugin__optimizemember_options_save" id="ws-plugin--optimizemember-options-save" value="' . esc_attr(wp_create_nonce("ws-plugin--optimizemember-options-save")) . '" />' . "\n";
         echo '<input type="hidden" name="ws_plugin__optimizemember_configured" id="ws-plugin--optimizemember-configured" value="1" />' . "\n";
         /**/
         do_action("ws_plugin__optimizemember_during_mms_ops_page_before_left_sections", get_defined_vars());
         /**/
         if (apply_filters("ws_plugin__optimizemember_during_mms_ops_page_during_left_sections_display_mms_patches", true, get_defined_vars())) {
             do_action("ws_plugin__optimizemember_during_mms_ops_page_during_left_sections_before_mms_patches", get_defined_vars());
             /**/
             echo '<div class="ws-menu-page-group" title="Multisite WordPress Patches" default-state="open">' . "\n";
             /**/
             echo '<div class="ws-menu-page-section ws-plugin--optimizemember-mms-patches-section">' . "\n";
             echo '<img src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/small-icon.png" title="optimizeMember ( a Membership management system for WordPress )" alt="" style="float:right; margin:0 0 0 25px; border:0;" />' . "\n";
             echo '<h3>Multisite WordPress Patches ( required for compatiblity )</h3>' . "\n";
             echo '<p>In order for optimizeMember to function properly in a Multisite environment, you MUST implement four patches. One goes into your <code>/wp-login.php</code> file, one into <code>/wp-includes/load.php</code>, one into <code>/wp-includes/ms-functions.php</code>, and another into <code>/wp-admin/user-new.php</code>. Please use the automatic patcher below. All you do is check the box &amp; click Save.</p>' . "\n";
             do_action("ws_plugin__optimizemember_during_mms_ops_page_during_left_sections_during_mms_patches", get_defined_vars());
             /**/
             echo '<table class="form-table">' . "\n";
             echo '<tbody>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-mms-auto-patch">' . "\n";
             echo 'Patch Automatically? ( the easiest way )' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             /**/
             if (defined("DISALLOW_FILE_MODS") && DISALLOW_FILE_MODS) {
                 echo '<select name="ws_plugin__optimizemember_mms_auto_patch" id="ws-plugin--optimizemember-mms-auto-patch" disabled="disabled">' . "\n";
                 echo '<option value="0" selected="selected">No ( I\'ll patch WordPress myself )</option>' . "\n";
                 echo '</select><br />' . "\n";
                 echo '<em class="ws-menu-page-hilite">This is now locked. Your <code>/wp-config.php</code> file says: <code>DISALLOW_FILE_MODS = true</code></em>.' . "\n";
             } else {
                 echo '<select name="ws_plugin__optimizemember_mms_auto_patch" id="ws-plugin--optimizemember-mms-auto-patch">' . "\n";
                 echo '<option value="1"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_auto_patch"] ? ' selected="selected"' : '') . '>Yes ( automatically patch WordPress )</option>' . "\n";
                 echo '<option value="0"' . (!$GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_auto_patch"] ? ' selected="selected"' : '') . '>No ( I\'ll patch WordPress myself )</option>' . "\n";
                 echo '</select><br />' . "\n";
                 echo '<em class="ws-menu-page-hilite">These files MUST be patched, each time you upgrade the WordPress core. If you set this option to <code>Yes ( Patch Automatically )</code>, optimizeMember will patch your installation now, and also in the future, should you upgrade to newer version. That way, you won\'t need to patch manually each time WordPress is upgraded.</em>' . "\n";
             }
             /**/
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '</tbody>' . "\n";
             echo '</table>' . "\n";
             /**/
             echo '<div class="ws-menu-page-hr"></div>' . "\n";
             /**/
             echo '<div id="ws-plugin--optimizemember-mms-patches-details-wrapper">' . "\n";
             echo '<h3>Rather Do It Yourself? ( <a href="#" onclick="jQuery(\'div#ws-plugin--optimizemember-mms-patches-details\').toggle(); return false;" class="ws-dotted-link">manual instructions</a> )</h3>' . "\n";
             echo '<div id="ws-plugin--optimizemember-mms-patches-details" style="display:none;">' . "\n";
             echo '<p><strong>Patch #1</strong> ( /wp-login.php )</p>' . "\n";
             echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/mms-patch-wp-login.x-php")) . '</p>' . "\n";
             echo '<p><strong>Patch #2</strong> ( /wp-includes/load.php )</p>' . "\n";
             echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/mms-patch-load.x-php")) . '</p>' . "\n";
             echo '<p><strong>Patch #3</strong> ( /wp-admin/user-new.php )</p>' . "\n";
             echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/mms-patch-user-new.x-php")) . '</p>' . "\n";
             echo '<p><strong>Patch #4</strong> ( /wp-includes/ms-functions.php )</p>' . "\n";
             echo '<p>' . c_ws_plugin__optimizemember_utils_strings::highlight_php(file_get_contents(dirname(__FILE__) . "/code-samples/mms-patch-ms-functions.x-php")) . '</p>' . "\n";
             echo '<p><em class="ws-menu-page-hilite">Don\'t forget to patch these files again, each time you upgrade the WordPress core.</em></p>' . "\n";
             echo '</div>' . "\n";
             echo '</div>' . "\n";
             echo '</div>' . "\n";
             /**/
             echo '</div>' . "\n";
             /**/
             do_action("ws_plugin__optimizemember_during_mms_ops_page_during_left_sections_after_mms_patches", get_defined_vars());
         }
         /**/
         if (apply_filters("ws_plugin__optimizemember_during_mms_ops_page_during_left_sections_display_mms_registration", true, get_defined_vars())) {
             do_action("ws_plugin__optimizemember_during_mms_ops_page_during_left_sections_before_mms_registration", get_defined_vars());
             /**/
             echo '<div class="ws-menu-page-group" title="Multisite Registration Configuration" default-state="open">' . "\n";
             /**/
             echo '<div class="ws-menu-page-section ws-plugin--optimizemember-mms-registration-section">' . "\n";
             echo '<img src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/large-icon.png" title="optimizeMember ( a Membership management system for WordPress )" alt="" style="float:right; margin:0 0 0 25px; border:0;" />' . "\n";
             echo '<h3>Multisite Registration ( Main Site Configuration )</h3>' . "\n";
             echo '<p>optimizeMember supports Free Subscribers <em>( at Level #0 )</em>, and several Primary Roles created by the optimizeMember plugin (<em> i.e. optimizeMember Levels 1-4, or up to the number of configured Levels )</em>. If you want your visitors to be capable of registering absolutely free, you will want to "allow" Open Registration. Whenever a visitor registers without paying, they\'ll automatically become a Free Subscriber, at Level #0.</p>' . "\n";
             echo '<p><strong>Running A Multisite Blog Farm?</strong> With Multisite Networking enabled, your Main Site could ALSO offer a Customer access to create a Blog of their own <em>( optional )</em>, where a Customer becomes a "Member" of your Main Site, and also a Blog Owner/Administrator of at least one other Blog on your Network. With optimizeMember installed <em>( Network wide )</em>, each of your Blog Owners could offer Membership too, using a single copy of the optimizeMember plugin, which is a great selling point<em>!</em> We refer to this type of installation as a Multisite Blog Farm.</p>' . "\n";
             echo '<p>Multisite Networking makes a new Registration Form available <em>( driven by your theme )</em>; which we refer to as: <code>/wp-signup.php</code>. If, and only if, you\'re planning to offer Blogs, you MUST use <a href="' . esc_attr(c_ws_plugin__optimizemember_utils_urls::wp_signup_url()) . '" target="_blank" rel="external" onclick="alert(\'optimizeMember will now open your Multisite Registration Form.\\n* optimizeMember makes this form available to logged-in Super Administrators, at all times ( for testing purposes ), regardless of configuration.' . (c_ws_plugin__optimizemember_utils_conds::bp_is_installed() ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( ' . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(c_ws_plugin__optimizemember_utils_urls::bp_register_url()) . ' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '') . '\');">/wp-signup.php</a>, instead of using the Standard Login/Registration Form. In a Multisite installation, we refer to the Standard Login/Registration Form, as: <a href="' . esc_attr(c_ws_plugin__optimizemember_utils_urls::wp_register_url()) . '" target="_blank" rel="external" onclick="alert(\'optimizeMember will now open your Standard Registration Form.\\n* optimizeMember makes this form available to logged-in Administrators, at all times ( for testing purposes ), regardless of configuration.' . (c_ws_plugin__optimizemember_utils_conds::bp_is_installed() ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( ' . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(c_ws_plugin__optimizemember_utils_urls::bp_register_url()) . ' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '') . '\');">/wp-login.php?action=register</a>. If you\'re planning to offer Membership Access only, and NOT Blogs, you can simply use the <a href="' . esc_attr(c_ws_plugin__optimizemember_utils_urls::wp_register_url()) . '" target="_blank" rel="external" onclick="alert(\'optimizeMember will now open your Standard Registration Form.\\n* optimizeMember makes this form available to logged-in Administrators, at all times ( for testing purposes ), regardless of configuration.' . (c_ws_plugin__optimizemember_utils_conds::bp_is_installed() ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( ' . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(c_ws_plugin__optimizemember_utils_urls::bp_register_url()) . ' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '') . '\');">Standard Login/Registration Form</a>, which is easily customized through <code>optimizeMember -> General Options -> Login/Registration Design</code>.</p>' . "\n";
             echo '<p>In either case, optimizeMember Pro Forms are possible too. If you\'ve purchased optimizeMember Pro, you could use Pro Forms instead of these WordPress defaults. That being said, even with optimizeMember Pro Forms, if you are offering Blogs, you will still need to facilitate the actual creation of each Blog through <code>/wp-signup.php</code>. In other words, Customers can register through optimizeMember Pro Forms, and even checkout. But when it comes time to setup a new Blog, you will need to redirect your Customer to <code>/wp-signup.php</code>, while they are logged-in. This will allow them to create a new Blog on your Network. That is, if they are allowed to <em>( based on your configuration below )</em>.</p>' . "\n";
             echo c_ws_plugin__optimizemember_utils_conds::bp_is_installed() ? '<p><em><strong>BuddyPress:</strong> BuddyPress will use its own Registration Form, powered by your theme.<br />( BuddyPress can handle both Membership and Blog creation in its integration )<br />( <a href="' . esc_attr(c_ws_plugin__optimizemember_utils_urls::bp_register_url()) . '" target="_blank" rel="external" onclick="alert(\'optimizeMember will now open your BuddyPress Registration Form.\\n* However, you will probably be redirected away from this BuddyPress Registration Form ( ' . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(c_ws_plugin__optimizemember_utils_urls::bp_register_url()) . ' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.\');">' . esc_html(c_ws_plugin__optimizemember_utils_urls::bp_register_url()) . '</a> )</em></p>' . "\n" : '';
             do_action("ws_plugin__optimizemember_during_mms_ops_page_during_left_sections_during_mms_registration", get_defined_vars());
             /**/
             echo '<div id="ws-plugin--optimizemember-mms-registration-support-package-details-wrapper">' . "\n";
             echo '<h4 style="margin-bottom:0;">Running a Multisite Blog Farm? ( <a href="#" onclick="jQuery(\'div#ws-plugin--optimizemember-mms-registration-support-package-details\').toggle(); return false;" class="ws-dotted-link">click here / please read</a> )</h4>' . "\n";
             echo '<div id="ws-plugin--optimizemember-mms-registration-support-package-details" style="display:none;">' . "\n";
             echo '<p>The most important thing to do when setting up a Blog Farm with optimizeMember, is to add this line to your <code>/wp-config.php</code> file: <code><span style="color:#0000BB;">define</span><span style="color:#007700;">(</span><span style="color:#DD0000;">"MULTISITE_FARM"</span>, <span style="color:#0000BB;">true</span><span style="color:#007700;">);</span></code>. This will add a default layer of security, to all Blogs within your Network, with respect to optimizeMember. <strong>But, before you go live</strong>, please contact <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember.com</a> for full documentation. There is some additional functionality that can be enabled for security on a Blog Farm installation; and also some menus/documentation/functionality that can be disabled. You will be asked to purchase our <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">Network Support Package</a> when you need assistance in this regard.</p>' . "\n";
             echo '<p>Multisite Blog Farms require a site owner that fully understands the potential security risks associated with Blog Farming. optimizeMember\'s <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">Network Support Package</a> provides you with the information you need, and priority support for anything about optimizeMember that you don\'t understand. In addition, our Network Support Package includes a lengthy PDF file that details a list of things affected by <code><span style="color:#0000BB;">define</span><span style="color:#007700;">(</span><span style="color:#DD0000;">"MULTISITE_FARM"</span>, <span style="color:#0000BB;">true</span><span style="color:#007700;">);</span></code>, best practices, and other supplemental documentation focused on Blog Farms.</p>' . "\n";
             echo '<p><em><strong>Definition of a Multisite Blog Farm:</strong> If your Network is making it possible for "Members" of your Main Site, to create and/or manage Blogs (in any way), optimizeMember will consider your installation to be a Multisite Blog Farm. That being said, some site owners run a Multisite Network for the purpose of maintaining their own sites. The term Multisite Blog Farm does NOT apply to a Network that hosts multiple Child Blogs, all of which are operated by a single site owner and/or a single company. Again, a Multisite Blog Farm ( in the eyes of optimizeMember ), is any Network that is making it possible for "Members" of its Main Site, to create and/or manage Blogs; where one or more of these Child Blogs is being administered by a Customer ( e.g. if you offer both Membership and Blog creation, as configured below ).</em></p>' . "\n";
             echo '<p><em><strong>When NOT to run a Multisite Blog Farm:</strong> If you run a Multisite Network for the purpose of maintaining your own sites. You should NOT run a Multisite Blog Farm. You can still activate optimizeMember Network-wide, if you like ( optional ), but the advanced security considerations offered through optimizeMember\'s Multisite Blog Farm functionality are NOT needed in this case; because all of the Child Blogs in your Network belong to trusted Administrators ( i.e. your Customers are NOT going to run Child Blogs on your Network in this case ).</em></p>' . "\n";
             echo '</div>' . "\n";
             echo '</div>' . "\n";
             /**/
             echo '<div class="ws-menu-page-hr"></div>' . "\n";
             /**/
             echo '<table class="form-table">' . "\n";
             echo '<tbody>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-mms-registration-file">' . "\n";
             echo 'What Do You Plan To Offer? ( please choose one )' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             /**/
             if (defined("MULTISITE_FARM") && MULTISITE_FARM) {
                 echo '<select name="ws_plugin__optimizemember_mms_registration_file" id="ws-plugin--optimizemember-mms-registration-file" disabled="disabled">' . "\n";
                 echo '<option value="wp-signup" selected="selected">Blog Farm ( I plan to offer both Membership &amp; Blog creation )</option>' . "\n";
                 echo '</select><br />' . "\n";
                 echo '<em class="ws-menu-page-hilite">This is now locked. Your <code>/wp-config.php</code> file says: <code>MULTISITE_FARM = true</code></em>.' . "\n";
             } else {
                 echo '<select name="ws_plugin__optimizemember_mms_registration_file" id="ws-plugin--optimizemember-mms-registration-file">' . "\n";
                 echo '<option value="wp-login"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_registration_file"] === "wp-login" ? ' selected="selected"' : '') . '>Membership Only ( I\'m NOT offering Blogs )</option>' . "\n";
                 echo '<option value="wp-signup"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_registration_file"] === "wp-signup" ? ' selected="selected"' : '') . '>Blog Farm ( I plan to offer both Membership &amp; Blog creation )</option>' . "\n";
                 echo '</select><br />' . "\n";
                 echo 'Depending on your selection, the options below may change.' . "\n";
             }
             /**/
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '</tbody>' . "\n";
             echo '</table>' . "\n";
             /**/
             echo '<div class="ws-menu-page-hr"></div>' . "\n";
             /**/
             echo '<table class="form-table ws-plugin--optimizemember-mms-registration-wp-login" style="margin:0;">' . "\n";
             echo '<tbody>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<th style="padding-top:0;">' . "\n";
             echo '<label for="ws-plugin--optimizemember-allow-subscribers-in">' . "\n";
             echo 'Your Main Site / Allow Open Registration? ( via <code>wp-login.php?action=register</code> )' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td>' . "\n";
             echo '<select name="ws_plugin__optimizemember_allow_subscribers_in" id="ws-plugin--optimizemember-allow-subscribers-in">' . "\n";
             echo '<option value="0"' . (!$GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["allow_subscribers_in"] ? ' selected="selected"' : '') . '>No ( do NOT allow Open Registration )</option>' . "\n";
             echo '<option value="1"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["allow_subscribers_in"] ? ' selected="selected"' : '') . '>Yes ( allow Open Registration; Free Subscribers at Level #0 )</option>' . "\n";
             echo '</select><br />' . "\n";
             echo 'If you set this to <code>Yes</code>, you\'re unlocking <a href="' . esc_attr(c_ws_plugin__optimizemember_utils_urls::wp_register_url()) . '" target="_blank" rel="external" onclick="alert(\'optimizeMember will now open your Standard Registration Form.\\n* optimizeMember makes this form available to logged-in Administrators, at all times ( for testing purposes ), regardless of configuration.' . (c_ws_plugin__optimizemember_utils_conds::bp_is_installed() ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( ' . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(c_ws_plugin__optimizemember_utils_urls::bp_register_url()) . ' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '') . '\');">wp-login.php?action=register</a> ( on your Main Site ). When a visitor registers without paying, they\'ll automatically become a Free Subscriber, at Level #0. The optimizeMember software reserves Level #0; to be used ONLY for Free Subscribers. All other Membership Levels [1-4] require payment.' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '</tbody>' . "\n";
             echo '</table>' . "\n";
             /**/
             echo '<table class="form-table ws-plugin--optimizemember-mms-registration-wp-signup" style="margin:0;">' . "\n";
             echo '<tbody>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<th style="padding-top:0;">' . "\n";
             echo '<label for="ws-plugin--optimizemember-mms-registration-grants">' . "\n";
             echo 'Your Main Site / Allow Open Registration? ( via <code>wp-signup.php</code> )' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td style="padding-bottom:0;">' . "\n";
             echo '<select name="ws_plugin__optimizemember_mms_registration_grants" id="ws-plugin--optimizemember-mms-registration-grants">' . "\n";
             echo '<option value="none"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_registration_grants"] === "none" ? ' selected="selected"' : '') . '>No ( do NOT allow Open Registration )</option>' . "\n";
             echo '<option value="user"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_registration_grants"] === "user" ? ' selected="selected"' : '') . '>Yes ( allow Open Registration; Free Subscribers at Level #0 )</option>' . "\n";
             echo '<option value="all"' . ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_registration_grants"] === "all" ? ' selected="selected"' : '') . '>Yes ( allow Open Registration; Free Subscribers, with a free Blog too )</option>' . "\n";
             echo '</select><br />' . "\n";
             echo 'If you set this to <code>Yes</code>, you\'re unlocking <a href="' . esc_attr(c_ws_plugin__optimizemember_utils_urls::wp_signup_url()) . '" target="_blank" rel="external" onclick="alert(\'optimizeMember will now open your Multisite Registration Form.\\n* optimizeMember makes this form available to logged-in Super Administrators, at all times ( for testing purposes ), regardless of configuration.' . (c_ws_plugin__optimizemember_utils_conds::bp_is_installed() ? '\\n\\nBuddyPress: * BuddyPress will use its own Registration Form. Please note, you will probably be redirected away from the BuddyPress Registration Form ( ' . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(c_ws_plugin__optimizemember_utils_urls::bp_register_url()) . ' ), because you\\\'re ALREADY logged-in. Please log out before testing BuddyPress registration.' : '') . '\');">wp-signup.php</a> ( on your Main Site ).' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '</tbody>' . "\n";
             echo '</table>' . "\n";
             /**/
             echo '<table class="form-table ws-plugin--optimizemember-mms-registration-wp-signup ws-plugin--optimizemember-mms-registration-wp-signup-blogs-level0">' . "\n";
             echo '<tbody>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<th>' . "\n";
             echo '<label for="ws-plugin--optimizemember-mms-registration-blogs-level0">' . "\n";
             echo 'Level #0 ( Free Subscribers ):' . "\n";
             echo '</label>' . "\n";
             echo '</th>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '<tr>' . "\n";
             /**/
             echo '<td style="padding-bottom:0;">' . "\n";
             echo '<input type="text" autocomplete="off" name="ws_plugin__optimizemember_mms_registration_blogs_level0" id="ws-plugin--optimizemember-mms-registration-blogs-level0" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_registration_blogs_level0"]) . '" /><br />' . "\n";
             echo 'How many blogs can a Free Subscriber create?' . "\n";
             echo '</td>' . "\n";
             /**/
             echo '</tr>' . "\n";
             echo '</tbody>' . "\n";
             echo '</table>' . "\n";
             /**/
             echo '<div class="ws-menu-page-hr ws-plugin--optimizemember-mms-registration-wp-signup"></div>' . "\n";
             /**/
             echo '<table class="form-table ws-plugin--optimizemember-mms-registration-wp-signup" style="margin:0;">' . "\n";
             echo '<tbody>' . "\n";
             /**/
             for ($n = 1; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
                 $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
                 echo '<tr>' . "\n";
                 /**/
                 echo '<th style="padding-top:0;">' . "\n";
                 echo '<label for="ws-plugin--optimizemember-mms-registration-blogs-level' . $n . '">' . "\n";
                 echo 'Membership Level ' . $labelText . ' / Maximum Blogs Allowed:' . "\n";
                 echo '</label>' . "\n";
                 echo '</th>' . "\n";
                 /**/
                 echo '</tr>' . "\n";
                 echo '<tr>' . "\n";
                 /**/
                 echo '<td>' . "\n";
                 echo '<input type="text" autocomplete="off" name="ws_plugin__optimizemember_mms_registration_blogs_level' . $n . '" id="ws-plugin--optimizemember-mms-registration-blogs-level' . $n . '" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["mms_registration_blogs_level" . $n]) . '" /><br />' . "\n";
                 echo 'How many blogs can a Member ( at Level ' . $labelText . ' ) create?' . "\n";
                 echo '</td>' . "\n";
                 /**/
                 echo '</tr>' . "\n";
             }
             /**/
             echo '</tbody>' . "\n";
             echo '</table>' . "\n";
             echo '</div>' . "\n";
             /**/
             echo '</div>' . "\n";
             /**/
             do_action("ws_plugin__optimizemember_during_mms_ops_page_during_left_sections_after_mms_registration", get_defined_vars());
         }
         do_action("ws_plugin__optimizemember_during_mms_ops_page_after_left_sections", get_defined_vars());
         /**/
         //echo '<div class="ws-menu-page-hr"></div>'."\n";
         /**/
         echo '<p class="submit"><input type="submit" class="op-pb-button green" value="Save All Changes" /></p>' . "\n";
         /**/
         echo '</form>' . "\n";
     } else {
         echo '<p style="margin-top:0;"><span class="ws-menu-page-hilite">Your WordPress installation does not have Multisite Networking enabled.<br />Which is perfectly OK :-) Multisite Networking is 100% completely optional.</span></p>' . "\n";
         echo '<img src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/large-icon.png" title="optimizeMember (a Membership management system for WordPress)" alt="" style="float:right; margin:0 0 0 25px; border:0;" />' . "\n";
         /**/
         if (file_exists($ws_plugin__optimizemember_temp = dirname(dirname(dirname(__FILE__))) . "/readme-ms.txt")) {
             echo '<div class="ws-menu-page-hr"></div>' . "\n";
             /**/
             if (!function_exists("NC_Markdown")) {
                 include_once dirname(dirname(__FILE__)) . "/externals/markdown/nc-markdown.inc.php";
             }
             /**/
             $ws_plugin__optimizemember_temp = file_get_contents($ws_plugin__optimizemember_temp);
             $ws_plugin__optimizemember_temp = preg_replace("/(\\=)( )(.+?)( )(\\=)/", "<h3>\$3</h3>", $ws_plugin__optimizemember_temp);
             $ws_plugin__optimizemember_temp = NC_Markdown($ws_plugin__optimizemember_temp);
             /**/
             echo preg_replace("/(\\<a)( href)/i", "\$1" . ' target="_blank" rel="nofollow external"' . "\$2", $ws_plugin__optimizemember_temp);
         }
     }
     /**/
     echo '</td>' . "\n";
     /**/
     echo '<td class="ws-menu-page-table-r">' . "\n";
     c_ws_plugin__optimizemember_menu_pages_rs::display();
     echo '</td>' . "\n";
     /**/
     echo '</tr>' . "\n";
     echo '</tbody>' . "\n";
     echo '</table>' . "\n";
     /**/
     echo '</div>' . "\n";
     echo '</div>' . "\n";
 }
Example #9
0
 /**
  * Parses readme specification keys.
  *
  * @package optimizeMember\Readmes
  * @since 1.5
  *
  * @param str $key A key *( within the specs section )*.
  * @param str $specific_path Optional. Path to a specific readme file to parse. Defaults to that of the software itself.
  * 	When/if a readme-dev.txt file is available, that will be used instead of the default readme.txt.
  * @return str|bool The value of the key, else false if not found.
  */
 public static function parse_readme_value($key = FALSE, $specific_path = FALSE)
 {
     if (!($path = $specific_path)) {
         $path = dirname(dirname(dirname(__FILE__))) . "/readme.txt";
         $dev_path = dirname(dirname(dirname(__FILE__))) . "/readme-dev.txt";
         $path = file_exists($dev_path) ? $dev_path : $path;
     }
     /**/
     return c_ws_plugin__optimizemember_readmes::parse_readme_value($key, $path);
 }
Example #10
0
        public function __construct()
        {
            echo '<div class="wrap ws-menu-page op-bsw-wizard op-bsw-content">' . "\n";
            /**/
            echo '<div class="op-bsw-header">';
            echo '<div class="op-logo"><img src="' . $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images/" . 'logo-optimizepress.png" alt="OptimizePress" height="50" class="animated flipInY"></div>';
            echo '</div>';
            echo '<div class="op-bsw-main-content inline-input-fields">';
            echo '<h2>PayPal Buttons</h2>' . "\n";
            /**/
            echo '<table class="ws-menu-page-table">' . "\n";
            echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
            echo '<tr class="ws-menu-page-table-tr">' . "\n";
            echo '<td class="ws-menu-page-table-l">' . "\n";
            /**/
            do_action("ws_plugin__optimizemember_during_paypal_buttons_page_before_left_sections", get_defined_vars());
            /**/
            for ($n = 1; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
                $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
                if (($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_levelN_buttons = "ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_level" . $n . "_buttons") && apply_filters($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_levelN_buttons, true, get_defined_vars())) {
                    if ($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_levelN_buttons = "ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_level" . $n . "_buttons") {
                        do_action($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_levelN_buttons, get_defined_vars());
                    }
                    /**/
                    echo '<div class="ws-menu-page-group" title="PayPal Buttons For Level ' . $labelText . ' Access">' . "\n";
                    /**/
                    echo '<div class="ws-menu-page-section ws-plugin--optimizemember-level' . $n . '-buttons-section">' . "\n";
                    echo '<h3>Button Code Generator For Level ' . $labelText . ' Access</h3>' . "\n";
                    echo '<p>Very simple. All you do is customize the form fields provided, for each Membership Level that you plan to offer. Then press (Generate Button Code). These special PayPal Buttons are customized to work with optimizeMember seamlessly. Member accounts will be activated instantly, in an automated fashion. When you, or a Member, cancels their Membership, or fails to make payments on time, optimizeMember will automatically terminate their Membership privileges. optimizeMember makes extensive use of the PayPal IPN service. optimizeMember receives updates from PayPal behind-the-scene.</p>' . "\n";
                    echo '<p><em>* Buttons are NOT saved here. This is only a Button Generator. Once you\'ve generated your Button, copy/paste it into your Membership Options Page. If you lose your Button Code, you\'ll need to come back &amp; re-generate a new one. If you\'re in Sandbox Test-Mode, and you\'re NOT using the Shortcode Format, please remember to come back and re-generate your Buttons before you go live.</em></p>' . "\n";
                    /**/
                    if ($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_levelN_buttons = "ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_level" . $n . "_buttons") {
                        do_action($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_levelN_buttons, get_defined_vars());
                    }
                    /**/
                    echo '<table class="form-table">' . "\n";
                    echo '<tbody>' . "\n";
                    echo '<tr>' . "\n";
                    /**/
                    echo '<th class="ws-menu-page-th-side">' . "\n";
                    echo '<label for="ws-plugin--optimizemember-level' . $n . '-shortcode">' . "\n";
                    echo 'Button Code<br />For Level ' . $labelText . ':<br /><br />' . "\n";
                    echo '<div id="ws-plugin--optimizemember-level' . $n . '-button-prev"></div>' . "\n";
                    echo '</label>' . "\n";
                    echo '</th>' . "\n";
                    /**/
                    echo '<td>' . "\n";
                    echo '<form onsubmit="return false;">' . "\n";
                    echo '<p id="ws-plugin--optimizemember-level' . $n . '-trial-line">I\'ll offer the first <input type="text" autocomplete="off" id="ws-plugin--optimizemember-level' . $n . '-trial-period" value="0" size="6" /> <select id="ws-plugin--optimizemember-level' . $n . '-trial-term">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-membership-trial-terms.php"))) . '</select> @ $<input type="text" autocomplete="off" id="ws-plugin--optimizemember-level' . $n . '-trial-amount" value="0.00" size="4" /></p>' . "\n";
                    echo '<p><span id="ws-plugin--optimizemember-level' . $n . '-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--optimizemember-level' . $n . '-amount" value="0.01" size="4" /> / <select id="ws-plugin--optimizemember-level' . $n . '-term" class="paypal-buttons-subscription-select">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
                    echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by optimizeMember; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-level' . $n . '-page-style" value="paypal" size="18" class="paypal-buttons-checkout-page-style-input" /> <select id="ws-plugin--optimizemember-level' . $n . '-currency">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__optimizemember_paypalButtonGenerate(\'level' . $n . '\');" class="button-primary" /></p>' . "\n";
                    echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-level' . $n . '-desc" class="paypal-buttons-description-input" value="' . format_to_edit($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_label"]) . ' / description and pricing details here." size="73" /></p>' . "\n";
                    //echo '<p' . ((is_multisite () && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities ( comma-delimited ) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: optimizeMember -> API Scripting -> Custom Capabilities.\\n\\n*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell optimizeMember to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\\n\\nOr to just (Remove All) and (Add) nothing:\\n-all\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--optimizemember-level' . $n . '-ccaps" size="40" /></p>' . "\n";
                    echo 'Packages: ';
                    if (count($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"]) > 0) {
                        foreach ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"] as $key => $val) {
                            echo '<input type="checkbox" onchange="showSelectedValues(\'ccpchk_' . $n . '\', \'ccaps\', ' . $n . ');" name="ws_plugin__optimizemember_ccpchk_' . $n . '" value="' . $val . '" /> ' . $val . "\n";
                        }
                    } else {
                        echo 'To use packages, enter some first in <a href="' . esc_attr(admin_url("/admin.php?page=ws-plugin--optimizemember-gen-ops")) . '">Define membership levels and packages section.</a>';
                    }
                    echo '<input type="hidden" autocomplete="off" name="ws_plugin__optimizemember_security_meta_box_ccaps" id="ws-plugin--optimizemember-level' . $n . '-ccaps" value="" />' . "\n";
                    ?>

										<?php 
                    echo '</form>' . "\n";
                    echo '</td>' . "\n";
                    /**/
                    echo '</tr>' . "\n";
                    echo '<tr>' . "\n";
                    /**/
                    echo '<td colspan="2">' . "\n";
                    echo '<form onsubmit="return false;">' . "\n";
                    /**/
                    if ($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_levelN_buttons_before_shortcode = "ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_level" . $n . "_buttons_before_shortcode") {
                        do_action($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_levelN_buttons_before_shortcode, get_defined_vars());
                    }
                    /**/
                    echo '<strong>WordPress Shortcode:</strong> ( recommended for both the WordPress Visual &amp; HTML Editors )<br />' . "\n";
                    $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.php")));
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%level%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($n)), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%level_label%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_label"])), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%custom%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($_SERVER["HTTP_HOST"])), $ws_plugin__optimizemember_temp_s);
                    echo '<input type="text" autocomplete="off" id="ws-plugin--optimizemember-level' . $n . '-shortcode" value="' . format_to_edit($ws_plugin__optimizemember_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
                    /**/
                    echo '<div' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? ' style="display:none;"' : '') . '><br />' . "\n";
                    echo '<strong>Resulting PayPal Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
                    echo '<textarea id="ws-plugin--optimizemember-level' . $n . '-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
                    $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/buttons/paypal-checkout-button.php")));
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%endpoint%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%paypal_business%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_business"])), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%level%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($n)), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%level_label%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level" . $n . "_label"])), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%cancel_return%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(home_url("/"))), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%notify_url%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url("/?optimizemember_paypal_notify=1"))), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%return%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url("/?optimizemember_paypal_return=1"))), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%custom%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($_SERVER["HTTP_HOST"])), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%images%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images")), $ws_plugin__optimizemember_temp_s);
                    $ws_plugin__optimizemember_temp_s = preg_replace("/%%wpurl%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url())), $ws_plugin__optimizemember_temp_s);
                    echo format_to_edit($ws_plugin__optimizemember_temp_s);
                    echo '</textarea><br />' . "\n";
                    echo '&uarr; <em>This <span class="ws-menu-page-hilite">may contain PHP code too</span>; so be careful if you use this.</em>' . "\n";
                    echo '</div>' . "\n";
                    /**/
                    echo '</form>' . "\n";
                    echo '</td>' . "\n";
                    /**/
                    echo '</tr>' . "\n";
                    echo '</tbody>' . "\n";
                    echo '</table>' . "\n";
                    echo '</div>' . "\n";
                    /**/
                    echo '</div>' . "\n";
                    /**/
                    if ($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_levelN_buttons = "ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_level" . $n . "_buttons") {
                        do_action($ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_levelN_buttons, get_defined_vars());
                    }
                }
            }
            ?>
							<script type="text/javascript">
							window.showSelectedValues = function(param, elemId, n) {
									var text = jQuery("input[name=ws_plugin__optimizemember_"+param+"]:checked").map(
									     function () {return this.value;}).get().join(",");
									jQuery("#ws-plugin--optimizemember-level"+n+"-" + elemId).val(text);


								}
							window.showSingleSelectedValues = function(param, elemId, n) {
								var text = jQuery("input[name=ws_plugin__optimizemember_"+param+"]:checked").map(
								     function () {return this.value;}).get().join(",");
								jQuery("#ws-plugin--optimizemember-" + elemId + "-ccaps").val(text);


							}
								/**/
							</script>
							<?php 
            /**/
            if (apply_filters("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_modification_buttons", true, get_defined_vars())) {
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_modification_buttons", get_defined_vars());
                /**/
                echo '<div class="ws-menu-page-group" title="PayPal Subscr Modification Buttons">' . "\n";
                /**/
                echo '<div class="ws-menu-page-section ws-plugin--optimizemember-modification-buttons-section">' . "\n";
                echo '<h3>Button Code Generator For Subscription Modifications</h3>' . "\n";
                echo '<p>If you\'d like to give your Members <em>( and/or your Free Subscribers )</em> the ability to modify their billing plan, by switching to a more expensive option, or a less expensive option; generate a new PayPal Modification Button here. Configure the updated Level, pricing, terms, etc. Then, make that new Modification Button available to Members who are logged into their existing account with you. For example, you might want to insert a "Level #2" Upgrade Button into your Login Welcome Page, which would up-sell existing Level #1 Members to a more expensive plan that you offer.</p>' . "\n";
                echo '<p><em><strong>*Important Note*</strong> Modification Buttons should be displayed to existing Users/Members, and they should be logged-in, BEFORE clicking this Button. Otherwise, post-processing of their transaction will fail to recognize the Customer\'s existing account within WordPress. Please display this Button only to Users/Members that are already logged into their account ( perhaps in your Login Welcome Page for optimizeMember ), or in another location where you can be absolutely sure that a User/Member is logged in. optimizeMember\'s Simple Conditionals could also be used to ensure a User/Member is logged in, by wrapping your Shortcode within a Conditional test. For further details, please see: <code>optimizeMember -> API Scripting -> Simple Conditionals</code>.</em></p>' . "\n";
                echo '<p><em><strong>*Modification Process*</strong> When you send a Member to PayPal using a Subscription Modification Button, PayPal will ask them to login. Once they\'re logged in, instead of being able to signup for a new Membership, PayPal will provide them with the ability to upgrade and/or downgrade their existing Membership with you, by allowing them to switch to the Membership Plan that was specified in the Subscription Modification Button. PayPal handles this nicely, and you\'ll be happy to know that optimizeMember has been pre-configured to deal with this scenario as well, so that everything remains automated. Their Membership Access Level will either be promoted, or demoted, based on the actions they took at PayPal during the modification process. Once an existing Member completes their Subscription Modification at PayPal, they\'ll be brought back to their Login Welcome Page, instead of to the registration screen.</em></p>' . "\n";
                echo '<p><em><strong>*Also Works For Free Subscribers*</strong> Although a Free Subscriber does not have an existing PayPal Subscription, optimizeMember is capable of adapting to this scenario gracefully. Just make sure that your existing Free Subscribers <em>( the ones who wish to upgrade )</em> pay for their Membership through a Modification Button generated by optimizeMember. That will allow them to continue using their existing account with you. In other words, they can keep their existing Username <em>( and anything already associated with that Username )</em>, rather than being forced to re-register after checkout.</em></p>' . "\n";
                echo '<p><em><strong>*Make It More User-Friendly*</strong> You can make the Subscription Modification Process, more user-friendly, by setting up a <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can tell optimizeMember to use that Page Style whenever you generate your Button Code.\'); return false;">Custom Page Style at PayPal</a>, specifically for Subscription Modification Buttons. Use a custom header image, with a brief explanation to the Customer. Something like, "Log into PayPal", "You can Modify your Subscription!".</em></p>' . "\n";
                echo '<p><em><strong>*Integrating Conditionals*</strong> Since each Modification Button is configured for a specific Level, you may want to create multiple Modification Buttons, one for each combination you intend to make available. optimizeMember\'s API Conditionals can help you display the proper Button to each Customer, based on the status of their existing account. For further details, see: <code>optimizeMember -> API Scripting</code>.</em></p>' . "\n";
                echo !is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site() ? '<p><em><strong>*Independent Custom Capabilities*</strong> If you just want to sell an existing Member new Custom Capabilities, without affecting their paid Subscription in any way, please see the next Button Generator: <code>Capability (Buy Now) Buttons</code>. Independent Capability Buttons facilitate Buy Now functionality, specifically for Custom Capabilities, without affecting the Customer\'s primary Subscription and Membership Level Access.</em></p>' . "\n" : '';
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_modification_buttons", get_defined_vars());
                /**/
                echo '<table class="form-table">' . "\n";
                echo '<tbody>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<th class="ws-menu-page-th-side">' . "\n";
                echo '<label for="ws-plugin--optimizemember-modification-shortcode">' . "\n";
                echo 'Button Code<br />For Modifications:<br /><br />' . "\n";
                echo '<div id="ws-plugin--optimizemember-modification-button-prev"></div>' . "\n";
                echo '</label>' . "\n";
                echo '</th>' . "\n";
                /**/
                echo '<td>' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                /**/
                echo '<p>Modification: <select id="ws-plugin--optimizemember-modification-level">' . "\n";
                /**/
                for ($n = 1; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
                    $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
                    echo '<optgroup label="Level ' . $labelText . '">' . "\n";
                    echo '<option value="upgrade:' . $n . '">&uarr; Upgrade To Level ' . $labelText . '</option>' . "\n";
                    echo $n < $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"] ? '<option value="downgrade:' . $n . '">&darr; Downgrade To Level ' . $labelText . '</option>' . "\n" : '';
                    echo '</optgroup>' . "\n";
                    /**/
                    echo $n < $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"] ? '<option disabled="disabled"></option>' . "\n" : '';
                }
                /**/
                echo '</select></p>' . "\n";
                /**/
                echo '<p id="ws-plugin--optimizemember-modification-trial-line">I\'ll offer the first <input type="text" autocomplete="off" id="ws-plugin--optimizemember-modification-trial-period" value="0" size="6" /> <select id="ws-plugin--optimizemember-modification-trial-term">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-membership-trial-terms.php"))) . '</select> @ $<input type="text" autocomplete="off" id="ws-plugin--optimizemember-modification-trial-amount" value="0.00" size="4" /></p>' . "\n";
                echo '<p><span id="ws-plugin--optimizemember-modification-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--optimizemember-modification-amount" value="0.01" size="4" /> / <select id="ws-plugin--optimizemember-modification-term" class="paypal-buttons-subscription-select">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select><span id="ws-plugin--optimizemember-modification-20p-rule"><br /><small>* Watch out for <a href="https://www.x.com/thread/41748" target="_blank" rel="external">the 20% rule</a>. Additional details are <a href="http://www.optimizepress.com/paypal-20p-rule" target="_blank" rel="external">documented here</a>.<br />* <strong>Tip</strong> <a href="' . esc_attr(c_ws_plugin__optimizemember_readmes::parse_readme_value("Pro Module / Prices")) . '" target="_blank" rel="external">optimizeMember Pro Forms</a> are NOT subjected to this ridiculous 20% rule.</small></span></p>' . "\n";
                echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by optimizeMember; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-modification-page-style" value="paypal" size="18" class="paypal-buttons-checkout-page-style-input" /> <select id="ws-plugin--optimizemember-modification-currency">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__optimizemember_paypalButtonGenerate(\'modification\');" class="button-primary" /></p>' . "\n";
                echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-modification-desc" class="paypal-buttons-description-input" value="Description and pricing details here." size="73" /></p>' . "\n";
                //echo '<p' . ((is_multisite () && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities ( comma-delimited ) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: optimizeMember -> API Scripting -> Custom Capabilities.\\n\\n*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell optimizeMember to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\\n\\nOr to just (Remove All) and (Add) nothing:\\n-all\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--optimizemember-modification-ccaps" size="40" /></p>' . "\n";
                //echo '<p' . ((is_multisite () && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities ( comma-delimited ) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: optimizeMember -> API Scripting -> Custom Capabilities.\\n\\n*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell optimizeMember to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\\n\\nOr to just (Remove All) and (Add) nothing:\\n-all\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--optimizemember-level' . $n . '-ccaps" size="40" /></p>' . "\n";
                echo 'Packages: ';
                $n = 1;
                if (count($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"]) > 0) {
                    foreach ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"] as $key => $val) {
                        echo '<input type="checkbox" onchange="showSingleSelectedValues(\'ccpchksub_' . $n . '\', \'modification\', ' . $n . ');" name="ws_plugin__optimizemember_ccpchksub_' . $n . '" value="' . $val . '" /> ' . $val . "\n";
                    }
                } else {
                    echo 'To use packages, enter some first in <a href="' . esc_attr(admin_url("/admin.php?page=ws-plugin--optimizemember-gen-ops")) . '">Define membership levels and packages section.</a>';
                }
                echo '<input type="hidden" autocomplete="off" name="ws_plugin__optimizemember_security_meta_box_ccaps" id="ws-plugin--optimizemember-modification-ccaps" value="" />' . "\n";
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<td colspan="2">' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_modification_buttons_before_shortcode", get_defined_vars());
                echo '<strong>WordPress Shortcode:</strong> ( recommended for both the WordPress Visual &amp; HTML Editors )<br />' . "\n";
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.php")));
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%level%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr("1")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%level_label%% /", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level1_label"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%custom%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($_SERVER["HTTP_HOST"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/\\/]\$/", 'modify="1" /]', $ws_plugin__optimizemember_temp_s);
                /* Adds modify="1" to the end of the Shortcode. */
                echo '<input type="text" autocomplete="off" id="ws-plugin--optimizemember-modification-shortcode" value="' . format_to_edit($ws_plugin__optimizemember_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
                /**/
                echo '<div' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? ' style="display:none;"' : '') . '><br />' . "\n";
                echo '<strong>Resulting PayPal Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
                echo '<textarea id="ws-plugin--optimizemember-modification-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/buttons/paypal-checkout-button.php")));
                $ws_plugin__optimizemember_temp_s = preg_replace('/name\\="modify" value\\="(.*?)"/', 'name="modify" value="1"', $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%endpoint%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%paypal_business%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_business"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%level%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr("1")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%level_label%% /", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["level1_label"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%cancel_return%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(home_url("/"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%notify_url%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url("/?optimizemember_paypal_notify=1"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%return%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url("/?optimizemember_paypal_return=1"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%custom%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($_SERVER["HTTP_HOST"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%images%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%wpurl%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url())), $ws_plugin__optimizemember_temp_s);
                echo format_to_edit($ws_plugin__optimizemember_temp_s);
                echo '</textarea><br />' . "\n";
                echo '&uarr; <em>This <span class="ws-menu-page-hilite">may contain PHP code too</span>; so be careful if you use this.</em>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '</tbody>' . "\n";
                echo '</table>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</div>' . "\n";
                /**/
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_modification_buttons", get_defined_vars());
            }
            /**/
            if (apply_filters("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_ccap_buttons", !is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site(), get_defined_vars())) {
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_ccap_buttons", get_defined_vars());
                /**/
                echo '<div class="ws-menu-page-group" title="PayPal Capability (Buy Now) Buttons">' . "\n";
                /**/
                echo '<div class="ws-menu-page-section ws-plugin--optimizemember-ccap-buttons-section">' . "\n";
                echo '<h3>Button Code Generator For Independent Custom Capabilities</h3>' . "\n";
                echo '<p>This is VERY advanced. For further details, please check your Dashboard: <code>optimizeMember -> API Scripting -> Custom Capabiities</code>.</p>' . "\n";
                echo '<p>With optimizeMember, you can sell one or more Custom Capabilities using Buy Now functionality, to "existing" Users/Members, regardless of which Membership Level they have on your site <em>( i.e. you could even sell Independent Custom Capabilities to Users at Membership Level #0, normally referred to as Free Subscribers, if you like )</em>. So this is quite flexible. Independent Custom Capabilities do NOT rely on any specific Membership Level. That\'s why optimizeMember refers to these as `Independent` Custom Capabilities, because you can sell Capabilities this way, through Buy Now functionality, and the Customer\'s Membership Level Access, along with any existing paid Subscription they may already have with you, will remain completely unaffected. That being said, if you intend to charge a recurring fee for Custom Capabilities, please use a <code>Subscr. Modification Button</code> instead; because Independent Custom Capabilities can only be sold through Buy Now functionality.</p>' . "\n";
                echo '<p>Independent Custom Capabilities are added to a Customer\'s account immediately after checkout, and the Customer will have the Custom Capabilities for as long as their Membership lasts, based on their primary Subscription with your site, and/or forever, if they have a Lifetime account with you. In other words, Independent Custom Capabilities will exist on the Customer\'s account forever, or until an EOT <em>( End Of Term )</em> occurs on their primary Subscription with you; in which case optimizeMember would demote or delete the Customer\'s account <em>( based on your EOT configuration )</em>, and all Custom Capabilities are removed as well.</p>' . "\n";
                echo '<p>Very simple. All you do is customize the form fields provided, for each set of Custom Capabilities that you plan to sell. Then press (Generate Button Code). These special PayPal Buttons are customized to work with optimizeMember seamlessly. The Customer will be granted additional access to one or more Custom Capabilities that you specify; while the Customer\'s Membership Level Access and any existing paid Subscription they may already have with you, will remain completely unaffected.</p>' . "\n";
                echo '<p><em><strong>*Important Note*</strong> Independent Custom Capability Buttons should ONLY be displayed to existing Users/Members, and they MUST be logged-in, BEFORE clicking this Button. Otherwise, post-processing of their transaction will fail to recognize the Customer\'s existing account within WordPress. Please display this Button only to Users/Members that are already logged into their account ( perhaps in your Login Welcome Page for optimizeMember ), or in another location where you can be absolutely sure that a User/Member is logged in. optimizeMember\'s Simple Conditionals could also be used to ensure a User/Member is logged in, by wrapping your Shortcode within a Conditional test. For further details, please see: <code>optimizeMember -> API Scripting -> Simple Conditionals</code>.</em></p>' . "\n";
                echo '<p><em>* Buttons are NOT saved here. This is only a Button Generator. Once you\'ve generated your Button, copy/paste it into your WordPress Editor. If you lose your Button Code, you\'ll need to come back &amp; re-generate a new one. If you\'re in Sandbox Test-Mode, and you\'re NOT using the Shortcode Format, please remember to come back and re-generate your Buttons before you go live.</em></p>' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_ccap_buttons", get_defined_vars());
                /**/
                echo '<table class="form-table">' . "\n";
                echo '<tbody>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<th class="ws-menu-page-th-side">' . "\n";
                echo '<label for="ws-plugin--optimizemember-ccap-shortcode">' . "\n";
                echo 'Button Code<br />For Capabilities:<br /><br />' . "\n";
                echo '<div id="ws-plugin--optimizemember-ccap-button-prev"></div>' . "\n";
                echo '</label>' . "\n";
                echo '</th>' . "\n";
                /**/
                echo '<td>' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--optimizemember-ccap-amount" value="0.01" size="4" /> / <select id="ws-plugin--optimizemember-ccap-term">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-membership-ccap-terms.php"))) . '</select></p>' . "\n";
                echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by optimizeMember; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-ccap-page-style" class="paypal-buttons-checkout-page-style-input" value="paypal" size="18" /> <select id="ws-plugin--optimizemember-ccap-currency">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__optimizemember_paypalCcapButtonGenerate();" class="button-primary" /></p>' . "\n";
                echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-ccap-desc" class="paypal-buttons-description-input" value="Description and pricing details here." size="73" /></p>' . "\n";
                //echo '<p>Custom Capabilities ( comma-delimited ) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: optimizeMember -> API Scripting -> Custom Capabilities.\\n\\n*ADVANCED TIP: You can specifiy a list of Custom Capabilities that will be (Added) with this purchase. Or, you could tell optimizeMember to (Remove All) Custom Capabilities that may or may not already exist for a particular Member, and (Add) only the new ones that you specify. To do this, just start your list of Custom Capabilities with `-all`.\\n\\nSo instead of just (Adding) Custom Capabilities:\\nmusic,videos,archives,gifts\\n\\nYou could (Remove All) that may already exist, and then (Add) new ones:\\n-all,calendar,forums,tools\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--optimizemember-ccap-ccaps" size="40" /></p>' . "\n";
                echo 'Packages: ';
                $n = 1;
                if (count($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"]) > 0) {
                    foreach ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"] as $key => $val) {
                        echo '<input type="checkbox" onchange="showSingleSelectedValues(\'ccpchkccaps_' . $n . '\', \'ccap\', ' . $n . ');" name="ws_plugin__optimizemember_ccpchkccaps_' . $n . '" value="' . $val . '" /> ' . $val . "\n";
                    }
                } else {
                    echo 'To use packages, enter some first in <a href="' . esc_attr(admin_url("/admin.php?page=ws-plugin--optimizemember-gen-ops")) . '">Define membership levels and packages section.</a>';
                }
                echo '<input type="hidden" autocomplete="off" name="ws_plugin__optimizemember_security_meta_box_ccaps" id="ws-plugin--optimizemember-ccap-ccaps" value="" />' . "\n";
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<td colspan="2">' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_ccap_buttons_before_shortcode", get_defined_vars());
                echo '<strong>WordPress Shortcode:</strong> ( recommended for both the WordPress Visual &amp; HTML Editors )<br />' . "\n";
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php")));
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%custom%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($_SERVER["HTTP_HOST"])), $ws_plugin__optimizemember_temp_s);
                echo '<input type="text" autocomplete="off" id="ws-plugin--optimizemember-ccap-shortcode" value="' . format_to_edit($ws_plugin__optimizemember_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
                /**/
                echo '<div' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? ' style="display:none;"' : '') . '><br />' . "\n";
                echo '<strong>Resulting PayPal Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
                echo '<textarea id="ws-plugin--optimizemember-ccap-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/buttons/paypal-ccaps-checkout-button.php")));
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%endpoint%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%paypal_business%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_business"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%cancel_return%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(home_url("/"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%notify_url%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url("/?optimizemember_paypal_notify=1"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%return%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url("/?optimizemember_paypal_return=1"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%custom%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($_SERVER["HTTP_HOST"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%images%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%wpurl%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url())), $ws_plugin__optimizemember_temp_s);
                echo format_to_edit($ws_plugin__optimizemember_temp_s);
                echo '</textarea><br />' . "\n";
                echo '&uarr; <em>This <span class="ws-menu-page-hilite">may contain PHP code too</span>; so be careful if you use this.</em>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '</tbody>' . "\n";
                echo '</table>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</div>' . "\n";
                /**/
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_ccap_buttons", get_defined_vars());
            }
            /**/
            if (apply_filters("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_cancellation_buttons", true, get_defined_vars())) {
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_cancellation_buttons", get_defined_vars());
                /**/
                echo '<div class="ws-menu-page-group" title="PayPal Subscr Cancellation Buttons">' . "\n";
                /**/
                echo '<div class="ws-menu-page-section ws-plugin--optimizemember-cancellation-buttons-section">' . "\n";
                echo '<h3>One Button Does It All For Cancellations ( copy/paste )</h3>' . "\n";
                echo '<p>Since all recurring charges are associated with a PayPal Subscription; and every PayPal Subscription is associated with a PayPal Account; your Members will always have a PayPal Account of their own, which is tied to their Membership with you. So... a Member can simply log into their own PayPal account and cancel their Subscription(s) with you at anytime, all on their own. However, some Customers do not realize this. So, if you would like to make it clearer ( easier ) for Members to cancel their own Subscription(s), you can provide this Cancellation Button for them on your Login Welcome Page, or somewhere in the support section of your website. Note... you don\'t have to use this Cancellation Button at all, if you don\'t want to. It\'s completely optional.</p>' . "\n";
                echo '<p><em><strong>*Cancellation Process*</strong> Very simple. A Member clicks the Cancellation Button. PayPal asks them to log into their PayPal account. Once they\'re logged in, PayPal will display a list of all active Subscriptions they have with you. They choose which ones they want to cancel, and optimizeMember is notified silently behind-the-scene, through the PayPal IPN service.</em></p>' . "\n";
                echo '<p><em><strong>*Understanding Cancellations*</strong> It\'s important to realize that a Cancellation is not an EOT ( End Of Term ). All that happens during a Cancellation event, is that billing is stopped, and it\'s understood that the Customer is going to lose access, at some point in the future. This does NOT mean, that access will be revoked immediately. A separate EOT event will automatically handle a (demotion or deletion) later, at the appropriate time; which could be several days, or even a year after the Cancellation took place.</em></p>' . "\n";
                echo '<p><em><strong>*Some Hairy Details*</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through PayPal... but, optimizeMember continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. optimizeMember will only remove the User\'s Membership privileges when an EOT ( End Of Term ) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by optimizeMember.</em></p>' . "\n";
                echo '<p><em>optimizeMember will not process an EOT ( End Of Term ) until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, optimizeMember will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system ( based on your configuration ). optimizeMember also calculates one extra day ( 24 hours ) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_cancellation_buttons", get_defined_vars());
                /**/
                echo '<table class="form-table">' . "\n";
                echo '<tbody>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<th class="ws-menu-page-th-side">' . "\n";
                echo '<label for="ws-plugin--optimizemember-cancellation-shortcode">' . "\n";
                echo 'Button Code<br />For Cancellations:<br /><br />' . "\n";
                echo '<div id="ws-plugin--optimizemember-cancellation-button-prev">' . "\n";
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/buttons/paypal-cancellation-button.php")));
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%endpoint%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%paypal_business%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_business"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%images%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%wpurl%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url())), $ws_plugin__optimizemember_temp_s);
                echo preg_replace("/\\<a/", '<a target="_blank"', $ws_plugin__optimizemember_temp_s);
                echo '</div>' . "\n";
                echo '</label>' . "\n";
                echo '</th>' . "\n";
                /**/
                echo '<td class="align-top">' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                echo '<p>No configuration necessary.</p>' . "\n";
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<td colspan="2">' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_cancellation_buttons_before_shortcode", get_defined_vars());
                echo '<strong>WordPress Shortcode:</strong> ( recommended for both the WordPress Visual &amp; HTML Editors )<br />' . "\n";
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/shortcodes/paypal-cancellation-button-shortcode.php")));
                echo '<input type="text" autocomplete="off" id="ws-plugin--optimizemember-cancellation-shortcode" value="' . format_to_edit($ws_plugin__optimizemember_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
                /**/
                echo '<div' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? ' style="display:none;"' : '') . '><br />' . "\n";
                echo '<strong>Resulting PayPal Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
                echo '<textarea id="ws-plugin--optimizemember-cancellation-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/buttons/paypal-cancellation-button.php")));
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%endpoint%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%paypal_business%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_business"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%images%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%wpurl%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url())), $ws_plugin__optimizemember_temp_s);
                echo format_to_edit($ws_plugin__optimizemember_temp_s);
                echo '</textarea><br />' . "\n";
                echo '&uarr; <em>This <span class="ws-menu-page-hilite">may contain PHP code too</span>; so be careful if you use this.</em>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '</tbody>' . "\n";
                echo '</table>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</div>' . "\n";
                /**/
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_cancellation_buttons", get_defined_vars());
            }
            /**/
            if (apply_filters("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_reg_links", true, get_defined_vars())) {
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_reg_links", get_defined_vars());
                /**/
                echo '<div class="ws-menu-page-group" title="PayPal Member Registration Access Links">' . "\n";
                /**/
                echo '<div class="ws-menu-page-section ws-plugin--optimizemember-reg-links-section">' . "\n";
                echo '<h3>Registration Access Link Generator ( for Customer Service )</h3>' . "\n";
                echo '<p>optimizeMember automatically generates Registration Access Links for your Customers after checkout, and also sends them a link in a Confirmation Email. However, if you ever need to deal with a Customer Service issue that requires a new Registration Access Link to be created manually, you can use this tool for that. Alternatively, you can create their account yourself/manually by going to <code>optimizeMember -> Add A Member</code>. Either of these methods will work fine.</p>' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_reg_links", get_defined_vars());
                /**/
                echo '<table class="form-table">' . "\n";
                echo '<tbody>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<td>' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                echo '<p>Paid Membership Level#: <select id="ws-plugin--optimizemember-reg-link-level" style="min-width:200px;">' . "\n";
                for ($n = 1; $n <= $GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["levels"]; $n++) {
                    $labelText = ws_plugin__optimizemember_getMembershipLabel($n);
                    echo '<option value="' . $n . '">optimizeMember Level ' . $labelText . '</option>' . "\n";
                }
                echo '</select></p>' . "\n";
                echo '<p>Paid Subscr. ID: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-reg-link-subscr-id" value="" size="50" /> <a href="#" onclick="alert(\'The Customer\\\'s Paid Subscr. ID ( aka: Recurring Profile ID, Transaction ID ) must be unique. This value can be obtained from inside your PayPal account under the History tab. Each paying Customer MUST be associated with a unique Paid Subscr. ID. If the Customer is NOT associated with a Paid Subscr. ID, you will need to generate a unique value for this field on your own. But keep in mind, optimizeMember will be unable to maintain future communication with the PayPal IPN ( i.e. Notification ) service if this value does not reflect a real Paid Subscr. ID that exists in your PayPal History log.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
                echo '<p>Custom String Value: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-reg-link-custom" value="' . esc_attr($_SERVER["HTTP_HOST"]) . '" size="30" /> <a href="#" onclick="alert(\'A Paid Subscription is always associated with a Custom String that is passed through the custom=\\\'\\\'' . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(esc_attr($_SERVER["HTTP_HOST"]), 3) . '\\\'\\\' attribute of your Shortcode. This Custom Value, MUST always start with your domain name. However, you can also pipe delimit additional values after your domain, if you need to.\\n\\nFor example:\\n' . c_ws_plugin__optimizemember_utils_strings::esc_js_sq(esc_attr($_SERVER["HTTP_HOST"]), 3) . '|cv1|cv2|cv3\'); return false;" tabindex="-1">[?]</a> <input type="button" value="Generate Access Link" onclick="ws_plugin__optimizemember_paypalRegLinkGenerate();" class="button-primary" /> <img id="ws-plugin--optimizemember-reg-link-loading" src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
                //echo '<p' . ((is_multisite () && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '>Custom Capabilities ( comma-delimited ) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: optimizeMember -> API Scripting -> Custom Capabilities.\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--optimizemember-reg-link-ccaps" size="40" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></p>' . "\n";
                echo 'Packages: ';
                $n = 1;
                if (count($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"]) > 0) {
                    foreach ($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["ccp"] as $key => $val) {
                        echo '<input type="checkbox" onchange="showSingleSelectedValues(\'ccpchkreg_' . $n . '\', \'reg-link\', ' . $n . ');" name="ws_plugin__optimizemember_ccpchkreg_' . $n . '" value="' . $val . '" /> ' . $val . "\n";
                    }
                } else {
                    echo 'To use packages, enter some first in <a href="' . esc_attr(admin_url("/admin.php?page=ws-plugin--optimizemember-gen-ops")) . '">Define membership levels and packages section.</a>';
                }
                echo '<input type="hidden" autocomplete="off" name="ws_plugin__optimizemember_security_meta_box_ccaps" id="ws-plugin--optimizemember-reg-link-ccaps" value="" />' . "\n";
                echo '<p>Fixed Term Length ( for Buy Now transactions ): <input type="text" autocomplete="off" id="ws-plugin--optimizemember-reg-link-fixed-term" value="" size="10" /> <a href="#" onclick="alert(\'If the Customer purchased Membership through a Buy Now transaction ( i.e. there is no Initial/Trial Period and no recurring charges for ongoing access ), you may configure a Fixed Term Length in this field. This way the Customer\\\'s Membership Access is automatically revoked by optimizeMember at the appropriate time. This will be a numeric value, followed by a space, then a single letter.\\n\\nHere are some examples:\\n\\n1 D ( this means 1 Day )\\n1 W ( this means 1 Week )\\n1 M ( this means 1 Month )\\n1 Y ( this means 1 Year )\\n1 L ( this means 1 Lifetime )\'); return false;">[?]</a></p>' . "\n";
                echo '<p id="ws-plugin--optimizemember-reg-link" style="font-family:Consolas, monospace; display:none;"></p>' . "\n";
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '</tbody>' . "\n";
                echo '</table>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</div>' . "\n";
                /**/
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_reg_links", get_defined_vars());
            }
            /**/
            if (apply_filters("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_sp_buttons", true, get_defined_vars())) {
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_sp_buttons", get_defined_vars());
                /**/
                echo '<div class="ws-menu-page-group" title="PayPal Specific Post/Page (Buy Now) Buttons">' . "\n";
                /**/
                echo '<div class="ws-menu-page-section ws-plugin--optimizemember-sp-buttons-section">' . "\n";
                echo '<h3>Button Code Generator For Specific Post/Page Buttons</h3>' . "\n";
                echo '<p>optimizeMember now supports an additional layer of functionality ( very powerful ), which allows you to sell access to specific Posts/Pages that you\'ve created in WordPress. Specific Post/Page Access works independently from Member Level Access. That is, you can sell an unlimited number of Posts/Pages using "Buy Now" Buttons, and your Customers will NOT be required to have a Membership Account with your site in order to receive access. If they are already a Member, that\'s fine, but they won\'t need to be.</p>' . "\n";
                echo '<p>In other words, Customers will NOT need to login, just to receive access to the Specific Post/Page they purchased access to. optimizeMember will immediately redirect the Customer to the Specific Post/Page after checkout is completed successfully. An email is also sent to the Customer with a link ( see: <code>optimizeMember -> PayPal Options -> Specific Post/Page Email</code> ). Authentication is handled automatically through self-expiring links, good for 72 hours by default.</p>' . "\n";
                echo '<p>Specific Post/Page Access, is sort of like selling a product. Only, instead of shipping anything to the Customer, you just give them access to a specific Post/Page on your site; one that you created in WordPress. A Specific Post/Page that is protected by optimizeMember, might contain a download link for your eBook, access to file &amp; music downloads, access to additional support services, and the list goes on and on. The possibilities with this are endless; as long as your digital product can be delivered through access to a WordPress Post/Page that you\'ve created. To protect Specific Posts/Pages, please see: <code>optimizeMember -> Restriction Options -> Specific Post/Page Access</code>. Once you\'ve configured your Specific Post/Page Restrictions, those Posts/Pages will be available in the menus below.</p>' . "\n";
                echo '<p>Very simple. All you do is customize the form fields provided, for each Post/Page that you plan to sell. Then press (Generate Button Code). These special PayPal Buttons are customized to work with optimizeMember seamlessly. You can even Package Additional Posts/Pages together into one transaction.</p>' . "\n";
                echo '<p><em>* Buttons are NOT saved here. This is only a Button Generator. Once you\'ve generated your Button, copy/paste it into your WordPress Editor. If you lose your Button Code, you\'ll need to come back &amp; re-generate a new one. If you\'re in Sandbox Test-Mode, and you\'re NOT using the Shortcode Format, please remember to come back and re-generate your Buttons before you go live.</em></p>' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_sp_buttons", get_defined_vars());
                /**/
                echo '<table class="form-table">' . "\n";
                echo '<tbody>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<th class="ws-menu-page-th-side">' . "\n";
                echo '<label for="ws-plugin--optimizemember-sp-shortcode">' . "\n";
                echo 'Button Code<br />Specific Posts/Pages:<br /><br />' . "\n";
                echo '<div id="ws-plugin--optimizemember-sp-button-prev"></div>' . "\n";
                echo '</label>' . "\n";
                echo '</th>' . "\n";
                /**/
                echo '<td>' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                /**/
                echo '<p><select id="ws-plugin--optimizemember-sp-leading-id">' . "\n";
                echo '<option value="">&mdash; Select a Leading Post/Page that you\'ve protected &mdash;</option>' . "\n";
                /**/
                $ws_plugin__optimizemember_temp_a_singulars = c_ws_plugin__optimizemember_utils_gets::get_all_singulars_with_sp("exclude-conflicts");
                /**/
                foreach ($ws_plugin__optimizemember_temp_a_singulars as $ws_plugin__optimizemember_temp_o) {
                    echo '<option value="' . esc_attr($ws_plugin__optimizemember_temp_o->ID) . '">' . esc_html($ws_plugin__optimizemember_temp_o->post_title) . '</option>' . "\n";
                }
                /**/
                echo '</select> <a href="#" onclick="alert(\'Required. The Leading Post/Page, is what your Customers will land on after checkout.\\n\\n*Tip* If there are no Posts/Pages in the menu, it\\\'s because you\\\'ve not configured optimizeMember for Specific Post/Page Access yet. See: optimizeMember -> Restriction Options -> Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
                /**/
                echo '<p><select id="ws-plugin--optimizemember-sp-additional-ids" multiple="multiple" style="height:100px;">' . "\n";
                echo '<optgroup label="&mdash; Package Additional Posts/Pages that you\'ve protected &mdash;">' . "\n";
                /**/
                foreach ($ws_plugin__optimizemember_temp_a_singulars as $ws_plugin__optimizemember_temp_o) {
                    echo '<option value="' . esc_attr($ws_plugin__optimizemember_temp_o->ID) . '">' . esc_html($ws_plugin__optimizemember_temp_o->post_title) . '</option>' . "\n";
                }
                /**/
                echo '</optgroup></select> <a href="#" onclick="alert(\'Hold down your `Ctrl` key to select multiples.\\n\\nOptional. If you include Additional Posts/Pages, Customers will still land on your Leading Post/Page; BUT, they\\\'ll ALSO have access to some Additional Posts/Pages that you\\\'ve protected. This gives you the ability to create Post/Page Packages.\\n\\nIn other words, a Customer is sold a Specific Post/Page ( they\\\'ll land on your Leading Post/Page after checkout ), which might contain links to some other Posts/Pages that you\\\'ve packaged together under one transaction.\\n\\nBundling Additional Posts/Pages into one Package, authenticates the Customer for access to the Additional Posts/Pages automatically ( e.g. only one Access Link is needed, and optimizeMember generates this automatically ). However, you will STILL need to design your Leading Post/Page ( which is what a Customer will actually land on ), with links pointing to the other Posts/Pages. This way your Customers will have clickable links to everything they\\\'ve paid for.\\n\\n*Quick Summary* optimizeMember sends Customers to your Leading Post/Page, and also authenticates them for access to any Additional Posts/Pages automatically. You handle it from there.\\n\\n*Tip* If there are no Posts/Pages in this menu, it\\\'s because you\\\'ve not configured optimizeMember for Specific Post/Page Access yet. See: optimizeMember -> Restriction Options -> Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
                /**/
                echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--optimizemember-sp-amount" value="0.01" size="4" /> / <select id="ws-plugin--optimizemember-sp-hours" class="paypal-buttons-subscription-select">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-sp-hours.php"))) . '</select></p>' . "\n";
                echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-sp-desc" class="paypal-buttons-description-input" value="Description and pricing details here." size="68" /></p>' . "\n";
                echo '<p>Checkout Page Style <a href="#" onclick="alert(\'Optional. This can be configured inside your PayPal account. PayPal allows you to create Custom Page Styles, and assign a unique name to them. You can add your own header image and color selection to the checkout form. Once you\\\'ve created a Custom Page Style at PayPal, you can enter that Page Style here.\\n\\nIn addition. The Shortcode below, provided by optimizeMember; supports an image attribute: image=\\\'\\\'default\\\'\\\'. This can be changed to a full URL, pointing to a custom image of your own; instead of the default PayPal Button image.\'); return false;" tabindex="-1">[?]</a>: <input type="text" autocomplete="off" id="ws-plugin--optimizemember-sp-page-style" class="paypal-buttons-checkout-page-style-input" value="paypal" size="18" /> <select id="ws-plugin--optimizemember-sp-currency">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__optimizemember_paypalSpButtonGenerate();" class="button-primary" /></p>' . "\n";
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<td colspan="2">' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_sp_buttons_before_shortcode", get_defined_vars());
                echo '<strong>WordPress Shortcode:</strong> ( recommended for both the WordPress Visual &amp; HTML Editors )<br />' . "\n";
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/shortcodes/paypal-sp-checkout-button-shortcode.php")));
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%custom%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($_SERVER["HTTP_HOST"])), $ws_plugin__optimizemember_temp_s);
                echo '<input type="text" autocomplete="off" id="ws-plugin--optimizemember-sp-shortcode" value="' . format_to_edit($ws_plugin__optimizemember_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
                /**/
                echo '<div' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? ' style="display:none;"' : '') . '><br />' . "\n";
                echo '<strong>Resulting PayPal Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
                echo '<textarea id="ws-plugin--optimizemember-sp-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
                $ws_plugin__optimizemember_temp_s = trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/buttons/paypal-sp-checkout-button.php")));
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%endpoint%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%paypal_business%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["paypal_business"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%cancel_return%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(home_url("/"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%notify_url%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url("/?optimizemember_paypal_notify=1"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%return%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url("/?optimizemember_paypal_return=1"))), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%custom%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($_SERVER["HTTP_HOST"])), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%images%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"] . "/images")), $ws_plugin__optimizemember_temp_s);
                $ws_plugin__optimizemember_temp_s = preg_replace("/%%wpurl%%/", c_ws_plugin__optimizemember_utils_strings::esc_ds(esc_attr(site_url())), $ws_plugin__optimizemember_temp_s);
                echo format_to_edit($ws_plugin__optimizemember_temp_s);
                echo '</textarea><br />' . "\n";
                echo '&uarr; <em>This <span class="ws-menu-page-hilite">may contain PHP code too</span>; so be careful if you use this.</em>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '</tbody>' . "\n";
                echo '</table>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</div>' . "\n";
                /**/
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_sp_buttons", get_defined_vars());
            }
            /**/
            if (apply_filters("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_sp_links", true, get_defined_vars())) {
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_sp_links", get_defined_vars());
                /**/
                echo '<div class="ws-menu-page-group" title="PayPal Specific Post/Page Access Links">' . "\n";
                /**/
                echo '<div class="ws-menu-page-section ws-plugin--optimizemember-sp-links-section">' . "\n";
                echo '<h3>Specific Post/Page Link Generator ( for Customer Service )</h3>' . "\n";
                echo '<p>optimizeMember automatically generates Specific Post/Page Links for your Customers after checkout, and also sends them a link in a Confirmation Email. However, if you ever need to deal with a Customer Service issue that requires a new Specific Post/Page Link to be created manually, you can use this tool for that.</p>' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_sp_links", get_defined_vars());
                /**/
                echo '<table class="form-table">' . "\n";
                echo '<tbody>' . "\n";
                echo '<tr>' . "\n";
                /**/
                echo '<td>' . "\n";
                echo '<form onsubmit="return false;">' . "\n";
                /**/
                echo '<p><select id="ws-plugin--optimizemember-sp-link-leading-id">' . "\n";
                echo '<option value="">&mdash; Select a Leading Post/Page that you\'ve protected &mdash;</option>' . "\n";
                /**/
                $ws_plugin__optimizemember_temp_a_singulars = c_ws_plugin__optimizemember_utils_gets::get_all_singulars_with_sp("exclude-conflicts");
                /**/
                foreach ($ws_plugin__optimizemember_temp_a_singulars as $ws_plugin__optimizemember_temp_o) {
                    echo '<option value="' . esc_attr($ws_plugin__optimizemember_temp_o->ID) . '">' . esc_html($ws_plugin__optimizemember_temp_o->post_title) . '</option>' . "\n";
                }
                /**/
                echo '</select> <a href="#" onclick="alert(\'Required. The Leading Post/Page, is what your Customers will land on after checkout.\\n\\n*Tip* If there are no Posts/Pages in the menu, it\\\'s because you\\\'ve not configured optimizeMember for Specific Post/Page Access yet. See: optimizeMember -> Restriction Options -> Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
                /**/
                echo '<p><select id="ws-plugin--optimizemember-sp-link-additional-ids" multiple="multiple" style="height:100px; min-width:450px;">' . "\n";
                echo '<optgroup label="&mdash; Package Additional Posts/Pages that you\'ve protected &mdash;">' . "\n";
                /**/
                foreach ($ws_plugin__optimizemember_temp_a_singulars as $ws_plugin__optimizemember_temp_o) {
                    echo '<option value="' . esc_attr($ws_plugin__optimizemember_temp_o->ID) . '">' . esc_html($ws_plugin__optimizemember_temp_o->post_title) . '</option>' . "\n";
                }
                /**/
                echo '</optgroup></select> <a href="#" onclick="alert(\'Hold down your `Ctrl` key to select multiples.\\n\\nOptional. If you include Additional Posts/Pages, Customers will still land on your Leading Post/Page; BUT, they\\\'ll ALSO have access to some Additional Posts/Pages that you\\\'ve protected. This gives you the ability to create Post/Page Packages.\\n\\nIn other words, a Customer is sold a Specific Post/Page ( they\\\'ll land on your Leading Post/Page after checkout ), which might contain links to some other Posts/Pages that you\\\'ve packaged together under one transaction.\\n\\nBundling Additional Posts/Pages into one Package, authenticates the Customer for access to the Additional Posts/Pages automatically ( e.g. only one Access Link is needed, and optimizeMember generates this automatically ). However, you will STILL need to design your Leading Post/Page ( which is what a Customer will actually land on ), with links pointing to the other Posts/Pages. This way your Customers will have clickable links to everything they\\\'ve paid for.\\n\\n*Quick Summary* optimizeMember sends Customers to your Leading Post/Page, and also authenticates them for access to any Additional Posts/Pages automatically. You handle it from there.\\n\\n*Tip* If there are no Posts/Pages in this menu, it\\\'s because you\\\'ve not configured optimizeMember for Specific Post/Page Access yet. See: optimizeMember -> Restriction Options -> Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
                /**/
                echo '<p><select id="ws-plugin--optimizemember-sp-link-hours">' . trim(c_ws_plugin__optimizemember_utilities::evl(file_get_contents(dirname(dirname(__FILE__)) . "/templates/options/paypal-sp-hours.php"))) . '</select> <input type="button" value="Generate Access Link" onclick="ws_plugin__optimizemember_paypalSpLinkGenerate();" class="button-primary" /> <img id="ws-plugin--optimizemember-sp-link-loading" src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["optimizemember"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
                echo '<p id="ws-plugin--optimizemember-sp-link" style="font-family:Consolas, monospace; display:none;"></p>' . "\n";
                echo '</form>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '</tbody>' . "\n";
                echo '</table>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</div>' . "\n";
                /**/
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_sp_links", get_defined_vars());
            }
            /**/
            if (apply_filters("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_display_shortcode_attrs", true, get_defined_vars())) {
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_before_shortcode_attrs", get_defined_vars());
                /**/
                echo '<div class="ws-menu-page-group" title="Shortcode Attributes ( Explained )">' . "\n";
                /**/
                echo '<div class="ws-menu-page-section ws-plugin--optimizemember-shortcode-attrs-section">' . "\n";
                echo '<h3>Shortcode Attributes ( Explained In Full Detail )</h3>' . "\n";
                echo '<p>When you generate a Button Code, optimizeMember will make a <a href="http://codex.wordpress.org/Shortcode_API#Overview" target="_blank" rel="external">Shortcode</a> available to you. Like most Shortcodes for WordPress, optimizeMember reads Attributes in your Shortcode. These Attributes will be pre-configured by one of optimizeMember\'s Button Generators automatically; so there really is nothing more you need to do. However, many site owners like to know exactly how these Shortcode Attributes work. Below, is a brief overview of each possible Shortcode Attribute.</p>' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_shortcode_attrs", get_defined_vars());
                /**/
                echo '<table class="form-table" style="margin-top:0;">' . "\n";
                echo '<tbody>' . "\n";
                echo '<tr style="padding-top:0;">' . "\n";
                /**/
                echo '<td style="padding-top:0;">' . "\n";
                echo '<ul>' . "\n";
                echo '<li><code>cancel="0"</code> Cancellation Button. Only valid w/ Membership Level Access. Possible values: <code>0</code> = this is NOT a Cancellation Button, <code>1</code> = this IS a Cancellation Button.</li>' . "\n";
                echo '<li><code>cc="USD"</code> 3 character Currency Code. Not valid when <code>cancel="1"</code>.</li>' . "\n";
                echo !is_multisite() || !c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() || is_main_site() ? '<li><code>ccaps="music,videos"</code> A comma-delimited list of Custom Capabilities. Only valid w/ Membership Level Access and/or Independent Custom Capabilities.</li>' . "\n" : '';
                echo '<li><code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '"</code> must start with your domain. Additional values can be piped in ( ex: <code>custom="' . esc_html($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3|etc"</code> ). Not valid when <code>cancel="1"</code>.</li>' . "\n";
                echo '<li><code>desc="Gold Membership"</code> A brief purchase Description. Not valid when <code>cancel="1"</code>.</li>' . "\n";
                echo '<li><code>dg="0"</code> The Digital Goods directive. optimizeMember will eventually be integrated with <a href="http://www.optimizepress.com/paypal-express-co-digitals" target="_blank" rel="external">Digital Goods</a> for inline Express Checkout. But for now, this should always be <code>0</code>.</li>' . "\n";
                echo '<li><code>exp="72"</code> Access Expires ( in hours ). Only valid when <code>sp="1"</code> for Specific Post/Page Access.</li>' . "\n";
                echo '<li><code>ids="14"</code> A Post/Page ID#, or a comma-delimited list of IDs. Only valid when <code>sp="1"</code> for Specific Post/Page Access.</li>' . "\n";
                echo '<li><code>image="default"</code> Button Image Location. Possible values: <code>default</code> = use the default PayPal Button, <code>http://...</code> = location of your custom Image.</li>' . "\n";
                echo '<li><code>lc=""</code> Optional 2 character Locale Code <em>( i.e. Country Code )</em>. This controls the interface language used at PayPal during checkout. If unspecified, the language is determined by PayPal when possible, defaulting to <code>US</code> <em>english</em> when not possible. Not valid when <code>cancel="1"</code>.</li>' . "\n";
                echo '<li><code>level="1"</code> Membership Level [1-4] <em>( or, up to the number of configured Levels )</em>. Only valid for Buttons providing paid Membership Level Access.' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' Or, with Independent Custom Capabilities this MUST be set to <code>level="*"</code>, and <code>ccaps=""</code> must NOT be empty <em>( i.e. <code>level="*" ccaps="music,videos"</code> )</em>.') . '</li>' . "\n";
                echo '<li><code>modify="0"</code> Modification directive. Only valid w/ Membership Level Access. Possible values: <code>0</code> = allows Customers to only create a new Subscription, <code>1</code> = allows Customers to modify their current Subscription or sign up for a new one, <code>2</code> = allows Customers to only modify their current Subscription.</li>' . "\n";
                echo '<li><code>ns="1"</code> The <em>no_shipping</em> directive. Possible values: <code>0</code> = prompt for an address, but do not require one, <code>1</code> = do not prompt for a shipping address, <code>2</code> = prompt for an address, and require one. Not valid when <code>cancel="1"</code>.</li>' . "\n";
                echo '<li><code>output="button"</code> Output Type. Possible values: <code>button</code> = PayPal Button w/hidden inputs, <code>anchor</code> = PayPal Button (  &lt;a&gt; anchor tag ) URL w/ ?query string, <code>url</code> = raw URL w/ ?query string.</li>' . "\n";
                echo '<li><code>ps="paypal"</code> PayPal checkout Page Style. Not valid when <code>cancel="1"</code>.</li>' . "\n";
                echo '<li><code>ra="0.01"</code> Regular, Buy Now, and/or Recurring Amount. Must be &gt;= <code>0.01</code>. Not valid when <code>cancel="1"</code>.</li>' . "\n";
                echo '<li><code>rp="1"</code> Regular Period. Only valid w/ Membership Level Access' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' and/or Independent Custom Capabilities') . '. Must be &gt;= <code>1</code> ( ex: <code>1</code> Week, <code>2</code> Months, <code>1</code> Month, <code>3</code> Days ).</li>' . "\n";
                echo '<li><code>rt="M"</code> Regular Term. Only valid w/ Membership Level Access' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' and/or Independent Custom Capabilities') . '. Possible values: <code>D</code> = Days, <code>W</code> = Weeks, <code>M</code> = Months, <code>Y</code> = Years, <code>L</code> = Lifetime.</li>' . "\n";
                echo '<li><code>rr="1"</code> Recurring directive. Only valid w/ Membership Level Access' . (is_multisite() && c_ws_plugin__optimizemember_utils_conds::is_multisite_farm() && !is_main_site() ? '' : ' and/or Independent Custom Capabilities') . '. Possible values: <code>0</code> = non-recurring "Subscription" with possible Trial Period for free, or at a different Trial Amount; <code>1</code> = recurring "Subscription" with possible Trial Period for free, or at a different Trial Amount; <code>BN</code> = non-recurring "Buy Now" functionality, no Trial Period possible.</li>' . "\n";
                echo '<li><code>rrt=""</code> Recurring Times <em>( i.e. a fixed number of installments )</em>. Only valid w/ Membership Level Access. When unspecified, any recurring charges will remain ongoing until cancelled, or until payments start failing. If this is set to <code>1 or higher</code> the regular recurring charges will only continue for X billing cycles, depending on what you specify. This is only valid when <code>rr="1"</code> for recurring "Subscriptions". Please note that a fixed number of installments, also means a fixed period of access. If a Customer\'s billing is monthly, and you set <code>rrt="3"</code>, billing will continue for only 3 monthly installments. After that, billing would stop, and their access to the site would be revoked as well <em>( based on your EOT Behavior setting under: optimizeMember -> PayPal Options )</em>.</li>' . "\n";
                echo '<li><code>rra="1"</code> Reattempt failed payments? Possible values: <code>0</code> = do NOT reattempt billing when/if a recurring payment fails; <code>1</code> = yes, DO reattempt billing when/if a recurring payment fails. With PayPal Standard integration, PayPal will retry a maximum of 2 times when you set <code>rra="1"</code>; after that, a Subscription would be terminated due to Max Failed Payments having been reached. PayPal Standard integration does NOT make it possible to configure Max Failed Payments, it simply defaults to a value of <code>2</code> whenever <code>rra="1"</code>, indicating that you DO want to retry failed payments.</li>' . "\n";
                echo '<li><code>sp="0"</code> Specific Post/Page Button. Possible values: <code>0</code> = this is NOT a Specific Post/Page Access Button, <code>1</code> = this IS a Specific Post/Page Access Button.</li>' . "\n";
                echo '<li><code>ta="0.00"</code> Trial Amount. Only valid w/ Membership Level Access. Must be <code>0</code> when <code>rt="L"</code> or when <code>rr="BN"</code>.</li>' . "\n";
                echo '<li><code>tp="0"</code> Trial Period. Only valid w/ Membership Level Access. Must be <code>0</code> when <code>rt="L"</code> or when <code>rr="BN"</code>.</li>' . "\n";
                echo '<li><code>tt="D"</code> Trial Term. Only valid w/ Membership Level Access. Possible values: <code>D</code> = Days, <code>W</code> = Weeks, <code>M</code> = Months, <code>Y</code> = Years.</li>' . "\n";
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_during_shortcode_attrs_lis", get_defined_vars());
                echo '</ul>' . "\n";
                echo '</td>' . "\n";
                /**/
                echo '</tr>' . "\n";
                echo '</tbody>' . "\n";
                echo '</table>' . "\n";
                echo '</div>' . "\n";
                /**/
                echo '</div>' . "\n";
                /**/
                do_action("ws_plugin__optimizemember_during_paypal_buttons_page_during_left_sections_after_shortcode_attrs", get_defined_vars());
            }
            /**/
            do_action("ws_plugin__optimizemember_during_paypal_buttons_page_after_left_sections", get_defined_vars());
            /**/
            echo '</td>' . "\n";
            /**/
            echo '<td class="ws-menu-page-table-r">' . "\n";
            c_ws_plugin__optimizemember_menu_pages_rs::display();
            echo '</td>' . "\n";
            /**/
            echo '</tr>' . "\n";
            echo '</tbody>' . "\n";
            echo '</table>' . "\n";
            /**/
            echo '</div>' . "\n";
            echo '</div>' . "\n";
        }