s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) - Version 131109

Version Description

= v131109 = (Maintenance Release) Upgrade immediately.

Download this release

Release Info

Developer WebSharks
Plugin Icon 128x128 s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members)
Version 131109
Comparing to
See all releases

Code changes from version 131026 to 131109

Files changed (46) hide show
  1. checksum.txt +1 -1
  2. images/brand-favicon.png +0 -0
  3. images/s2___.png +0 -0
  4. images/s2___bar.png +0 -0
  5. images/s2___end.png +0 -0
  6. includes/classes/admin-notices.inc.php +1 -1
  7. includes/classes/cache.inc.php +3 -3
  8. includes/classes/constants.inc.php +1 -1
  9. includes/classes/css-js-themes.inc.php +43 -5
  10. includes/classes/menu-pages-rs.inc.php +9 -16
  11. includes/classes/menu-pages-tb.inc.php +83 -0
  12. includes/classes/menu-pages.inc.php +2 -1
  13. includes/classes/no-cache.inc.php +3 -1
  14. includes/classes/s-badge-status-in.inc.php +2 -1
  15. includes/classes/sc-files-in.inc.php +4 -4
  16. includes/classes/utils-html.inc.php +2 -6
  17. includes/classes/utils-strings.inc.php +3 -3
  18. includes/externals/markdown/nc-markdown.inc.php +108 -109
  19. includes/menu-pages/api-ops.inc.php +6 -3
  20. includes/menu-pages/code-samples/jwplayer-v5-standard-mp4.x-php +0 -30
  21. includes/menu-pages/code-samples/jwplayer-v5-streaming-mp4-sca.x-php +0 -42
  22. includes/menu-pages/code-samples/jwplayer-v5-streaming-mp4-webm.x-php +0 -45
  23. includes/menu-pages/code-samples/jwplayer-v5-streaming-mp4.x-php +0 -38
  24. includes/menu-pages/down-ops.inc.php +13 -47
  25. includes/menu-pages/els-ops.inc.php +9 -6
  26. includes/menu-pages/gen-ops.inc.php +9 -6
  27. includes/menu-pages/info.inc.php +5 -2
  28. includes/menu-pages/integrations.inc.php +5 -2
  29. includes/menu-pages/js-c-warning.inc.php +0 -40
  30. includes/menu-pages/logs.inc.php +20 -14
  31. includes/menu-pages/menu-pages-min.js +1 -1
  32. includes/menu-pages/menu-pages.css +753 -429
  33. includes/menu-pages/menu-pages.js +33 -33
  34. includes/menu-pages/mms-ops.inc.php +6 -3
  35. includes/menu-pages/paypal-buttons.inc.php +23 -20
  36. includes/menu-pages/paypal-ops.inc.php +10 -7
  37. includes/menu-pages/res-ops.inc.php +10 -7
  38. includes/menu-pages/scripting.inc.php +9 -6
  39. includes/menu-pages/start.inc.php +6 -3
  40. includes/menu-pages/trk-ops.inc.php +16 -17
  41. includes/menu-pages/updates.inc.php +7 -5
  42. includes/s2member-min.js +1 -1
  43. includes/s2member.js +44 -25
  44. includes/translations/s2member.pot +257 -257
  45. readme.txt +28 -6
  46. s2member.php +5 -5
checksum.txt CHANGED
@@ -1 +1 @@
1
- e9ddca7051c3309be91630e7f6eb17a1
1
+ 4f4a8d6b4f39d49be334333ddb1b073e
images/brand-favicon.png CHANGED
Binary file
images/s2___.png ADDED
Binary file
images/s2___bar.png ADDED
Binary file
images/s2___end.png ADDED
Binary file
includes/classes/admin-notices.inc.php CHANGED
@@ -131,7 +131,7 @@ if (!class_exists ("c_ws_plugin__s2member_admin_notices"))
131
  $page = preg_replace ("/^([^\:]*)\:/i", "", $page);
132
 
133
  if (empty ($adms) || in_array ("*", $adms) || in_array ($a, $adms))
134
- if (!$page || "*" === $page || $pagenow === $page || $_GET["page"] === $page)
135
  {
136
  if /* Time to show it? */ (strtotime ("now") >= (int)$notice["time"])
137
  {
131
  $page = preg_replace ("/^([^\:]*)\:/i", "", $page);
132
 
133
  if (empty ($adms) || in_array ("*", $adms) || in_array ($a, $adms))
134
+ if (!$page || "*" === $page || $pagenow === $page || @$_GET["page"] === $page)
135
  {
136
  if /* Time to show it? */ (strtotime ("now") >= (int)$notice["time"])
137
  {
includes/classes/cache.inc.php CHANGED
@@ -62,7 +62,7 @@ if (!class_exists ("c_ws_plugin__s2member_cache"))
62
  {
63
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["page"] = $lwp;
64
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["time"] = time ();
65
- $links["login_welcome_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["link"] = get_page_link ($lwp);
66
 
67
  $cache_needs_updating = /* Flag for cache update. */ true;
68
  }
@@ -74,7 +74,7 @@ if (!class_exists ("c_ws_plugin__s2member_cache"))
74
  {
75
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["page"] = $mop;
76
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["time"] = time ();
77
- $links["membership_options_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["link"] = get_page_link ($mop);
78
 
79
  $cache_needs_updating = /* Flag for cache update. */ true;
80
  }
@@ -86,7 +86,7 @@ if (!class_exists ("c_ws_plugin__s2member_cache"))
86
  {
87
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["page"] = $fdlep;
88
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["time"] = time ();
89
- $links["file_download_limit_exceeded_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["link"] = get_page_link ($fdlep);
90
 
91
  $cache_needs_updating = /* Flag for cache update. */ true;
92
  }
62
  {
63
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["page"] = $lwp;
64
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["time"] = time ();
65
+ $links["login_welcome_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["link"] = ($lwp) ? get_page_link ($lwp) : home_url("/");
66
 
67
  $cache_needs_updating = /* Flag for cache update. */ true;
68
  }
74
  {
75
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["page"] = $mop;
76
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["time"] = time ();
77
+ $links["membership_options_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["link"] = ($mop) ? get_page_link ($mop) : home_url("/");
78
 
79
  $cache_needs_updating = /* Flag for cache update. */ true;
80
  }
86
  {
87
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["page"] = $fdlep;
88
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["time"] = time ();
89
+ $links["file_download_limit_exceeded_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["link"] = ($fdlep) ? get_page_link ($fdlep) : home_url("/");
90
 
91
  $cache_needs_updating = /* Flag for cache update. */ true;
92
  }
includes/classes/constants.inc.php CHANGED
@@ -282,7 +282,7 @@ if (!class_exists ("c_ws_plugin__s2member_constants"))
282
  * @see http://codex.wordpress.org/Function_Reference/wp_get_current_user wp_get_current_user()
283
  */
284
  if (!defined ("S2MEMBER_CURRENT_USER_ACCESS_LABEL"))
285
- define ("S2MEMBER_CURRENT_USER_ACCESS_LABEL", ($c[] = (string)$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_label"]));
286
  /**
287
  * The current User's Paid Subscription ID (when applicable).
288
  *
282
  * @see http://codex.wordpress.org/Function_Reference/wp_get_current_user wp_get_current_user()
283
  */
284
  if (!defined ("S2MEMBER_CURRENT_USER_ACCESS_LABEL"))
285
+ define ("S2MEMBER_CURRENT_USER_ACCESS_LABEL", ($c[] = (string)@$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_label"]));
286
  /**
287
  * The current User's Paid Subscription ID (when applicable).
288
  *
includes/classes/css-js-themes.inc.php CHANGED
@@ -27,7 +27,44 @@ if (!class_exists ("c_ws_plugin__s2member_css_js_themes"))
27
  */
28
  class c_ws_plugin__s2member_css_js_themes
29
  {
30
- /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  * Enqueues CSS file for theme integration.
32
  *
33
  * @package s2Member\CSS_JS
@@ -41,7 +78,7 @@ if (!class_exists ("c_ws_plugin__s2member_css_js_themes"))
41
  {
42
  do_action ("ws_plugin__s2member_before_add_css", get_defined_vars ());
43
 
44
- if /* Not in the admin. */ (!is_admin ())
45
  {
46
  $s2o = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["s2o_url"];
47
 
@@ -71,7 +108,8 @@ if (!class_exists ("c_ws_plugin__s2member_css_js_themes"))
71
 
72
  do_action ("ws_plugin__s2member_before_add_js_w_globals", get_defined_vars ());
73
 
74
- if (!is_admin () || (is_user_admin () && $pagenow === "profile.php" && !current_user_can ("edit_users")))
 
75
  {
76
  $s2o = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["s2o_url"];
77
 
@@ -80,11 +118,11 @@ if (!class_exists ("c_ws_plugin__s2member_css_js_themes"))
80
  $md5 = /* An MD5 hash based on global key => values. */ WS_PLUGIN__S2MEMBER_API_CONSTANTS_MD5;
81
  // The MD5 hash allows the script to be cached in the browser until the globals happen to change.
82
  // For instance, the global variables may change when a User who is logged-in changes their Profile.
83
- wp_enqueue_script ("ws-plugin--s2member", $s2o . "?ws_plugin__s2member_js_w_globals=" . urlencode ($md5) . "&qcABC=1", array ("jquery", "password-strength-meter"), c_ws_plugin__s2member_utilities::ver_checksum ());
84
  }
85
  else // Else if they are not logged in, we distinguish the JavaScript file by NOT including $md5.
86
  { // This essentially creates 2 versions of the script. One while logged in & another when not.
87
- wp_enqueue_script ("ws-plugin--s2member", $s2o . "?ws_plugin__s2member_js_w_globals=1&qcABC=1", array ("jquery", "password-strength-meter"), c_ws_plugin__s2member_utilities::ver_checksum ());
88
  }
89
  do_action ("ws_plugin__s2member_during_add_js_w_globals", get_defined_vars ());
90
  }
27
  */
28
  class c_ws_plugin__s2member_css_js_themes
29
  {
30
+ /**
31
+ * Lazy load CSS/JS files?
32
+ *
33
+ * @package s2Member\CSS_JS
34
+ * @since 131028
35
+ *
36
+ * @return boolean TRUE if we should load; else FALSE.
37
+ */
38
+ public static function lazy_load_css_js ()
39
+ {
40
+ static $load; // Static cache var.
41
+
42
+ if(isset($load)) return $load;
43
+
44
+ if(c_ws_plugin__s2member_systematics::is_s2_systematic_use_page())
45
+ $load = TRUE;
46
+
47
+ else if(c_ws_plugin__s2member_utils_conds::bp_is_installed()
48
+ && (bp_is_register_page() || bp_is_activation_page() || bp_is_user_profile()))
49
+ $load = TRUE;
50
+
51
+ else if(is_singular() && ($post = get_post())
52
+ && (stripos($post->post_content, "s2member") !== FALSE
53
+ || stripos($post->post_content, "[s2") !== FALSE))
54
+ $load = TRUE;
55
+
56
+ else if(preg_match("/\/wp\-signup\.php".
57
+ "|\/wp\-login\.php".
58
+ "|\/wp\-admin\/(?:user\/)?profile\.php".
59
+ "|[?&]s2member/", $_SERVER["REQUEST_URI"]))
60
+ $load = TRUE;
61
+
62
+ if(!isset($load)) $load = FALSE; // Make sure it's set; always.
63
+
64
+ return ($load = apply_filters("ws_plugin__s2member_lazy_load_css_js", $load));
65
+ }
66
+
67
+ /**
68
  * Enqueues CSS file for theme integration.
69
  *
70
  * @package s2Member\CSS_JS
78
  {
79
  do_action ("ws_plugin__s2member_before_add_css", get_defined_vars ());
80
 
81
+ if(!is_admin () && c_ws_plugin__s2member_css_js_themes::lazy_load_css_js())
82
  {
83
  $s2o = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["s2o_url"];
84
 
108
 
109
  do_action ("ws_plugin__s2member_before_add_js_w_globals", get_defined_vars ());
110
 
111
+ if ((!is_admin() && c_ws_plugin__s2member_css_js_themes::lazy_load_css_js())
112
+ || (is_user_admin () && $pagenow === "profile.php" && !current_user_can ("edit_users")))
113
  {
114
  $s2o = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["s2o_url"];
115
 
118
  $md5 = /* An MD5 hash based on global key => values. */ WS_PLUGIN__S2MEMBER_API_CONSTANTS_MD5;
119
  // The MD5 hash allows the script to be cached in the browser until the globals happen to change.
120
  // For instance, the global variables may change when a User who is logged-in changes their Profile.
121
+ wp_enqueue_script ("ws-plugin--s2member", $s2o . "?ws_plugin__s2member_js_w_globals=" . urlencode ($md5) . "&qcABC=1", array ("jquery"), c_ws_plugin__s2member_utilities::ver_checksum (), TRUE);
122
  }
123
  else // Else if they are not logged in, we distinguish the JavaScript file by NOT including $md5.
124
  { // This essentially creates 2 versions of the script. One while logged in & another when not.
125
+ wp_enqueue_script ("ws-plugin--s2member", $s2o . "?ws_plugin__s2member_js_w_globals=1&qcABC=1", array ("jquery"), c_ws_plugin__s2member_utilities::ver_checksum (), TRUE);
126
  }
127
  do_action ("ws_plugin__s2member_during_add_js_w_globals", get_defined_vars ());
128
  }
includes/classes/menu-pages-rs.inc.php CHANGED
@@ -39,13 +39,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages_rs"))
39
  {
40
  do_action ("ws_plugin__s2member_during_menu_pages_before_right_sections", get_defined_vars ());
41
 
42
- echo '<div id="ws-menu-page-js-c-w" class="ws-menu-page-js-c-w">' . "\n";
43
- include_once dirname (dirname (__FILE__)) . "/menu-pages/js-c-warning.inc.php";
44
- echo '</div>' . "\n";
45
-
46
- echo '<script type="text/javascript">' . "\n";
47
- echo "jQuery('div#ws-menu-page-js-c-w').hide();" . "\n";
48
- echo '</script>' . "\n";
49
 
50
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["updates"])
51
  {
@@ -53,59 +47,58 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages_rs"))
53
  include_once dirname (dirname (__FILE__)) . "/menu-pages/updates.inc.php";
54
  echo '</div>' . "\n";
55
  }
56
-
57
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["upsell-pro"])
58
  {
59
  echo '<div class="ws-menu-page-others">' . "\n";
60
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Module / Prices")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-upsell-pro.png" alt="." /></a>' . "\n";
61
  echo '</div>' . "\n";
62
  }
63
-
64
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["installation"])
65
  {
66
  echo '<div class="ws-menu-page-installation">' . "\n";
67
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Professional Installation URI")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-installation.png" alt="." /></a>' . "\n";
68
  echo '</div>' . "\n";
69
  }
70
-
71
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["tools"])
72
  {
73
  echo '<div class="ws-menu-page-tools">' . "\n";
74
  echo '<img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-tools.png" alt="." />' . "\n";
75
  echo '</div>' . "\n";
76
  }
77
-
78
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["kb"])
79
  {
80
  echo '<div class="ws-menu-page-kb">' . "\n";
81
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Knowledge Base")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-kb.png" alt="." /></a>' . "\n";
82
  echo '</div>' . "\n";
83
  }
84
-
85
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["videos"])
86
  {
87
  echo '<div class="ws-menu-page-videos">' . "\n";
88
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Video Tutorials")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-videos.png" alt="." /></a>' . "\n";
89
  echo '</div>' . "\n";
90
  }
91
-
92
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["support"])
93
  {
94
  echo '<div class="ws-menu-page-support">' . "\n";
95
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Forum URI")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-support.png" alt="." /></a>' . "\n";
96
  echo '</div>' . "\n";
97
  }
98
-
99
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["donations"])
100
  {
101
  echo '<div class="ws-menu-page-donations">' . "\n";
102
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Donate link")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-donations.png" alt="." /></a>' . "\n";
103
  echo '</div>' . "\n";
104
  }
105
-
 
 
 
 
 
 
106
  do_action ("ws_plugin__s2member_during_menu_pages_after_right_sections", get_defined_vars ());
107
 
108
- return /* Return for uniformity. */;
109
  }
110
  }
111
  }
39
  {
40
  do_action ("ws_plugin__s2member_during_menu_pages_before_right_sections", get_defined_vars ());
41
 
42
+ ob_start(); // output buffer these so we can display a toggler conditionally.
 
 
 
 
 
 
43
 
44
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["updates"])
45
  {
47
  include_once dirname (dirname (__FILE__)) . "/menu-pages/updates.inc.php";
48
  echo '</div>' . "\n";
49
  }
 
50
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["upsell-pro"])
51
  {
52
  echo '<div class="ws-menu-page-others">' . "\n";
53
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Module / Prices")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-upsell-pro.png" alt="." /></a>' . "\n";
54
  echo '</div>' . "\n";
55
  }
 
56
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["installation"])
57
  {
58
  echo '<div class="ws-menu-page-installation">' . "\n";
59
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Professional Installation URI")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-installation.png" alt="." /></a>' . "\n";
60
  echo '</div>' . "\n";
61
  }
 
62
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["tools"])
63
  {
64
  echo '<div class="ws-menu-page-tools">' . "\n";
65
  echo '<img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-tools.png" alt="." />' . "\n";
66
  echo '</div>' . "\n";
67
  }
 
68
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["kb"])
69
  {
70
  echo '<div class="ws-menu-page-kb">' . "\n";
71
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Knowledge Base")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-kb.png" alt="." /></a>' . "\n";
72
  echo '</div>' . "\n";
73
  }
 
74
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["videos"])
75
  {
76
  echo '<div class="ws-menu-page-videos">' . "\n";
77
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Video Tutorials")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-videos.png" alt="." /></a>' . "\n";
78
  echo '</div>' . "\n";
79
  }
 
80
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["support"])
81
  {
82
  echo '<div class="ws-menu-page-support">' . "\n";
83
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Forum URI")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-support.png" alt="." /></a>' . "\n";
84
  echo '</div>' . "\n";
85
  }
 
86
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["donations"])
87
  {
88
  echo '<div class="ws-menu-page-donations">' . "\n";
89
  echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Donate link")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-donations.png" alt="." /></a>' . "\n";
90
  echo '</div>' . "\n";
91
  }
92
+ if (($rs = ob_get_clean()))
93
+ {
94
+ $rs = '<div class="wrapper">'.$rs.'</div>';
95
+ $rs = '<div class="toggler" title="toggle sidebar"'.
96
+ ((!empty($_GET['page']) && preg_match('/\-(?:start|info)$/', $_GET['page'])) ? ' default-state="open"' : '').'></div>' . "\n".$rs;
97
+ echo $rs; // output content now; w/ possible toggler.
98
+ }
99
  do_action ("ws_plugin__s2member_during_menu_pages_after_right_sections", get_defined_vars ());
100
 
101
+ return /* return for uniformity. */;
102
  }
103
  }
104
  }
includes/classes/menu-pages-tb.inc.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Toolbox for Menu Pages.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Menu_Pages
15
+ * @since 131108
16
+ */
17
+ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18
+ exit("Do not access this file directly.");
19
+
20
+ if (!class_exists ("c_ws_plugin__s2member_menu_pages_tb"))
21
+ {
22
+ /**
23
+ * Toolbox for Menu Pages.
24
+ *
25
+ * @package s2Member\Menu_Pages
26
+ * @since 131108
27
+ */
28
+ class c_ws_plugin__s2member_menu_pages_tb
29
+ {
30
+ /**
31
+ * Toolbox for Menu Pages.
32
+ *
33
+ * @package s2Member\Menu_Pages
34
+ * @since 131108
35
+ *
36
+ * @return null
37
+ */
38
+ public static function display ()
39
+ {
40
+ do_action ("ws_plugin__s2member_during_menu_pages_before_toolbox_sections", get_defined_vars ());
41
+
42
+ ob_start(); // output buffer these so we can display a toggler conditionally.
43
+
44
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["updates"])
45
+ {
46
+ echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Newsletter")) . '" target="_blank"><i class="fa fa-envelope"></i> s2 Updates (via Email)</a>';
47
+ }
48
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["upsell-pro"])
49
+ {
50
+ echo '<a href="' . esc_attr (c_ws_plugin__s2member_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";
51
+ }
52
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["installation"])
53
+ {
54
+ echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Professional Installation URI")) . '" target="_blank"><i class="fa fa-wrench"></i> Professional Installation Service</a>' . "\n";
55
+ }
56
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["kb"])
57
+ {
58
+ echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Knowledge Base")) . '" target="_blank"><i class="fa fa-lightbulb-o"></i> Knowledge Base</a>' . "\n";
59
+ }
60
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["videos"])
61
+ {
62
+ echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Video Tutorials")) . '" target="_blank"><i class="fa fa-film"></i> Video Tutorials</a>' . "\n";
63
+ }
64
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["support"])
65
+ {
66
+ echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Forum URI")) . '" target="_blank"><i class="fa fa-comments-o"></i> Community</a>' . "\n";
67
+ }
68
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["donations"])
69
+ {
70
+ echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Donate link")) . '" target="_blank"><i class="fa fa-heart-o"></i> Contribute</a>' . "\n";
71
+ }
72
+ if (($links = ob_get_clean()))
73
+ {
74
+ $links = '<div class="links">'.$links.'</div>';
75
+ echo $links; // output content now; w/ possible toggler.
76
+ }
77
+ do_action ("ws_plugin__s2member_during_menu_pages_after_toolbox_sections", get_defined_vars ());
78
+
79
+ return /* return for uniformity. */;
80
+ }
81
+ }
82
+ }
83
+ ?>
includes/classes/menu-pages.inc.php CHANGED
@@ -148,7 +148,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_pages"))
148
  $menu = apply_filters("ws_plugin__s2member_during_add_admin_options_menu_slug", "ws-plugin--s2member-start", get_defined_vars());
149
 
150
  if(apply_filters("ws_plugin__s2member_during_add_admin_options_add_menu_page", true, get_defined_vars()))
151
- add_menu_page("s2Member", "s2Member", "create_users", $menu, "c_ws_plugin__s2member_menu_pages::start_page", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]."/images/brand-favicon.png");
 
152
 
153
  if(apply_filters("ws_plugin__s2member_during_add_admin_options_add_start_page", true, get_defined_vars()))
154
  add_submenu_page($menu, "s2Member Quick-Start Guide", "Quick-Start Guide", "create_users", "ws-plugin--s2member-start", "c_ws_plugin__s2member_menu_pages::start_page");
148
  $menu = apply_filters("ws_plugin__s2member_during_add_admin_options_menu_slug", "ws-plugin--s2member-start", get_defined_vars());
149
 
150
  if(apply_filters("ws_plugin__s2member_during_add_admin_options_add_menu_page", true, get_defined_vars()))
151
+ add_menu_page(((c_ws_plugin__s2member_utils_conds::pro_is_installed()) ? "s2Member (Pro)" : "s2Member"), ((c_ws_plugin__s2member_utils_conds::pro_is_installed()) ? "s2Member (Pro)" : "s2Member"),
152
+ "create_users", $menu, "c_ws_plugin__s2member_menu_pages::start_page", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]."/images/brand-favicon.png");
153
 
154
  if(apply_filters("ws_plugin__s2member_during_add_admin_options_add_start_page", true, get_defined_vars()))
155
  add_submenu_page($menu, "s2Member Quick-Start Guide", "Quick-Start Guide", "create_users", "ws-plugin--s2member-start", "c_ws_plugin__s2member_menu_pages::start_page");
includes/classes/no-cache.inc.php CHANGED
@@ -88,7 +88,9 @@ if (!class_exists ("c_ws_plugin__s2member_no_cache"))
88
  do_action ("ws_plugin__s2member_before_no_cache_constants", get_defined_vars ());
89
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
90
 
91
- if (!$once && empty ($_GET["qcAC"]) && ($no_cache || is_user_logged_in () || c_ws_plugin__s2member_systematics::is_s2_systematic_use_page ()))
 
 
92
  {
93
  /**
94
  * No-cache DB queries for plugins.
88
  do_action ("ws_plugin__s2member_before_no_cache_constants", get_defined_vars ());
89
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
90
 
91
+ if (!$once && empty ($_GET["qcAC"]) && ($no_cache
92
+ || (is_user_logged_in () && (!defined("QUICK_CACHE_WHEN_LOGGED_IN") || !QUICK_CACHE_WHEN_LOGGED_IN))
93
+ || c_ws_plugin__s2member_systematics::is_s2_systematic_use_page ()))
94
  {
95
  /**
96
  * No-cache DB queries for plugins.
includes/classes/s-badge-status-in.inc.php CHANGED
@@ -71,7 +71,8 @@ if (!class_exists ("c_ws_plugin__s2member_s_badge_status_in"))
71
  {
72
  if (defined ("DB_USER") && DB_USER && defined ("DB_PASSWORD") && DB_PASSWORD && DB_USER !== DB_PASSWORD)
73
  {
74
- if (!apply_filters ("ws_plugin__s2member_disable_all_ip_restrictions", false, get_defined_vars ()) && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"])
 
75
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_failed_login_attempts"])
76
  {
77
  if ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"] && !glob($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"].'/*'))
71
  {
72
  if (defined ("DB_USER") && DB_USER && defined ("DB_PASSWORD") && DB_PASSWORD && DB_USER !== DB_PASSWORD)
73
  {
74
+ if ((!apply_filters ("ws_plugin__s2member_disable_all_ip_restrictions", false, get_defined_vars ()) && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"])
75
+ || ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_simultaneous_logins"]) /* Either of these are acceptable. */)
76
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_failed_login_attempts"])
77
  {
78
  if ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"] && !glob($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"].'/*'))
includes/classes/sc-files-in.inc.php CHANGED
@@ -102,7 +102,7 @@ if(!class_exists("c_ws_plugin__s2member_sc_files_in"))
102
 
103
  $attr = /* Force array; trim quote entities. */ c_ws_plugin__s2member_utils_strings::trim_qts_deep((array)$attr);
104
 
105
- $attr = shortcode_atts(array("download" => "", "download_key" => "", "stream" => "yes", "inline" => "yes", "storage" => "", "remote" => "", "ssl" => "", "rewrite" => "yes", "rewrite_base" => "", "skip_confirmation" => "", "url_to_storage_source" => "yes", "count_against_user" => "yes", "check_user" => "yes", /* Shortcode-specifics »» */ "file_download" => "", /* Configuration » */ "player" => "jwplayer-v6-rtmp", "player_id" => "s2-stream-".md5(uniqid("", TRUE)), "player_path" => "/jwplayer/jwplayer.js", "player_key" => "", "player_title" => "", "player_image" => "", "player_mediaid" => "", "player_description" => "", "player_captions" => "", /* Layout » */ "player_controls" => "yes", "player_skin" => "", "player_stretching" => "uniform", "player_width" => "480", "player_height" => "270", "player_aspectratio" => "", /* Playback » */ "player_autostart" => "no", "player_fallback" => "yes", "player_mute" => "no", "player_primary" => "flash", "player_repeat" => "no", "player_startparam" => "", /* Advanced option blocks » */ "player_option_blocks" => ""), $attr);
106
  $attr["download"] = (!empty($attr["file_download"])) ? $attr["file_download"] : $attr["download"];
107
 
108
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
@@ -116,7 +116,7 @@ if(!class_exists("c_ws_plugin__s2member_sc_files_in"))
116
  $config[$key] = $value;
117
 
118
  unset /* Ditch these now. We don't want these bleeding into Hooks/Filters anyway. */($key, $value);
119
-
120
  if /* Looking for a File Download URL? */(!empty($config) && isset($config["file_download"]))
121
  {
122
  $_get = c_ws_plugin__s2member_files::create_file_download_url($config, TRUE);
@@ -129,7 +129,7 @@ if(!class_exists("c_ws_plugin__s2member_sc_files_in"))
129
  if(strpos($attr["player"], "jwplayer-v6") === 0)
130
  {
131
  $get = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template)));
132
-
133
  $get = preg_replace("/%%streamer%%/", $_get["streamer"], $get);
134
  $get = preg_replace("/%%prefix%%/", $_get["prefix"], $get);
135
  $get = preg_replace("/%%file%%/", $_get["file"], $get);
@@ -155,7 +155,7 @@ if(!class_exists("c_ws_plugin__s2member_sc_files_in"))
155
  $get = preg_replace("/%%player_aspectratio%%/", $attr["player_aspectratio"], $get);
156
  $get = preg_replace("/%%player_skin%%/", $attr["player_skin"], $get);
157
  $get = preg_replace("/%%player_stretching%%/", $attr["player_stretching"], $get);
158
-
159
  $get = preg_replace("/%%player_autostart%%/", ((filter_var($attr["player_autostart"], FILTER_VALIDATE_BOOLEAN)) ? "true" : "false"), $get);
160
  $get = preg_replace("/%%player_fallback%%/", ((filter_var($attr["player_fallback"], FILTER_VALIDATE_BOOLEAN)) ? "true" : "false"), $get);
161
  $get = preg_replace("/%%player_mute%%/", ((filter_var($attr["player_mute"], FILTER_VALIDATE_BOOLEAN)) ? "true" : "false"), $get);
102
 
103
  $attr = /* Force array; trim quote entities. */ c_ws_plugin__s2member_utils_strings::trim_qts_deep((array)$attr);
104
 
105
+ $attr = shortcode_atts(array("download" => "", "download_key" => "", "stream" => "yes", "inline" => "yes", "storage" => "", "remote" => "", "ssl" => "", "rewrite" => "yes", "rewrite_base" => "", "skip_confirmation" => "", "url_to_storage_source" => "yes", "count_against_user" => "yes", "check_user" => "yes", /* Shortcode-specifics »» */ "file_download" => "", /* Configuration » */ "player" => "jwplayer-v6-rtmp", "player_id" => "s2-stream-".md5(uniqid("", TRUE)), "player_path" => "/jwplayer/jwplayer.js", "player_key" => "", "player_title" => "", "player_image" => "", "player_mediaid" => "", "player_description" => "", "player_captions" => "", /* Layout » */ "player_controls" => "yes", "player_skin" => "", "player_stretching" => "uniform", "player_width" => "480", "player_height" => "270", "player_aspectratio" => "", /* Playback » */ "player_autostart" => "no", "player_fallback" => "yes", "player_mute" => "no", "player_primary" => (($attr["player"] === "jw-player-v6") ? "html5" : "flash"), "player_repeat" => "no", "player_startparam" => "", /* Advanced option blocks » */ "player_option_blocks" => ""), $attr);
106
  $attr["download"] = (!empty($attr["file_download"])) ? $attr["file_download"] : $attr["download"];
107
 
108
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
116
  $config[$key] = $value;
117
 
118
  unset /* Ditch these now. We don't want these bleeding into Hooks/Filters anyway. */($key, $value);
119
+
120
  if /* Looking for a File Download URL? */(!empty($config) && isset($config["file_download"]))
121
  {
122
  $_get = c_ws_plugin__s2member_files::create_file_download_url($config, TRUE);
129
  if(strpos($attr["player"], "jwplayer-v6") === 0)
130
  {
131
  $get = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template)));
132
+
133
  $get = preg_replace("/%%streamer%%/", $_get["streamer"], $get);
134
  $get = preg_replace("/%%prefix%%/", $_get["prefix"], $get);
135
  $get = preg_replace("/%%file%%/", $_get["file"], $get);
155
  $get = preg_replace("/%%player_aspectratio%%/", $attr["player_aspectratio"], $get);
156
  $get = preg_replace("/%%player_skin%%/", $attr["player_skin"], $get);
157
  $get = preg_replace("/%%player_stretching%%/", $attr["player_stretching"], $get);
158
+
159
  $get = preg_replace("/%%player_autostart%%/", ((filter_var($attr["player_autostart"], FILTER_VALIDATE_BOOLEAN)) ? "true" : "false"), $get);
160
  $get = preg_replace("/%%player_fallback%%/", ((filter_var($attr["player_fallback"], FILTER_VALIDATE_BOOLEAN)) ? "true" : "false"), $get);
161
  $get = preg_replace("/%%player_mute%%/", ((filter_var($attr["player_mute"], FILTER_VALIDATE_BOOLEAN)) ? "true" : "false"), $get);
includes/classes/utils-html.inc.php CHANGED
@@ -54,15 +54,11 @@ if (!class_exists ("c_ws_plugin__s2member_utils_html"))
54
 
55
  echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' . "\n";
56
 
57
- echo '<script type="text/javascript" src="' . esc_attr (site_url ("/wp-includes/js/jquery/jquery.js?ver=" . urlencode (c_ws_plugin__s2member_utilities::ver_checksum ()))) . '"></script>' . "\n";
58
-
59
- echo '<script type="text/javascript">' . "var pwsL10n = {empty: '" . c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strength indicator", "s2member-front", "s2member")) . "', short: '" . c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Very weak", "s2member-front", "s2member")) . "', bad: '" . c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Weak", "s2member-front", "s2member")) . "', good: '" . c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Medium", "s2member-front", "s2member")) . "', strong: '" . c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strong", "s2member-front", "s2member")) . "', mismatch: '" . c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Mismatch", "s2member-front", "s2member")) . "'};</script>" . "\n";
60
- echo '<script type="text/javascript" src="' . esc_attr (site_url ("/wp-admin/js/password-strength-meter.js?ver=" . urlencode (c_ws_plugin__s2member_utilities::ver_checksum ()))) . '"></script>' . "\n";
61
 
 
62
  echo '<script type="text/javascript" src="' . esc_attr ($s2o . "?ws_plugin__s2member_js_w_globals=" . urlencode (WS_PLUGIN__S2MEMBER_API_CONSTANTS_MD5) . "&amp;qcABC=1&amp;ver=" . urlencode (c_ws_plugin__s2member_utilities::ver_checksum ())) . '"></script>' . "\n";
63
 
64
- echo '<link href="' . esc_attr ($s2o . "?ws_plugin__s2member_css=1&amp;qcABC=1&amp;ver=" . urlencode (c_ws_plugin__s2member_utilities::ver_checksum ())) . '" type="text/css" rel="stylesheet" media="all" />' . "\n";
65
-
66
  if ($doctype_html_head_title) // Add <title></title> tag?
67
  echo '<title>' . $doctype_html_head_title . '</title>' . "\n";
68
 
54
 
55
  echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' . "\n";
56
 
57
+ echo '<link href="' . esc_attr ($s2o . "?ws_plugin__s2member_css=1&amp;qcABC=1&amp;ver=" . urlencode (c_ws_plugin__s2member_utilities::ver_checksum ())) . '" type="text/css" rel="stylesheet" media="all" />' . "\n";
 
 
 
58
 
59
+ echo '<script type="text/javascript" src="' . esc_attr (site_url ("/wp-includes/js/jquery/jquery.js?ver=" . urlencode (c_ws_plugin__s2member_utilities::ver_checksum ()))) . '"></script>' . "\n";
60
  echo '<script type="text/javascript" src="' . esc_attr ($s2o . "?ws_plugin__s2member_js_w_globals=" . urlencode (WS_PLUGIN__S2MEMBER_API_CONSTANTS_MD5) . "&amp;qcABC=1&amp;ver=" . urlencode (c_ws_plugin__s2member_utilities::ver_checksum ())) . '"></script>' . "\n";
61
 
 
 
62
  if ($doctype_html_head_title) // Add <title></title> tag?
63
  echo '<title>' . $doctype_html_head_title . '</title>' . "\n";
64
 
includes/classes/utils-strings.inc.php CHANGED
@@ -332,9 +332,9 @@ if(!class_exists("c_ws_plugin__s2member_utils_strings"))
332
  */
333
  public static function highlight_php($string = FALSE)
334
  {
335
- $string = highlight_string((string)$string, true); // Start with PHP syntax, then Shortcodes.
336
-
337
- return preg_replace("/\[\/?_*s2[a-z0-9_\-]+.*?\]/i", '<span style="color:#164A61;">$0</span>', $string);
338
  }
339
  /**
340
  * Parses email addresses from a string or array.
332
  */
333
  public static function highlight_php($string = FALSE)
334
  {
335
+ $string = highlight_string(trim((string)$string), true); // Start with PHP syntax, then Shortcodes.
336
+ $string = preg_replace("/\[\/?_*s2[a-z0-9_\-]+.*?\]/i", '<span style="color:#164A61;">$0</span>', $string);
337
+ return str_replace('<code>', '<code class="highlight-php">', $string);
338
  }
339
  /**
340
  * Parses email addresses from a string or array.
includes/externals/markdown/nc-markdown.inc.php CHANGED
@@ -27,8 +27,7 @@ function NC_Markdown($text) {
27
 
28
  static $parser;
29
  if (!isset($parser)) {
30
- $parser_class = NC_Markdown_Parser;
31
- $parser = new $parser_class;
32
  }
33
 
34
  return $parser->transform($text);
@@ -44,7 +43,7 @@ class NC_Markdown_Parser {
44
  # Needed to insert a maximum bracked depth while converting to PHP.
45
  var $nested_brackets_depth = 6;
46
  var $nested_brackets_re;
47
-
48
  var $nested_url_parenthesis_depth = 4;
49
  var $nested_url_parenthesis_re;
50
 
@@ -55,11 +54,11 @@ class NC_Markdown_Parser {
55
  # Change to ">" for HTML output.
56
  var $empty_element_suffix = " />";
57
  var $tab_width = 4;
58
-
59
  # Change to `true` to disallow markup or entities.
60
  var $no_markup = false;
61
  var $no_entities = false;
62
-
63
  # Predefined urls and titles for reference links and images.
64
  var $predef_urls = array();
65
  var $predef_titles = array();
@@ -71,17 +70,17 @@ class NC_Markdown_Parser {
71
  #
72
  $this->_initDetab();
73
  $this->prepareItalicsAndBold();
74
-
75
- $this->nested_brackets_re =
76
  str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth).
77
  str_repeat('\])*', $this->nested_brackets_depth);
78
-
79
- $this->nested_url_parenthesis_re =
80
  str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth).
81
  str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth);
82
-
83
  $this->escape_chars_re = '['.preg_quote($this->escape_chars).']';
84
-
85
  # Sort document, block, and span gamut in ascendent priority order.
86
  asort($this->document_gamut);
87
  asort($this->block_gamut);
@@ -93,27 +92,27 @@ class NC_Markdown_Parser {
93
  var $urls = array();
94
  var $titles = array();
95
  var $html_hashes = array();
96
-
97
  # Status flag to avoid invalid nesting.
98
  var $in_anchor = false;
99
-
100
-
101
  function setup() {
102
  #
103
- # Called before the transformation process starts to setup parser
104
  # states.
105
  #
106
  # Clear global hashes.
107
  $this->urls = $this->predef_urls;
108
  $this->titles = $this->predef_titles;
109
  $this->html_hashes = array();
110
-
111
  $in_anchor = false;
112
  }
113
-
114
  function teardown() {
115
  #
116
- # Called after the transformation process to clear any variable
117
  # which may be taking up memory unnecessarly.
118
  #
119
  $this->urls = array();
@@ -128,7 +127,7 @@ class NC_Markdown_Parser {
128
  # and pass it through the document gamut.
129
  #
130
  $this->setup();
131
-
132
  # Remove UTF-8 BOM and marker character in input, if present.
133
  $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text);
134
 
@@ -155,16 +154,16 @@ class NC_Markdown_Parser {
155
  foreach ($this->document_gamut as $method => $priority) {
156
  $text = $this->$method($text);
157
  }
158
-
159
  $this->teardown();
160
 
161
  return $text . "\n";
162
  }
163
-
164
  var $document_gamut = array(
165
  # Strip link definitions, store in hashes.
166
  "stripLinkDefinitions" => 20,
167
-
168
  "runBasicBlockGamut" => 30,
169
  );
170
 
@@ -220,8 +219,8 @@ class NC_Markdown_Parser {
220
  # hard-coded:
221
  #
222
  # * List "a" is made of tags which can be both inline or block-level.
223
- # These will be treated block-level when the start tag is alone on
224
- # its line, otherwise they're not matched here and will be taken as
225
  # inline later.
226
  # * List "b" is made of tags which are always block-level;
227
  #
@@ -243,7 +242,7 @@ class NC_Markdown_Parser {
243
  |
244
  \'[^\']*\' # text inside single quotes (tolerate ">")
245
  )*
246
- )?
247
  ';
248
  $content =
249
  str_repeat('
@@ -260,7 +259,7 @@ class NC_Markdown_Parser {
260
  str_repeat('
261
  </\2\s*> # closing nested tag
262
  )
263
- |
264
  <(?!/\2\s*> # other tags with a different name
265
  )
266
  )*',
@@ -286,9 +285,9 @@ class NC_Markdown_Parser {
286
  )
287
  ( # save in $1
288
 
289
- # Match from `\n<tag>` to `</tag>\n`, handling nested tags
290
  # in between.
291
-
292
  [ ]{0,'.$less_than_tab.'}
293
  <('.$block_tags_b_re.')# start tag = $2
294
  '.$attr.'> # attributes followed by > and \n
@@ -306,28 +305,28 @@ class NC_Markdown_Parser {
306
  </\3> # the matching end tag
307
  [ ]* # trailing spaces/tabs
308
  (?=\n+|\Z) # followed by a newline or end of document
309
-
310
- | # Special case just for <hr />. It was easier to make a special
311
  # case than to make the other regex more complicated.
312
-
313
  [ ]{0,'.$less_than_tab.'}
314
  <(hr) # start tag = $2
315
  '.$attr.' # attributes
316
  /?> # the matching end tag
317
  [ ]*
318
  (?=\n{2,}|\Z) # followed by a blank line or end of document
319
-
320
  | # Special case for standalone HTML comments:
321
-
322
  [ ]{0,'.$less_than_tab.'}
323
  (?s:
324
  <!-- .*? -->
325
  )
326
  [ ]*
327
  (?=\n{2,}|\Z) # followed by a blank line or end of document
328
-
329
  | # PHP and ASP-style processor instructions (<? and <%)
330
-
331
  [ ]{0,'.$less_than_tab.'}
332
  (?s:
333
  <([?%]) # $2
@@ -336,7 +335,7 @@ class NC_Markdown_Parser {
336
  )
337
  [ ]*
338
  (?=\n{2,}|\Z) # followed by a blank line or end of document
339
-
340
  )
341
  )}Sxmi',
342
  array(&$this, '_hashHTMLBlocks_callback'),
@@ -349,11 +348,11 @@ class NC_Markdown_Parser {
349
  $key = $this->hashBlock($text);
350
  return "\n\n$key\n\n";
351
  }
352
-
353
-
354
  function hashPart($text, $boundary = 'X') {
355
  #
356
- # Called whenever a tag must be hashed when a function insert an atomic
357
  # element in the text stream. Passing $text to through this function gives
358
  # a unique text-token which will be reverted back when calling unhash.
359
  #
@@ -365,7 +364,7 @@ class NC_Markdown_Parser {
365
  # Swap back any tag hash found in $text so we do not have to `unhash`
366
  # multiple times at the end.
367
  $text = $this->unhash($text);
368
-
369
  # Then hash the block.
370
  static $i = 0;
371
  $key = "$boundary\x1A" . ++$i . $boundary;
@@ -389,7 +388,7 @@ class NC_Markdown_Parser {
389
  #
390
  "doHeaders" => 10,
391
  "doHorizontalRules" => 20,
392
-
393
  "doLists" => 40,
394
  "doCodeBlocks" => 50,
395
  "doBlockQuotes" => 60,
@@ -399,33 +398,33 @@ class NC_Markdown_Parser {
399
  #
400
  # Run block gamut tranformations.
401
  #
402
- # We need to escape raw HTML in Markdown source before doing anything
403
- # else. This need to be done for each block, and not only at the
404
  # begining in the Markdown function since hashed blocks can be part of
405
- # list items and could have been indented. Indented blocks would have
406
  # been seen as a code block in a previous pass of hashHTMLBlocks.
407
  $text = $this->hashHTMLBlocks($text);
408
-
409
  return $this->runBasicBlockGamut($text);
410
  }
411
-
412
  function runBasicBlockGamut($text) {
413
  #
414
- # Run block gamut tranformations, without hashing HTML blocks. This is
415
  # useful when HTML blocks are known to be already hashed, like in the first
416
  # whole-document pass.
417
  #
418
  foreach ($this->block_gamut as $method => $priority) {
419
  $text = $this->$method($text);
420
  }
421
-
422
  # Finally form paragraph and restore hashed blocks.
423
  $text = $this->formParagraphs($text);
424
 
425
  return $text;
426
  }
427
-
428
-
429
  function doHorizontalRules($text) {
430
  # Do Horizontal Rules:
431
  return preg_replace(
@@ -439,7 +438,7 @@ class NC_Markdown_Parser {
439
  [ ]* # Tailing spaces
440
  $ # End of line.
441
  }mx',
442
- "\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n",
443
  $text);
444
  }
445
 
@@ -457,7 +456,7 @@ class NC_Markdown_Parser {
457
  # because ![foo][f] looks like an anchor.
458
  "doImages" => 10,
459
  "doAnchors" => 20,
460
-
461
  # Make links out of things like `<http://example.com/>`
462
  # Must come after doAnchors, because you can use < and >
463
  # delimiters in inline links like [this](<url>).
@@ -478,11 +477,11 @@ class NC_Markdown_Parser {
478
 
479
  return $text;
480
  }
481
-
482
-
483
  function doHardBreaks($text) {
484
  # Do hard breaks:
485
- return preg_replace_callback('/ {2,}\n/',
486
  array(&$this, '_doHardBreaks_callback'), $text);
487
  }
488
  function _doHardBreaks_callback($matches) {
@@ -496,7 +495,7 @@ class NC_Markdown_Parser {
496
  #
497
  if ($this->in_anchor) return $text;
498
  $this->in_anchor = true;
499
-
500
  #
501
  # First, handle reference-style links: [link text] [id]
502
  #
@@ -569,7 +568,7 @@ class NC_Markdown_Parser {
569
  # for shortcut links like [this][] or [this].
570
  $link_id = $link_text;
571
  }
572
-
573
  # lower-case and turn embedded newlines into spaces
574
  $link_id = strtolower($link_id);
575
  $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
@@ -577,14 +576,14 @@ class NC_Markdown_Parser {
577
  if (isset($this->urls[$link_id])) {
578
  $url = $this->urls[$link_id];
579
  $url = $this->encodeAttribute($url);
580
-
581
  $result = "<a href=\"$url\"";
582
  if ( isset( $this->titles[$link_id] ) ) {
583
  $title = $this->titles[$link_id];
584
  $title = $this->encodeAttribute($title);
585
  $result .= " title=\"$title\"";
586
  }
587
-
588
  $link_text = $this->runSpanGamut($link_text);
589
  $result .= ">$link_text</a>";
590
  $result = $this->hashPart($result);
@@ -607,7 +606,7 @@ class NC_Markdown_Parser {
607
  $title = $this->encodeAttribute($title);
608
  $result .= " title=\"$title\"";
609
  }
610
-
611
  $link_text = $this->runSpanGamut($link_text);
612
  $result .= ">$link_text</a>";
613
 
@@ -636,7 +635,7 @@ class NC_Markdown_Parser {
636
  \]
637
 
638
  )
639
- }xs',
640
  array(&$this, '_doImages_reference_callback'), $text);
641
 
642
  #
@@ -721,7 +720,7 @@ class NC_Markdown_Parser {
721
  # Setext-style headers:
722
  # Header 1
723
  # ========
724
- #
725
  # Header 2
726
  # --------
727
  #
@@ -751,7 +750,7 @@ class NC_Markdown_Parser {
751
  # Terrible hack to check we haven't found an empty list item.
752
  if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1]))
753
  return $matches[0];
754
-
755
  $level = $matches[2]{0} == '=' ? 1 : 2;
756
  $block = "<h$level>".$this->runSpanGamut($matches[1])."</h$level>";
757
  return "\n" . $this->hashBlock($block) . "\n\n";
@@ -798,10 +797,10 @@ class NC_Markdown_Parser {
798
  )
799
  )
800
  '; // mx
801
-
802
  # We use a different prefix before nested lists than top-level lists.
803
  # See extended comment in _ProcessListItems().
804
-
805
  if ($this->list_level) {
806
  $text = preg_replace_callback('{
807
  ^
@@ -825,15 +824,15 @@ class NC_Markdown_Parser {
825
  $marker_ul_re = '[*+-]';
826
  $marker_ol_re = '\d+[.]';
827
  $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
828
-
829
  $list = $matches[1];
830
  $list_type = preg_match("/$marker_ul_re/", $matches[3]) ? "ul" : "ol";
831
-
832
  $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );
833
-
834
  $list .= "\n";
835
  $result = $this->processListItems($list, $marker_any_re);
836
-
837
  $result = $this->hashBlock("<$list_type>\n" . $result . "</$list_type>");
838
  return "\n". $result ."\n\n";
839
  }
@@ -865,7 +864,7 @@ class NC_Markdown_Parser {
865
  # without resorting to mind-reading. Perhaps the solution is to
866
  # change the syntax rules such that sub-lists must start with a
867
  # starting cardinal number; e.g. "1." or "a.".
868
-
869
  $this->list_level++;
870
 
871
  # trim trailing blank lines:
@@ -893,7 +892,7 @@ class NC_Markdown_Parser {
893
  $marker_space = $matches[3];
894
  $tailing_blank_line =& $matches[5];
895
 
896
- if ($leading_line || $tailing_blank_line ||
897
  preg_match('/\n{2,}/', $item))
898
  {
899
  # Replace marker with the appropriate whitespace indentation
@@ -968,7 +967,7 @@ class NC_Markdown_Parser {
968
  '___' => '(?<=\S)(?<!_)___(?!_)',
969
  );
970
  var $em_strong_prepared_relist;
971
-
972
  function prepareItalicsAndBold() {
973
  #
974
  # Prepare regular expressions for seraching emphasis tokens in any
@@ -983,37 +982,37 @@ class NC_Markdown_Parser {
983
  }
984
  $token_relist[] = $em_re;
985
  $token_relist[] = $strong_re;
986
-
987
  # Construct master expression from list.
988
  $token_re = '{('. implode('|', $token_relist) .')}';
989
  $this->em_strong_prepared_relist["$em$strong"] = $token_re;
990
  }
991
  }
992
  }
993
-
994
  function doItalicsAndBold($text) {
995
  $token_stack = array('');
996
  $text_stack = array('');
997
  $em = '';
998
  $strong = '';
999
  $tree_char_em = false;
1000
-
1001
  while (1) {
1002
  #
1003
  # Get prepared regular expression for seraching emphasis tokens
1004
  # in current context.
1005
  #
1006
  $token_re = $this->em_strong_prepared_relist["$em$strong"];
1007
-
1008
  #
1009
- # Each loop iteration seach for the next emphasis token.
1010
  # Each token is then passed to handleSpanToken.
1011
  #
1012
  $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
1013
  $text_stack[0] .= $parts[0];
1014
  $token =& $parts[1];
1015
  $text =& $parts[2];
1016
-
1017
  if (empty($token)) {
1018
  # Reached end of text span: empty stack without emitting.
1019
  # any more emphasis.
@@ -1023,7 +1022,7 @@ class NC_Markdown_Parser {
1023
  }
1024
  break;
1025
  }
1026
-
1027
  $token_len = strlen($token);
1028
  if ($tree_char_em) {
1029
  # Reached closing marker while inside a three-char emphasis.
@@ -1062,7 +1061,7 @@ class NC_Markdown_Parser {
1062
  $$tag = ''; # $$tag stands for $em or $strong
1063
  }
1064
  } else {
1065
- # Reached opening three-char emphasis marker. Push on token
1066
  # stack; will be handled by the special condition above.
1067
  $em = $token{0};
1068
  $strong = "$em$em";
@@ -1136,9 +1135,9 @@ class NC_Markdown_Parser {
1136
  $bq = $this->runBlockGamut($bq); # recurse
1137
 
1138
  $bq = preg_replace('/^/m', " ", $bq);
1139
- # These leading spaces cause problem with <pre> content,
1140
  # so we need to fix that:
1141
- $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
1142
  array(&$this, '_DoBlockQuotes_callback2'), $bq);
1143
 
1144
  return "\n". $this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n";
@@ -1201,7 +1200,7 @@ class NC_Markdown_Parser {
1201
  // # We can't call Markdown(), because that resets the hash;
1202
  // # that initialization code should be pulled into its own sub, though.
1203
  // $div_content = $this->hashHTMLBlocks($div_content);
1204
- //
1205
  // # Run document gamut methods on the content.
1206
  // foreach ($this->document_gamut as $method => $priority) {
1207
  // $div_content = $this->$method($div_content);
@@ -1229,11 +1228,11 @@ class NC_Markdown_Parser {
1229
  $text = str_replace('"', '&quot;', $text);
1230
  return $text;
1231
  }
1232
-
1233
-
1234
  function encodeAmpsAndAngles($text) {
1235
  #
1236
- # Smart processing for ampersands and angle brackets that need to
1237
  # be encoded. Valid character entities are left alone unless the
1238
  # no-entities mode is set.
1239
  #
@@ -1242,7 +1241,7 @@ class NC_Markdown_Parser {
1242
  } else {
1243
  # Ampersand-encoding based entirely on Nat Irons's Amputator
1244
  # MT plugin: <http://bumppo.net/projects/amputator/>
1245
- $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
1246
  '&amp;', $text);;
1247
  }
1248
  # Encode remaining <'s
@@ -1253,7 +1252,7 @@ class NC_Markdown_Parser {
1253
 
1254
 
1255
  function doAutoLinks($text) {
1256
- $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i',
1257
  array(&$this, '_doAutoLinks_url_callback'), $text);
1258
 
1259
  # Email addresses: <address@domain.foo>
@@ -1302,7 +1301,7 @@ class NC_Markdown_Parser {
1302
  $addr = "mailto:" . $addr;
1303
  $chars = preg_split('/(?<!^)(?!$)/', $addr);
1304
  $seed = (int)abs(crc32($addr) / strlen($addr)); # Deterministic seed.
1305
-
1306
  foreach ($chars as $key => $char) {
1307
  $ord = ord($char);
1308
  # Ignore non-ascii chars.
@@ -1315,7 +1314,7 @@ class NC_Markdown_Parser {
1315
  else $chars[$key] = '&#'.$ord.';';
1316
  }
1317
  }
1318
-
1319
  $addr = implode('', $chars);
1320
  $text = implode('', array_slice($chars, 7)); # text without `mailto:`
1321
  $addr = "<a href=\"$addr\">$text</a>";
@@ -1330,7 +1329,7 @@ class NC_Markdown_Parser {
1330
  # escaped characters and handling code spans.
1331
  #
1332
  $output = '';
1333
-
1334
  $span_re = '{
1335
  (
1336
  \\\\'.$this->escape_chars_re.'
@@ -1355,17 +1354,17 @@ class NC_Markdown_Parser {
1355
 
1356
  while (1) {
1357
  #
1358
- # Each loop iteration seach for either the next tag, the next
1359
- # openning code span marker, or the next escaped character.
1360
  # Each token is then passed to handleSpanToken.
1361
  #
1362
  $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);
1363
-
1364
  # Create token from text preceding tag.
1365
  if ($parts[0] != "") {
1366
  $output .= $parts[0];
1367
  }
1368
-
1369
  # Check if we reach the end.
1370
  if (isset($parts[1])) {
1371
  $output .= $this->handleSpanToken($parts[1], $parts[2]);
@@ -1375,14 +1374,14 @@ class NC_Markdown_Parser {
1375
  break;
1376
  }
1377
  }
1378
-
1379
  return $output;
1380
  }
1381
-
1382
-
1383
  function handleSpanToken($token, &$str) {
1384
  #
1385
- # Handle $token provided by parseSpan by determining its nature and
1386
  # returning the corresponding value that should replace it.
1387
  #
1388
  switch ($token{0}) {
@@ -1390,7 +1389,7 @@ class NC_Markdown_Parser {
1390
  return $this->hashPart("&#". ord($token{1}). ";");
1391
  case "`":
1392
  # Search for end marker in remaining text.
1393
- if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
1394
  $str, $matches))
1395
  {
1396
  $str = $matches[2];
@@ -1412,18 +1411,18 @@ class NC_Markdown_Parser {
1412
  }
1413
 
1414
 
1415
- # String length function for detab. `_initDetab` will create a function to
1416
  # hanlde UTF-8 if the default function does not exist.
1417
  var $utf8_strlen = 'mb_strlen';
1418
-
1419
  function detab($text) {
1420
  #
1421
  # Replace tabs with the appropriate amount of space.
1422
  #
1423
  # For each line we separate the line in blocks delemited by
1424
- # tab characters. Then we reconstruct every line by adding the
1425
  # appropriate number of space between each blocks.
1426
-
1427
  $text = preg_replace_callback('/^.*\t.*$/m',
1428
  array(&$this, '_detab_callback'), $text);
1429
 
@@ -1432,7 +1431,7 @@ class NC_Markdown_Parser {
1432
  function _detab_callback($matches) {
1433
  $line = $matches[0];
1434
  $strlen = $this->utf8_strlen; # strlen function for UTF-8.
1435
-
1436
  # Split in blocks.
1437
  $blocks = explode("\t", $line);
1438
  # Add each blocks to the line.
@@ -1440,7 +1439,7 @@ class NC_Markdown_Parser {
1440
  unset($blocks[0]); # Do not add first block twice.
1441
  foreach ($blocks as $block) {
1442
  # Calculate amount of space, insert spaces, insert block.
1443
- $amount = $this->tab_width -
1444
  $strlen($line, 'UTF-8') % $this->tab_width;
1445
  $line .= str_repeat(" ", $amount) . $block;
1446
  }
@@ -1449,13 +1448,13 @@ class NC_Markdown_Parser {
1449
  function _initDetab() {
1450
  #
1451
  # Check for the availability of the function in the `utf8_strlen` property
1452
- # (initially `mb_strlen`). If the function is not available, create a
1453
  # function that will loosely count the number of UTF-8 characters with a
1454
  # regular expression.
1455
  #
1456
  if (function_exists($this->utf8_strlen)) return;
1457
  $this->utf8_strlen = create_function('$text', 'return preg_match_all(
1458
- "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
1459
  $text, $m);');
1460
  }
1461
 
@@ -1464,7 +1463,7 @@ class NC_Markdown_Parser {
1464
  #
1465
  # Swap back in all the tags hashed by _HashHTMLBlocks.
1466
  #
1467
- return preg_replace_callback('/(.)\x1A[0-9]+\1/',
1468
  array(&$this, '_unhash_callback'), $text);
1469
  }
1470
  function _unhash_callback($matches) {
27
 
28
  static $parser;
29
  if (!isset($parser)) {
30
+ $parser = new NC_Markdown_Parser;
 
31
  }
32
 
33
  return $parser->transform($text);
43
  # Needed to insert a maximum bracked depth while converting to PHP.
44
  var $nested_brackets_depth = 6;
45
  var $nested_brackets_re;
46
+
47
  var $nested_url_parenthesis_depth = 4;
48
  var $nested_url_parenthesis_re;
49
 
54
  # Change to ">" for HTML output.
55
  var $empty_element_suffix = " />";
56
  var $tab_width = 4;
57
+
58
  # Change to `true` to disallow markup or entities.
59
  var $no_markup = false;
60
  var $no_entities = false;
61
+
62
  # Predefined urls and titles for reference links and images.
63
  var $predef_urls = array();
64
  var $predef_titles = array();
70
  #
71
  $this->_initDetab();
72
  $this->prepareItalicsAndBold();
73
+
74
+ $this->nested_brackets_re =
75
  str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth).
76
  str_repeat('\])*', $this->nested_brackets_depth);
77
+
78
+ $this->nested_url_parenthesis_re =
79
  str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth).
80
  str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth);
81
+
82
  $this->escape_chars_re = '['.preg_quote($this->escape_chars).']';
83
+
84
  # Sort document, block, and span gamut in ascendent priority order.
85
  asort($this->document_gamut);
86
  asort($this->block_gamut);
92
  var $urls = array();
93
  var $titles = array();
94
  var $html_hashes = array();
95
+
96
  # Status flag to avoid invalid nesting.
97
  var $in_anchor = false;
98
+
99
+
100
  function setup() {
101
  #
102
+ # Called before the transformation process starts to setup parser
103
  # states.
104
  #
105
  # Clear global hashes.
106
  $this->urls = $this->predef_urls;
107
  $this->titles = $this->predef_titles;
108
  $this->html_hashes = array();
109
+
110
  $in_anchor = false;
111
  }
112
+
113
  function teardown() {
114
  #
115
+ # Called after the transformation process to clear any variable
116
  # which may be taking up memory unnecessarly.
117
  #
118
  $this->urls = array();
127
  # and pass it through the document gamut.
128
  #
129
  $this->setup();
130
+
131
  # Remove UTF-8 BOM and marker character in input, if present.
132
  $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text);
133
 
154
  foreach ($this->document_gamut as $method => $priority) {
155
  $text = $this->$method($text);
156
  }
157
+
158
  $this->teardown();
159
 
160
  return $text . "\n";
161
  }
162
+
163
  var $document_gamut = array(
164
  # Strip link definitions, store in hashes.
165
  "stripLinkDefinitions" => 20,
166
+
167
  "runBasicBlockGamut" => 30,
168
  );
169
 
219
  # hard-coded:
220
  #
221
  # * List "a" is made of tags which can be both inline or block-level.
222
+ # These will be treated block-level when the start tag is alone on
223
+ # its line, otherwise they're not matched here and will be taken as
224
  # inline later.
225
  # * List "b" is made of tags which are always block-level;
226
  #
242
  |
243
  \'[^\']*\' # text inside single quotes (tolerate ">")
244
  )*
245
+ )?
246
  ';
247
  $content =
248
  str_repeat('
259
  str_repeat('
260
  </\2\s*> # closing nested tag
261
  )
262
+ |
263
  <(?!/\2\s*> # other tags with a different name
264
  )
265
  )*',
285
  )
286
  ( # save in $1
287
 
288
+ # Match from `\n<tag>` to `</tag>\n`, handling nested tags
289
  # in between.
290
+
291
  [ ]{0,'.$less_than_tab.'}
292
  <('.$block_tags_b_re.')# start tag = $2
293
  '.$attr.'> # attributes followed by > and \n
305
  </\3> # the matching end tag
306
  [ ]* # trailing spaces/tabs
307
  (?=\n+|\Z) # followed by a newline or end of document
308
+
309
+ | # Special case just for <hr />. It was easier to make a special
310
  # case than to make the other regex more complicated.
311
+
312
  [ ]{0,'.$less_than_tab.'}
313
  <(hr) # start tag = $2
314
  '.$attr.' # attributes
315
  /?> # the matching end tag
316
  [ ]*
317
  (?=\n{2,}|\Z) # followed by a blank line or end of document
318
+
319
  | # Special case for standalone HTML comments:
320
+
321
  [ ]{0,'.$less_than_tab.'}
322
  (?s:
323
  <!-- .*? -->
324
  )
325
  [ ]*
326
  (?=\n{2,}|\Z) # followed by a blank line or end of document
327
+
328
  | # PHP and ASP-style processor instructions (<? and <%)
329
+
330
  [ ]{0,'.$less_than_tab.'}
331
  (?s:
332
  <([?%]) # $2
335
  )
336
  [ ]*
337
  (?=\n{2,}|\Z) # followed by a blank line or end of document
338
+
339
  )
340
  )}Sxmi',
341
  array(&$this, '_hashHTMLBlocks_callback'),
348
  $key = $this->hashBlock($text);
349
  return "\n\n$key\n\n";
350
  }
351
+
352
+
353
  function hashPart($text, $boundary = 'X') {
354
  #
355
+ # Called whenever a tag must be hashed when a function insert an atomic
356
  # element in the text stream. Passing $text to through this function gives
357
  # a unique text-token which will be reverted back when calling unhash.
358
  #
364
  # Swap back any tag hash found in $text so we do not have to `unhash`
365
  # multiple times at the end.
366
  $text = $this->unhash($text);
367
+
368
  # Then hash the block.
369
  static $i = 0;
370
  $key = "$boundary\x1A" . ++$i . $boundary;
388
  #
389
  "doHeaders" => 10,
390
  "doHorizontalRules" => 20,
391
+
392
  "doLists" => 40,
393
  "doCodeBlocks" => 50,
394
  "doBlockQuotes" => 60,
398
  #
399
  # Run block gamut tranformations.
400
  #
401
+ # We need to escape raw HTML in Markdown source before doing anything
402
+ # else. This need to be done for each block, and not only at the
403
  # begining in the Markdown function since hashed blocks can be part of
404
+ # list items and could have been indented. Indented blocks would have
405
  # been seen as a code block in a previous pass of hashHTMLBlocks.
406
  $text = $this->hashHTMLBlocks($text);
407
+
408
  return $this->runBasicBlockGamut($text);
409
  }
410
+
411
  function runBasicBlockGamut($text) {
412
  #
413
+ # Run block gamut tranformations, without hashing HTML blocks. This is
414
  # useful when HTML blocks are known to be already hashed, like in the first
415
  # whole-document pass.
416
  #
417
  foreach ($this->block_gamut as $method => $priority) {
418
  $text = $this->$method($text);
419
  }
420
+
421
  # Finally form paragraph and restore hashed blocks.
422
  $text = $this->formParagraphs($text);
423
 
424
  return $text;
425
  }
426
+
427
+
428
  function doHorizontalRules($text) {
429
  # Do Horizontal Rules:
430
  return preg_replace(
438
  [ ]* # Tailing spaces
439
  $ # End of line.
440
  }mx',
441
+ "\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n",
442
  $text);
443
  }
444
 
456
  # because ![foo][f] looks like an anchor.
457
  "doImages" => 10,
458
  "doAnchors" => 20,
459
+
460
  # Make links out of things like `<http://example.com/>`
461
  # Must come after doAnchors, because you can use < and >
462
  # delimiters in inline links like [this](<url>).
477
 
478
  return $text;
479
  }
480
+
481
+
482
  function doHardBreaks($text) {
483
  # Do hard breaks:
484
+ return preg_replace_callback('/ {2,}\n/',
485
  array(&$this, '_doHardBreaks_callback'), $text);
486
  }
487
  function _doHardBreaks_callback($matches) {
495
  #
496
  if ($this->in_anchor) return $text;
497
  $this->in_anchor = true;
498
+
499
  #
500
  # First, handle reference-style links: [link text] [id]
501
  #
568
  # for shortcut links like [this][] or [this].
569
  $link_id = $link_text;
570
  }
571
+
572
  # lower-case and turn embedded newlines into spaces
573
  $link_id = strtolower($link_id);
574
  $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
576
  if (isset($this->urls[$link_id])) {
577
  $url = $this->urls[$link_id];
578
  $url = $this->encodeAttribute($url);
579
+
580
  $result = "<a href=\"$url\"";
581
  if ( isset( $this->titles[$link_id] ) ) {
582
  $title = $this->titles[$link_id];
583
  $title = $this->encodeAttribute($title);
584
  $result .= " title=\"$title\"";
585
  }
586
+
587
  $link_text = $this->runSpanGamut($link_text);
588
  $result .= ">$link_text</a>";
589
  $result = $this->hashPart($result);
606
  $title = $this->encodeAttribute($title);
607
  $result .= " title=\"$title\"";
608
  }
609
+
610
  $link_text = $this->runSpanGamut($link_text);
611
  $result .= ">$link_text</a>";
612
 
635
  \]
636
 
637
  )
638
+ }xs',
639
  array(&$this, '_doImages_reference_callback'), $text);
640
 
641
  #
720
  # Setext-style headers:
721
  # Header 1
722
  # ========
723
+ #
724
  # Header 2
725
  # --------
726
  #
750
  # Terrible hack to check we haven't found an empty list item.
751
  if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1]))
752
  return $matches[0];
753
+
754
  $level = $matches[2]{0} == '=' ? 1 : 2;
755
  $block = "<h$level>".$this->runSpanGamut($matches[1])."</h$level>";
756
  return "\n" . $this->hashBlock($block) . "\n\n";
797
  )
798
  )
799
  '; // mx
800
+
801
  # We use a different prefix before nested lists than top-level lists.
802
  # See extended comment in _ProcessListItems().
803
+
804
  if ($this->list_level) {
805
  $text = preg_replace_callback('{
806
  ^
824
  $marker_ul_re = '[*+-]';
825
  $marker_ol_re = '\d+[.]';
826
  $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
827
+
828
  $list = $matches[1];
829
  $list_type = preg_match("/$marker_ul_re/", $matches[3]) ? "ul" : "ol";
830
+
831
  $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );
832
+
833
  $list .= "\n";
834
  $result = $this->processListItems($list, $marker_any_re);
835
+
836
  $result = $this->hashBlock("<$list_type>\n" . $result . "</$list_type>");
837
  return "\n". $result ."\n\n";
838
  }
864
  # without resorting to mind-reading. Perhaps the solution is to
865
  # change the syntax rules such that sub-lists must start with a
866
  # starting cardinal number; e.g. "1." or "a.".
867
+
868
  $this->list_level++;
869
 
870
  # trim trailing blank lines:
892
  $marker_space = $matches[3];
893
  $tailing_blank_line =& $matches[5];
894
 
895
+ if ($leading_line || $tailing_blank_line ||
896
  preg_match('/\n{2,}/', $item))
897
  {
898
  # Replace marker with the appropriate whitespace indentation
967
  '___' => '(?<=\S)(?<!_)___(?!_)',
968
  );
969
  var $em_strong_prepared_relist;
970
+
971
  function prepareItalicsAndBold() {
972
  #
973
  # Prepare regular expressions for seraching emphasis tokens in any
982
  }
983
  $token_relist[] = $em_re;
984
  $token_relist[] = $strong_re;
985
+
986
  # Construct master expression from list.
987
  $token_re = '{('. implode('|', $token_relist) .')}';
988
  $this->em_strong_prepared_relist["$em$strong"] = $token_re;
989
  }
990
  }
991
  }
992
+
993
  function doItalicsAndBold($text) {
994
  $token_stack = array('');
995
  $text_stack = array('');
996
  $em = '';
997
  $strong = '';
998
  $tree_char_em = false;
999
+
1000
  while (1) {
1001
  #
1002
  # Get prepared regular expression for seraching emphasis tokens
1003
  # in current context.
1004
  #
1005
  $token_re = $this->em_strong_prepared_relist["$em$strong"];
1006
+
1007
  #
1008
+ # Each loop iteration seach for the next emphasis token.
1009
  # Each token is then passed to handleSpanToken.
1010
  #
1011
  $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
1012
  $text_stack[0] .= $parts[0];
1013
  $token =& $parts[1];
1014
  $text =& $parts[2];
1015
+
1016
  if (empty($token)) {
1017
  # Reached end of text span: empty stack without emitting.
1018
  # any more emphasis.
1022
  }
1023
  break;
1024
  }
1025
+
1026
  $token_len = strlen($token);
1027
  if ($tree_char_em) {
1028
  # Reached closing marker while inside a three-char emphasis.
1061
  $$tag = ''; # $$tag stands for $em or $strong
1062
  }
1063
  } else {
1064
+ # Reached opening three-char emphasis marker. Push on token
1065
  # stack; will be handled by the special condition above.
1066
  $em = $token{0};
1067
  $strong = "$em$em";
1135
  $bq = $this->runBlockGamut($bq); # recurse
1136
 
1137
  $bq = preg_replace('/^/m', " ", $bq);
1138
+ # These leading spaces cause problem with <pre> content,
1139
  # so we need to fix that:
1140
+ $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
1141
  array(&$this, '_DoBlockQuotes_callback2'), $bq);
1142
 
1143
  return "\n". $this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n";
1200
  // # We can't call Markdown(), because that resets the hash;
1201
  // # that initialization code should be pulled into its own sub, though.
1202
  // $div_content = $this->hashHTMLBlocks($div_content);
1203
+ //
1204
  // # Run document gamut methods on the content.
1205
  // foreach ($this->document_gamut as $method => $priority) {
1206
  // $div_content = $this->$method($div_content);
1228
  $text = str_replace('"', '&quot;', $text);
1229
  return $text;
1230
  }
1231
+
1232
+
1233
  function encodeAmpsAndAngles($text) {
1234
  #
1235
+ # Smart processing for ampersands and angle brackets that need to
1236
  # be encoded. Valid character entities are left alone unless the
1237
  # no-entities mode is set.
1238
  #
1241
  } else {
1242
  # Ampersand-encoding based entirely on Nat Irons's Amputator
1243
  # MT plugin: <http://bumppo.net/projects/amputator/>
1244
+ $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
1245
  '&amp;', $text);;
1246
  }
1247
  # Encode remaining <'s
1252
 
1253
 
1254
  function doAutoLinks($text) {
1255
+ $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i',
1256
  array(&$this, '_doAutoLinks_url_callback'), $text);
1257
 
1258
  # Email addresses: <address@domain.foo>
1301
  $addr = "mailto:" . $addr;
1302
  $chars = preg_split('/(?<!^)(?!$)/', $addr);
1303
  $seed = (int)abs(crc32($addr) / strlen($addr)); # Deterministic seed.
1304
+
1305
  foreach ($chars as $key => $char) {
1306
  $ord = ord($char);
1307
  # Ignore non-ascii chars.
1314
  else $chars[$key] = '&#'.$ord.';';
1315
  }
1316
  }
1317
+
1318
  $addr = implode('', $chars);
1319
  $text = implode('', array_slice($chars, 7)); # text without `mailto:`
1320
  $addr = "<a href=\"$addr\">$text</a>";
1329
  # escaped characters and handling code spans.
1330
  #
1331
  $output = '';
1332
+
1333
  $span_re = '{
1334
  (
1335
  \\\\'.$this->escape_chars_re.'
1354
 
1355
  while (1) {
1356
  #
1357
+ # Each loop iteration seach for either the next tag, the next
1358
+ # openning code span marker, or the next escaped character.
1359
  # Each token is then passed to handleSpanToken.
1360
  #
1361
  $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);
1362
+
1363
  # Create token from text preceding tag.
1364
  if ($parts[0] != "") {
1365
  $output .= $parts[0];
1366
  }
1367
+
1368
  # Check if we reach the end.
1369
  if (isset($parts[1])) {
1370
  $output .= $this->handleSpanToken($parts[1], $parts[2]);
1374
  break;
1375
  }
1376
  }
1377
+
1378
  return $output;
1379
  }
1380
+
1381
+
1382
  function handleSpanToken($token, &$str) {
1383
  #
1384
+ # Handle $token provided by parseSpan by determining its nature and
1385
  # returning the corresponding value that should replace it.
1386
  #
1387
  switch ($token{0}) {
1389
  return $this->hashPart("&#". ord($token{1}). ";");
1390
  case "`":
1391
  # Search for end marker in remaining text.
1392
+ if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
1393
  $str, $matches))
1394
  {
1395
  $str = $matches[2];
1411
  }
1412
 
1413
 
1414
+ # String length function for detab. `_initDetab` will create a function to
1415
  # hanlde UTF-8 if the default function does not exist.
1416
  var $utf8_strlen = 'mb_strlen';
1417
+
1418
  function detab($text) {
1419
  #
1420
  # Replace tabs with the appropriate amount of space.
1421
  #
1422
  # For each line we separate the line in blocks delemited by
1423
+ # tab characters. Then we reconstruct every line by adding the
1424
  # appropriate number of space between each blocks.
1425
+
1426
  $text = preg_replace_callback('/^.*\t.*$/m',
1427
  array(&$this, '_detab_callback'), $text);
1428
 
1431
  function _detab_callback($matches) {
1432
  $line = $matches[0];
1433
  $strlen = $this->utf8_strlen; # strlen function for UTF-8.
1434
+
1435
  # Split in blocks.
1436
  $blocks = explode("\t", $line);
1437
  # Add each blocks to the line.
1439
  unset($blocks[0]); # Do not add first block twice.
1440
  foreach ($blocks as $block) {
1441
  # Calculate amount of space, insert spaces, insert block.
1442
+ $amount = $this->tab_width -
1443
  $strlen($line, 'UTF-8') % $this->tab_width;
1444
  $line .= str_repeat(" ", $amount) . $block;
1445
  }
1448
  function _initDetab() {
1449
  #
1450
  # Check for the availability of the function in the `utf8_strlen` property
1451
+ # (initially `mb_strlen`). If the function is not available, create a
1452
  # function that will loosely count the number of UTF-8 characters with a
1453
  # regular expression.
1454
  #
1455
  if (function_exists($this->utf8_strlen)) return;
1456
  $this->utf8_strlen = create_function('$text', 'return preg_match_all(
1457
+ "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
1458
  $text, $m);');
1459
  }
1460
 
1463
  #
1464
  # Swap back in all the tags hashed by _HashHTMLBlocks.
1465
  #
1466
+ return preg_replace_callback('/(.)\x1A[0-9]+\1/',
1467
  array(&$this, '_unhash_callback'), $text);
1468
  }
1469
  function _unhash_callback($matches) {
includes/menu-pages/api-ops.inc.php CHANGED
@@ -31,8 +31,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>s2Member API / Notifications</h2>' . "\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">' . "\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
@@ -983,7 +986,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
983
 
984
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
985
 
986
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>' . "\n";
987
 
988
  echo '</form>' . "\n";
989
 
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>API / Notifications</h2>' . "\n";
39
 
40
  echo '<table class="ws-menu-page-table">' . "\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
986
 
987
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
988
 
989
+ echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>' . "\n";
990
 
991
  echo '</form>' . "\n";
992
 
includes/menu-pages/code-samples/jwplayer-v5-standard-mp4.x-php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- // Configuration.
3
- $s2_jw_config["jwplayer"] = "/jwplayer/"; // Relative URL path to JW Player files directory.
4
- $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test file.
5
- // Don't edit anything else below unless you know what you're doing.
6
- ?>
7
-
8
- <div id="jw-container">JW Player® appears here.</div>
9
- <script type="text/javascript" src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
10
- <script type="text/javascript">
11
- jwplayer("jw-container").setup({modes: // JW Player®.
12
- [
13
- // First try psuedo-streaming with Flash® player.
14
- {type: "flash", provider: "http", src: "<?php echo $s2_jw_config["jwplayer"]; ?>player.swf",
15
- config: {file: "/wp-content/plugins/s2member-files/s2member-file-inline/<?php echo $s2_jw_config["mp4_video_file_name"]; ?>"}},
16
- // Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="<?php echo $s2_jw_config["mp4_video_file_name"]; ?>" /]
17
-
18
- // Else, try an HTML5 video tag.
19
- {type: "html5", provider: "video",
20
- config: {file: "/wp-content/plugins/s2member-files/s2member-file-inline/<?php echo $s2_jw_config["mp4_video_file_name"]; ?>"}},
21
- // Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="<?php echo $s2_jw_config["mp4_video_file_name"]; ?>" /]
22
-
23
- // Else, this is a safe fallback.
24
- {type: "download", // Download the file.
25
- config: {file: "/wp-content/plugins/s2member-files/s2member-file-inline/<?php echo $s2_jw_config["mp4_video_file_name"]; ?>"}}
26
- // Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="<?php echo $s2_jw_config["mp4_video_file_name"]; ?>" /]
27
- ],
28
- /* Set video dimensions. */ width: 480, height: 270
29
- });
30
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/menu-pages/code-samples/jwplayer-v5-streaming-mp4-sca.x-php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
- // Configuration.
3
- $s2_jw_config["jwplayer"] = "/jwplayer/"; // Relative URL path to JW Player files directory.
4
- $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test file.
5
- // Don't edit anything else below unless you know what you're doing.
6
- ?>
7
-
8
- <div id="jw-container">JW Player® appears here.</div>
9
- <script type="text/javascript" src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
10
-
11
- <script type="text/javascript">
12
- // The Shortcode here will return a JSON object for JavaScript notation.
13
- // A direct URL to the RTMP source; counting the file against the current User in real-time.
14
- // API Shortcode `s2File` returns a null object if access is denied to the current User/Member.
15
- var mp4 = [s2File download="<?php echo $s2_jw_config["mp4_video_file_name"]; ?>" url_to_storage_source="true" count_against_user="true" get_streamer_json="true" /];
16
- </script>
17
-
18
- <script type="text/javascript">
19
- if(typeof mp4 === 'object') // `s2File` returns a null object if access is denied to the current User.
20
- {
21
- jwplayer("jw-container").setup({modes: // JW Player®.
22
- [
23
- // First try real-time streaming with Flash® player.
24
- {type: "flash", provider: "rtmp", src: "<?php echo $s2_jw_config["jwplayer"]; ?>player.swf",
25
- config: {streamer: mp4['streamer'], file: mp4['file']}},
26
-
27
- // Else, try an HTML5 video tag.
28
- {type: "html5", provider: "video",
29
- config: {file: mp4['url']}},
30
-
31
- // Else, this is a safe fallback.
32
- {type: "download", // Download the file.
33
- config: {file: mp4['url']}}
34
- ],
35
- /* Set video dimensions. */ width: 480, height: 270
36
- });
37
- }
38
- else // Else, `s2File` returned a null object value.
39
- {
40
- document.write('Sorry, you do NOT have access to this file.');
41
- }
42
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/menu-pages/code-samples/jwplayer-v5-streaming-mp4-webm.x-php DELETED
@@ -1,45 +0,0 @@
1
- <?php
2
- // Configuration.
3
- $s2_jw_config["jwplayer"] = "/jwplayer/"; // Relative URL path to JW Player files directory.
4
- $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test file.
5
- $s2_jw_config["webm_video_file_name"] = "video.webm"; // Name of your WEBM test file.
6
- // Don't edit anything else below unless you know what you're doing.
7
- ?>
8
-
9
- <div id="jw-container">JW Player® appears here.</div>
10
- <script type="text/javascript" src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
11
-
12
- <?php // A direct URL to the RTMP source; counting the file against the current User in real-time.
13
- $mp4_cfg = array ("file_download" => $s2_jw_config["mp4_video_file_name"], "url_to_storage_source" => true, "count_against_user" => true);
14
- $webm_cfg = array ("file_download" => $s2_jw_config["webm_video_file_name"], "url_to_storage_source" => true /* Don't count variations. */); ?>
15
-
16
- <?php // API Function `s2member_file_download_url()` returns false if access is denied to the current User.
17
- if (($mp4 = s2member_file_download_url ($mp4_cfg, "get-streamer-array"))
18
- && ($webm["url"] = s2member_file_download_url ($webm_cfg))) { ?>
19
-
20
- <script type="text/javascript">
21
- jwplayer("jw-container").setup({modes: // JW Player®.
22
- [
23
- // First try real-time streaming with Flash® player.
24
- {type: "flash", provider: "rtmp", src: "<?php echo $s2_jw_config["jwplayer"]; ?>player.swf",
25
- config: {streamer: "<?php echo $mp4["streamer"]; ?>", file: "<?php echo $mp4["file"]; ?>"}},
26
-
27
- // Else, try an HTML5 video tag with the `mp4` file.
28
- {type: "html5", provider: "video",
29
- config: {file: "<?php echo $mp4["url"]; ?>"}},
30
-
31
- // Else, try an HTML5 video tag with a `webm` file.
32
- {type: "html5", provider: "video",
33
- config: {file: "<?php echo $webm["url"]; ?>"}},
34
-
35
- // Else, this is a safe fallback.
36
- {type: "download", // Download the file.
37
- config: {file: "<?php echo $mp4["url"]; ?>"}}
38
- ],
39
- /* Set video dimensions. */ width: 480, height: 270
40
- });
41
- </script>
42
-
43
- <?php } else /* Access is denied to the current User. */ { ?>
44
- Sorry, you do NOT have access to this file.
45
- <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/menu-pages/code-samples/jwplayer-v5-streaming-mp4.x-php DELETED
@@ -1,38 +0,0 @@
1
- <?php
2
- // Configuration.
3
- $s2_jw_config["jwplayer"] = "/jwplayer/"; // Relative URL path to JW Player files directory.
4
- $s2_jw_config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test file.
5
- // Don't edit anything else below unless you know what you're doing.
6
- ?>
7
-
8
- <div id="jw-container">JW Player® appears here.</div>
9
- <script type="text/javascript" src="<?php echo $s2_jw_config["jwplayer"]; ?>jwplayer.js"></script>
10
-
11
- <?php // A direct URL to the RTMP source; counting the file against the current User in real-time.
12
- $cfg = array ("file_download" => $s2_jw_config["mp4_video_file_name"], "url_to_storage_source" => true, "count_against_user" => true); ?>
13
-
14
- <?php // API Function `s2member_file_download_url()` returns false if access is denied to the current User.
15
- if (($mp4 = s2member_file_download_url ($cfg, "get-streamer-array"))) { ?>
16
-
17
- <script type="text/javascript">
18
- jwplayer("jw-container").setup({modes: // JW Player®.
19
- [
20
- // First try real-time streaming with Flash® player.
21
- {type: "flash", provider: "rtmp", src: "<?php echo $s2_jw_config["jwplayer"]; ?>player.swf",
22
- config: {streamer: "<?php echo $mp4["streamer"]; ?>", file: "<?php echo $mp4["file"]; ?>"}},
23
-
24
- // Else, try an HTML5 video tag.
25
- {type: "html5", provider: "video",
26
- config: {file: "<?php echo $mp4["url"]; ?>"}},
27
-
28
- // Else, this is a safe fallback.
29
- {type: "download", // Download the file.
30
- config: {file: "<?php echo $mp4["url"]; ?>"}}
31
- ],
32
- /* Set video dimensions. */ width: 480, height: 270
33
- });
34
- </script>
35
-
36
- <?php } else /* Access is denied to the current User. */ { ?>
37
- Sorry, you do NOT have access to this file.
38
- <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/menu-pages/down-ops.inc.php CHANGED
@@ -31,8 +31,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>'."\n";
35
- echo '<h2>s2Member File Download Options</h2>'."\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">'."\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
@@ -248,7 +251,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
248
  {
249
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_s3", get_defined_vars());
250
 
251
- echo '<div class="ws-menu-page-group" title="Amazon S3/CDN Storage Option"'.((c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"]) ? ' default-state="open"' : '').'>'."\n";
252
 
253
  echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-s3-section">'."\n";
254
  echo '<h3>Amazon S3/CDN Storage &amp; Delivery (optional)</h3>'."\n";
@@ -335,7 +338,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
335
  {
336
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_cf", get_defined_vars());
337
 
338
- echo '<div class="ws-menu-page-group" title="Amazon S3/CloudFront CDN Storage Option"'.((c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"]) ? ' default-state="open"' : '').'>'."\n";
339
 
340
  echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-cf-section">'."\n";
341
  echo '<h3>Amazon S3/CloudFront CDN Storage &amp; Delivery (optional)</h3>'."\n";
@@ -395,7 +398,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
395
 
396
  echo '<td>'."\n";
397
  echo '<input type="hidden" name="ws_plugin__s2member_amazon_cf_files_private_key" id="ws-plugin--s2member-amazon-cf-files-private-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'" data-s-prev-config-value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'" />'."\n";
398
- echo '<textarea name="ws_plugin__s2member_amazon_cf_files_private_key_entry" id="ws-plugin--s2member-amazon-cf-files-private-key-entry" rows="3" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'</textarea><br />'."\n";
399
  echo 'See: <code>Amazon Web Services Account -› Security Credentials -› Key Pairs</code>.<br />'."\n";
400
  echo '<em>* Note, s2Member needs your <strong>Private Key file</strong>, NOT your Public Key file.</em>'."\n";
401
  echo '</td>'."\n";
@@ -413,7 +416,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
413
  echo '<tr>'."\n";
414
 
415
  echo '<td>'."\n";
416
- echo '<input type="checkbox" name="ws_plugin__s2member_amazon_cf_files_auto_configure_distros" id="ws-plugin--s2member-amazon-cf-files-auto-configure-distros" value="'.esc_attr(wp_create_nonce("ws-plugin--s2member-amazon-cf-files-auto-configure-distros")).'"'.((c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-amazon-cf-files-auto-configure-distros"><strong>Yes</strong>, automatically configure my Amazon CloudFront Distributions &amp; Amazon S3 ACLs for me.</label><br />'."\n";
417
  echo '<em>s2Member will auto-configure and/or delete &amp; re-configure your Amazon CloudFront Distributions for you.</em>'."\n";
418
  echo '</td>'."\n";
419
 
@@ -421,7 +424,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
421
  echo '<tr>'."\n";
422
 
423
  echo '<td>'."\n";
424
- echo '<input type="checkbox" name="ws_plugin__s2member_amazon_cf_files_auto_configure_distros_w_cnames" id="ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames" value="'.esc_attr(wp_create_nonce("ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames")).'"'.((c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"] && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_cname"] || $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_cname"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames"><strong>Yes</strong>, I want s2Member to auto-configure using custom CNAMES that I\'ll setup.</label><br />'."\n";
425
  echo '<em>* Optional, do NOT check this box unless you know what you\'re doing. This requires DNS changes.</em>'."\n";
426
  echo '</td>'."\n";
427
 
@@ -486,7 +489,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
486
 
487
  echo '<div class="ws-menu-page-section ws-plugin--s2member-rtmp-streaming-section">'."\n";
488
  echo '<h3>JW Player v6 &amp; RTMP Protocol Examples</h3>'."\n";
489
- echo '<a href="http://www.longtailvideo.com/players/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/jwplayer-logo.png" class="ws-menu-page-right" style="width:179px; height:58px; border:0;" alt="." /></a>'."\n";
490
  echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon S3 or CloudFront; we DO highly recommend that you integrate both Amazon S3 and Amazon CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Support Forums</a> for tips/tricks if you like.</p>'."\n";
491
  echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
492
  echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
@@ -543,43 +546,6 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
543
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_after_rtmp_streaming", get_defined_vars());
544
  }
545
 
546
- if(apply_filters("ws_plugin__s2member_during_down_ops_page_during_left_sections_display_rtmp_streaming", true, get_defined_vars()))
547
- {
548
- do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_rtmp_streaming", get_defined_vars());
549
-
550
- echo '<div class="ws-menu-page-group" title="JW Player v5 &amp; RTMP Protocol Examples (Deprecated)">'."\n";
551
-
552
- echo '<div class="ws-menu-page-section ws-plugin--s2member-rtmp-streaming-section">'."\n";
553
- echo '<h3>JW Player v5 &amp; RTMP Protocol Examples (Deprecated)</h3>'."\n";
554
- echo '<a href="http://www.longtailvideo.com/players/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/jwplayer-logo.png" class="ws-menu-page-right" style="width:179px; height:58px; border:0;" alt="." /></a>'."\n";
555
- echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon S3 or CloudFront; we DO highly recommend that you integrate both Amazon S3 and Amazon CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Support Forums</a> for tips/tricks if you like.</p>'."\n";
556
- echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
557
- do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_rtmp_streaming", get_defined_vars());
558
-
559
- echo '<div class="ws-menu-page-hr"></div>'."\n";
560
-
561
- echo '<h3>PHP Code Examples (for more advanced integrations)</h3>'."\n";
562
- echo '<p>These examples exist from past versions of s2Member. JW Player v5 is now outdated by JW Player v6 (recommended).</p>'."\n";
563
-
564
- echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-v5-standard-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (MP4 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
565
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-v5-standard-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <code>s2Member -› Download Options -› Advanced Mod Rewrite Linkage</code>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-v5-standard-mp4.x-php")).'</p>'."\n";
566
-
567
- echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-v5-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
568
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-v5-streaming-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-v5-streaming-mp4.x-php")).'</p>'."\n";
569
-
570
- echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-v5-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative)</a></p>'."\n";
571
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-v5-streaming-mp4-sca" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-v5-streaming-mp4-sca.x-php")).'</p>'."\n";
572
-
573
- echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-v5-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, advanced w/ multiple fallbacks)</a></p>'."\n";
574
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-v5-streaming-mp4-webm" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-v5-streaming-mp4-webm.x-php")).'</p>'."\n";
575
-
576
- echo '</div>'."\n";
577
-
578
- echo '</div>'."\n";
579
-
580
- do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_after_rtmp_streaming", get_defined_vars());
581
- }
582
-
583
  if(apply_filters("ws_plugin__s2member_during_down_ops_page_during_left_sections_display_rewrite_linkage", true, get_defined_vars()))
584
  {
585
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_rewrite_linkage", get_defined_vars());
@@ -714,7 +680,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
714
  echo '<div class="ws-menu-page-hr"></div>'."\n";
715
  echo '<p style="margin:0; font-weight:bold;">s2Member automatically adds this to your <code>.htaccess</code> file upon activation of the plugin.</p>'."\n";
716
  echo '<p style="margin:0;">The following <code>mod_rewrite</code> rule goes inside this file: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path(ABSPATH.".htaccess")).'</code></p>'."\n";
717
- echo '<pre><code>'.esc_html(trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_no_gzip_htaccess"])))).'</code></pre>';
718
  echo '<p><strong>* Tip:</strong> this covers all types of integration with s2Member File Downloads, even if you\'re using s2Member\'s Advanced Mod Rewrite Linkage.</p>'."\n";
719
  echo '</div>'."\n";
720
 
@@ -763,7 +729,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
763
 
764
  echo '<div class="ws-menu-page-hr"></div>'."\n";
765
 
766
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>'."\n";
767
 
768
  echo '</form>'."\n";
769
 
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>Download Options</h2>'."\n";
39
 
40
  echo '<table class="ws-menu-page-table">'."\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
251
  {
252
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_s3", get_defined_vars());
253
 
254
+ echo '<div class="ws-menu-page-group" title="Amazon S3/CDN Storage Option"'.((!empty(c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"])) ? ' default-state="open"' : '').'>'."\n";
255
 
256
  echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-s3-section">'."\n";
257
  echo '<h3>Amazon S3/CDN Storage &amp; Delivery (optional)</h3>'."\n";
338
  {
339
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_cf", get_defined_vars());
340
 
341
+ echo '<div class="ws-menu-page-group" title="Amazon S3/CloudFront CDN Storage Option"'.((!empty(c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"])) ? ' default-state="open"' : '').'>'."\n";
342
 
343
  echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-cf-section">'."\n";
344
  echo '<h3>Amazon S3/CloudFront CDN Storage &amp; Delivery (optional)</h3>'."\n";
398
 
399
  echo '<td>'."\n";
400
  echo '<input type="hidden" name="ws_plugin__s2member_amazon_cf_files_private_key" id="ws-plugin--s2member-amazon-cf-files-private-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'" data-s-prev-config-value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'" />'."\n";
401
+ echo '<textarea name="ws_plugin__s2member_amazon_cf_files_private_key_entry" id="ws-plugin--s2member-amazon-cf-files-private-key-entry" rows="3" wrap="off" spellcheck="false" class="monospace">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_private_key"]).'</textarea><br />'."\n";
402
  echo 'See: <code>Amazon Web Services Account -› Security Credentials -› Key Pairs</code>.<br />'."\n";
403
  echo '<em>* Note, s2Member needs your <strong>Private Key file</strong>, NOT your Public Key file.</em>'."\n";
404
  echo '</td>'."\n";
416
  echo '<tr>'."\n";
417
 
418
  echo '<td>'."\n";
419
+ echo '<input type="checkbox" name="ws_plugin__s2member_amazon_cf_files_auto_configure_distros" id="ws-plugin--s2member-amazon-cf-files-auto-configure-distros" value="'.esc_attr(wp_create_nonce("ws-plugin--s2member-amazon-cf-files-auto-configure-distros")).'"'.((!empty(c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-amazon-cf-files-auto-configure-distros"><strong>Yes</strong>, automatically configure my Amazon CloudFront Distributions &amp; Amazon S3 ACLs for me.</label><br />'."\n";
420
  echo '<em>s2Member will auto-configure and/or delete &amp; re-configure your Amazon CloudFront Distributions for you.</em>'."\n";
421
  echo '</td>'."\n";
422
 
424
  echo '<tr>'."\n";
425
 
426
  echo '<td>'."\n";
427
+ echo '<input type="checkbox" name="ws_plugin__s2member_amazon_cf_files_auto_configure_distros_w_cnames" id="ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames" value="'.esc_attr(wp_create_nonce("ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames")).'"'.((!empty(c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"]) && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_cname"] || $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_cname"])) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames"><strong>Yes</strong>, I want s2Member to auto-configure using custom CNAMES that I\'ll setup.</label><br />'."\n";
428
  echo '<em>* Optional, do NOT check this box unless you know what you\'re doing. This requires DNS changes.</em>'."\n";
429
  echo '</td>'."\n";
430
 
489
 
490
  echo '<div class="ws-menu-page-section ws-plugin--s2member-rtmp-streaming-section">'."\n";
491
  echo '<h3>JW Player v6 &amp; RTMP Protocol Examples</h3>'."\n";
492
+ echo '<a href="http://www.longtailvideo.com/players/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/jwplayer-logo.png" class="ws-menu-page-right" style="width:179px; height:58px; border:0; border-radius:3px; background:#FFFFFF; padding:15px;" alt="." /></a>'."\n";
493
  echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon S3 or CloudFront; we DO highly recommend that you integrate both Amazon S3 and Amazon CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Support Forums</a> for tips/tricks if you like.</p>'."\n";
494
  echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
495
  echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
546
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_after_rtmp_streaming", get_defined_vars());
547
  }
548
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
549
  if(apply_filters("ws_plugin__s2member_during_down_ops_page_during_left_sections_display_rewrite_linkage", true, get_defined_vars()))
550
  {
551
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_rewrite_linkage", get_defined_vars());
680
  echo '<div class="ws-menu-page-hr"></div>'."\n";
681
  echo '<p style="margin:0; font-weight:bold;">s2Member automatically adds this to your <code>.htaccess</code> file upon activation of the plugin.</p>'."\n";
682
  echo '<p style="margin:0;">The following <code>mod_rewrite</code> rule goes inside this file: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path(ABSPATH.".htaccess")).'</code></p>'."\n";
683
+ echo '<pre class="code"><code>'.esc_html(trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_no_gzip_htaccess"])))).'</code></pre>';
684
  echo '<p><strong>* Tip:</strong> this covers all types of integration with s2Member File Downloads, even if you\'re using s2Member\'s Advanced Mod Rewrite Linkage.</p>'."\n";
685
  echo '</div>'."\n";
686
 
729
 
730
  echo '<div class="ws-menu-page-hr"></div>'."\n";
731
 
732
+ echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>'."\n";
733
 
734
  echo '</form>'."\n";
735
 
includes/menu-pages/els-ops.inc.php CHANGED
@@ -31,8 +31,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>'."\n";
35
- echo '<h2>s2Member API / List Servers</h2>'."\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">'."\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
@@ -105,7 +108,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
105
 
106
  echo '<div class="ws-menu-page-hr"></div>'."\n";
107
 
108
- echo '<div class="ws-menu-page-hilite" style="border-radius:3px; padding:5px;">'."\n";
109
  echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems during MailChimp processing. See: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Files (Debug)</a>.</span></p>'."\n";
110
  echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
111
  echo '</div>'."\n";
@@ -124,7 +127,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
124
  echo '<div class="ws-menu-page-group" title="AWeber Integration">'."\n";
125
 
126
  echo '<div class="ws-menu-page-section ws-plugin--s2member-aweber-section">'."\n";
127
- echo '<a href="http://www.s2member.com/aweber" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/aweber-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
128
  echo '<h3>AWeber List Server Integration (optional)</h3>'."\n";
129
  echo '<p>s2Member can be integrated with AWeber. AWeber is an email marketing service. Whether you\'re looking to get your first email campaign off the ground, or you\'re a seasoned veteran who wants to dig into advanced tools like detailed email web analytics, activity based segmentation, geo-targeting and broadcast split-testing, AWeber\'s got just what you need to make email marketing work for you.</p>'."\n";
130
  echo '<p>You can have your Members automatically subscribed to your AWeber marketing lists <em>(e.g. newsletters / auto-responders)</em>. You\'ll need an <a href="http://www.s2member.com/aweber" target="_blank" rel="external">AWeber account</a> and your <a href="#" onclick="alert(\'To obtain your AWeber List ID(s), log into your AWeber account. Click on the Lists tab. On that page you\\\'ll find a Unique List ID associated with each of your lists. AWeber sometimes refers to this as a List Name instead of a List ID.\'); return false;">AWeber List IDs</a>. You will ALSO need to configure a <a href="http://www.s2member.com/kb/aweber-email-parser-for-s2member/" target="_blank" rel="external">Custom Email Parser</a> inside your AWeber account.</p>'."\n";
@@ -162,7 +165,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
162
 
163
  echo '<div class="ws-menu-page-hr"></div>'."\n";
164
 
165
- echo '<div class="ws-menu-page-hilite" style="border-radius:3px; padding:5px;">'."\n";
166
  echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems during AWeber processing. See: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Files (Debug)</a>.</span></p>'."\n";
167
  echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
168
  echo '</div>'."\n";
@@ -321,7 +324,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
321
 
322
  echo '<div class="ws-menu-page-hr"></div>'."\n";
323
 
324
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>'."\n";
325
 
326
  echo '</form>'."\n";
327
 
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>API / List Servers</h2>'."\n";
39
 
40
  echo '<table class="ws-menu-page-table">'."\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
108
 
109
  echo '<div class="ws-menu-page-hr"></div>'."\n";
110
 
111
+ echo '<div class="info" style="margin-bottom:0;">'."\n";
112
  echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems during MailChimp processing. See: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Files (Debug)</a>.</span></p>'."\n";
113
  echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
114
  echo '</div>'."\n";
127
  echo '<div class="ws-menu-page-group" title="AWeber Integration">'."\n";
128
 
129
  echo '<div class="ws-menu-page-section ws-plugin--s2member-aweber-section">'."\n";
130
+ echo '<a href="http://www.s2member.com/aweber" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/aweber-logo.png" class="ws-menu-page-right screenshot" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
131
  echo '<h3>AWeber List Server Integration (optional)</h3>'."\n";
132
  echo '<p>s2Member can be integrated with AWeber. AWeber is an email marketing service. Whether you\'re looking to get your first email campaign off the ground, or you\'re a seasoned veteran who wants to dig into advanced tools like detailed email web analytics, activity based segmentation, geo-targeting and broadcast split-testing, AWeber\'s got just what you need to make email marketing work for you.</p>'."\n";
133
  echo '<p>You can have your Members automatically subscribed to your AWeber marketing lists <em>(e.g. newsletters / auto-responders)</em>. You\'ll need an <a href="http://www.s2member.com/aweber" target="_blank" rel="external">AWeber account</a> and your <a href="#" onclick="alert(\'To obtain your AWeber List ID(s), log into your AWeber account. Click on the Lists tab. On that page you\\\'ll find a Unique List ID associated with each of your lists. AWeber sometimes refers to this as a List Name instead of a List ID.\'); return false;">AWeber List IDs</a>. You will ALSO need to configure a <a href="http://www.s2member.com/kb/aweber-email-parser-for-s2member/" target="_blank" rel="external">Custom Email Parser</a> inside your AWeber account.</p>'."\n";
165
 
166
  echo '<div class="ws-menu-page-hr"></div>'."\n";
167
 
168
+ echo '<div class="info" style="margin-bottom:0;">'."\n";
169
  echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems during AWeber processing. See: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Files (Debug)</a>.</span></p>'."\n";
170
  echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
171
  echo '</div>'."\n";
324
 
325
  echo '<div class="ws-menu-page-hr"></div>'."\n";
326
 
327
+ echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>'."\n";
328
 
329
  echo '</form>'."\n";
330
 
includes/menu-pages/gen-ops.inc.php CHANGED
@@ -31,8 +31,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_gen_ops"))
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>s2Member General Options</h2>' . "\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">' . "\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
@@ -197,7 +200,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_gen_ops"))
197
  echo '<tr>' . "\n";
198
 
199
  echo '<td>' . "\n";
200
- echo '<textarea name="ws_plugin__s2member_wp_footer_code" id="ws-plugin--s2member-wp-footer-code" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["wp_footer_code"]) . '</textarea><br />' . "\n";
201
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' (or even PHP)') . ' code will work just fine here.' . "\n";
202
  echo '</td>' . "\n";
203
 
@@ -1348,10 +1351,10 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_gen_ops"))
1348
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1349
 
1350
  echo '<p><strong>Shortcode (copy/paste)</strong>, for an Inline Profile Modification Form:<br />' . "\n";
1351
- echo '<p><input type="text" autocomplete="off" value="' . format_to_edit ('[s2Member-Profile /]') . '" style="font-size:90%; font-family:Consolas, monospace; width:99%;" onclick="this.select ();" /></p>' . "\n";
1352
 
1353
  echo '<p style="margin-top:20px;"><strong>Stand-Alone (copy/paste)</strong>, for popup window:</p>' . "\n";
1354
- echo '<p><input type="text" autocomplete="off" value="' . format_to_edit (preg_replace ("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_ds (site_url ("/?s2member_profile=1")), file_get_contents (dirname (__FILE__) . "/code-samples/current-user-profile-modification-page-url-2-ops.x-php"))) . '" style="font-size:90%; font-family:Consolas, monospace; width:99%;" onclick="this.select ();" /></p>' . "\n";
1355
  echo '</div>' . "\n";
1356
 
1357
  echo '</div>' . "\n";
@@ -1421,7 +1424,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_gen_ops"))
1421
 
1422
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1423
 
1424
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>' . "\n";
1425
 
1426
  echo '</form>' . "\n";
1427
 
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>General Options</h2>' . "\n";
39
 
40
  echo '<table class="ws-menu-page-table">' . "\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
200
  echo '<tr>' . "\n";
201
 
202
  echo '<td>' . "\n";
203
+ echo '<textarea name="ws_plugin__s2member_wp_footer_code" id="ws-plugin--s2member-wp-footer-code" rows="8" wrap="off" spellcheck="false" class="monospace">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["wp_footer_code"]) . '</textarea><br />' . "\n";
204
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' (or even PHP)') . ' code will work just fine here.' . "\n";
205
  echo '</td>' . "\n";
206
 
1351
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1352
 
1353
  echo '<p><strong>Shortcode (copy/paste)</strong>, for an Inline Profile Modification Form:<br />' . "\n";
1354
+ echo '<p><input type="text" autocomplete="off" value="' . format_to_edit ('[s2Member-Profile /]') . '" class="monospace" onclick="this.select ();" /></p>' . "\n";
1355
 
1356
  echo '<p style="margin-top:20px;"><strong>Stand-Alone (copy/paste)</strong>, for popup window:</p>' . "\n";
1357
+ echo '<p><input type="text" autocomplete="off" value="' . format_to_edit (preg_replace ("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_ds (site_url ("/?s2member_profile=1")), file_get_contents (dirname (__FILE__) . "/code-samples/current-user-profile-modification-page-url-2-ops.x-php"))) . '" class="monospace" onclick="this.select ();" /></p>' . "\n";
1358
  echo '</div>' . "\n";
1359
 
1360
  echo '</div>' . "\n";
1424
 
1425
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
1426
 
1427
+ echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>' . "\n";
1428
 
1429
  echo '</form>' . "\n";
1430
 
includes/menu-pages/info.inc.php CHANGED
@@ -31,8 +31,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_info"))
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>s2Member Information</h2>' . "\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">' . "\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>Specs / Info</h2>' . "\n";
39
 
40
  echo '<table class="ws-menu-page-table">' . "\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
includes/menu-pages/integrations.inc.php CHANGED
@@ -31,8 +31,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_integrations"))
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>'."\n";
35
- echo '<h2>Other s2Member Integrations</h2>'."\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">'."\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>Other Integrations</h2>'."\n";
39
 
40
  echo '<table class="ws-menu-page-table">'."\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
includes/menu-pages/js-c-warning.inc.php DELETED
@@ -1,40 +0,0 @@
1
- <?php
2
- /**
3
- * JS conflict warning for Menu Pages.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Menu_Pages
15
- * @since 110912
16
- */
17
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18
- exit("Do not access this file directly.");
19
-
20
- if (!class_exists ("c_ws_plugin__s2member_menu_pages_js_c_warning"))
21
- {
22
- /**
23
- * Newsletter/Feed Boxes for Menu Pages.
24
- *
25
- * @package s2Member\Menu_Pages
26
- * @since 110531
27
- */
28
- class c_ws_plugin__s2member_menu_pages_js_c_warning
29
- {
30
- public function __construct ()
31
- {
32
- echo '<p style="margin-top:0;"><strong>Dashboard JavaScript Conflict</strong></p>' . "\n";
33
- echo '<p>Something is conflicting with the jQuery JavaScript framework, which s2Member uses; causing this warning to be visible to you.</p>' . "\n";
34
- echo '<p style="margin-bottom:0;">Please deactivate one other plugin at a time until you find the culprit. Or, in Firefox, see <code>Tools -› Error Console</code>.</p>';
35
- }
36
- }
37
- }
38
-
39
- new c_ws_plugin__s2member_menu_pages_js_c_warning ();
40
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/menu-pages/logs.inc.php CHANGED
@@ -31,8 +31,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>'."\n";
35
- echo '<h2>s2Member Logs</h2>'."\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">'."\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
@@ -66,7 +69,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
66
 
67
  echo '<h3>Search s2Member KB Articles, Forums, Codex and more<em>!</em></h3>'."\n";
68
  echo '<form method="get" action="http://www.s2member.com/quick-s.php" target="_blank" onsubmit="if(this.q.value === \'enter search terms...\') this.q.value = \'\';">'."\n";
69
- echo '<p><input type="text" name="q" value="enter search terms..." style="width:60%;" onfocus="if(this.value === \'enter search terms...\') this.value = \'\';" onblur="if(this.value === \'\') this.value = \'enter search terms...\';" /><input type="submit" value="Search" /></p>'."\n";
70
  echo '</form>'."\n";
71
 
72
  do_action ("ws_plugin__s2member_during_logs_page_during_left_sections_during_help", get_defined_vars ());
@@ -85,9 +88,12 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
85
 
86
  echo '<h3>Logging Configuration</h3>'."\n";
87
 
88
- echo '<div class="ws-menu-page-hilite" style="border-radius:3px; padding:5px;">'."\n";
89
  echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems that occur during processing. Enable logging here, and then view your log files below; in the s2Member Log Viewer.</span></p>'."\n";
90
  echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
 
 
 
91
  echo '<p style="font-size:110%; margin-bottom:0;"><span>Regarding s2Member Security Badges. If debug logging is enabled, your site will NOT qualify for an s2Member Security Badge until you disable logging (and you must ALSO download, and then delete any existing log files). For further details, please see KB Article: <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">s2Member Security Badges</a>.</span></p>'."\n";
92
  echo '</div>'."\n";
93
 
@@ -139,7 +145,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
139
  echo '</table>' . "\n";
140
 
141
  echo '<p class="submit" style="margin-top:20px;">'."\n";
142
- echo '<input type="submit" class="button-primary" value="Update Logging Configuration" />'."\n";
143
  echo '</p>' . "\n";
144
 
145
  echo '</form>'."\n";
@@ -165,17 +171,17 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
165
 
166
  echo '<form method="post" onsubmit="if(!confirm(\'Archive all existing log files?\n\nAll of your current log files will be archived (e.g. they will simply be renamed with an ARCHIVED tag &amp; date in their file name); and new log files will be created automatically the next time s2Member logs something on your installation.\n\nPlease click OK to confirm this action.\')) return false;">'."\n";
167
  echo '<input type="hidden" name="ws_plugin__s2member_logs_archive_start_fresh" value="'.esc_attr(wp_create_nonce ("ws-plugin--s2member-logs-archive-start-fresh")).'" />'."\n";
168
- echo '<input type="submit" value="Archive All Current Log Files" class="ws-menu-page-right ws-plugin--s2member-archive-logs-start-fresh-button" style="clear:right; min-width:200px;" />'."\n";
169
  echo '</form>'."\n";
170
 
171
  echo '<form method="post" onsubmit="if(!confirm(\'Delete all existing log files?\n\nThis will permanently delete ALL of your existing log files (including any archived log files).\n\nPlease click OK to confirm this action.\')) return false;">'."\n";
172
  echo '<input type="hidden" name="ws_plugin__s2member_logs_delete_start_fresh" value="'.esc_attr(wp_create_nonce ("ws-plugin--s2member-logs-delete-start-fresh")).'" />'."\n";
173
- echo '<input type="submit" value="Permanently Delete All Log Files" class="ws-menu-page-right ws-plugin--s2member-delete-logs-start-fresh-button" style="clear:right; min-width:200px;" />'."\n";
174
  echo '</form>'."\n";
175
 
176
  echo '<form method="post">'."\n";
177
  echo '<input type="hidden" name="ws_plugin__s2member_logs_download_zip" value="'.esc_attr(wp_create_nonce ("ws-plugin--s2member-logs-download-zip")).'" />'."\n";
178
- echo '<input type="submit" value="Download All Log Files (Zip File)" class="ws-menu-page-right ws-plugin--s2member-logs-download-zip-button" style="clear:right; min-width:200px;" />'."\n";
179
  echo '</form>'."\n";
180
 
181
  echo '<p><strong>Debugging Tips:</strong> &nbsp;&nbsp; It is normal to see a few errors in your log files. This is because s2Member logs ALL of its communication with Payment Gateways. Everything — not just successes. With that in mind, there will be some failures that s2Member expects (to a certain extent); and s2Member deals with these gracefully. What you\'re looking for here, are things that jump right out at you as being a major issue (e.g. when s2Member makes a point of providing details to you in a log entry about problems that should be corrected on your installation). Please read carefully.</p>'."\n";
@@ -261,8 +267,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
261
  echo '</select>' . "\n";
262
  echo '</td>' . "\n";
263
 
264
- echo '<td style="width:20%;">' . "\n";
265
- echo '<input type="submit" value="View" class="button-primary" />'."\n";
266
  echo '</td>' . "\n";
267
 
268
  echo '</tr>' . "\n";
@@ -295,20 +301,20 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
295
  echo '<p style="float:right; text-align:right;">[ <a href="'.esc_attr(add_query_arg(array("ws_plugin__s2member_download_log_file" => $view_log_file, "ws_plugin__s2member_download_log_file_v" => wp_create_nonce ("ws-plugin--s2member-download-log-file-v")))).'"><strong>download file</strong></a> ]</p>'."\n";
296
  echo '<p style="margin-right:10px; float:right; text-align:right;"><a href="#" class="ws-plugin--s2member-log-file-viewport-toggle" style="text-decoration:none;">&#8659; expand viewport &#8659;</a></p>'."\n";
297
 
298
- echo '<textarea id="ws-plugin--s2member-log-file-viewer" rows="20" wrap="on" spellcheck="false" style="box-shadow:inset 0 0 8px #000000; background:#EEEEEE; color:#000000; overflow-y:scroll; font-family:\'Consolas\', \'Monaco\', monospace;">'.htmlspecialchars(file_get_contents($logs_dir."/".$view_log_file)).'</textarea>' . "\n";
299
 
300
  echo '<p style="float:left; text-align:left;"><strong>Viewing:</strong> <a href="'.esc_attr(add_query_arg(array("ws_plugin__s2member_download_log_file" => $view_log_file, "ws_plugin__s2member_download_log_file_v" => wp_create_nonce ("ws-plugin--s2member-download-log-file-v")))).'">'.esc_html($view_log_file).'</a> (log entries oldest to newest)</p>'."\n";
301
  echo '<p style="float:right; text-align:right;">[ <a href="'.esc_attr(add_query_arg(array("ws_plugin__s2member_download_log_file" => $view_log_file, "ws_plugin__s2member_download_log_file_v" => wp_create_nonce ("ws-plugin--s2member-download-log-file-v")))).'"><strong>download file</strong></a> ]</p>'."\n";
302
  echo '<p style="margin-right:10px; float:right; text-align:right;"><a href="#" class="ws-plugin--s2member-log-file-viewport-toggle" style="text-decoration:none;">&#8659; expand viewport &#8659;</a></p>'."\n";
303
  }
304
  else if($view_log_file && file_exists($logs_dir."/".$view_log_file))
305
- echo '<textarea id="ws-plugin--s2member-log-file-viewer" rows="20" wrap="on" spellcheck="false" style="box-shadow:inset 0 0 8px #000000; background:#EEEEEE; color:#000000; overflow-y:scroll; font-family:\'Consolas\', \'Monaco\', monospace; font-style:italic;">— Empty at this time —</textarea>' . "\n";
306
 
307
  else if($view_log_file && !file_exists($logs_dir."/".$view_log_file))
308
- echo '<textarea id="ws-plugin--s2member-log-file-viewer" rows="20" wrap="on" spellcheck="false" style="box-shadow:inset 0 0 8px #000000; background:#EEEEEE; color:#000000; overflow-y:scroll; font-family:\'Consolas\', \'Monaco\', monospace; font-style:italic;">— File no longer exists —</textarea>' . "\n";
309
 
310
  else // Display an empty textarea in this default scenario.
311
- echo '<textarea id="ws-plugin--s2member-log-file-viewer" rows="20" wrap="on" spellcheck="false" style="box-shadow:inset 0 0 8px #000000; background:#EEEEEE; color:#000000; overflow-y:scroll; font-family:\'Consolas\', \'Monaco\', monospace; font-style:italic;"></textarea>' . "\n";
312
 
313
  echo '</td>' . "\n";
314
 
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>Log Files</h2>'."\n";
39
 
40
  echo '<table class="ws-menu-page-table">'."\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
69
 
70
  echo '<h3>Search s2Member KB Articles, Forums, Codex and more<em>!</em></h3>'."\n";
71
  echo '<form method="get" action="http://www.s2member.com/quick-s.php" target="_blank" onsubmit="if(this.q.value === \'enter search terms...\') this.q.value = \'\';">'."\n";
72
+ echo '<p><input type="text" name="q" value="enter search terms..." style="width:60%;" onfocus="if(this.value === \'enter search terms...\') this.value = \'\';" onblur="if(this.value === \'\') this.value = \'enter search terms...\';" /> <input type="submit" value="Search" style="font-size:120%; font-weight:normal;" /></p>'."\n";
73
  echo '</form>'."\n";
74
 
75
  do_action ("ws_plugin__s2member_during_logs_page_during_left_sections_during_help", get_defined_vars ());
88
 
89
  echo '<h3>Logging Configuration</h3>'."\n";
90
 
91
+ echo '<div class="info">'."\n";
92
  echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems that occur during processing. Enable logging here, and then view your log files below; in the s2Member Log Viewer.</span></p>'."\n";
93
  echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
94
+ echo '</div>'."\n";
95
+
96
+ echo '<div class="notice" style="margin-bottom:0;">'."\n";
97
  echo '<p style="font-size:110%; margin-bottom:0;"><span>Regarding s2Member Security Badges. If debug logging is enabled, your site will NOT qualify for an s2Member Security Badge until you disable logging (and you must ALSO download, and then delete any existing log files). For further details, please see KB Article: <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">s2Member Security Badges</a>.</span></p>'."\n";
98
  echo '</div>'."\n";
99
 
145
  echo '</table>' . "\n";
146
 
147
  echo '<p class="submit" style="margin-top:20px;">'."\n";
148
+ echo '<input type="submit" value="Update Logging Configuration" />'."\n";
149
  echo '</p>' . "\n";
150
 
151
  echo '</form>'."\n";
171
 
172
  echo '<form method="post" onsubmit="if(!confirm(\'Archive all existing log files?\n\nAll of your current log files will be archived (e.g. they will simply be renamed with an ARCHIVED tag &amp; date in their file name); and new log files will be created automatically the next time s2Member logs something on your installation.\n\nPlease click OK to confirm this action.\')) return false;">'."\n";
173
  echo '<input type="hidden" name="ws_plugin__s2member_logs_archive_start_fresh" value="'.esc_attr(wp_create_nonce ("ws-plugin--s2member-logs-archive-start-fresh")).'" />'."\n";
174
+ echo '<input type="submit" value="Archive All Current Log Files" class="ws-menu-page-right ws-plugin--s2member-archive-logs-start-fresh-button" style="font-size:110%; font-weight:normal; clear:right; min-width:200px;" />'."\n";
175
  echo '</form>'."\n";
176
 
177
  echo '<form method="post" onsubmit="if(!confirm(\'Delete all existing log files?\n\nThis will permanently delete ALL of your existing log files (including any archived log files).\n\nPlease click OK to confirm this action.\')) return false;">'."\n";
178
  echo '<input type="hidden" name="ws_plugin__s2member_logs_delete_start_fresh" value="'.esc_attr(wp_create_nonce ("ws-plugin--s2member-logs-delete-start-fresh")).'" />'."\n";
179
+ echo '<input type="submit" value="Permanently Delete All Log Files" class="ws-menu-page-right ws-plugin--s2member-delete-logs-start-fresh-button" style="font-size:110%; font-weight:normal; clear:right; min-width:200px;" />'."\n";
180
  echo '</form>'."\n";
181
 
182
  echo '<form method="post">'."\n";
183
  echo '<input type="hidden" name="ws_plugin__s2member_logs_download_zip" value="'.esc_attr(wp_create_nonce ("ws-plugin--s2member-logs-download-zip")).'" />'."\n";
184
+ echo '<input type="submit" value="Download All Log Files (Zip File)" class="ws-menu-page-right ws-plugin--s2member-logs-download-zip-button" style="font-size:110%; font-weight:normal; clear:right; min-width:200px;" />'."\n";
185
  echo '</form>'."\n";
186
 
187
  echo '<p><strong>Debugging Tips:</strong> &nbsp;&nbsp; It is normal to see a few errors in your log files. This is because s2Member logs ALL of its communication with Payment Gateways. Everything — not just successes. With that in mind, there will be some failures that s2Member expects (to a certain extent); and s2Member deals with these gracefully. What you\'re looking for here, are things that jump right out at you as being a major issue (e.g. when s2Member makes a point of providing details to you in a log entry about problems that should be corrected on your installation). Please read carefully.</p>'."\n";
267
  echo '</select>' . "\n";
268
  echo '</td>' . "\n";
269
 
270
+ echo '<td style="width:20%; padding-left:5px;">' . "\n";
271
+ echo '<input type="submit" value="View" style="font-size:120%; font-weight:normal;" />'."\n";
272
  echo '</td>' . "\n";
273
 
274
  echo '</tr>' . "\n";
301
  echo '<p style="float:right; text-align:right;">[ <a href="'.esc_attr(add_query_arg(array("ws_plugin__s2member_download_log_file" => $view_log_file, "ws_plugin__s2member_download_log_file_v" => wp_create_nonce ("ws-plugin--s2member-download-log-file-v")))).'"><strong>download file</strong></a> ]</p>'."\n";
302
  echo '<p style="margin-right:10px; float:right; text-align:right;"><a href="#" class="ws-plugin--s2member-log-file-viewport-toggle" style="text-decoration:none;">&#8659; expand viewport &#8659;</a></p>'."\n";
303
 
304
+ echo '<textarea id="ws-plugin--s2member-log-file-viewer" rows="20" wrap="on" spellcheck="false" style="box-shadow:inset 0 0 5px rgba(0,0,0,0.5); background:#EEEEEE; color:#000000; overflow-y:scroll;" class="monospace">'.htmlspecialchars(file_get_contents($logs_dir."/".$view_log_file)).'</textarea>' . "\n";
305
 
306
  echo '<p style="float:left; text-align:left;"><strong>Viewing:</strong> <a href="'.esc_attr(add_query_arg(array("ws_plugin__s2member_download_log_file" => $view_log_file, "ws_plugin__s2member_download_log_file_v" => wp_create_nonce ("ws-plugin--s2member-download-log-file-v")))).'">'.esc_html($view_log_file).'</a> (log entries oldest to newest)</p>'."\n";
307
  echo '<p style="float:right; text-align:right;">[ <a href="'.esc_attr(add_query_arg(array("ws_plugin__s2member_download_log_file" => $view_log_file, "ws_plugin__s2member_download_log_file_v" => wp_create_nonce ("ws-plugin--s2member-download-log-file-v")))).'"><strong>download file</strong></a> ]</p>'."\n";
308
  echo '<p style="margin-right:10px; float:right; text-align:right;"><a href="#" class="ws-plugin--s2member-log-file-viewport-toggle" style="text-decoration:none;">&#8659; expand viewport &#8659;</a></p>'."\n";
309
  }
310
  else if($view_log_file && file_exists($logs_dir."/".$view_log_file))
311
+ echo '<textarea id="ws-plugin--s2member-log-file-viewer" rows="20" wrap="on" spellcheck="false" style="box-shadow:inset 0 0 5px rgba(0,0,0,0.5); background:#EEEEEE; color:#000000; overflow-y:scroll; font-style:italic;" class="monospace">— Empty at this time —</textarea>' . "\n";
312
 
313
  else if($view_log_file && !file_exists($logs_dir."/".$view_log_file))
314
+ echo '<textarea id="ws-plugin--s2member-log-file-viewer" rows="20" wrap="on" spellcheck="false" style="box-shadow:inset 0 0 5px rgba(0,0,0,0.5); background:#EEEEEE; color:#000000; overflow-y:scroll; font-style:italic;" class="monospace">— File no longer exists —</textarea>' . "\n";
315
 
316
  else // Display an empty textarea in this default scenario.
317
+ echo '<textarea id="ws-plugin--s2member-log-file-viewer" rows="20" wrap="on" spellcheck="false" style="box-shadow:inset 0 0 5px rgba(0,0,0,0.5); background:#EEEEEE; color:#000000; overflow-y:scroll; font-style:italic;" class="monospace"></textarea>' . "\n";
318
 
319
  echo '</td>' . "\n";
320
 
includes/menu-pages/menu-pages-min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function(b){b("div#ws-menu-page-js-c-w").hide();b(window).resize(tb_position=function(){var c=(b(window).width()>720)?720:b(window).width(),e=b(window).height(),d=(b("body.admin-bar").length)?28:0;b("#TB_window").css({width:c-50+"px",height:e-45-d+"px",top:25+d+"px","margin-top":0,"margin-left":"-"+parseInt(((c-50)/2),10)+"px"});b("#TB_ajaxContent").css({width:c-50+"px",height:e-75-d+"px",margin:0,padding:0})});var a=b("div.ws-menu-page-group");a.each(function(e){var g=b(this),d="<ins>+</ins>",f=g,h=b.trim(f.attr("title"));var c=b('<div class="ws-menu-page-group-header">'+d+h+"</div>");c.css({"z-index":1});c.insertBefore(f),f.hide(),c.click(function(){var k=b(this),j=b("ins",k),i=k.next();if(i.css("display")==="none"){k.addClass("open"),j.html("-"),i.show()}else{k.removeClass("open"),j.html("+"),i.hide()}return false});if(a.length>1&&e===0){b('<div class="ws-menu-page-groups-show">+</div>').insertBefore(c).click(function(){b("div.ws-menu-page-group-header").each(function(){var k=b(this),j=b("ins",k),i=k.next();k.addClass("open"),j.html("-"),i.show();return});return false});b('<div class="ws-menu-page-groups-hide">-</div>').insertBefore(c).click(function(){b("div.ws-menu-page-group-header").each(function(){var k=b(this),j=b("ins",k),i=k.next();k.removeClass("open"),j.html("+"),i.hide();return});return false})}if(f.attr("default-state")==="open"){c.trigger("click")}return});if(a.length>1){b("div.ws-menu-page-group-header:first").css({"margin-right":"140px"});b("div.ws-menu-page-group:first").css({"margin-right":"145px"})}b("div.ws-menu-page-r-group-header").click(function(){var d=b(this),c=d.next("div.ws-menu-page-r-group");if(c.css("display")==="none"){b("ins",d).html("-"),d.addClass("open"),c.show()}else{b("ins",d).html("+"),d.removeClass("open");c.hide()}return false});b("div.ws-menu-page-group-header:first, div.ws-menu-page-r-group-header:first").css({"margin-top":"0"});b("div.ws-menu-page-group > div.ws-menu-page-section:first-child > h3").css({"margin-top":"0"});b("div.ws-menu-page-readme > div.readme > div.section:last-child").css({"border-bottom-width":"0"});b("input.ws-menu-page-media-btn").filter(function(){return(b(this).attr("rel"))?true:false}).click(function(){var c=b(this);window.send_to_editor=function(g){var h,f,d=b.trim(c.attr("rel"));if(d&&(h=b("input#"+d)).length>0){var e=h.css("background-color"),i=b.trim(b(g).attr("src"));i=(!i)?b.trim(b("img",g).attr("src")):i;h.val(i),h.css({"background-color":"#FFFFCC"}),setTimeout(function(){h.css({"background-color":e})},2000);tb_remove();return}else{if(d&&(f=b("textarea#"+d)).length>0){var e=f.css("background-color"),i=b.trim(b(g).attr("src"));i=(!i)?b.trim(b("img",g).attr("src")):i;f.val(b.trim(f.val())+"\n"+i),f.css({"background-color":"#FFFFCC"}),setTimeout(function(){f.css({"background-color":e})},2000);tb_remove();return}}};tb_show("","./media-upload.php?type=image&TB_iframe=true");return false});b("form#ws-updates-form").submit(function(){var c="";if(!b.trim(b("input#ws-updates-fname").val())){c+="First Name missing, please try again.\n\n"}if(!b.trim(b("input#ws-updates-lname").val())){c+="Last Name missing, please try again.\n\n"}if(!b.trim(b("input#ws-updates-email").val())){c+="Email missing, please try again.\n\n"}else{if(!b("input#ws-updates-email").val().match(/^([a-z_~0-9\+\-]+)(((\.?)([a-z_~0-9\+\-]+))*)(@)([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i)){c+="Invalid email address, please try again.\n\n"}}if(c=b.trim(c)){alert("— Oops, you missed something: —\n\n"+c);return false}return true})});
1
+ jQuery(document).ready(function(e){e(window).resize(tb_position=function(){var f=(e(window).width()>720)?720:e(window).width(),i=e(window).height(),g=(e("body.admin-bar").length)?28:0;e("#TB_window").css({width:f-50+"px",height:i-45-g+"px",top:25+g+"px","margin-top":0,"margin-left":"-"+parseInt(((f-50)/2),10)+"px"});e("#TB_ajaxContent").css({width:f-50+"px",height:i-75-g+"px",margin:0,padding:0})});var b=e("table.ws-menu-page-table td.ws-menu-page-table-r"),a=e("> .toggler",b),d=e("> .wrapper",b);var c=e("div.ws-menu-page-group");c.each(function(g){var i=e(this),h=i,j=e.trim(h.attr("title"));var f=e('<div class="ws-menu-page-group-header">'+j+"</div>");f.css({"z-index":1});f.insertBefore(h),f.click(function(){var l=e(this),k=l.next();if(l.hasClass("open")){l.add(k).removeClass("open")}else{l.add(k).addClass("open")}return false});if(c.length>1&&g===0){e('<div class="ws-menu-page-groups-hide"><i class="fa fa-chevron-up"></i></div>').insertBefore("div.ws-menu-page-toolbox").click(function(){e("div.ws-menu-page-group-header").each(function(){var l=e(this),k=l.next();l.add(k).removeClass("open");return});return false});e('<div class="ws-menu-page-groups-show"><i class="fa fa-chevron-down"></i></div>').insertBefore("div.ws-menu-page-toolbox").click(function(){e("div.ws-menu-page-group-header").each(function(){var l=e(this),k=l.next();l.add(k).addClass("open");return});return false})}if(h.attr("default-state")==="open"){f.trigger("click")}return});a.click(function(){if(b.hasClass("open")){d.hide(),b.removeClass("open")}else{d.show(),b.addClass("open")}});if(a.attr("default-state")==="open"){a.click()}e("div.ws-menu-page-r-group-header").click(function(){var g=e(this),f=g.next();if(g.hasClass("open")){g.add(f).removeClass("open")}else{g.add(f).addClass("open")}return false});e("div.ws-menu-page-group-header:first, div.ws-menu-page-r-group-header:first").css({"margin-top":"0"});e("div.ws-menu-page-group-header:last, div.ws-menu-page-r-group-header:last, div.ws-menu-page-group:last").css({"margin-bottom":"0"});e("input.ws-menu-page-media-btn").filter(function(){return(e(this).attr("rel"))?true:false}).click(function(){var f=e(this);window.send_to_editor=function(j){var k,i,g=e.trim(f.attr("rel"));if(g&&(k=e("input#"+g)).length>0){var h=k.css("background-color"),l=e.trim(e(j).attr("src"));l=(!l)?e.trim(e("img",j).attr("src")):l;k.val(l),k.css({"background-color":"#FFFFCC"}),setTimeout(function(){k.css({"background-color":h})},2000);tb_remove();return}else{if(g&&(i=e("textarea#"+g)).length>0){var h=i.css("background-color"),l=e.trim(e(j).attr("src"));l=(!l)?e.trim(e("img",j).attr("src")):l;i.val(e.trim(i.val())+"\n"+l),i.css({"background-color":"#FFFFCC"}),setTimeout(function(){i.css({"background-color":h})},2000);tb_remove();return}}};tb_show("","./media-upload.php?type=image&TB_iframe=true");return false});e("form#ws-updates-form").submit(function(){var f="";if(!e.trim(e("input#ws-updates-fname").val())){f+="First Name missing, please try again.\n\n"}if(!e.trim(e("input#ws-updates-lname").val())){f+="Last Name missing, please try again.\n\n"}if(!e.trim(e("input#ws-updates-email").val())){f+="Email missing, please try again.\n\n"}else{if(!e("input#ws-updates-email").val().match(/^([a-z_~0-9\+\-]+)(((\.?)([a-z_~0-9\+\-]+))*)(@)([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i)){f+="Invalid email address, please try again.\n\n"}}if(f=e.trim(f)){alert("— Oops, you missed something: —\n\n"+f);return false}return true})});
includes/menu-pages/menu-pages.css CHANGED
@@ -15,509 +15,833 @@
15
  * @package WebSharks\Menu Pages
16
  * @since x.xx
17
  */
 
 
 
 
 
 
 
 
 
 
 
18
  /*
19
  These CSS selectors address common layout styles.
20
  */
21
  div.ws-menu-page
22
- {
23
- min-width: 800px;
24
- margin-bottom: 20px;
25
- background: url('<?php echo $i; ?>/brand-bg.png') no-repeat top right;
26
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  div.ws-menu-page a.ws-dotted-link
28
- {
29
- text-decoration: none;
30
- border-bottom: 1px dotted;
31
- }
32
  div.ws-menu-page > h2
33
- {
34
- margin-bottom: 15px;
35
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  div.ws-menu-page .ws-menu-page-right
37
- {
38
- float: right;
39
- margin-left: 25px;
40
- }
41
  div.ws-menu-page .ws-menu-page-left
42
- {
43
- float: left;
44
- margin-right: 25px;
45
- }
46
  div.ws-menu-page .ws-menu-page-center
47
- {
48
- display: block;
49
- margin-left: auto;
50
- margin-right: auto;
51
- }
52
  div.ws-menu-page div.ws-menu-page-hr
53
- {
54
- height: 1px;
55
- line-height: 1px;
56
- background: #DDDDDD;
57
- margin: 7px 0 7px 0;
58
- }
59
- div.ws-menu-page .ws-menu-page-hilite
60
- {
61
- font-size: 102%;
62
- background: #FAF9BB;
63
- }
64
  div.ws-menu-page .ws-menu-page-error
65
- {
66
- color: #CC0000;
67
- }
 
 
 
 
 
 
 
 
68
  div.ws-menu-page .ws-menu-page-error-hilite
69
- {
70
- color: #FFFFFF;
71
- background: #FF0000;
72
- }
 
 
 
73
  div.ws-menu-page img.ws-menu-page-img-16
74
- {
75
- border: 0;
76
- width: 16px;
77
- height: 16px;
78
- }
79
- div.ws-menu-page img.ws-menu-page-img-24
80
- {
81
- border: 0;
82
- width: 24px;
83
- height: 24px;
84
- }
85
- div.ws-menu-page img.ws-menu-page-img-32
86
- {
87
- border: 0;
88
- width: 32px;
89
- height: 32px;
90
- }
91
- div.ws-menu-page img.ws-menu-page-img-48
92
- {
93
- border: 0;
94
- width: 48px;
95
- height: 48px;
96
- }
97
- div.ws-menu-page img.ws-menu-page-img-64
98
- {
99
- border: 0;
100
- width: 64px;
101
- height: 64px;
102
- }
103
- div.ws-menu-page img.ws-menu-page-img-128
104
- {
105
- border: 0;
106
- width: 128px;
107
- height: 128px;
108
- }
109
- div.ws-menu-page img.ws-menu-page-img-200
110
- {
111
- border: 0;
112
- width: 200px;
113
- height: 200px;
114
- }
115
- div.ws-menu-page img.ws-menu-page-img-256
116
- {
117
- border: 0;
118
- width: 256px;
119
- height: 256px;
120
- }
121
- div.ws-menu-page img.ws-menu-page-img-200-auto
122
- {
123
- border: 0;
124
- width: 200px;
125
- height: auto;
126
- }
127
- div.ws-menu-page img.ws-menu-page-img-256-auto
128
- {
129
- border: 0;
130
- width: 256px;
131
- height: auto;
132
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  /*
134
  Specifically for the main layout table.
135
  These CSS selectors address common layout styles.
136
  */
137
  table.ws-menu-page-table
138
- {
139
- border: 0;
140
- width: 100%;
141
- }
 
 
 
 
 
 
 
 
 
 
 
 
142
  table.ws-menu-page-table ul,
143
  table.ws-menu-page-table ol
144
- {
145
- margin: 10px 0 10px 20px;
146
- }
147
  table.ws-menu-page-table ul > li
148
- {
149
- list-style: disc outside;
150
- margin-bottom: 0;
151
- }
152
  table.ws-menu-page-table ol > li
153
- {
154
- list-style: decimal outside;
155
- margin-bottom: 0;
156
- }
157
  table.ws-menu-page-table > tbody > tr
158
- {
159
- vertical-align: top;
160
- }
161
  table.ws-menu-page-table td.ws-menu-page-table-l
162
- {
163
- padding: 0;
164
- width: 100%;
165
- }
166
  table.ws-menu-page-table td.ws-menu-page-table-r
167
- {
168
- padding: 0;
169
- width: auto;
170
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  table.ws-menu-page-table img.ws-menu-page-brand-icon
172
- {
173
- border: 0px;
174
- float: right;
175
- width: 128px;
176
- height: 128px;
177
- margin: 0 0 0 25px;
178
- vertical-align: middle;
179
- }
180
  table.ws-menu-page-table img.ws-menu-page-brand-updates
181
- {
182
- border: 0px;
183
- float: right;
184
- width: 155px;
185
- height: 40px;
186
- margin: 0 -153px 0 25px;
187
- vertical-align: middle;
188
- }
189
  table.ws-menu-page-table p.submit
190
- {
191
- margin: 0;
192
- padding: 0;
193
- }
194
- table.ws-menu-page-table a[rel ~= "external"]
195
- {
196
- padding-right: 18px;
197
- background: url('<?php echo $i; ?>/brand-xlink.png') no-repeat center right;
198
- }
199
- table.ws-menu-page-table div.ws-menu-page-groups-show,
200
- table.ws-menu-page-table div.ws-menu-page-groups-hide
201
- {
202
- float: right;
203
- height: 24px;
204
- width: 24px;
205
- color: #333333;
206
- padding: 5px;
207
- cursor: pointer;
208
- font-size: 28px;
209
- font-weight: bold;
210
- line-height: 25px;
211
- text-align: center;
212
- margin: 0 0 0 7px;
213
- vertical-align: middle;
214
- font-family: monospace;
215
- border: 1px solid #666666;
216
- -moz-border-radius: 5px;
217
- -webkit-border-radius: 5px;
218
- border-radius: 5px;
219
- -moz-user-select: none;
220
- -webkit-user-select: none;
221
- user-select: none;
222
- background: linear-gradient(to bottom, #FFFFFF 95%, rgba(236, 236, 236, 1) 90%);
223
- }
224
- table.ws-menu-page-table div.ws-menu-page-groups-hide
225
- {
226
- color: #999999;
227
- border-color: #999999;
228
- }
229
  table.ws-menu-page-table div.ws-menu-page-group-header,
230
  table.ws-menu-page-table div.ws-menu-page-r-group-header
231
- {
232
- height: 24px;
233
- color: #666666;
234
- padding: 5px;
235
- cursor: pointer;
236
- font-size: 19px;
237
- line-height: 20px;
238
- position: relative;
239
- margin: 7px 0 7px 0;
240
- vertical-align: middle;
241
- font-family: 'Georgia', serif;
242
- border: 1px solid #CCCCCC;
243
- -moz-border-radius: 5px;
244
- -webkit-border-radius: 5px;
245
- border-radius: 5px;
246
- -moz-user-select: none;
247
- -webkit-user-select: none;
248
- user-select: none;
249
- background: linear-gradient(to bottom, #FFFFFF 95%, rgba(236, 236, 236, 1) 90%);
250
- }
251
- table.ws-menu-page-table div.ws-menu-page-group-header > ins,
252
- table.ws-menu-page-table div.ws-menu-page-r-group-header > ins
253
- {
254
- padding: 0;
255
- width: 22px;
256
- height: 22px;
257
- color: #CCCCCC;
258
- font-size: 22px;
259
- line-height: 22px;
260
- font-weight: bold;
261
- text-align: center;
262
- margin: 0 10px 0 0;
263
- background: #666666;
264
- text-decoration: none;
265
- font-family: monospace;
266
- vertical-align: text-top;
267
- border: 1px solid transparent;
268
- -moz-border-radius: 5px;
269
- -webkit-border-radius: 5px;
270
- border-radius: 5px;
271
- display: inline-block;
272
- zoom: 1 !ie<8;
273
- display: inline !ie<8;
274
- margin-top: 0 !ie<8;
275
- }
276
  table.ws-menu-page-table div.ws-menu-page-group-header:hover,
277
- table.ws-menu-page-table div.ws-menu-page-group-header.open,
278
  table.ws-menu-page-table div.ws-menu-page-r-group-header:hover,
 
279
  table.ws-menu-page-table div.ws-menu-page-r-group-header.open
280
- {
281
- color: #164A61;
282
- border-color: #666666;
283
- }
284
- table.ws-menu-page-table div.ws-menu-page-group-header:hover > ins,
285
- table.ws-menu-page-table div.ws-menu-page-group-header.open > ins,
286
- table.ws-menu-page-table div.ws-menu-page-r-group-header:hover > ins,
287
- table.ws-menu-page-table div.ws-menu-page-r-group-header.open > ins
288
- {
289
- color: #FFFFFF;
290
- background: #164A61;
291
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  table.ws-menu-page-table div.ws-menu-page-group,
293
  table.ws-menu-page-table div.ws-menu-page-r-group
294
- {
295
- display: none;
296
- margin: -15px 5px 0 5px;
297
- padding: 20px 10px 10px 10px;
298
- border: 1px solid #CCCCCC;
299
- -moz-border-radius: 5px;
300
- -webkit-border-radius: 5px;
301
- border-radius: 5px;
302
- background: #FFFFFF url('<?php echo $i; ?>/brand-gradient-bg.png') repeat-x;
303
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
  table.ws-menu-page-table div.ws-menu-page-group > div.ws-menu-page-hr,
305
  table.ws-menu-page-table div.ws-menu-page-r-group > div.ws-menu-page-hr
306
- {
307
- background: #666666;
308
- margin: 15px 0 15px 0;
309
- }
 
 
 
310
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr
311
- {
312
- vertical-align: top;
313
- }
314
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > th
315
- {
316
- width: auto;
317
- color: #164A61;
318
- font-size: 115%;
319
- padding: 0 0.5em 0 0;
320
- font-family: 'Georgia', serif;
321
- }
 
322
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td
323
- {
324
- width: auto;
325
- padding: 0.5em 10px 0.5em 0;
326
- }
327
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > th.ws-menu-page-th-side
328
- {
329
- width: 200px;
330
- }
331
- table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > input[type = "text"],
332
- table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > input[type = "password"],
333
- table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > textarea,
334
- table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > select
335
- {
336
- width: /* 100% does not work across all browsers. */ 100%;
337
- width: /* 100% does not work in IE browsers < 8. */ 98% !ie<8;
338
- box-sizing: /* Make all fields behave the same. */ border-box;
339
- -ms-box-sizing: border-box;
340
- -moz-box-sizing: border-box;
341
- -webkit-box-sizing: border-box;
342
- }
343
- table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > select
344
- {
345
- width: /* Required in IE < 8. */ 99.5% !ie<8;
346
- }
347
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > textarea
348
- {
349
- font-family: 'Courier New', monospace;
350
- }
351
- table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > input[type = "checkbox"],
352
- table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > input[type = "radio"]
353
- {
354
- margin-right: 3px;
355
- vertical-align: middle;
356
- }
357
- table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > input[type = "button"].ws-menu-page-media-btn
358
- {
359
- float: left;
360
- margin: 5px 25px 0 0;
361
- }
 
 
 
 
 
 
 
 
 
 
362
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > div.ws-menu-page-scrollbox
363
- {
364
- margin: 1px;
365
- padding: 5px;
366
- height: 150px;
367
- overflow-y: scroll;
368
- overflow-x: visible;
369
- background: #FFFFFF;
370
- border: 1px solid #CCCCCC;
371
- -moz-border-radius: 4px;
372
- -webkit-border-radius: 4px;
373
- border-radius: 4px;
374
- }
 
 
 
 
375
  /*
376
  Specifically for info pages with readme files.
377
  These CSS selectors address common layout styles.
378
  */
379
  div.ws-menu-page-readme > div.readme > div.section
380
- {
381
- margin: 0 0 20px 0;
382
- padding: 0 0 20px 0;
383
- border: 0 solid #DDDDDD;
384
- border-width: 0 0 1px 0;
385
- }
 
 
 
 
386
  div.ws-menu-page-readme > div.readme > div.section > h2
387
- {
388
- margin-top: 0;
389
- padding-top: 0;
390
- font-size: 150%;
391
- }
392
  div.ws-menu-page-readme > div.readme > div.section > div.content ul,
393
  div.ws-menu-page-readme > div.readme > div.section > div.content ol
394
- {
395
- padding: 0;
396
- margin: 10px 0 0 25px;
397
- }
398
  div.ws-menu-page-readme > div.readme > div.section > div.content ul > li
399
- {
400
- list-style: disc outside;
401
- margin-bottom: 0;
402
- }
403
  div.ws-menu-page-readme > div.readme > div.section > div.content ol > li
404
- {
405
- list-style: decimal outside;
406
- margin-bottom: 0;
407
- }
408
- /*
409
- Specifically for the right sidebar panel.
410
- These CSS selectors address common layout styles.
411
- */
412
- td.ws-menu-page-table-r div.ws-menu-page-js-c-w,
413
- td.ws-menu-page-table-r div.ws-menu-page-updates,
414
- td.ws-menu-page-table-r div.ws-menu-page-installation,
415
- td.ws-menu-page-table-r div.ws-menu-page-tools,
416
- td.ws-menu-page-table-r div.ws-menu-page-kb,
417
- td.ws-menu-page-table-r div.ws-menu-page-videos,
418
- td.ws-menu-page-table-r div.ws-menu-page-support,
419
- td.ws-menu-page-table-r div.ws-menu-page-donations,
420
- td.ws-menu-page-table-r div.ws-menu-page-others
421
- {
422
- width: 200px;
423
- margin: 0 0 25px 25px;
424
- }
425
- td.ws-menu-page-table-r div.ws-menu-page-installation img,
426
- td.ws-menu-page-table-r div.ws-menu-page-tools img,
427
- td.ws-menu-page-table-r div.ws-menu-page-kb img,
428
- td.ws-menu-page-table-r div.ws-menu-page-videos img,
429
- td.ws-menu-page-table-r div.ws-menu-page-support img,
430
- td.ws-menu-page-table-r div.ws-menu-page-donations img,
431
- td.ws-menu-page-table-r div.ws-menu-page-others img
432
- {
433
- border: 0;
434
- width: 200px;
435
- height: auto;
436
- }
437
- td.ws-menu-page-table-r div.ws-menu-page-js-c-w
438
- {
439
- width: 178px;
440
- padding: 10px;
441
- background: #FFF5F7;
442
- text-align: justify;
443
- border: 1px solid #FA4D4D;
444
- -moz-border-radius: 5px;
445
- -webkit-border-radius: 5px;
446
- border-radius: 5px;
447
- }
448
  /*
449
  Specifically for the right sidebar panel.
450
  - Specifically for the updates box.
451
  These CSS selectors address common layout styles.
452
  */
453
  div.ws-menu-page-updates ul
454
- {
455
- padding: 0;
456
- margin: 0 0 0 12px;
457
- }
458
  div.ws-menu-page-updates ul > li
459
- {
460
- padding: 0;
461
- margin: 5px 0 5px 0;
462
- list-style: square outside;
463
- -moz-user-select: none;
464
- -webkit-user-select: none;
465
- user-select: none;
466
- }
467
  div.ws-menu-page-updates ul > li:first-child
468
- {
469
- margin-top: 0;
470
- }
471
  div.ws-menu-page-updates a[target = "_blank"]
472
- {
473
- padding-right: 18px;
474
- background: url('<?php echo $i; ?>/brand-xlink.png') no-repeat center right;
475
- }
476
  div.ws-menu-page-updates div#creditfooter
477
- {
478
- display: none;
479
- }
480
  div.ws-menu-page-updates div#ws-updates-div-fname,
481
  div.ws-menu-page-updates div#ws-updates-div-lname,
482
  div.ws-menu-page-updates div#ws-updates-div-email,
483
  div.ws-menu-page-updates div#ws-updates-div-subs,
484
  div.ws-menu-page-updates div#ws-updates-div-priv
485
- {
486
- margin: 0 0 10px 0;
487
- }
488
  div.ws-menu-page-updates div#ws-updates-div-subs
489
- {
490
- margin: 15px 0 0 0;
491
- }
492
  div.ws-menu-page-updates div#ws-updates-div-priv
493
- {
494
- font-size: 80%;
495
- margin: 0 0 5px 0;
496
- }
497
  div.ws-menu-page-updates input[type = "text"],
498
  div.ws-menu-page-updates input[type = "password"],
499
  div.ws-menu-page-updates input[type = "submit"],
500
  div.ws-menu-page-updates textarea,
501
  div.ws-menu-page-updates select
502
- {
503
- width: /* 100% does not work across all browsers. */ 100%;
504
- width: /* 100% does not work in IE browsers < 8. */ 98% !ie<8;
505
- box-sizing: /* Make all fields behave the same. */ border-box;
506
- -ms-box-sizing: border-box;
507
- -moz-box-sizing: border-box;
508
- -webkit-box-sizing: border-box;
509
- }
510
  div.ws-menu-page-updates input[type = "checkbox"],
511
  div.ws-menu-page-updates input[type = "radio"]
512
- {
513
- margin-right: 3px;
514
- vertical-align: middle;
515
- }
516
- div.ws-menu-page-updates input[type = "submit"]
517
- {
518
- width: /* This width required in IE < 8. */ 100% !ie<8;
519
- }
520
- div.ws-menu-page-updates select
521
- {
522
- width: /* Required in IE < 8. */ 99.5% !ie<8;
523
- }
15
  * @package WebSharks\Menu Pages
16
  * @since x.xx
17
  */
18
+ @import url('//netdna.bootstrapcdn.com/font-awesome/4.0.0/css/font-awesome.min.css');
19
+
20
+ /*
21
+ Align these with menu page.
22
+ */
23
+ div.updated, div.error
24
+ {
25
+ font-size : 120%;
26
+ margin : 25px 25px 25px 5px;
27
+ }
28
+
29
  /*
30
  These CSS selectors address common layout styles.
31
  */
32
  div.ws-menu-page
33
+ {
34
+ font-size : 14px;
35
+ padding : 25px;
36
+ min-width : 800px;
37
+ margin : 25px 25px 25px 5px;
38
+
39
+ border-radius : 5px;
40
+ background : #ECECEC;
41
+ border : 1px solid #A4A4A4;
42
+ box-shadow : 0 0 2px 0 rgba(0, 0, 0, 0.2) !important;
43
+ }
44
+ div.ws-menu-page a
45
+ {
46
+ color : #003E75;
47
+ }
48
+ div.ws-menu-page a:hover,
49
+ div.ws-menu-page a:active
50
+ {
51
+ color : #027E02;
52
+ }
53
+ div.ws-menu-page p:first-child,
54
+ div.ws-menu-page pre:first-child
55
+ {
56
+ margin-top : 0;
57
+ }
58
+ div.ws-menu-page p:last-child,
59
+ div.ws-menu-page pre:last-child
60
+ {
61
+ margin-bottom : 0;
62
+ }
63
+ div.ws-menu-page h3 + p
64
+ {
65
+ margin-top : 0;
66
+ }
67
  div.ws-menu-page a.ws-dotted-link
68
+ {
69
+ text-decoration : none;
70
+ border-bottom : 1px dotted;
71
+ }
72
  div.ws-menu-page > h2
73
+ {
74
+ font-size : 200%;
75
+ font-weight : bold;
76
+
77
+ height : 90px;
78
+ box-sizing : border-box;
79
+ position : relative;
80
+ z-index : 0;
81
+
82
+ margin-bottom : 25px;
83
+ padding : 25px 0 0 120px;
84
+ background : url('<?php echo $i; ?>/s2___.png') no-repeat left bottom;
85
+ }
86
+ div.ws-menu-page > h2:before
87
+ {
88
+ content : ' ';
89
+ display : block;
90
+ width : 85%;
91
+ width : calc(100% - 220px);
92
+ height : 90px;
93
+
94
+ right : 20px;
95
+ bottom : 0;
96
+ z-index : 0;
97
+ position : absolute;
98
+
99
+ background : url('<?php echo $i; ?>/s2___bar.png') repeat-x left bottom;
100
+ }
101
+ div.ws-menu-page > h2:after
102
+ {
103
+ content : ' ';
104
+ display : block;
105
+ width : 20px;
106
+ height : 90px;
107
+
108
+ right : 0;
109
+ bottom : 0;
110
+ z-index : 0;
111
+ position : absolute;
112
+
113
+ background : url('<?php echo $i; ?>/s2___end.png') no-repeat right bottom
114
+ }
115
+ div.ws-menu-page code
116
+ {
117
+ font-size : 1em;
118
+ font-family : 'Monaco', 'Menlo', 'Consolas', 'Courier New', monospace;
119
+ }
120
+ div.ws-menu-page pre.code
121
+ {
122
+ padding : 0;
123
+ background : none;
124
+ }
125
+ div.ws-menu-page pre.code > code
126
+ {
127
+ font-size : 90%;
128
+ color : #EEEEEE;
129
+ background : #222222;
130
+ overflow-x : auto;
131
+ max-width : 100%;
132
+
133
+ border-radius : 5px;
134
+ padding : 10px;
135
+ display : block;
136
+ box-shadow : 0 0 5px 1px #000000 inset, 0 0 1px 1px rgba(223, 245, 165, 0.5);
137
+ }
138
+ div.ws-menu-page code.highlight-php
139
+ {
140
+ font-size : 90%;
141
+ color : #EEEEEE;
142
+ background : #FFFFFF;
143
+ overflow : auto;
144
+ max-width : 100%;
145
+ max-height : 400px;
146
+ white-space : nowrap;
147
+
148
+ border-radius : 5px;
149
+ padding : 10px;
150
+ display : block;
151
+ box-shadow : 0 0 5px 1px rgba(0, 0, 0, 0.38) inset, 0 0 1px 1px rgba(223, 245, 165, 0.5);
152
+ }
153
+ div.ws-menu-page img
154
+ {
155
+ border : 0;
156
+ }
157
+ div.ws-menu-page img.screenshot
158
+ {
159
+ float : right;
160
+ margin : 0 0 0 25px;
161
+
162
+ border-radius : 5px;
163
+ border : 1px solid #AFAFAF;
164
+
165
+ box-shadow : 0 0 5px 0 rgba(0, 0, 0, 0.2) inset, 0 0 1px 0 rgba(72, 155, 88, 0.2);
166
+ background : #FFFFFF;
167
+ padding : 10px;
168
+ }
169
  div.ws-menu-page .ws-menu-page-right
170
+ {
171
+ float : right;
172
+ margin-left : 25px;
173
+ }
174
  div.ws-menu-page .ws-menu-page-left
175
+ {
176
+ float : left;
177
+ margin-right : 25px;
178
+ }
179
  div.ws-menu-page .ws-menu-page-center
180
+ {
181
+ margin-left : auto;
182
+ margin-right : auto;
183
+ display : block;
184
+ }
185
  div.ws-menu-page div.ws-menu-page-hr
186
+ {
187
+ height : 1px;
188
+ line-height : 1px;
189
+ background : #DDDDDD;
190
+ margin : 10px 0 10px 0;
191
+ }
 
 
 
 
 
192
  div.ws-menu-page .ws-menu-page-error
193
+ {
194
+ color : #962722;
195
+ }
196
+ div.ws-menu-page .ws-menu-page-hilite
197
+ {
198
+ font-size : 102%;
199
+ background : #DFF0DF;
200
+
201
+ border-radius : 3px;
202
+ padding : 0.2em;
203
+ }
204
  div.ws-menu-page .ws-menu-page-error-hilite
205
+ {
206
+ color : #FFFFFF;
207
+ background : #962722;
208
+
209
+ border-radius : 3px;
210
+ padding : 0.2em;
211
+ }
212
  div.ws-menu-page img.ws-menu-page-img-16
213
+ {
214
+ border : 0;
215
+ width : 16px;
216
+ height : 16px;
217
+ }
218
+ div.ws-menu-page label
219
+ {
220
+ text-shadow : none;
221
+
222
+ -webkit-user-select : none;
223
+ -moz-user-select : none;
224
+ user-select : none;
225
+ }
226
+ div.ws-menu-page .form-table td
227
+ {
228
+ font-size : inherit;
229
+ line-height : inherit;
230
+ }
231
+ div.ws-menu-page input:not([type='image']):not([type='button']):not([type='submit']):not([type='radio']):not([type='checkbox']),
232
+ div.ws-menu-page input:not([type='image']):not([type='button']):not([type='submit']):not([type='radio']):not([type='checkbox']):focus,
233
+ div.ws-menu-page select, div.ws-menu-page select:focus,
234
+ div.ws-menu-page textarea, div.ws-menu-page textarea:focus
235
+ {
236
+ width : 100%;
237
+ height : auto;
238
+
239
+ margin : 0;
240
+ padding : 5px;
241
+ line-height : 1em;
242
+ box-sizing : border-box;
243
+ border : 1px solid rgba(13, 31, 47, 0.5);
244
+
245
+ color : #FFFFFF;
246
+ background : #73834B;
247
+ box-shadow : 0 0 1px 0 rgba(0, 0, 0, 0.5) inset, 0 0 1px 1px rgba(223, 245, 165, 0.5);
248
+ }
249
+ div.ws-menu-page input:not([type='image']):not([type='button']):not([type='submit']):not([type='radio']):not([type='checkbox']):focus,
250
+ div.ws-menu-page select:focus, div.ws-menu-page textarea:focus
251
+ {
252
+ background : #637041;
253
+ }
254
+ div.ws-menu-page input[disabled],
255
+ div.ws-menu-page select[disabled],
256
+ div.ws-menu-page textarea[disabled]
257
+ {
258
+ opacity : 0.5;
259
+ }
260
+ div.ws-menu-page button,
261
+ div.ws-menu-page input[type='button'],
262
+ div.ws-menu-page input[type='submit']
263
+ {
264
+ line-height : 1em;
265
+ font-size : 120%;
266
+ color : #FFFFFF;
267
+ background : #0E4152;
268
+
269
+ border-radius : 4px;
270
+ border : 1px solid rgba(0, 0, 0, 0.5);
271
+ box-shadow : 0 1px 1px 0 rgba(0, 0, 0, 0.25), -1px -1px 0 1px rgba(0, 0, 0, 0.2) inset, 1px 1px 0 1px rgba(255, 255, 255, 0.1) inset;
272
+
273
+ margin : 0;
274
+ box-sizing : border-box;
275
+ padding : 6px 12px 6px 12px;
276
+
277
+ outline : none;
278
+
279
+ cursor : pointer;
280
+ -webkit-user-select : none;
281
+ -moz-user-select : none;
282
+ user-select : none;
283
+ }
284
+ div.ws-menu-page button:hover,
285
+ div.ws-menu-page input[type='button']:hover,
286
+ div.ws-menu-page input[type='submit']:hover
287
+ {
288
+ background : #0D1F2F;
289
+ }
290
+ div.ws-menu-page button:active,
291
+ div.ws-menu-page input[type='button']:active,
292
+ div.ws-menu-page input[type='submit']:active
293
+ {
294
+ -webkit-transform : scale(0.98, 0.98);
295
+ transform : scale(0.98, 0.98);
296
+ }
297
+ div.ws-menu-page button[type='submit'],
298
+ div.ws-menu-page input[type='submit']
299
+ {
300
+ font-size : 150%;
301
+ font-weight : bold;
302
+ background : #5F7523;
303
+ }
304
+ div.ws-menu-page button[type='submit']:hover,
305
+ div.ws-menu-page input[type='submit']:hover
306
+ {
307
+ background : #4C6324;
308
+ }
309
+ div.ws-menu-page p.submit button[type='submit'],
310
+ div.ws-menu-page p.submit input[type='submit']
311
+ {
312
+ width : 100%;
313
+ }
314
+ div.ws-menu-page input[type='file']
315
+ {
316
+ width : auto !important;
317
+ }
318
+ div.ws-menu-page .pro-preview
319
+ {
320
+ opacity : 0.5;
321
+ }
322
+ div.ws-menu-page .info,
323
+ div.ws-menu-page .notice,
324
+ div.ws-menu-page .warning,
325
+ div.ws-menu-page .error
326
+ {
327
+ font-size : 120%;
328
+ padding : 10px;
329
+ margin : 0 0 25px 0;
330
+ border-radius : 5px;
331
+ }
332
+ div.ws-menu-page .info
333
+ {
334
+ border : 1px solid #35558A;
335
+ background : #C9E0FA;
336
+ }
337
+ div.ws-menu-page .notice
338
+ {
339
+ border : 1px solid #E6DB55;
340
+ background : #FFFBCC;
341
+ }
342
+ div.ws-menu-page .warning
343
+ {
344
+ border : 1px solid #D29A04;
345
+ background : #FADDAB;
346
+ }
347
+ div.ws-menu-page .error
348
+ {
349
+ border : 1px solid #711E1E;
350
+ background : #FABBC6;
351
+ }
352
+ div.ws-menu-page .monospace
353
+ {
354
+ font-family : 'Monaco', 'Menlo', 'Consolas', 'Courier New', monospace;
355
+ }
356
+ div.ws-menu-page textarea.monospace
357
+ {
358
+ white-space : nowrap;
359
+ }
360
+ div.ws-menu-page .clearfix:before,
361
+ div.ws-menu-page .clearfix:after
362
+ {
363
+ display : table;
364
+ content : ' ';
365
+ }
366
+ div.ws-menu-page .clearfix:after
367
+ {
368
+ clear : both;
369
+ }
370
+
371
+ /*
372
+ Tools and togglers.
373
+ */
374
+ div.ws-menu-page div.ws-menu-page-groups-show,
375
+ div.ws-menu-page div.ws-menu-page-groups-hide
376
+ {
377
+ float : right;
378
+
379
+ z-index : 1;
380
+ position : relative;
381
+
382
+ line-height : 1em;
383
+ font-size : 150%;
384
+ font-weight : bold;
385
+ color : #FFFFFF;
386
+ background : #0E4152;
387
+
388
+ border-radius : 4px;
389
+ border : 1px solid rgba(0, 0, 0, 0.5);
390
+ box-shadow : 0 1px 1px 0 rgba(0, 0, 0, 0.25), -1px -1px 0 1px rgba(0, 0, 0, 0.2) inset, 1px 1px 0 1px rgba(255, 255, 255, 0.1) inset;
391
+
392
+ margin : 0;
393
+ box-sizing : border-box;
394
+ padding : 6px 12px 6px 12px;
395
+
396
+ outline : none;
397
+
398
+ cursor : pointer;
399
+ -webkit-user-select : none;
400
+ -moz-user-select : none;
401
+ user-select : none;
402
+ }
403
+ div.ws-menu-page div.ws-menu-page-groups-show
404
+ {
405
+ margin : 0 5px 0 0;
406
+ }
407
+ div.ws-menu-page div.ws-menu-page-groups-show:hover,
408
+ div.ws-menu-page div.ws-menu-page-groups-hide:hover
409
+ {
410
+ background : #0D1F2F;
411
+ }
412
+ div.ws-menu-page div.ws-menu-page-groups-show:active,
413
+ div.ws-menu-page div.ws-menu-page-groups-hide:active
414
+ {
415
+ -webkit-transform : scale(0.98, 0.98);
416
+ transform : scale(0.98, 0.98);
417
+ }
418
+ div.ws-menu-page div.ws-menu-page-toolbox
419
+ {
420
+ float : right;
421
+ max-width : 300px;
422
+
423
+ z-index : 1;
424
+ position : relative;
425
+ }
426
+ div.ws-menu-page div.ws-menu-page-toolbox > .links
427
+ {
428
+ text-align : center;
429
+ }
430
+ div.ws-menu-page div.ws-menu-page-toolbox > .links a
431
+ {
432
+ display : inline-block;
433
+ margin : 0 10px 0 10px;
434
+ text-decoration : none;
435
+ }
436
+
437
  /*
438
  Specifically for the main layout table.
439
  These CSS selectors address common layout styles.
440
  */
441
  table.ws-menu-page-table
442
+ {
443
+ border : 0;
444
+ width : 100%;
445
+ table-layout : fixed;
446
+ }
447
+ table.ws-menu-page-table .notice,
448
+ table.ws-menu-page-table .info,
449
+ table.ws-menu-page-table .warning,
450
+ table.ws-menu-page-table .error
451
+ {
452
+ font-size : 100%;
453
+ font-style : italic;
454
+
455
+ padding : 5px;
456
+ margin : 1em 0 1em 0;
457
+ }
458
  table.ws-menu-page-table ul,
459
  table.ws-menu-page-table ol
460
+ {
461
+ margin : 10px 0 10px 20px;
462
+ }
463
  table.ws-menu-page-table ul > li
464
+ {
465
+ margin-bottom : 0;
466
+ list-style : disc outside;
467
+ }
468
  table.ws-menu-page-table ol > li
469
+ {
470
+ margin-bottom : 0;
471
+ list-style : decimal outside;
472
+ }
473
  table.ws-menu-page-table > tbody > tr
474
+ {
475
+ vertical-align : top;
476
+ }
477
  table.ws-menu-page-table td.ws-menu-page-table-l
478
+ {
479
+ padding : 0;
480
+ }
 
481
  table.ws-menu-page-table td.ws-menu-page-table-r
482
+ {
483
+ padding : 0;
484
+ width : 30px;
485
+ box-sizing : border-box;
486
+
487
+ height : 100%;
488
+ position : relative;
489
+ }
490
+ table.ws-menu-page-table td.ws-menu-page-table-r.open
491
+ {
492
+ width : 310px;
493
+ }
494
+ table.ws-menu-page-table td.ws-menu-page-table-r > .toggler
495
+ {
496
+ width : 12px;
497
+ box-sizing : border-box;
498
+ position : absolute;
499
+ min-height : 100%;
500
+
501
+ z-index : 2;
502
+ top : 0;
503
+ right : 0;
504
+
505
+ background : #8EA7BD;
506
+ box-shadow : 0 0 0 2px #FFFFFF;
507
+ border-radius : 3px;
508
+
509
+ cursor : pointer;
510
+ -webkit-user-select : none;
511
+ -moz-user-select : none;
512
+ user-select : none;
513
+ }
514
+ table.ws-menu-page-table td.ws-menu-page-table-r > .toggler:hover
515
+ {
516
+ background : #74808B;
517
+ }
518
+ table.ws-menu-page-table td.ws-menu-page-table-r > .wrapper
519
+ {
520
+ margin : 0;
521
+ padding : 25px;
522
+ position : relative;
523
+ box-sizing : border-box;
524
+ min-height : 100%;
525
+ width : 250px;
526
+
527
+ z-index : 1;
528
+ top : 0;
529
+ left : 25px;
530
+
531
+ border-radius : 5px;
532
+ background : #B2BFCA;
533
+ border : 1px solid #656F79;
534
+
535
+ display : none;
536
+ }
537
+ td.ws-menu-page-table-r div.ws-menu-page-js-c-w,
538
+ td.ws-menu-page-table-r div.ws-menu-page-updates,
539
+ td.ws-menu-page-table-r div.ws-menu-page-installation,
540
+ td.ws-menu-page-table-r div.ws-menu-page-tools,
541
+ td.ws-menu-page-table-r div.ws-menu-page-kb,
542
+ td.ws-menu-page-table-r div.ws-menu-page-videos,
543
+ td.ws-menu-page-table-r div.ws-menu-page-support,
544
+ td.ws-menu-page-table-r div.ws-menu-page-donations,
545
+ td.ws-menu-page-table-r div.ws-menu-page-others
546
+ {
547
+ width : 200px;
548
+ margin : 0 0 25px 0;
549
+ }
550
+ td.ws-menu-page-table-r div.ws-menu-page-installation img,
551
+ td.ws-menu-page-table-r div.ws-menu-page-tools img,
552
+ td.ws-menu-page-table-r div.ws-menu-page-kb img,
553
+ td.ws-menu-page-table-r div.ws-menu-page-videos img,
554
+ td.ws-menu-page-table-r div.ws-menu-page-support img,
555
+ td.ws-menu-page-table-r div.ws-menu-page-donations img,
556
+ td.ws-menu-page-table-r div.ws-menu-page-others img
557
+ {
558
+ border : 0;
559
+ width : 200px;
560
+ height : auto;
561
+ }
562
  table.ws-menu-page-table img.ws-menu-page-brand-icon
563
+ {
564
+ border : 0px;
565
+ float : right;
566
+ width : 128px;
567
+ height : 128px;
568
+ margin : 0 0 0 25px;
569
+ vertical-align : middle;
570
+ }
571
  table.ws-menu-page-table img.ws-menu-page-brand-updates
572
+ {
573
+ border : 0px;
574
+ float : right;
575
+ width : 155px;
576
+ height : 40px;
577
+ margin : 0 -153px 0 25px;
578
+ vertical-align : middle;
579
+ }
580
  table.ws-menu-page-table p.submit
581
+ {
582
+ margin : 0;
583
+ padding : 0;
584
+ }
585
+ table.ws-menu-page-table a[rel~="external"]
586
+ {
587
+ padding-right : 18px;
588
+ background : url('<?php echo $i; ?>/brand-xlink.png') no-repeat center right;
589
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
590
  table.ws-menu-page-table div.ws-menu-page-group-header,
591
  table.ws-menu-page-table div.ws-menu-page-r-group-header
592
+ {
593
+ z-index : 1;
594
+ position : relative;
595
+
596
+ padding : 10px;
597
+ font-size : 150%;
598
+ font-weight : bold;
599
+ line-height : 1em;
600
+ color : #EEEEEE;
601
+ background : #173B47;
602
+
603
+ border-radius : 5px;
604
+ box-shadow : 0 2px 2px 0 rgba(0, 0, 0, 0.25);
605
+
606
+ margin-bottom : 25px;
607
+
608
+ cursor : pointer;
609
+ -webkit-user-select : none;
610
+ -moz-user-select : none;
611
+ user-select : none;
612
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
613
  table.ws-menu-page-table div.ws-menu-page-group-header:hover,
 
614
  table.ws-menu-page-table div.ws-menu-page-r-group-header:hover,
615
+ table.ws-menu-page-table div.ws-menu-page-group-header.open,
616
  table.ws-menu-page-table div.ws-menu-page-r-group-header.open
617
+ {
618
+ color : #FFFFFF;
619
+ background : #0D1F2F;
620
+ }
621
+ table.ws-menu-page-table div.ws-menu-page-group-header.open,
622
+ table.ws-menu-page-table div.ws-menu-page-r-group-header.open
623
+ {
624
+ margin-bottom : 0;
625
+ }
626
+ table.ws-menu-page-table div.ws-menu-page-group-header:after,
627
+ table.ws-menu-page-table div.ws-menu-page-r-group-header:after
628
+ {
629
+ font-size : 80%;
630
+ content : '\f078';
631
+ font-weight : normal;
632
+ font-family : 'FontAwesome';
633
+
634
+ float : right;
635
+ margin : 0 0 0 10px;
636
+ display : inline-block;
637
+ }
638
+ table.ws-menu-page-table div.ws-menu-page-group-header.open:after,
639
+ table.ws-menu-page-table div.ws-menu-page-r-group-header.open:after
640
+ {
641
+ content : '\f077';
642
+ }
643
  table.ws-menu-page-table div.ws-menu-page-group,
644
  table.ws-menu-page-table div.ws-menu-page-r-group
645
+ {
646
+ z-index : 0;
647
+ position : relative;
648
+ display : none;
649
+
650
+ padding : 25px;
651
+ color : #333333;
652
+ background : #D0DDAD;
653
+
654
+ border-bottom-left-radius : 5px;
655
+ border-bottom-right-radius : 5px;
656
+
657
+ box-shadow : 0 1px 1px 0 rgba(0, 0, 0, 0.5);
658
+ }
659
+ table.ws-menu-page-table div.ws-menu-page-group.open,
660
+ table.ws-menu-page-table div.ws-menu-page-r-group.open
661
+ {
662
+ display : block;
663
+ margin-bottom : 25px;
664
+ }
665
+ table.ws-menu-page-table div.ws-menu-page-group div.ws-menu-page-hr,
666
+ table.ws-menu-page-table div.ws-menu-page-r-group div.ws-menu-page-hr
667
+ {
668
+ background : #81E07D;
669
+ }
670
  table.ws-menu-page-table div.ws-menu-page-group > div.ws-menu-page-hr,
671
  table.ws-menu-page-table div.ws-menu-page-r-group > div.ws-menu-page-hr
672
+ {
673
+ margin : 15px 0 15px 0;
674
+ }
675
+ div.ws-menu-page-group > div.ws-menu-page-section:first-child > h3
676
+ {
677
+ margin-top : 0;
678
+ }
679
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr
680
+ {
681
+ vertical-align : top;
682
+ }
683
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > th
684
+ {
685
+ font-size : 115%;
686
+ color : #73834B;
687
+ font-family : 'Georgia', serif;
688
+
689
+ width : auto;
690
+ padding : 0 0.5em 0 0;
691
+ }
692
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td
693
+ {
694
+ width : auto;
695
+ padding : 0.5em 0 0.5em 0;
696
+ }
697
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > th.ws-menu-page-th-side
698
+ {
699
+ width : 200px;
700
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
701
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > textarea
702
+ {
703
+ font-family : 'Monaco', 'Menlo', 'Consolas', 'Courier New', monospace;
704
+ }
705
+ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > * input[type='text'],
706
+ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > * input[type='password'],
707
+ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > * select
708
+ {
709
+ width : auto !important;
710
+ }
711
+ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > * input[id*='shortcode']
712
+ {
713
+ width : 100% !important;
714
+ }
715
+ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > input[type = 'checkbox'],
716
+ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > input[type = 'radio']
717
+ {
718
+ margin-right : 3px;
719
+ vertical-align : middle;
720
+ }
721
+ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > input[type = 'button'].ws-menu-page-media-btn
722
+ {
723
+ float : left;
724
+ margin : 5px 25px 0 0;
725
+ }
726
  table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > div.ws-menu-page-scrollbox
727
+ {
728
+ margin : 1px;
729
+ padding : 5px;
730
+ height : 150px;
731
+
732
+ overflow-y : scroll;
733
+ overflow-x : visible;
734
+
735
+ border-radius : 4px;
736
+ border : 1px solid rgba(13, 31, 47, 0.5);
737
+
738
+ color : #FFFFFF;
739
+ background : #73834B;
740
+ box-shadow : 0 0 1px 0 rgba(0, 0, 0, 0.5) inset, 0 0 1px 1px rgba(223, 245, 165, 0.5);
741
+ }
742
+
743
  /*
744
  Specifically for info pages with readme files.
745
  These CSS selectors address common layout styles.
746
  */
747
  div.ws-menu-page-readme > div.readme > div.section
748
+ {
749
+ margin : 0 0 20px 0;
750
+ padding : 0 0 20px 0;
751
+ border : 0 solid #DDDDDD;
752
+ border-width : 0 0 1px 0;
753
+ }
754
+ div.ws-menu-page-readme > div.readme > div.section:last-child
755
+ {
756
+ border-bottom-width : 0;
757
+ }
758
  div.ws-menu-page-readme > div.readme > div.section > h2
759
+ {
760
+ margin-top : 0;
761
+ padding-top : 0;
762
+ font-size : 150%;
763
+ }
764
  div.ws-menu-page-readme > div.readme > div.section > div.content ul,
765
  div.ws-menu-page-readme > div.readme > div.section > div.content ol
766
+ {
767
+ padding : 0;
768
+ margin : 10px 0 0 25px;
769
+ }
770
  div.ws-menu-page-readme > div.readme > div.section > div.content ul > li
771
+ {
772
+ list-style : disc outside;
773
+ margin-bottom : 0;
774
+ }
775
  div.ws-menu-page-readme > div.readme > div.section > div.content ol > li
776
+ {
777
+ list-style : decimal outside;
778
+ margin-bottom : 0;
779
+ }
780
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
781
  /*
782
  Specifically for the right sidebar panel.
783
  - Specifically for the updates box.
784
  These CSS selectors address common layout styles.
785
  */
786
  div.ws-menu-page-updates ul
787
+ {
788
+ padding : 0;
789
+ margin : 0 0 0 12px;
790
+ }
791
  div.ws-menu-page-updates ul > li
792
+ {
793
+ padding : 0;
794
+ margin : 5px 0 5px 0;
795
+ list-style : square outside;
796
+ -moz-user-select : none;
797
+ -webkit-user-select : none;
798
+ user-select : none;
799
+ }
800
  div.ws-menu-page-updates ul > li:first-child
801
+ {
802
+ margin-top : 0;
803
+ }
804
  div.ws-menu-page-updates a[target = "_blank"]
805
+ {
806
+ padding-right : 18px;
807
+ background : url('<?php echo $i; ?>/brand-xlink.png') no-repeat center right;
808
+ }
809
  div.ws-menu-page-updates div#creditfooter
810
+ {
811
+ display : none;
812
+ }
813
  div.ws-menu-page-updates div#ws-updates-div-fname,
814
  div.ws-menu-page-updates div#ws-updates-div-lname,
815
  div.ws-menu-page-updates div#ws-updates-div-email,
816
  div.ws-menu-page-updates div#ws-updates-div-subs,
817
  div.ws-menu-page-updates div#ws-updates-div-priv
818
+ {
819
+ margin : 0 0 10px 0;
820
+ }
821
  div.ws-menu-page-updates div#ws-updates-div-subs
822
+ {
823
+ margin : 15px 0 0 0;
824
+ }
825
  div.ws-menu-page-updates div#ws-updates-div-priv
826
+ {
827
+ font-size : 80%;
828
+ margin : 0 0 5px 0;
829
+ }
830
  div.ws-menu-page-updates input[type = "text"],
831
  div.ws-menu-page-updates input[type = "password"],
832
  div.ws-menu-page-updates input[type = "submit"],
833
  div.ws-menu-page-updates textarea,
834
  div.ws-menu-page-updates select
835
+ {
836
+ width : 100%;
837
+ box-sizing : border-box;
838
+ -ms-box-sizing : border-box;
839
+ -moz-box-sizing : border-box;
840
+ -webkit-box-sizing : border-box;
841
+ }
 
842
  div.ws-menu-page-updates input[type = "checkbox"],
843
  div.ws-menu-page-updates input[type = "radio"]
844
+ {
845
+ margin-right : 3px;
846
+ vertical-align : middle;
847
+ }
 
 
 
 
 
 
 
 
includes/menu-pages/menu-pages.js CHANGED
@@ -20,8 +20,6 @@
20
  */
21
  jQuery(document).ready (function($)
22
  {
23
- $('div#ws-menu-page-js-c-w').hide /* Hide JavaScript conflict warning. */ ();
24
-
25
  $(window).resize ( /* Global function. */tb_position /* Thickbox resizer/positioner. */ = function()
26
  {
27
  var w = ($(window).width () > 720) ? 720 : $(window).width (), h = $(window).height (), admin_bar_h = ($('body.admin-bar').length) ? 28 : 0;
@@ -29,48 +27,51 @@ jQuery(document).ready (function($)
29
  $('#TB_ajaxContent').css ({'width': w - 50 + 'px', 'height': h - 75 - admin_bar_h + 'px', 'margin': 0, 'padding': 0});
30
  });
31
 
 
 
 
32
  var $groups = /* Query groups. */ $('div.ws-menu-page-group');
33
  $groups.each ( /* Go through each group, one at a time. */function(index)
34
  {
35
- var $this = $(this), ins = '<ins>+</ins>', $group = $this, title = $.trim ($group.attr ('title'));
36
 
37
- var $header = $('<div class="ws-menu-page-group-header">' + ins + title + '</div>');
38
 
39
  $header.css /* Stack them sequentially, top to bottom. */ ({'z-index': 1});
40
 
41
- $header.insertBefore ($group), $group.hide (), $header.click (function()
42
  {
43
- var $this = $(this), $ins = $('ins', $this), $group = $this.next ();
44
 
45
- if ($group.css ('display') === 'none')
46
- $this.addClass ('open'), $ins.html ('-'), $group.show ();
47
-
48
- else // Else remove open class and hide group.
49
- $this.removeClass ('open'), $ins.html ('+'), $group.hide ();
50
 
51
  return /* Return. */ false;
52
  });
53
- if /* These are the buttons for showing/hiding all groups. */ ($groups.length > 1 && index === 0)
54
  {
55
- $('<div class="ws-menu-page-groups-show">+</div>').insertBefore ($header).click (function()
 
56
  {
57
  $('div.ws-menu-page-group-header').each (function()
58
  {
59
- var $this = $(this), $ins = $('ins', $this), $group = $this.next ();
60
 
61
- $this.addClass ('open'), $ins.html ('-'), $group.show ();
62
 
63
  return; // Return.
64
  });
65
  return /* Return. */ false;
66
  });
67
- $('<div class="ws-menu-page-groups-hide">-</div>').insertBefore ($header).click (function()
 
68
  {
69
  $('div.ws-menu-page-group-header').each (function()
70
  {
71
- var $this = $(this), $ins = $('ins', $this), $group = $this.next ();
72
 
73
- $this.removeClass ('open'), $ins.html ('+'), $group.hide ();
74
 
75
  return; // Return.
76
  });
@@ -82,28 +83,27 @@ jQuery(document).ready (function($)
82
 
83
  return; // Return.
84
  });
85
- if /* We only apply these special margins when there are multiple groups. */ ($groups.length > 1)
86
- {
87
- $('div.ws-menu-page-group-header:first').css ({'margin-right': '140px'});
88
- $('div.ws-menu-page-group:first').css ({'margin-right': '145px'});
89
- }
 
 
 
 
90
  $('div.ws-menu-page-r-group-header').click (function()
91
  {
92
- var $this = $(this), $group = $this.next ('div.ws-menu-page-r-group');
93
 
94
- if ($group.css ('display') === 'none')
95
- $('ins', $this).html ('-'), $this.addClass ('open'), $group.show ();
 
96
 
97
- else // Otherwise, we hide this group.
98
- {
99
- $('ins', $this).html ('+'), $this.removeClass ('open');
100
- $group.hide ();
101
- }
102
  return /* Return. */ false;
103
  });
104
  $('div.ws-menu-page-group-header:first, div.ws-menu-page-r-group-header:first').css ({'margin-top': '0'});
105
- $('div.ws-menu-page-group > div.ws-menu-page-section:first-child > h3').css ({'margin-top': '0'});
106
- $('div.ws-menu-page-readme > div.readme > div.section:last-child').css ({'border-bottom-width': '0'});
107
 
108
  $('input.ws-menu-page-media-btn').filter ( /* Only those that have a rel attribute. */function()
109
  {
20
  */
21
  jQuery(document).ready (function($)
22
  {
 
 
23
  $(window).resize ( /* Global function. */tb_position /* Thickbox resizer/positioner. */ = function()
24
  {
25
  var w = ($(window).width () > 720) ? 720 : $(window).width (), h = $(window).height (), admin_bar_h = ($('body.admin-bar').length) ? 28 : 0;
27
  $('#TB_ajaxContent').css ({'width': w - 50 + 'px', 'height': h - 75 - admin_bar_h + 'px', 'margin': 0, 'padding': 0});
28
  });
29
 
30
+ var $rs = $('table.ws-menu-page-table td.ws-menu-page-table-r'),
31
+ $rsToggler = $('> .toggler', $rs), $rsWrapper = $('> .wrapper', $rs);
32
+
33
  var $groups = /* Query groups. */ $('div.ws-menu-page-group');
34
  $groups.each ( /* Go through each group, one at a time. */function(index)
35
  {
36
+ var $this = $(this), $group = $this, title = $.trim ($group.attr ('title'));
37
 
38
+ var $header = $('<div class="ws-menu-page-group-header">' + title + '</div>');
39
 
40
  $header.css /* Stack them sequentially, top to bottom. */ ({'z-index': 1});
41
 
42
+ $header.insertBefore ($group), $header.click (function()
43
  {
44
+ var $this = $(this), $group = $this.next ();
45
 
46
+ if ($this.hasClass('open'))
47
+ $this.add($group).removeClass ('open');
48
+ else $this.add($group).addClass ('open');
 
 
49
 
50
  return /* Return. */ false;
51
  });
52
+ if ($groups.length > 1 && index === 0)
53
  {
54
+ $('<div class="ws-menu-page-groups-hide"><i class="fa fa-chevron-up"></i></div>')
55
+ .insertBefore ('div.ws-menu-page-toolbox').click (function()
56
  {
57
  $('div.ws-menu-page-group-header').each (function()
58
  {
59
+ var $this = $(this), $group = $this.next ();
60
 
61
+ $this.add($group).removeClass ('open');
62
 
63
  return; // Return.
64
  });
65
  return /* Return. */ false;
66
  });
67
+ $('<div class="ws-menu-page-groups-show"><i class="fa fa-chevron-down"></i></div>')
68
+ .insertBefore ('div.ws-menu-page-toolbox').click (function()
69
  {
70
  $('div.ws-menu-page-group-header').each (function()
71
  {
72
+ var $this = $(this), $group = $this.next ();
73
 
74
+ $this.add($group).addClass ('open');
75
 
76
  return; // Return.
77
  });
83
 
84
  return; // Return.
85
  });
86
+ $rsToggler.click(function()
87
+ {
88
+ if($rs.hasClass('open'))
89
+ $rsWrapper.hide(), $rs.removeClass('open');
90
+ else // Open the sidebar (right-side).
91
+ $rsWrapper.show(), $rs.addClass('open');
92
+ });
93
+ if($rsToggler.attr('default-state') === 'open') $rsToggler.click();
94
+
95
  $('div.ws-menu-page-r-group-header').click (function()
96
  {
97
+ var $this = $(this), $group = $this.next ();
98
 
99
+ if ($this.hasClass('open'))
100
+ $this.add($group).removeClass ('open');
101
+ else $this.add($group).addClass ('open');
102
 
 
 
 
 
 
103
  return /* Return. */ false;
104
  });
105
  $('div.ws-menu-page-group-header:first, div.ws-menu-page-r-group-header:first').css ({'margin-top': '0'});
106
+ $('div.ws-menu-page-group-header:last, div.ws-menu-page-r-group-header:last, div.ws-menu-page-group:last').css ({'margin-bottom': '0'});
 
107
 
108
  $('input.ws-menu-page-media-btn').filter ( /* Only those that have a rel attribute. */function()
109
  {
includes/menu-pages/mms-ops.inc.php CHANGED
@@ -31,8 +31,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_mms_ops"))
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>'."\n";
35
- echo '<h2>s2Member Multisite (Configuration)</h2>'."\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">'."\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
@@ -297,7 +300,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_mms_ops"))
297
 
298
  echo '<div class="ws-menu-page-hr"></div>'."\n";
299
 
300
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>'."\n";
301
 
302
  echo '</form>'."\n";
303
  }
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>Multisite Config</h2>'."\n";
39
 
40
  echo '<table class="ws-menu-page-table">'."\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
300
 
301
  echo '<div class="ws-menu-page-hr"></div>'."\n";
302
 
303
+ echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>'."\n";
304
 
305
  echo '</form>'."\n";
306
  }
includes/menu-pages/paypal-buttons.inc.php CHANGED
@@ -31,8 +31,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>s2Member / PayPal Buttons</h2>' . "\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">' . "\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
@@ -73,7 +76,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
73
  echo '<form onsubmit="return false;">' . "\n";
74
  echo '<p id="ws-plugin--s2member-level' . $n . '-trial-line">I\'ll offer the first <input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-trial-period" value="0" size="6" /> <select id="ws-plugin--s2member-level' . $n . '-trial-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-trial-terms.php"))) . '</select> @ $<input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-trial-amount" value="0.00" size="4" /></p>' . "\n";
75
  echo '<p><span id="ws-plugin--s2member-level' . $n . '-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-level' . $n . '-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
76
- 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 s2Member; 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--s2member-level' . $n . '-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-level' . $n . '-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalButtonGenerate(\'level' . $n . '\');" class="button-primary" /></p>' . "\n";
77
  echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-desc" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_label"]) . ' / description and pricing details here." size="73" /></p>' . "\n";
78
  echo '<p' . ((is_multisite () && c_ws_plugin__s2member_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: s2Member -› 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 s2Member 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--s2member-level' . $n . '-ccaps" size="40" /></p>' . "\n";
79
  echo '</form>' . "\n";
@@ -93,11 +96,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
93
  $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($n)), $ws_plugin__s2member_temp_s);
94
  $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_label"])), $ws_plugin__s2member_temp_s);
95
  $ws_plugin__s2member_temp_s = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
96
- echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
97
 
98
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
99
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
100
- echo '<textarea id="ws-plugin--s2member-level' . $n . '-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
101
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.php")));
102
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
103
  $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
@@ -176,7 +179,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
176
 
177
  echo '<p id="ws-plugin--s2member-modification-trial-line">I\'ll offer the first <input type="text" autocomplete="off" id="ws-plugin--s2member-modification-trial-period" value="0" size="6" /> <select id="ws-plugin--s2member-modification-trial-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-trial-terms.php"))) . '</select> @ $<input type="text" autocomplete="off" id="ws-plugin--s2member-modification-trial-amount" value="0.00" size="4" /></p>' . "\n";
178
  echo '<p><span id="ws-plugin--s2member-modification-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-modification-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-modification-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
179
- 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 s2Member; 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--s2member-modification-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-modification-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalButtonGenerate(\'modification\');" class="button-primary" /></p>' . "\n";
180
  echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-modification-desc" value="Description and pricing details here." size="73" /></p>' . "\n";
181
  echo '<p' . ((is_multisite () && c_ws_plugin__s2member_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: s2Member -› 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 s2Member 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--s2member-modification-ccaps" size="40" /></p>' . "\n";
182
  echo '</form>' . "\n";
@@ -194,11 +197,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
194
  $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%% /", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level1_label"])), $ws_plugin__s2member_temp_s);
195
  $ws_plugin__s2member_temp_s = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
196
  $ws_plugin__s2member_temp_s = preg_replace ("/\/]$/", 'modify="1" /]', $ws_plugin__s2member_temp_s); // Adds modify="1" to the end of the Shortcode.
197
- echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-modification-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
198
 
199
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
200
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
201
- echo '<textarea id="ws-plugin--s2member-modification-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
202
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.php")));
203
  $ws_plugin__s2member_temp_s = preg_replace ('/name\="modify" value\="(.*?)"/', 'name="modify" value="1"', $ws_plugin__s2member_temp_s);
204
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
@@ -259,7 +262,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
259
  echo '<td>' . "\n";
260
  echo '<form onsubmit="return false;">' . "\n";
261
  echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-ccap-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-ccap-terms.php"))) . '</select></p>' . "\n";
262
- 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 s2Member; 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--s2member-ccap-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-ccap-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalCcapButtonGenerate();" class="button-primary" /></p>' . "\n";
263
  echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-desc" value="Description and pricing details here." size="73" /></p>' . "\n";
264
  echo '<p>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member -› 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 s2Member 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--s2member-ccap-ccaps" size="40" /></p>' . "\n";
265
  echo '</form>' . "\n";
@@ -274,11 +277,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
274
  echo '<strong>WordPress Shortcode:</strong> (recommended for both the WordPress Visual &amp; HTML Editors)<br />' . "\n";
275
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php")));
276
  $ws_plugin__s2member_temp_s = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
277
- echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
278
 
279
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
280
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
281
- echo '<textarea id="ws-plugin--s2member-ccap-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
282
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-ccaps-checkout-button.php")));
283
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
284
  $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
@@ -353,11 +356,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
353
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_cancellation_buttons_before_shortcode", get_defined_vars ());
354
  echo '<strong>WordPress Shortcode:</strong> (recommended for both the WordPress Visual &amp; HTML Editors)<br />' . "\n";
355
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-cancellation-button-shortcode.php")));
356
- echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-cancellation-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
357
 
358
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
359
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
360
- echo '<textarea id="ws-plugin--s2member-cancellation-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
361
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-cancellation-button.php")));
362
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
363
  $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
@@ -403,10 +406,10 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
403
  echo '<option value="' . $n . '">s2Member Level #' . $n . '</option>' . "\n";
404
  echo '</select></p>' . "\n";
405
  echo '<p>Paid Subscr. ID: <input type="text" autocomplete="off" id="ws-plugin--s2member-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, s2Member 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";
406
- echo '<p>Custom String Value: <input type="text" autocomplete="off" id="ws-plugin--s2member-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__s2member_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__s2member_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__s2member_paypalRegLinkGenerate();" class="button-primary" /> <img id="ws-plugin--s2member-reg-link-loading" src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
407
  echo '<p' . ((is_multisite () && c_ws_plugin__s2member_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: s2Member -› API Scripting -› Custom Capabilities.\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--s2member-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";
408
  echo '<p>Fixed Term Length (for Buy Now transactions): <input type="text" autocomplete="off" id="ws-plugin--s2member-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 s2Member 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";
409
- echo '<p id="ws-plugin--s2member-reg-link" style="font-family:Consolas, monospace; display:none;"></p>' . "\n";
410
  echo '</form>' . "\n";
411
  echo '</td>' . "\n";
412
 
@@ -469,7 +472,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
469
 
470
  echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-sp-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-sp-hours">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-sp-hours.php"))) . '</select></p>' . "\n";
471
  echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-sp-desc" value="Description and pricing details here." size="68" /></p>' . "\n";
472
- 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 s2Member; 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--s2member-sp-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-sp-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalSpButtonGenerate();" class="button-primary" /></p>' . "\n";
473
  echo '</form>' . "\n";
474
  echo '</td>' . "\n";
475
 
@@ -482,11 +485,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
482
  echo '<strong>WordPress Shortcode:</strong> (recommended for both the WordPress Visual &amp; HTML Editors)<br />' . "\n";
483
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-sp-checkout-button-shortcode.php")));
484
  $ws_plugin__s2member_temp_s = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
485
- echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-sp-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" />' . "\n";
486
 
487
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
488
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
489
- echo '<textarea id="ws-plugin--s2member-sp-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
490
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-sp-checkout-button.php")));
491
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
492
  $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
@@ -550,8 +553,8 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
550
 
551
  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 s2Member 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* s2Member 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 s2Member for Specific Post/Page Access yet. See: s2Member -› Restriction Options -› Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
552
 
553
- echo '<p><select id="ws-plugin--s2member-sp-link-hours">' . trim (c_ws_plugin__s2member_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__s2member_paypalSpLinkGenerate();" class="button-primary" /> <img id="ws-plugin--s2member-sp-link-loading" src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
554
- echo '<p id="ws-plugin--s2member-sp-link" style="font-family:Consolas, monospace; display:none;"></p>' . "\n";
555
  echo '</form>' . "\n";
556
  echo '</td>' . "\n";
557
 
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>PayPal Buttons</h2>' . "\n";
39
 
40
  echo '<table class="ws-menu-page-table">' . "\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
76
  echo '<form onsubmit="return false;">' . "\n";
77
  echo '<p id="ws-plugin--s2member-level' . $n . '-trial-line">I\'ll offer the first <input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-trial-period" value="0" size="6" /> <select id="ws-plugin--s2member-level' . $n . '-trial-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-trial-terms.php"))) . '</select> @ $<input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-trial-amount" value="0.00" size="4" /></p>' . "\n";
78
  echo '<p><span id="ws-plugin--s2member-level' . $n . '-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-level' . $n . '-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
79
+ 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 s2Member; 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--s2member-level' . $n . '-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-level' . $n . '-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalButtonGenerate(\'level' . $n . '\');" /></p>' . "\n";
80
  echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-desc" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_label"]) . ' / description and pricing details here." size="73" /></p>' . "\n";
81
  echo '<p' . ((is_multisite () && c_ws_plugin__s2member_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: s2Member -› 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 s2Member 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--s2member-level' . $n . '-ccaps" size="40" /></p>' . "\n";
82
  echo '</form>' . "\n";
96
  $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($n)), $ws_plugin__s2member_temp_s);
97
  $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_label"])), $ws_plugin__s2member_temp_s);
98
  $ws_plugin__s2member_temp_s = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
99
+ echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-level' . $n . '-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" class="monospace" />' . "\n";
100
 
101
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
102
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
103
+ echo '<textarea id="ws-plugin--s2member-level' . $n . '-button" rows="8" wrap="off" onclick="this.select ();" class="monospace">';
104
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.php")));
105
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
106
  $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
179
 
180
  echo '<p id="ws-plugin--s2member-modification-trial-line">I\'ll offer the first <input type="text" autocomplete="off" id="ws-plugin--s2member-modification-trial-period" value="0" size="6" /> <select id="ws-plugin--s2member-modification-trial-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-trial-terms.php"))) . '</select> @ $<input type="text" autocomplete="off" id="ws-plugin--s2member-modification-trial-amount" value="0.00" size="4" /></p>' . "\n";
181
  echo '<p><span id="ws-plugin--s2member-modification-trial-then">Then, </span>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-modification-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-modification-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-regular-terms.php"))) . '</select></p>' . "\n";
182
+ 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 s2Member; 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--s2member-modification-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-modification-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalButtonGenerate(\'modification\');" /></p>' . "\n";
183
  echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-modification-desc" value="Description and pricing details here." size="73" /></p>' . "\n";
184
  echo '<p' . ((is_multisite () && c_ws_plugin__s2member_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: s2Member -› 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 s2Member 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--s2member-modification-ccaps" size="40" /></p>' . "\n";
185
  echo '</form>' . "\n";
197
  $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%% /", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level1_label"])), $ws_plugin__s2member_temp_s);
198
  $ws_plugin__s2member_temp_s = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
199
  $ws_plugin__s2member_temp_s = preg_replace ("/\/]$/", 'modify="1" /]', $ws_plugin__s2member_temp_s); // Adds modify="1" to the end of the Shortcode.
200
+ echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-modification-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" class="monospace" />' . "\n";
201
 
202
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
203
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
204
+ echo '<textarea id="ws-plugin--s2member-modification-button" rows="8" wrap="off" onclick="this.select ();" class="monospace">';
205
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.php")));
206
  $ws_plugin__s2member_temp_s = preg_replace ('/name\="modify" value\="(.*?)"/', 'name="modify" value="1"', $ws_plugin__s2member_temp_s);
207
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
262
  echo '<td>' . "\n";
263
  echo '<form onsubmit="return false;">' . "\n";
264
  echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-ccap-term">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-membership-ccap-terms.php"))) . '</select></p>' . "\n";
265
+ 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 s2Member; 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--s2member-ccap-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-ccap-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalCcapButtonGenerate();" /></p>' . "\n";
266
  echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-desc" value="Description and pricing details here." size="73" /></p>' . "\n";
267
  echo '<p>Custom Capabilities (comma-delimited) <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member -› 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 s2Member 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--s2member-ccap-ccaps" size="40" /></p>' . "\n";
268
  echo '</form>' . "\n";
277
  echo '<strong>WordPress Shortcode:</strong> (recommended for both the WordPress Visual &amp; HTML Editors)<br />' . "\n";
278
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php")));
279
  $ws_plugin__s2member_temp_s = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
280
+ echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-ccap-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" class="monospace" />' . "\n";
281
 
282
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
283
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
284
+ echo '<textarea id="ws-plugin--s2member-ccap-button" rows="8" wrap="off" onclick="this.select ();" class="monospace">';
285
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-ccaps-checkout-button.php")));
286
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
287
  $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
356
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_cancellation_buttons_before_shortcode", get_defined_vars ());
357
  echo '<strong>WordPress Shortcode:</strong> (recommended for both the WordPress Visual &amp; HTML Editors)<br />' . "\n";
358
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-cancellation-button-shortcode.php")));
359
+ echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-cancellation-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" class="monospace" />' . "\n";
360
 
361
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
362
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
363
+ echo '<textarea id="ws-plugin--s2member-cancellation-button" rows="8" wrap="off" onclick="this.select ();" class="monospace">';
364
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-cancellation-button.php")));
365
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
366
  $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
406
  echo '<option value="' . $n . '">s2Member Level #' . $n . '</option>' . "\n";
407
  echo '</select></p>' . "\n";
408
  echo '<p>Paid Subscr. ID: <input type="text" autocomplete="off" id="ws-plugin--s2member-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, s2Member 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";
409
+ echo '<p>Custom String Value: <input type="text" autocomplete="off" id="ws-plugin--s2member-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__s2member_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__s2member_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__s2member_paypalRegLinkGenerate();" /> <img id="ws-plugin--s2member-reg-link-loading" src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
410
  echo '<p' . ((is_multisite () && c_ws_plugin__s2member_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: s2Member -› API Scripting -› Custom Capabilities.\'); return false;" tabindex="-1">[?]</a> <input type="text" maxlength="125" autocomplete="off" id="ws-plugin--s2member-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";
411
  echo '<p>Fixed Term Length (for Buy Now transactions): <input type="text" autocomplete="off" id="ws-plugin--s2member-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 s2Member 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";
412
+ echo '<p id="ws-plugin--s2member-reg-link" class="monospace" style="display:none;"></p>' . "\n";
413
  echo '</form>' . "\n";
414
  echo '</td>' . "\n";
415
 
472
 
473
  echo '<p>I want to charge: $<input type="text" autocomplete="off" id="ws-plugin--s2member-sp-amount" value="0.01" size="4" /> / <select id="ws-plugin--s2member-sp-hours">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-sp-hours.php"))) . '</select></p>' . "\n";
474
  echo '<p>Description: <input type="text" autocomplete="off" id="ws-plugin--s2member-sp-desc" value="Description and pricing details here." size="68" /></p>' . "\n";
475
+ 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 s2Member; 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--s2member-sp-page-style" value="paypal" size="18" /> <select id="ws-plugin--s2member-sp-currency">' . trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/options/paypal-currencies.php"))) . '</select> <input type="button" value="Generate Button Code" onclick="ws_plugin__s2member_paypalSpButtonGenerate();" /></p>' . "\n";
476
  echo '</form>' . "\n";
477
  echo '</td>' . "\n";
478
 
485
  echo '<strong>WordPress Shortcode:</strong> (recommended for both the WordPress Visual &amp; HTML Editors)<br />' . "\n";
486
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-sp-checkout-button-shortcode.php")));
487
  $ws_plugin__s2member_temp_s = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
488
+ echo '<input type="text" autocomplete="off" id="ws-plugin--s2member-sp-shortcode" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" class="monospace" />' . "\n";
489
 
490
  echo '<div' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? ' style="display:none;"' : '') . '><br />' . "\n";
491
  echo '<strong>Resulting PayPal Button Code:</strong> (ultimately, your Shortcode will produce this snippet)<br />' . "\n";
492
+ echo '<textarea id="ws-plugin--s2member-sp-button" rows="8" wrap="off" onclick="this.select ();" class="monospace">';
493
  $ws_plugin__s2member_temp_s = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-sp-checkout-button.php")));
494
  $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
495
  $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
553
 
554
  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 s2Member 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* s2Member 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 s2Member for Specific Post/Page Access yet. See: s2Member -› Restriction Options -› Specific Post/Page Access.\'); return false;" tabindex="-1">[?]</a></p>' . "\n";
555
 
556
+ echo '<p><select id="ws-plugin--s2member-sp-link-hours">' . trim (c_ws_plugin__s2member_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__s2member_paypalSpLinkGenerate();" /> <img id="ws-plugin--s2member-sp-link-loading" src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/ajax-loader.gif" alt="" style="display:none;" /></p>' . "\n";
557
+ echo '<p id="ws-plugin--s2member-sp-link" class="monospace" style="display:none;"></p>' . "\n";
558
  echo '</form>' . "\n";
559
  echo '</td>' . "\n";
560
 
includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -31,8 +31,11 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>'."\n";
35
- echo '<h2>s2Member PayPal Options</h2>'."\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">'."\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
@@ -194,7 +197,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
194
  echo '<tr>'."\n";
195
 
196
  echo '<td>'."\n";
197
- echo '<div class="ws-menu-page-hilite" style="border-radius:3px; padding:5px;">'."\n";
198
  echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems during payment processing. See: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Files (Debug)</a>.</span></p>'."\n";
199
  echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
200
  echo '</div>'."\n";
@@ -325,7 +328,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
325
  echo '<p>You\'ll need your IPN URL, which is:<br /><code>'.esc_html(site_url("/?s2member_paypal_notify=1")).'</code></p>'."\n";
326
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars());
327
 
328
- echo '<h3>More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
329
  echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="display:none;">'."\n";
330
  echo '<p><em><strong>*Quick Tip*</strong> In addition to the <a href="http://www.s2member.com/paypal-ipn-setup" target="_blank" rel="external">default IPN settings inside your PayPal account</a>, the IPN URL is also set on a per-transaction basis by the special PayPal Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal account, that\'s OK. s2Member dynamically sets the IPN URL for each transaction. The result is that the IPN URL configured from within your PayPal account, becomes the default, which is then overwritten on a per-transaction basis. In fact, PayPal recently updated their system to support IPN URL preservation. One PayPal account can handle multiple sites, all using different IPN URLs.</em></p>'."\n";
331
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_quick_tip", get_defined_vars());
@@ -334,7 +337,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
334
 
335
  echo '<div class="ws-menu-page-hr"></div>'."\n";
336
 
337
- echo '<h3>IPN w/ Proxy Key (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-proxy-details\').toggle(); return false;" class="ws-dotted-link">optional, for 3rd-party integrations</a>)</h3>'."\n";
338
  echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="display:none;">'."\n";
339
  echo '<p>If you\'re using a 3rd-party application that needs to POST simulated IPN transactions to your s2Member installation, you can use this alternate IPN URL, which includes a Proxy Key. This encrypted Proxy Key verifies incoming data being received by s2Member\'s IPN processor. You can change <em>[proxy-gateway]</em> to whatever you like. The <em>[proxy-gateway]</em> value is required. It will be stored by s2Member as the Customer\'s Paid Subscr. Gateway. Your [proxy-gateway] value will also be reflected in s2Member\'s IPN log.</p>'."\n";
340
  echo '<input type="text" autocomplete="off" value="'.format_to_edit(site_url("/?s2member_paypal_notify=1&s2member_paypal_proxy=[proxy-gateway]&s2member_paypal_proxy_verification=".urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()))).'" style="width:99%;" />'."\n";
@@ -386,7 +389,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
386
 
387
  echo '<div class="ws-menu-page-hr"></div>'."\n";
388
 
389
- echo '<h3>More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-pdt-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
390
  echo '<div id="ws-plugin--s2member-paypal-pdt-details" style="display:none;">'."\n";
391
  echo '<p><em><strong>*Quick Tip*</strong> In addition to the <a href="http://www.s2member.com/paypal-pdt-setup" target="_blank" rel="external">default Auto-Return/PDT configuration inside your PayPal account</a>, the Auto-Return URL is also set on a per-transaction basis from within the special PayPal Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal account, that\'s OK. s2Member dynamically sets the Auto-Return URL for each transaction. The result is that the Auto-Return URL configured from within your PayPal account, becomes the default, which is then overwritten on a per-transaction basis.</em></p>'."\n";
392
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_quick_tip", get_defined_vars());
@@ -763,7 +766,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
763
 
764
  echo '<div class="ws-menu-page-hr"></div>'."\n";
765
 
766
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>'."\n";
767
 
768
  echo '</form>'."\n";
769
 
31
  {
32
  echo '<div class="wrap ws-menu-page">'."\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>PayPal Options</h2>'."\n";
39
 
40
  echo '<table class="ws-menu-page-table">'."\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">'."\n";
197
  echo '<tr>'."\n";
198
 
199
  echo '<td>'."\n";
200
+ echo '<div class="info" style="margin-bottom:0;">'."\n";
201
  echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems during payment processing. See: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Files (Debug)</a>.</span></p>'."\n";
202
  echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
203
  echo '</div>'."\n";
328
  echo '<p>You\'ll need your IPN URL, which is:<br /><code>'.esc_html(site_url("/?s2member_paypal_notify=1")).'</code></p>'."\n";
329
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars());
330
 
331
+ echo '<h3 style="margin:0;">More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
332
  echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="display:none;">'."\n";
333
  echo '<p><em><strong>*Quick Tip*</strong> In addition to the <a href="http://www.s2member.com/paypal-ipn-setup" target="_blank" rel="external">default IPN settings inside your PayPal account</a>, the IPN URL is also set on a per-transaction basis by the special PayPal Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal account, that\'s OK. s2Member dynamically sets the IPN URL for each transaction. The result is that the IPN URL configured from within your PayPal account, becomes the default, which is then overwritten on a per-transaction basis. In fact, PayPal recently updated their system to support IPN URL preservation. One PayPal account can handle multiple sites, all using different IPN URLs.</em></p>'."\n";
334
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_quick_tip", get_defined_vars());
337
 
338
  echo '<div class="ws-menu-page-hr"></div>'."\n";
339
 
340
+ echo '<h3 style="margin:0;">IPN w/ Proxy Key (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-proxy-details\').toggle(); return false;" class="ws-dotted-link">optional, for 3rd-party integrations</a>)</h3>'."\n";
341
  echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="display:none;">'."\n";
342
  echo '<p>If you\'re using a 3rd-party application that needs to POST simulated IPN transactions to your s2Member installation, you can use this alternate IPN URL, which includes a Proxy Key. This encrypted Proxy Key verifies incoming data being received by s2Member\'s IPN processor. You can change <em>[proxy-gateway]</em> to whatever you like. The <em>[proxy-gateway]</em> value is required. It will be stored by s2Member as the Customer\'s Paid Subscr. Gateway. Your [proxy-gateway] value will also be reflected in s2Member\'s IPN log.</p>'."\n";
343
  echo '<input type="text" autocomplete="off" value="'.format_to_edit(site_url("/?s2member_paypal_notify=1&s2member_paypal_proxy=[proxy-gateway]&s2member_paypal_proxy_verification=".urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()))).'" style="width:99%;" />'."\n";
389
 
390
  echo '<div class="ws-menu-page-hr"></div>'."\n";
391
 
392
+ echo '<h3 style="margin:0;">More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-pdt-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
393
  echo '<div id="ws-plugin--s2member-paypal-pdt-details" style="display:none;">'."\n";
394
  echo '<p><em><strong>*Quick Tip*</strong> In addition to the <a href="http://www.s2member.com/paypal-pdt-setup" target="_blank" rel="external">default Auto-Return/PDT configuration inside your PayPal account</a>, the Auto-Return URL is also set on a per-transaction basis from within the special PayPal Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal account, that\'s OK. s2Member dynamically sets the Auto-Return URL for each transaction. The result is that the Auto-Return URL configured from within your PayPal account, becomes the default, which is then overwritten on a per-transaction basis.</em></p>'."\n";
395
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_quick_tip", get_defined_vars());
766
 
767
  echo '<div class="ws-menu-page-hr"></div>'."\n";
768
 
769
+ echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>'."\n";
770
 
771
  echo '</form>'."\n";
772
 
includes/menu-pages/res-ops.inc.php CHANGED
@@ -31,8 +31,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>s2Member Restriction Options</h2>' . "\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">' . "\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
@@ -56,7 +59,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
56
  echo '<p>Here you can specify Posts that are restricted to certain Membership Access Levels. s2Member 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";
57
  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";
58
  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 s2Member\'s options for "Alternative View Protection", which deals with search results, as well as feeds.</em></p>' . "\n";
59
- echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && !$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" : '';
60
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_post_level_access", get_defined_vars ());
61
 
62
  echo '<table class="form-table">' . "\n";
@@ -103,7 +106,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
103
  echo '<div class="ws-menu-page-section ws-plugin--s2member-page-level-access-section">' . "\n";
104
  echo '<h3>Page Level Access Restrictions (optional)</h3>' . "\n";
105
  echo '<p>Here you can specify Pages that are restricted to certain Membership Access Levels.</p>' . "\n";
106
- echo ((!is_multisite () || !c_ws_plugin__s2member_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" : '';
107
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_page_level_access", get_defined_vars ());
108
 
109
  echo '<table class="form-table">' . "\n";
@@ -193,7 +196,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
193
  echo '<div class="ws-menu-page-section ws-plugin--s2member-category-level-access-section">' . "\n";
194
  echo '<h3>Category Level Access Restrictions (optional)</h3>' . "\n";
195
  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";
196
- echo ((!is_multisite () || !c_ws_plugin__s2member_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" : '';
197
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_category_level_access", get_defined_vars ());
198
 
199
  echo '<table class="form-table">' . "\n";
@@ -355,7 +358,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
355
  echo '<p>In other words, Customers will NOT need to login, just to receive access to the Specific Post/Page they purchased access to. s2Member 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>s2Member -› PayPal Options -› Specific Post/Page Email</code>). Authentication is handled automatically through self-expiring links, good for 72 hours by default.</p>' . "\n";
356
  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 s2Member, 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";
357
  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>s2Member -› 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 s2Member, will even let you Package Additional Posts/Pages together into one transaction.</p>' . "\n";
358
- echo ((!is_multisite () || !c_ws_plugin__s2member_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" : '';
359
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_sp_access", get_defined_vars ());
360
 
361
  echo '<table class="form-table">' . "\n";
@@ -603,7 +606,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
603
 
604
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
605
 
606
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>' . "\n";
607
 
608
  echo '</form>' . "\n";
609
 
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>Restriction Options</h2>' . "\n";
39
 
40
  echo '<table class="ws-menu-page-table">' . "\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
59
  echo '<p>Here you can specify Posts that are restricted to certain Membership Access Levels. s2Member 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";
60
  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";
61
  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 s2Member\'s options for "Alternative View Protection", which deals with search results, as well as feeds.</em></p>' . "\n";
62
+ echo ((!is_multisite () || !c_ws_plugin__s2member_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" : '';
63
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_post_level_access", get_defined_vars ());
64
 
65
  echo '<table class="form-table">' . "\n";
106
  echo '<div class="ws-menu-page-section ws-plugin--s2member-page-level-access-section">' . "\n";
107
  echo '<h3>Page Level Access Restrictions (optional)</h3>' . "\n";
108
  echo '<p>Here you can specify Pages that are restricted to certain Membership Access Levels.</p>' . "\n";
109
+ echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && empty($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" : '';
110
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_page_level_access", get_defined_vars ());
111
 
112
  echo '<table class="form-table">' . "\n";
196
  echo '<div class="ws-menu-page-section ws-plugin--s2member-category-level-access-section">' . "\n";
197
  echo '<h3>Category Level Access Restrictions (optional)</h3>' . "\n";
198
  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";
199
+ echo ((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && empty($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" : '';
200
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_category_level_access", get_defined_vars ());
201
 
202
  echo '<table class="form-table">' . "\n";
358
  echo '<p>In other words, Customers will NOT need to login, just to receive access to the Specific Post/Page they purchased access to. s2Member 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>s2Member -› PayPal Options -› Specific Post/Page Email</code>). Authentication is handled automatically through self-expiring links, good for 72 hours by default.</p>' . "\n";
359
  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 s2Member, 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";
360
  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>s2Member -› 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 s2Member, will even let you Package Additional Posts/Pages together into one transaction.</p>' . "\n";
361
+ echo ((!is_multisite () || !c_ws_plugin__s2member_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/Page IDs? Get <a href="http://wordpress.org/extend/plugins/wp-show-ids/" target="_blank" rel="external">WP Show IDs</a>.</em></p>' . "\n" : '';
362
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_sp_access", get_defined_vars ());
363
 
364
  echo '<table class="form-table">' . "\n";
606
 
607
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
608
 
609
+ echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>' . "\n";
610
 
611
  echo '</form>' . "\n";
612
 
includes/menu-pages/scripting.inc.php CHANGED
@@ -31,8 +31,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>s2Member API / Scripting</h2>' . "\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">' . "\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
@@ -460,16 +463,16 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
460
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
461
 
462
  echo '<p><strong>Shortcode:</strong> for an Inline Profile Modification Form:<br />' . "\n";
463
- echo '<p><input type="text" autocomplete="off" value="' . format_to_edit ('[s2Member-Profile /]') . '" style="font-size:90%; font-family:Consolas, monospace; width:99%;" onclick="this.select ();" /></p>' . "\n";
464
 
465
  echo '<p style="margin-top:20px;"><strong>Stand-Alone / Code Sample</strong> (standard link tag):</p>' . "\n";
466
- echo '<p><input type="text" autocomplete="off" value="' . format_to_edit (preg_replace ("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_ds (site_url ("/?s2member_profile=1")), file_get_contents (dirname (__FILE__) . "/code-samples/current-user-profile-modification-page-url-1-ops.x-php"))) . '" style="font-size:90%; font-family:Consolas, monospace; width:99%;" onclick="this.select ();" /></p>' . "\n";
467
 
468
  echo '<p style="margin-top:20px;"><strong>Stand-Alone / Code Sample</strong> (open the link in a popup window):</p>' . "\n";
469
- echo '<p><input type="text" autocomplete="off" value="' . format_to_edit (preg_replace ("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_ds (site_url ("/?s2member_profile=1")), file_get_contents (dirname (__FILE__) . "/code-samples/current-user-profile-modification-page-url-2-ops.x-php"))) . '" style="font-size:90%; font-family:Consolas, monospace; width:99%;" onclick="this.select ();" /></p>' . "\n";
470
 
471
  echo '<p style="margin-top:20px;"><strong>Stand-Alone / Code Sample</strong> (embed the Form with an IFRAME tag):</p>' . "\n";
472
- echo '<p><input type="text" autocomplete="off" value="' . format_to_edit (preg_replace ("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_ds (site_url ("/?s2member_profile=1")), file_get_contents (dirname (__FILE__) . "/code-samples/current-user-profile-modification-page-url-3-ops.x-php"))) . '" style="font-size:90%; font-family:Consolas, monospace; width:99%;" onclick="this.select ();" /></p>' . "\n";
473
  echo '</div>' . "\n";
474
 
475
  echo '</div>' . "\n";
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>API / Scripting</h2>' . "\n";
39
 
40
  echo '<table class="ws-menu-page-table">' . "\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
463
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
464
 
465
  echo '<p><strong>Shortcode:</strong> for an Inline Profile Modification Form:<br />' . "\n";
466
+ echo '<p><input type="text" autocomplete="off" value="' . format_to_edit ('[s2Member-Profile /]') . '" class="monospace" onclick="this.select ();" /></p>' . "\n";
467
 
468
  echo '<p style="margin-top:20px;"><strong>Stand-Alone / Code Sample</strong> (standard link tag):</p>' . "\n";
469
+ echo '<p><input type="text" autocomplete="off" value="' . format_to_edit (preg_replace ("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_ds (site_url ("/?s2member_profile=1")), file_get_contents (dirname (__FILE__) . "/code-samples/current-user-profile-modification-page-url-1-ops.x-php"))) . '" class="monospace" onclick="this.select ();" /></p>' . "\n";
470
 
471
  echo '<p style="margin-top:20px;"><strong>Stand-Alone / Code Sample</strong> (open the link in a popup window):</p>' . "\n";
472
+ echo '<p><input type="text" autocomplete="off" value="' . format_to_edit (preg_replace ("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_ds (site_url ("/?s2member_profile=1")), file_get_contents (dirname (__FILE__) . "/code-samples/current-user-profile-modification-page-url-2-ops.x-php"))) . '" class="monospace" onclick="this.select ();" /></p>' . "\n";
473
 
474
  echo '<p style="margin-top:20px;"><strong>Stand-Alone / Code Sample</strong> (embed the Form with an IFRAME tag):</p>' . "\n";
475
+ echo '<p><input type="text" autocomplete="off" value="' . format_to_edit (preg_replace ("/\<\?php echo S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL; \?\>/", c_ws_plugin__s2member_utils_strings::esc_ds (site_url ("/?s2member_profile=1")), file_get_contents (dirname (__FILE__) . "/code-samples/current-user-profile-modification-page-url-3-ops.x-php"))) . '" class="monospace" onclick="this.select ();" /></p>' . "\n";
476
  echo '</div>' . "\n";
477
 
478
  echo '</div>' . "\n";
includes/menu-pages/start.inc.php CHANGED
@@ -31,8 +31,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>s2Member / Quick-Start Guide</h2>' . "\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">' . "\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
@@ -312,7 +315,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
312
 
313
  echo '<h3>Search s2Member KB Articles, Forums, Codex and more<em>!</em></h3>'."\n";
314
  echo '<form method="get" action="http://www.s2member.com/quick-s.php" target="_blank" onsubmit="if(this.q.value === \'enter search terms...\') this.q.value = \'\';">'."\n";
315
- echo '<p><input type="text" name="q" value="enter search terms..." style="width:60%;" onfocus="if(this.value === \'enter search terms...\') this.value = \'\';" onblur="if(this.value === \'\') this.value = \'enter search terms...\';" /><input type="submit" value="Search" /></p>'."\n";
316
  echo '</form>'."\n";
317
 
318
  do_action ("ws_plugin__s2member_during_start_page_during_left_sections_during_help", get_defined_vars ());
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>Quick-Start Guide</h2>' . "\n";
39
 
40
  echo '<table class="ws-menu-page-table">' . "\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
315
 
316
  echo '<h3>Search s2Member KB Articles, Forums, Codex and more<em>!</em></h3>'."\n";
317
  echo '<form method="get" action="http://www.s2member.com/quick-s.php" target="_blank" onsubmit="if(this.q.value === \'enter search terms...\') this.q.value = \'\';">'."\n";
318
+ echo '<p><input type="text" name="q" value="enter search terms..." style="width:60%;" onfocus="if(this.value === \'enter search terms...\') this.value = \'\';" onblur="if(this.value === \'\') this.value = \'enter search terms...\';" /> <input type="submit" value="Search" style="font-size:120%; font-weight:normal;" /></p>'."\n";
319
  echo '</form>'."\n";
320
 
321
  do_action ("ws_plugin__s2member_during_start_page_during_left_sections_during_help", get_defined_vars ());
includes/menu-pages/trk-ops.inc.php CHANGED
@@ -31,8 +31,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
- echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
35
- echo '<h2>s2Member API / Tracking</h2>' . "\n";
 
 
 
36
 
37
  echo '<table class="ws-menu-page-table">' . "\n";
38
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
@@ -75,7 +78,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
75
  echo '<tr>' . "\n";
76
 
77
  echo '<td>' . "\n";
78
- echo '<textarea name="ws_plugin__s2member_signup_tracking_codes" id="ws-plugin--s2member-signup-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_tracking_codes"]) . '</textarea><br />' . "\n";
79
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_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";
80
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
81
  echo '<ul>' . "\n";
@@ -158,7 +161,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
158
  echo '<tr>' . "\n";
159
 
160
  echo '<td>' . "\n";
161
- echo '<textarea name="ws_plugin__s2member_modification_tracking_codes" id="ws-plugin--s2member-modification-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["modification_tracking_codes"]) . '</textarea><br />' . "\n";
162
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_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";
163
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
164
  echo '<ul>' . "\n";
@@ -252,7 +255,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
252
  echo '<tr>' . "\n";
253
 
254
  echo '<td>' . "\n";
255
- echo '<textarea name="ws_plugin__s2member_ccap_tracking_codes" id="ws-plugin--s2member-ccap-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["ccap_tracking_codes"]) . '</textarea><br />' . "\n";
256
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_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";
257
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
258
  echo '<ul>' . "\n";
@@ -341,7 +344,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
341
  echo '<tr>' . "\n";
342
 
343
  echo '<td>' . "\n";
344
- echo '<textarea name="ws_plugin__s2member_sp_tracking_codes" id="ws-plugin--s2member-sp-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_tracking_codes"]) . '</textarea><br />' . "\n";
345
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_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";
346
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
347
  echo '<ul>' . "\n";
@@ -390,15 +393,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
390
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_after_sp_tracking", get_defined_vars ());
391
  }
392
 
393
- if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_display_integrations_header", true, get_defined_vars ()))
394
  {
395
- do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_before_integrations_header", get_defined_vars ());
396
-
397
- echo '<div style="border-bottom:1px solid #DFDFDF; margin:-20px 0 9px 0; padding:0;">&nbsp;</div>' . "\n";
398
- echo '<div id="icon-tools" class="icon32" style="margin-top:0; margin-bottom:0; padding-top:0; padding-bottom:0;"><br /></div>' . "\n";
399
- echo '<h2 style="margin-top:0; margin-bottom:0; padding-top:0; padding-bottom:0;">API / Tracking Integrations</h2>' . "\n";
400
-
401
- do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_after_integrations_header", get_defined_vars ());
402
  }
403
 
404
  if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_display_idev", true, get_defined_vars ()))
@@ -409,7 +408,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
409
 
410
  echo '<div class="ws-menu-page-section ws-plugin--s2member-idev-section">' . "\n";
411
  echo '<h3>Integrating iDevAffiliate (affiliate program management)</h3>' . "\n";
412
- echo '<a href="http://www.s2member.com/idev-affiliate" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/idev-logo.gif" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
413
  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.s2member.com/idev-affiliate" target="_blank" rel="external">iDevAffiliate</a> (an affiliate management portal), installs in just minutes, and can be integrated seamlessly with s2Member. We recommend <a href="http://www.s2member.com/idev-affiliate" target="_blank" rel="external">iDevAffiliate Standard</a> ( $99 ) because of its proven track record, and its ability to integrate with s2Member using a variety of techniques. The most popular being a Hidden Image Tag.</p>' . "\n";
414
  echo '<p>If you choose to <a href="http://www.s2member.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 s2Member\'s Tracking Code integrations.</p>' . "\n";
415
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_idev", get_defined_vars ());
@@ -458,7 +457,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
458
 
459
  echo '<div class="ws-menu-page-section ws-plugin--s2member-shareasale-section">' . "\n";
460
  echo '<h3>Integrating ShareASale (affiliate program management)</h3>' . "\n";
461
- echo '<a href="http://www.s2member.com/shareasale" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/sas-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
462
  echo '<p>Established in 2000, <a href="http://www.s2member.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";
463
  echo '<p>If you <a href="http://www.s2member.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 s2Member\'s Tracking Code integrations.</p>' . "\n";
464
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_shareasale", get_defined_vars ());
@@ -523,7 +522,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_trk_ops"))
523
 
524
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
525
 
526
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>' . "\n";
527
 
528
  echo '</form>' . "\n";
529
 
31
  {
32
  echo '<div class="wrap ws-menu-page">' . "\n";
33
 
34
+ echo '<div class="ws-menu-page-toolbox">'."\n";
35
+ c_ws_plugin__s2member_menu_pages_tb::display ();
36
+ echo '</div>'."\n";
37
+
38
+ echo '<h2>API / Tracking</h2>' . "\n";
39
 
40
  echo '<table class="ws-menu-page-table">' . "\n";
41
  echo '<tbody class="ws-menu-page-table-tbody">' . "\n";
78
  echo '<tr>' . "\n";
79
 
80
  echo '<td>' . "\n";
81
+ echo '<textarea name="ws_plugin__s2member_signup_tracking_codes" id="ws-plugin--s2member-signup-tracking-codes" rows="8" wrap="off" spellcheck="false" class="monospace">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_tracking_codes"]) . '</textarea><br />' . "\n";
82
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_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";
83
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
84
  echo '<ul>' . "\n";
161
  echo '<tr>' . "\n";
162
 
163
  echo '<td>' . "\n";
164
+ echo '<textarea name="ws_plugin__s2member_modification_tracking_codes" id="ws-plugin--s2member-modification-tracking-codes" rows="8" wrap="off" spellcheck="false" class="monospace">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["modification_tracking_codes"]) . '</textarea><br />' . "\n";
165
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_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";
166
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
167
  echo '<ul>' . "\n";
255
  echo '<tr>' . "\n";
256
 
257
  echo '<td>' . "\n";
258
+ echo '<textarea name="ws_plugin__s2member_ccap_tracking_codes" id="ws-plugin--s2member-ccap-tracking-codes" rows="8" wrap="off" spellcheck="false" class="monospace">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["ccap_tracking_codes"]) . '</textarea><br />' . "\n";
259
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_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";
260
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
261
  echo '<ul>' . "\n";
344
  echo '<tr>' . "\n";
345
 
346
  echo '<td>' . "\n";
347
+ echo '<textarea name="ws_plugin__s2member_sp_tracking_codes" id="ws-plugin--s2member-sp-tracking-codes" rows="8" wrap="off" spellcheck="false" class="monospace">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_tracking_codes"]) . '</textarea><br />' . "\n";
348
  echo 'Any valid XHTML / JavaScript' . ((is_multisite () && c_ws_plugin__s2member_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";
349
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
350
  echo '<ul>' . "\n";
393
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_after_sp_tracking", get_defined_vars ());
394
  }
395
 
396
+ if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_display_integrations_divider", true, get_defined_vars ()))
397
  {
398
+ do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_before_integrations_divider", get_defined_vars ());
399
+ echo '<div style="border-bottom:1px solid #DFDFDF; margin:-20px 0 20px 0; padding:0;">&nbsp;</div>' . "\n";
400
+ do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_after_integrations_divider", get_defined_vars ());
 
 
 
 
401
  }
402
 
403
  if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_display_idev", true, get_defined_vars ()))
408
 
409
  echo '<div class="ws-menu-page-section ws-plugin--s2member-idev-section">' . "\n";
410
  echo '<h3>Integrating iDevAffiliate (affiliate program management)</h3>' . "\n";
411
+ echo '<a href="http://www.s2member.com/idev-affiliate" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/idev-logo.gif" class="ws-menu-page-right screenshot" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
412
  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.s2member.com/idev-affiliate" target="_blank" rel="external">iDevAffiliate</a> (an affiliate management portal), installs in just minutes, and can be integrated seamlessly with s2Member. We recommend <a href="http://www.s2member.com/idev-affiliate" target="_blank" rel="external">iDevAffiliate Standard</a> ( $99 ) because of its proven track record, and its ability to integrate with s2Member using a variety of techniques. The most popular being a Hidden Image Tag.</p>' . "\n";
413
  echo '<p>If you choose to <a href="http://www.s2member.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 s2Member\'s Tracking Code integrations.</p>' . "\n";
414
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_idev", get_defined_vars ());
457
 
458
  echo '<div class="ws-menu-page-section ws-plugin--s2member-shareasale-section">' . "\n";
459
  echo '<h3>Integrating ShareASale (affiliate program management)</h3>' . "\n";
460
+ echo '<a href="http://www.s2member.com/shareasale" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/sas-logo.png" class="ws-menu-page-right screenshot" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
461
  echo '<p>Established in 2000, <a href="http://www.s2member.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";
462
  echo '<p>If you <a href="http://www.s2member.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 s2Member\'s Tracking Code integrations.</p>' . "\n";
463
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_shareasale", get_defined_vars ());
522
 
523
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
524
 
525
+ echo '<p class="submit"><input type="submit" value="Save All Changes" /></p>' . "\n";
526
 
527
  echo '</form>' . "\n";
528
 
includes/menu-pages/updates.inc.php CHANGED
@@ -35,22 +35,24 @@ if(!class_exists("c_ws_plugin__s2member_menu_pages_updates"))
35
 
36
  if(!is_ssl() && !c_ws_plugin__s2member_utils_conds::is_localhost())
37
  {
38
- echo '<div class="ws-menu-page-r-group-header">'."\n";
39
- echo '<ins class="open">-</ins>Latest News<em>!</em>'."\n";
40
  echo '</div>'."\n";
41
 
42
- echo '<div class="ws-menu-page-r-group" style="display:block;">'."\n";
43
  echo '<script type="text/javascript" src="http://feeds.feedburner.com/s2member-updates?format=sigpro&amp;nItems=5&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";
44
  echo '➘ <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Knowledge Base")).'" target="_blank" rel="external">More updates...</a>'."\n";
45
  echo '</div>'."\n";
46
  }
47
 
48
  echo '<div class="ws-menu-page-r-group-header">'."\n";
49
- echo '<ins>+</ins>Email Updates<em>!</em>'."\n";
50
  echo '</div>'."\n";
51
 
52
  echo '<div class="ws-menu-page-r-group">'."\n";
53
 
 
 
54
  echo '<div id="ws-updates-div-fname">'."\n";
55
  echo '<label for="ws-updates-fname">First Name: *</label><br />'."\n";
56
  echo '<input type="text" aria-required="true" autocomplete="off" name="FNAME" id="ws-updates-fname" value="'.esc_attr($user->first_name).'" />'."\n";
@@ -74,7 +76,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_pages_updates"))
74
  }
75
 
76
  echo '<div id="ws-updates-div-priv">'."\n";
77
- echo '(<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Privacy URI")).'" target="_blank">we DO respect your privacy</a>)'."\n";
78
  echo '</div>'."\n";
79
 
80
  echo '<div id="ws-updates-div-submit">'."\n";
35
 
36
  if(!is_ssl() && !c_ws_plugin__s2member_utils_conds::is_localhost())
37
  {
38
+ echo '<div class="ws-menu-page-r-group-header open">'."\n";
39
+ echo ' <i class="fa fa-rss"></i> s2 News'."\n";
40
  echo '</div>'."\n";
41
 
42
+ echo '<div class="ws-menu-page-r-group open">'."\n";
43
  echo '<script type="text/javascript" src="http://feeds.feedburner.com/s2member-updates?format=sigpro&amp;nItems=5&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";
44
  echo '➘ <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Knowledge Base")).'" target="_blank" rel="external">More updates...</a>'."\n";
45
  echo '</div>'."\n";
46
  }
47
 
48
  echo '<div class="ws-menu-page-r-group-header">'."\n";
49
+ echo ' <i class="fa fa-envelope"></i> s2 Updates'."\n";
50
  echo '</div>'."\n";
51
 
52
  echo '<div class="ws-menu-page-r-group">'."\n";
53
 
54
+ echo '<p style="text-align:center; font-size:90%;"><strong>Hi '.esc_html(wp_get_current_user()->first_name).' :-)</strong><br />Subscribe here! We\'ll keep you informed about all things related to s2Member.</p>'."\n";
55
+
56
  echo '<div id="ws-updates-div-fname">'."\n";
57
  echo '<label for="ws-updates-fname">First Name: *</label><br />'."\n";
58
  echo '<input type="text" aria-required="true" autocomplete="off" name="FNAME" id="ws-updates-fname" value="'.esc_attr($user->first_name).'" />'."\n";
76
  }
77
 
78
  echo '<div id="ws-updates-div-priv">'."\n";
79
+ echo '(<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Privacy URI")).'" target="_blank">privacy policy</a>)'."\n";
80
  echo '</div>'."\n";
81
 
82
  echo '<div id="ws-updates-div-submit">'."\n";
includes/s2member-min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function(d){var c='<?php echo c_ws_plugin__s2member_utils_conds::bp_is_installed ("query-active-plugins") ? "1" : ""; ?>';var a='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (c_ws_plugin__s2member_utils_dirs::basename_dir_app_data ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])); ?>';var b=(typeof ws_plugin__s2member_skip_all_file_confirmations!=="undefined"&&ws_plugin__s2member_skip_all_file_confirmations)?true:false;var e=[];if(S2MEMBER_CURRENT_USER_IS_LOGGED_IN&&S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED&&!b){d('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"], a[href^="'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"]').click(function(){if(!this.href.match(/s2member[_\-]file[_\-]download[_\-]key[\=\-].+/i)){var f='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Confirm File Download —", "s2member-front", "s2member")); ?>\n\n';f+=d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`ve downloaded %s protected %s in the last %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY,((S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("file", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("files", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("24 hours", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("%s days", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)))+"\n\n";f+=(S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`re entitled to UNLIMITED downloads though (so, no worries).", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`re entitled to %s unique %s %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED,((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("download", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("downloads", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("each day", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("every %s-day period", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)));if((this.href.match(/s2member[_\-]skip[_\-]confirmation/i)&&!this.href.match(/s2member[_\-]skip[_\-]confirmation[\=\-](0|no|false)/i))||confirm(f)){if(d.inArray(this.href,e)===-1){S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY++,e.push(this.href)}return true}else{return false}}else{return true}})}if(!location.href.match(/\/wp-admin(\/|\?|$)/)){d("input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#ws-plugin--s2member-profile-login"),d("input#ws-plugin--s2member-profile-password1"),d("input#ws-plugin--s2member-profile-password2"),d("div#ws-plugin--s2member-profile-password-strength"))});d("form#ws-plugin--s2member-profile").submit(function(){var h=this,g="",f="",l="";var j=d("input#ws-plugin--s2member-profile-password1",h);var i=d("input#ws-plugin--s2member-profile-password2",h);var k=d("input#ws-plugin--s2member-profile-submit",h);d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("strong").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(d.trim(j.val())&&d.trim(j.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(d.trim(j.val())&&d.trim(j.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(k);return true})}if(location.href.match(/\/wp-signup\.php/)){d("div#content > div.mu_register > form#setupform").submit(function(){var h=this,g="",f="",j="";d("input#user_email",h).attr("data-expected","email");var i=d('p.submit input[type="submit"]',h);d("input#user_name, input#user_email, input#blogname, input#blog_title, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var k=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(k&&(g=d.trim(d('label[for="'+k+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){j+=f+"\n\n"}}});if(j=d.trim(j)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+j);return false}ws_plugin__s2member_animateProcessing(i);return true})}if(location.href.match(/\/wp-login\.php/)){d("div#login > form#registerform input#user_login").attr("tabindex","10");d("div#login > form#registerform input#user_email").attr("tabindex","20");d("div#login > form#registerform input#wp-submit").attr("tabindex","1000");d("input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#user_login"),d("input#ws-plugin--s2member-custom-reg-field-user-pass1"),d("input#ws-plugin--s2member-custom-reg-field-user-pass2"),d("div#ws-plugin--s2member-custom-reg-field-user-pass-strength"))});d("div#login > form#registerform").submit(function(){var h=this,g="",f="",l="";d("input#user_email",h).attr("data-expected","email");var k=d('input#ws-plugin--s2member-custom-reg-field-user-pass1[aria-required="true"]',h);var i=d("input#ws-plugin--s2member-custom-reg-field-user-pass2",h);var j=d("input#wp-submit",h);d("input#user_login, input#user_email, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(d.inArray(m,["user_login","user_email","captcha_code"])!==-1){if((g=d.trim(d(this).parent("label").text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}else{if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(k.length&&d.trim(k.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(k.length&&d.trim(k.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(j);return true})}if(location.href.match(/\/wp-admin\/(user\/)?profile\.php/)){d("form#your-profile").submit(function(){var h=this,g="",f="",i="";d("input#email",h).attr("data-expected","email");d(':input[id^="ws-plugin--s2member-profile-"]',h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}if(c){d("body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#signup_email",h).attr("data-expected","email");d("input#signup_username, input#signup_email, input#signup_password, input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true});d("body.logged-in.profile.profile-edit :input.ws-plugin--s2member-profile-field-4bp").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}ws_plugin__s2member_passwordStrength=function(g,i,h,f){if(g instanceof jQuery&&i instanceof jQuery&&h instanceof jQuery&&f instanceof jQuery&&typeof passwordStrength==="function"&&typeof pwsL10n==="object"){f.removeClass("ws-plugin--s2member-password-strength-short ws-plugin--s2member-password-strength-bad ws-plugin--s2member-password-strength-good ws-plugin--s2member-password-strength-strong ws-plugin--s2member-password-strength-mismatch");switch(passwordStrength(i.val(),g.val(),h.val())){case 1:f.addClass("ws-plugin--s2member-password-strength-short").html(pwsL10n["short"]);break;case 2:f.addClass("ws-plugin--s2member-password-strength-bad").html(pwsL10n.bad);break;case 3:f.addClass("ws-plugin--s2member-password-strength-good").html(pwsL10n.good);break;case 4:f.addClass("ws-plugin--s2member-password-strength-strong").html(pwsL10n.strong);break;case 5:f.addClass("ws-plugin--s2member-password-strength-mismatch").html(pwsL10n.mismatch);break;default:f.addClass("ws-plugin--s2member-password-strength-short").html(pwsL10n["short"])}}return};ws_plugin__s2member_validationErrors=function(r,q,g,m,l){if(typeof r==="string"&&r&&typeof q==="object"&&typeof g==="object"){if(typeof q.tagName==="string"&&q.tagName.match(/^(input|textarea|select)$/i)&&!q.disabled){var t=q.tagName.toLowerCase(),p=d(q),o=d.trim(p.attr("type")).toLowerCase(),f=d.trim(p.attr("name")),s=p.val();var m=(typeof m==="boolean")?m:(p.attr("aria-required")==="true"),l=(typeof l==="string")?l:d.trim(p.attr("data-expected"));var k=('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>'>0)?true:false;var i=new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@',"i");if(t==="input"&&o==="checkbox"&&f.match(/\[\]$/)){if(typeof q.id==="string"&&q.id.match(/-0$/)){if(m&&!d('input[name="'+f.replace(/([\[\]])/g,"$1")+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please check at least one of the boxes.", "s2member-front", "s2member")); ?>'}}}else{if(t==="input"&&o==="checkbox"){if(m&&!q.checked){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Required. This box must be checked.", "s2member-front", "s2member")); ?>'}}else{if(t==="input"&&o==="radio"){if(typeof q.id==="string"&&q.id.match(/-0$/)){if(m&&!d('input[name="'+f.replace(/([\[\]])/g,"$1")+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please select one of the options.", "s2member-front", "s2member")); ?>'}}}else{if(t==="select"&&p.attr("multiple")){if(m&&(!(s instanceof Array)||!s.length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please select at least one of the options.", "s2member-front", "s2member")); ?>'}}else{if(typeof s!=="string"||(m&&!(s=d.trim(s)).length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("This is a required field, please try again.", "s2member-front", "s2member")); ?>'}else{if((s=d.trim(s)).length&&((t==="input"&&o.match(/^(text|password)$/i))||t==="textarea")&&typeof l==="string"&&l.length){if(l==="numeric-wp-commas"&&(!s.match(/^[0-9\.,]+$/)||isNaN(s.replace(/,/g,"")))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be numeric (with or without decimals, commas allowed).", "s2member-front", "s2member")); ?>'}else{if(l==="numeric"&&(!s.match(/^[0-9\.]+$/)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be numeric (with or without decimals, no commas).", "s2member-front", "s2member")); ?>'}else{if(l==="integer"&&(!s.match(/^[0-9]+$/)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be an integer (a whole number, without any decimals).", "s2member-front", "s2member")); ?>'}else{if(l==="integer-gt-0"&&(!s.match(/^[0-9]+$/)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be an integer > 0 (whole number, no decimals, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="float"&&(!s.match(/^[0-9\.]+$/)||!s.match(/[0-9]/)||!s.match(/\./)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a float (floating point number, decimals required).", "s2member-front", "s2member")); ?>'}else{if(l==="float-gt-0"&&(!s.match(/^[0-9\.]+$/)||!s.match(/[0-9]/)||!s.match(/\./)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a float > 0 (floating point number, decimals required, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="date"&&!s.match(/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&!s.match(/^([a-z_~0-9\+\-]+)(((\.?)([a-z_~0-9\+\-]+))*)(@)([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a valid email address.", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&k&&s.match(i)){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>',s.split("@")[0])}else{if(l==="url"&&!s.match(/^http(s?)\:\/\/(.{5,})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>'}else{if(l==="domain"&&!s.match(/^([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>'}else{if(l==="phone"&&(!s.match(/^[0-9 \(\)\-]+$/)||s.replace(/[^0-9]/g,"").length!==10)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a phone # (10 digits w/possible hyphens,spaces,brackets).", "s2member-front", "s2member")); ?>'}else{if(l==="uszip"&&!s.match(/^[0-9]{5}(-[0-9]{4})?$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a US zipcode (5-9 digits w/possible hyphen).", "s2member-front", "s2member")); ?>'}else{if(l==="cazip"&&!s.match(/^[0-9A-Z]{3}( ?)[0-9A-Z]{3}$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>'}else{if(l==="uczip"&&!s.match(/^[0-9]{5}(-[0-9]{4})?$/)&&!s.match(/^[0-9A-Z]{3}( ?)[0-9A-Z]{3}$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-spaces-punctuation-([0-9]+)(-e)?$/)&&!s.match(/^[a-z 0-9,\.\/\?\:;"'\{\}\[\]\|\\\+\=_\-\(\)\*&\^%\$#@\!`~]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-spaces-([0-9]+)(-e)?$/)&&!s.match(/^[a-z 0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-punctuation-([0-9]+)(-e)?$/)&&!s.match(/^[a-z0-9,\.\/\?\:;"'\{\}\[\]\|\\\+\=_\-\(\)\*&\^%\$#@\!`~]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-([0-9]+)(-e)?$/)&&!s.match(/^[a-z0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphabetics-([0-9]+)(-e)?$/)&&!s.match(/^[a-z]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^numerics-([0-9]+)(-e)?$/)&&!s.match(/^[0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use numeric digits only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^(any|alphanumerics-spaces-punctuation|alphanumerics-spaces|alphanumerics-punctuation|alphanumerics|alphabetics|numerics)-([0-9]+)(-e)?$/)){var n=l.split("-"),h=Number(n[1]),j=(n.length>2&&n[2]==="e")?true:false;if(j&&s.length!==h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be exactly %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')))}else{if(s.length<h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be at least %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}return""};ws_plugin__s2member_animateProcessingConfig={originalText:"",interval:null,speed:100},ws_plugin__s2member_animateProcessing=function(g,f){if(g instanceof jQuery){if(f){clearInterval(ws_plugin__s2member_animateProcessingConfig.interval);if(ws_plugin__s2member_animateProcessingConfig.originalText){g.val(ws_plugin__s2member_animateProcessingConfig.originalText)}return}g.first().each(function(){var k=d(this),j=0,h="r",l=[".","..","..."];ws_plugin__s2member_animateProcessingConfig.originalText=k.val();clearInterval(ws_plugin__s2member_animateProcessingConfig.interval);ws_plugin__s2member_animateProcessingConfig.interval=setInterval(function(){if(h==="r"){if(j+1<=l.length-1){j=j+1,h="r"}else{j=j-1,h="l"}}else{if(h==="l"){if(j-1>=0){j=j-1,h="l"}else{j=j+1,h="r"}}}for(var m=l[j],i=l[j].length;i<l.length;i++){m+=" "}k.val('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Processing", "s2member-front", "s2member")); ?>'+m)},ws_plugin__s2member_animateProcessingConfig.speed)})}}});
1
+ jQuery(document).ready(function(d){var c='<?php echo c_ws_plugin__s2member_utils_conds::bp_is_installed ("query-active-plugins") ? "1" : ""; ?>';var a='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (c_ws_plugin__s2member_utils_dirs::basename_dir_app_data ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])); ?>';var b=(typeof ws_plugin__s2member_skip_all_file_confirmations!=="undefined"&&ws_plugin__s2member_skip_all_file_confirmations)?true:false;var e=[];if(S2MEMBER_CURRENT_USER_IS_LOGGED_IN&&S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED&&!b){d('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"], a[href^="'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"]').click(function(){if(!this.href.match(/s2member[_\-]file[_\-]download[_\-]key[\=\-].+/i)){var f='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Confirm File Download —", "s2member-front", "s2member")); ?>\n\n';f+=d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`ve downloaded %s protected %s in the last %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY,((S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("file", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("files", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("24 hours", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("%s days", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)))+"\n\n";f+=(S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`re entitled to UNLIMITED downloads though (so, no worries).", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`re entitled to %s unique %s %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED,((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("download", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("downloads", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("each day", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("every %s-day period", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)));if((this.href.match(/s2member[_\-]skip[_\-]confirmation/i)&&!this.href.match(/s2member[_\-]skip[_\-]confirmation[\=\-](0|no|false)/i))||confirm(f)){if(d.inArray(this.href,e)===-1){S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY++,e.push(this.href)}return true}else{return false}}else{return true}})}if(!location.href.match(/\/wp-admin(\/|\?|$)/)){d("input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#ws-plugin--s2member-profile-login"),d("input#ws-plugin--s2member-profile-password1"),d("input#ws-plugin--s2member-profile-password2"),d("div#ws-plugin--s2member-profile-password-strength"))});d("form#ws-plugin--s2member-profile").submit(function(){var h=this,g="",f="",l="";var j=d("input#ws-plugin--s2member-profile-password1",h);var i=d("input#ws-plugin--s2member-profile-password2",h);var k=d("input#ws-plugin--s2member-profile-submit",h);d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("strong").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(d.trim(j.val())&&d.trim(j.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(d.trim(j.val())&&d.trim(j.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(k);return true})}if(location.href.match(/\/wp-signup\.php/)){d("div#content > div.mu_register > form#setupform").submit(function(){var h=this,g="",f="",j="";d("input#user_email",h).attr("data-expected","email");var i=d('p.submit input[type="submit"]',h);d("input#user_name, input#user_email, input#blogname, input#blog_title, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var k=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(k&&(g=d.trim(d('label[for="'+k+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){j+=f+"\n\n"}}});if(j=d.trim(j)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+j);return false}ws_plugin__s2member_animateProcessing(i);return true})}if(location.href.match(/\/wp-login\.php/)){d("div#login > form#registerform input#user_login").attr("tabindex","10");d("div#login > form#registerform input#user_email").attr("tabindex","20");d("div#login > form#registerform input#wp-submit").attr("tabindex","1000");d("input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#user_login"),d("input#ws-plugin--s2member-custom-reg-field-user-pass1"),d("input#ws-plugin--s2member-custom-reg-field-user-pass2"),d("div#ws-plugin--s2member-custom-reg-field-user-pass-strength"))});d("div#login > form#registerform").submit(function(){var h=this,g="",f="",l="";d("input#user_email",h).attr("data-expected","email");var k=d('input#ws-plugin--s2member-custom-reg-field-user-pass1[aria-required="true"]',h);var i=d("input#ws-plugin--s2member-custom-reg-field-user-pass2",h);var j=d("input#wp-submit",h);d("input#user_login, input#user_email, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(d.inArray(m,["user_login","user_email","captcha_code"])!==-1){if((g=d.trim(d(this).parent("label").text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}else{if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(k.length&&d.trim(k.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(k.length&&d.trim(k.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(j);return true})}if(location.href.match(/\/wp-admin\/(user\/)?profile\.php/)){d("form#your-profile").submit(function(){var h=this,g="",f="",i="";d("input#email",h).attr("data-expected","email");d(':input[id^="ws-plugin--s2member-profile-"]',h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}if(c){d("body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#signup_email",h).attr("data-expected","email");d("input#signup_username, input#signup_email, input#signup_password, input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true});d("body.logged-in.profile.profile-edit :input.ws-plugin--s2member-profile-field-4bp").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}ws_plugin__s2member_passwordStrengthMeter=function(h,f){var g=0;if((h!=f)&&f.length>0){return"mismatch"}else{if(h.length<1){return"empty"}else{if(h.length<6){return"short"}}}if(h.match(/[0-9]/)){g+=10}if(h.match(/[a-z]/)){g+=10}if(h.match(/[A-Z]/)){g+=10}if(h.match(/[^0-9a-zA-Z]/)){g=(g===30)?g+20:g+10}if(g<30){return"bad"}if(g<50){return"good"}return"strong"};ws_plugin__s2member_passwordStrength=function(h,k,i,g){if(h instanceof jQuery&&k instanceof jQuery&&i instanceof jQuery&&g instanceof jQuery){var j={empty:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strength indicator", "s2member-front", "s2member")); ?>',"short":'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Very weak", "s2member-front", "s2member")); ?>',bad:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Weak", "s2member-front", "s2member")); ?>',good:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Medium", "s2member-front", "s2member")); ?>',strong:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strong", "s2member-front", "s2member")); ?>',mismatch:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Mismatch", "s2member-front", "s2member")); ?>'};g.removeClass("ws-plugin--s2member-password-strength-short");g.removeClass("ws-plugin--s2member-password-strength-bad");g.removeClass("ws-plugin--s2member-password-strength-good");g.removeClass("ws-plugin--s2member-password-strength-strong");g.removeClass("ws-plugin--s2member-password-strength-mismatch");g.removeClass("ws-plugin--s2member-password-strength-empty");var f=ws_plugin__s2member_passwordStrengthMeter(k.val(),i.val());g.addClass("ws-plugin--s2member-password-strength-"+f).html(j[f])}};ws_plugin__s2member_validationErrors=function(r,q,g,m,l){if(typeof r==="string"&&r&&typeof q==="object"&&typeof g==="object"){if(typeof q.tagName==="string"&&q.tagName.match(/^(input|textarea|select)$/i)&&!q.disabled){var t=q.tagName.toLowerCase(),p=d(q),o=d.trim(p.attr("type")).toLowerCase(),f=d.trim(p.attr("name")),s=p.val();var m=(typeof m==="boolean")?m:(p.attr("aria-required")==="true"),l=(typeof l==="string")?l:d.trim(p.attr("data-expected"));var k=('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>'>0)?true:false;var i=new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@',"i");if(t==="input"&&o==="checkbox"&&f.match(/\[\]$/)){if(typeof q.id==="string"&&q.id.match(/-0$/)){if(m&&!d('input[name="'+f.replace(/([\[\]])/g,"$1")+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please check at least one of the boxes.", "s2member-front", "s2member")); ?>'}}}else{if(t==="input"&&o==="checkbox"){if(m&&!q.checked){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Required. This box must be checked.", "s2member-front", "s2member")); ?>'}}else{if(t==="input"&&o==="radio"){if(typeof q.id==="string"&&q.id.match(/-0$/)){if(m&&!d('input[name="'+f.replace(/([\[\]])/g,"$1")+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please select one of the options.", "s2member-front", "s2member")); ?>'}}}else{if(t==="select"&&p.attr("multiple")){if(m&&(!(s instanceof Array)||!s.length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please select at least one of the options.", "s2member-front", "s2member")); ?>'}}else{if(typeof s!=="string"||(m&&!(s=d.trim(s)).length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("This is a required field, please try again.", "s2member-front", "s2member")); ?>'}else{if((s=d.trim(s)).length&&((t==="input"&&o.match(/^(text|password)$/i))||t==="textarea")&&typeof l==="string"&&l.length){if(l==="numeric-wp-commas"&&(!s.match(/^[0-9\.,]+$/)||isNaN(s.replace(/,/g,"")))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be numeric (with or without decimals, commas allowed).", "s2member-front", "s2member")); ?>'}else{if(l==="numeric"&&(!s.match(/^[0-9\.]+$/)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be numeric (with or without decimals, no commas).", "s2member-front", "s2member")); ?>'}else{if(l==="integer"&&(!s.match(/^[0-9]+$/)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be an integer (a whole number, without any decimals).", "s2member-front", "s2member")); ?>'}else{if(l==="integer-gt-0"&&(!s.match(/^[0-9]+$/)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be an integer > 0 (whole number, no decimals, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="float"&&(!s.match(/^[0-9\.]+$/)||!s.match(/[0-9]/)||!s.match(/\./)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a float (floating point number, decimals required).", "s2member-front", "s2member")); ?>'}else{if(l==="float-gt-0"&&(!s.match(/^[0-9\.]+$/)||!s.match(/[0-9]/)||!s.match(/\./)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a float > 0 (floating point number, decimals required, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="date"&&!s.match(/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&!s.match(/^([a-z_~0-9\+\-]+)(((\.?)([a-z_~0-9\+\-]+))*)(@)([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a valid email address.", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&k&&s.match(i)){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>',s.split("@")[0])}else{if(l==="url"&&!s.match(/^http(s?)\:\/\/(.{5,})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>'}else{if(l==="domain"&&!s.match(/^([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>'}else{if(l==="phone"&&(!s.match(/^[0-9 \(\)\-]+$/)||s.replace(/[^0-9]/g,"").length!==10)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a phone # (10 digits w/possible hyphens,spaces,brackets).", "s2member-front", "s2member")); ?>'}else{if(l==="uszip"&&!s.match(/^[0-9]{5}(-[0-9]{4})?$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a US zipcode (5-9 digits w/possible hyphen).", "s2member-front", "s2member")); ?>'}else{if(l==="cazip"&&!s.match(/^[0-9A-Z]{3}( ?)[0-9A-Z]{3}$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>'}else{if(l==="uczip"&&!s.match(/^[0-9]{5}(-[0-9]{4})?$/)&&!s.match(/^[0-9A-Z]{3}( ?)[0-9A-Z]{3}$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-spaces-punctuation-([0-9]+)(-e)?$/)&&!s.match(/^[a-z 0-9,\.\/\?\:;"'\{\}\[\]\|\\\+\=_\-\(\)\*&\^%\$#@\!`~]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-spaces-([0-9]+)(-e)?$/)&&!s.match(/^[a-z 0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-punctuation-([0-9]+)(-e)?$/)&&!s.match(/^[a-z0-9,\.\/\?\:;"'\{\}\[\]\|\\\+\=_\-\(\)\*&\^%\$#@\!`~]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-([0-9]+)(-e)?$/)&&!s.match(/^[a-z0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphabetics-([0-9]+)(-e)?$/)&&!s.match(/^[a-z]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^numerics-([0-9]+)(-e)?$/)&&!s.match(/^[0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use numeric digits only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^(any|alphanumerics-spaces-punctuation|alphanumerics-spaces|alphanumerics-punctuation|alphanumerics|alphabetics|numerics)-([0-9]+)(-e)?$/)){var n=l.split("-"),h=Number(n[1]),j=(n.length>2&&n[2]==="e")?true:false;if(j&&s.length!==h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be exactly %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')))}else{if(s.length<h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be at least %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}return""};ws_plugin__s2member_animateProcessingConfig={originalText:"",interval:null,speed:100},ws_plugin__s2member_animateProcessing=function(g,f){if(g instanceof jQuery){if(f){clearInterval(ws_plugin__s2member_animateProcessingConfig.interval);if(ws_plugin__s2member_animateProcessingConfig.originalText){g.val(ws_plugin__s2member_animateProcessingConfig.originalText)}return}g.first().each(function(){var k=d(this),j=0,h="r",l=[".","..","..."];ws_plugin__s2member_animateProcessingConfig.originalText=k.val();clearInterval(ws_plugin__s2member_animateProcessingConfig.interval);ws_plugin__s2member_animateProcessingConfig.interval=setInterval(function(){if(h==="r"){if(j+1<=l.length-1){j=j+1,h="r"}else{j=j-1,h="l"}}else{if(h==="l"){if(j-1>=0){j=j-1,h="l"}else{j=j+1,h="r"}}}for(var m=l[j],i=l[j].length;i<l.length;i++){m+=" "}k.val('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Processing", "s2member-front", "s2member")); ?>'+m)},ws_plugin__s2member_animateProcessingConfig.speed)})}}});
includes/s2member.js CHANGED
@@ -296,35 +296,54 @@ jQuery(document).ready (function($)
296
  });
297
  }
298
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
299
  ws_plugin__s2member_passwordStrength = function($username, $pass1, $pass2, $result)
300
  {
301
- if ($username instanceof jQuery && $pass1 instanceof jQuery && $pass2 instanceof jQuery && $result instanceof jQuery && typeof passwordStrength === 'function' && typeof pwsL10n === 'object')
302
  {
303
- $result.removeClass ('ws-plugin--s2member-password-strength-short ws-plugin--s2member-password-strength-bad ws-plugin--s2member-password-strength-good ws-plugin--s2member-password-strength-strong ws-plugin--s2member-password-strength-mismatch');
304
-
305
- switch /* Uses WordPress script: `password-strength-meter` and `pwsL10n`. */ (passwordStrength($pass1.val (), $username.val (), $pass2.val ()))
306
- {
307
- case 1:
308
- $result.addClass ('ws-plugin--s2member-password-strength-short').html (pwsL10n['short']);
309
- break;
310
- case 2:
311
- $result.addClass ('ws-plugin--s2member-password-strength-bad').html (pwsL10n['bad']);
312
- break;
313
- case 3:
314
- $result.addClass ('ws-plugin--s2member-password-strength-good').html (pwsL10n['good']);
315
- break;
316
- case 4:
317
- $result.addClass ('ws-plugin--s2member-password-strength-strong').html (pwsL10n['strong']);
318
- break;
319
- case 5:
320
- $result.addClass ('ws-plugin--s2member-password-strength-mismatch').html (pwsL10n['mismatch']);
321
- break;
322
- default:
323
- $result.addClass ('ws-plugin--s2member-password-strength-short').html (pwsL10n['short']);
324
- }
325
  }
326
-
327
- return;
328
  };
329
 
330
  ws_plugin__s2member_validationErrors = function(label, field, context, required, expected)
296
  });
297
  }
298
 
299
+ ws_plugin__s2member_passwordStrengthMeter = function(password1, password2)
300
+ {
301
+ var score = 0; // Initialize score.
302
+
303
+ if((password1 != password2) && password2.length > 0)
304
+ return 'mismatch';
305
+ else if(password1.length < 1)
306
+ return 'empty';
307
+ else if(password1.length < 6)
308
+ return 'short';
309
+
310
+ if(password1.match(/[0-9]/))
311
+ score += 10;
312
+ if(password1.match(/[a-z]/))
313
+ score += 10;
314
+ if(password1.match(/[A-Z]/))
315
+ score += 10;
316
+ if(password1.match(/[^0-9a-zA-Z]/))
317
+ score = (score === 30) ? score + 20 : score + 10;
318
+
319
+ if(score < 30) return 'bad';
320
+ if(score < 50) return 'good';
321
+
322
+ return 'strong'; // Default return value.
323
+ };
324
+
325
  ws_plugin__s2member_passwordStrength = function($username, $pass1, $pass2, $result)
326
  {
327
+ if ($username instanceof jQuery && $pass1 instanceof jQuery && $pass2 instanceof jQuery && $result instanceof jQuery)
328
  {
329
+ var pwsL10n = { // Password strength meter translations.
330
+ 'empty': '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strength indicator", "s2member-front", "s2member")); ?>',
331
+ 'short': '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Very weak", "s2member-front", "s2member")); ?>',
332
+ 'bad': '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Weak", "s2member-front", "s2member")); ?>',
333
+ 'good': '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Medium", "s2member-front", "s2member")); ?>',
334
+ 'strong': '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strong", "s2member-front", "s2member")); ?>',
335
+ 'mismatch': '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Mismatch", "s2member-front", "s2member")); ?>'};
336
+
337
+ $result.removeClass ('ws-plugin--s2member-password-strength-short');
338
+ $result.removeClass ('ws-plugin--s2member-password-strength-bad');
339
+ $result.removeClass ('ws-plugin--s2member-password-strength-good');
340
+ $result.removeClass ('ws-plugin--s2member-password-strength-strong');
341
+ $result.removeClass ('ws-plugin--s2member-password-strength-mismatch');
342
+ $result.removeClass ('ws-plugin--s2member-password-strength-empty');
343
+
344
+ var meterSays = ws_plugin__s2member_passwordStrengthMeter($pass1.val (), $pass2.val ());
345
+ $result.addClass ('ws-plugin--s2member-password-strength-'+meterSays).html (pwsL10n[meterSays]);
 
 
 
 
 
346
  }
 
 
347
  };
348
 
349
  ws_plugin__s2member_validationErrors = function(label, field, context, required, expected)
includes/translations/s2member.pot CHANGED
@@ -4,7 +4,7 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: s2Member® Framework 130816\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2013-10-26 00:00:43+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -21,12 +21,12 @@ msgstr ""
21
  #: s2member/includes/classes/custom-reg-fields.inc.php:464
22
  #: s2member/includes/classes/profile-in.inc.php:120
23
  #: s2member/includes/classes/sc-profile-in.inc.php:136
24
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:64
25
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:32
26
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:64
27
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:64
28
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:32
29
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:64
30
  msgctxt "s2member-front"
31
  msgid "First Name"
32
  msgstr ""
@@ -35,12 +35,12 @@ msgstr ""
35
  #: s2member/includes/classes/custom-reg-fields.inc.php:479
36
  #: s2member/includes/classes/profile-in.inc.php:140
37
  #: s2member/includes/classes/sc-profile-in.inc.php:156
38
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:70
39
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:38
40
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:70
41
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:70
42
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:38
43
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:70
44
  msgctxt "s2member-front"
45
  msgid "Last Name"
46
  msgstr ""
@@ -63,10 +63,10 @@ msgstr ""
63
  #: s2member/includes/classes/custom-reg-fields.inc.php:446
64
  #: s2member/includes/classes/profile-in.inc.php:243
65
  #: s2member/includes/classes/sc-profile-in.inc.php:259
66
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:92
67
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:60
68
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:92
69
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:60
70
  msgctxt "s2member-front"
71
  msgid "password strength indicator"
72
  msgstr ""
@@ -728,12 +728,12 @@ msgstr ""
728
 
729
  #: s2member/includes/classes/profile-in.inc.php:98
730
  #: s2member/includes/classes/sc-profile-in.inc.php:114
731
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:76
732
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:44
733
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:76
734
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:76
735
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:44
736
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:76
737
  msgctxt "s2member-front"
738
  msgid "Email Address"
739
  msgstr ""
@@ -818,7 +818,7 @@ msgstr ""
818
  #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
819
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
820
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:270
821
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:560
822
  msgctxt "s2member-front paypal-button-lang-code"
823
  msgid "en_US"
824
  msgstr ""
@@ -891,36 +891,6 @@ msgctxt "s2member-front"
891
  msgid "(for this site)"
892
  msgstr ""
893
 
894
- #: s2member/includes/classes/utils-html.inc.php:59
895
- msgctxt "s2member-front"
896
- msgid "Strength indicator"
897
- msgstr ""
898
-
899
- #: s2member/includes/classes/utils-html.inc.php:59
900
- msgctxt "s2member-front"
901
- msgid "Very weak"
902
- msgstr ""
903
-
904
- #: s2member/includes/classes/utils-html.inc.php:59
905
- msgctxt "s2member-front"
906
- msgid "Weak"
907
- msgstr ""
908
-
909
- #: s2member/includes/classes/utils-html.inc.php:59
910
- msgctxt "s2member-front"
911
- msgid "Medium"
912
- msgstr ""
913
-
914
- #: s2member/includes/classes/utils-html.inc.php:59
915
- msgctxt "s2member-front"
916
- msgid "Strong"
917
- msgstr ""
918
-
919
- #: s2member/includes/classes/utils-html.inc.php:59
920
- msgctxt "s2member-front"
921
- msgid "Mismatch"
922
- msgstr ""
923
-
924
  #: s2member/includes/classes/utils-time.inc.php:53
925
  msgctxt "s2member-front"
926
  msgid "less than a minute"
@@ -1225,12 +1195,12 @@ msgstr ""
1225
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:239
1226
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:246
1227
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:253
1228
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:495
1229
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:502
1230
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:765
1231
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:772
1232
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:779
1233
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:786
1234
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1235
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:66
1236
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:73
@@ -1240,12 +1210,12 @@ msgstr ""
1240
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:239
1241
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:246
1242
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:253
1243
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:535
1244
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:542
1245
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:853
1246
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:860
1247
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:867
1248
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:874
1249
  msgctxt "s2member-front"
1250
  msgid "— Oops, you missed something: —"
1251
  msgstr ""
@@ -1254,10 +1224,10 @@ msgstr ""
1254
  #: s2member/includes/s2member.js:192
1255
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1256
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:239
1257
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:772
1258
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1259
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:239
1260
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:860
1261
  msgctxt "s2member-front"
1262
  msgid "Passwords do not match up. Please try again."
1263
  msgstr ""
@@ -1266,181 +1236,211 @@ msgstr ""
1266
  #: s2member/includes/s2member.js:199
1267
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1268
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:246
1269
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:779
1270
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1271
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:246
1272
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:867
1273
  msgctxt "s2member-front"
1274
  msgid "Password MUST be at least 6 characters. Please try again."
1275
  msgstr ""
1276
 
1277
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:345
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1278
  msgctxt "s2member-front"
1279
  msgid "Please check at least one of the boxes."
1280
  msgstr ""
1281
 
1282
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:350
1283
  msgctxt "s2member-front"
1284
  msgid "Required. This box must be checked."
1285
  msgstr ""
1286
 
1287
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:356
1288
  msgctxt "s2member-front"
1289
  msgid "Please select one of the options."
1290
  msgstr ""
1291
 
1292
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:361
1293
  msgctxt "s2member-front"
1294
  msgid "Please select at least one of the options."
1295
  msgstr ""
1296
 
1297
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:365
1298
  msgctxt "s2member-front"
1299
  msgid "This is a required field, please try again."
1300
  msgstr ""
1301
 
1302
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:371
1303
  msgctxt "s2member-front"
1304
  msgid "Must be numeric (with or without decimals, commas allowed)."
1305
  msgstr ""
1306
 
1307
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:375
1308
  msgctxt "s2member-front"
1309
  msgid "Must be numeric (with or without decimals, no commas)."
1310
  msgstr ""
1311
 
1312
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:379
1313
  msgctxt "s2member-front"
1314
  msgid "Must be an integer (a whole number, without any decimals)."
1315
  msgstr ""
1316
 
1317
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:383
1318
  msgctxt "s2member-front"
1319
  msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
1320
  msgstr ""
1321
 
1322
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:387
1323
  msgctxt "s2member-front"
1324
  msgid "Must be a float (floating point number, decimals required)."
1325
  msgstr ""
1326
 
1327
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:391
1328
  msgctxt "s2member-front"
1329
  msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
1330
  msgstr ""
1331
 
1332
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:395
1333
  msgctxt "s2member-front"
1334
  msgid "Must be a date (required date format: dd/mm/yyyy)."
1335
  msgstr ""
1336
 
1337
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:399
1338
  msgctxt "s2member-front"
1339
  msgid "Must be a valid email address."
1340
  msgstr ""
1341
 
1342
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:403
1343
  msgctxt "s2member-front"
1344
  msgid ""
1345
  "Please use a personal email address.\n"
1346
  "Addresses like <%s@> are problematic."
1347
  msgstr ""
1348
 
1349
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:407
1350
  msgctxt "s2member-front"
1351
  msgid "Must be a full URL (starting with http or https)."
1352
  msgstr ""
1353
 
1354
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:411
1355
  msgctxt "s2member-front"
1356
  msgid "Must be a domain name (domain name only, without http)."
1357
  msgstr ""
1358
 
1359
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:415
1360
  msgctxt "s2member-front"
1361
  msgid "Must be a phone # (10 digits w/possible hyphens,spaces,brackets)."
1362
  msgstr ""
1363
 
1364
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:419
1365
  msgctxt "s2member-front"
1366
  msgid "Must be a US zipcode (5-9 digits w/possible hyphen)."
1367
  msgstr ""
1368
 
1369
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:423
1370
  msgctxt "s2member-front"
1371
  msgid "Must be a Canadian zipcode (6 alpha-numerics w/possible space)."
1372
  msgstr ""
1373
 
1374
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:427
1375
  msgctxt "s2member-front"
1376
  msgid "Must be a zipcode (either a US or Canadian zipcode)."
1377
  msgstr ""
1378
 
1379
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:431
1380
  msgctxt "s2member-front"
1381
  msgid "Please use alphanumerics, spaces & punctuation only."
1382
  msgstr ""
1383
 
1384
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:435
1385
  msgctxt "s2member-front"
1386
  msgid "Please use alphanumerics & spaces only."
1387
  msgstr ""
1388
 
1389
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:439
1390
  msgctxt "s2member-front"
1391
  msgid "Please use alphanumerics & punctuation only (no spaces)."
1392
  msgstr ""
1393
 
1394
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:443
1395
  msgctxt "s2member-front"
1396
  msgid "Please use alphanumerics only (no spaces/punctuation)."
1397
  msgstr ""
1398
 
1399
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:447
1400
  msgctxt "s2member-front"
1401
  msgid "Please use alphabetics only (no digits/spaces/punctuation)."
1402
  msgstr ""
1403
 
1404
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:451
1405
  msgctxt "s2member-front"
1406
  msgid "Please use numeric digits only."
1407
  msgstr ""
1408
 
1409
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:458
1410
  msgctxt "s2member-front"
1411
  msgid "Must be exactly %s %s."
1412
  msgstr ""
1413
 
1414
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:458
1415
- #: s2member/includes/s2member.js:461
1416
  msgctxt "s2member-front"
1417
  msgid "digit"
1418
  msgstr ""
1419
 
1420
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:458
1421
- #: s2member/includes/s2member.js:461
1422
  msgctxt "s2member-front"
1423
  msgid "digits"
1424
  msgstr ""
1425
 
1426
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:458
1427
- #: s2member/includes/s2member.js:461
1428
  msgctxt "s2member-front"
1429
  msgid "character"
1430
  msgstr ""
1431
 
1432
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:458
1433
- #: s2member/includes/s2member.js:461
1434
  msgctxt "s2member-front"
1435
  msgid "characters"
1436
  msgstr ""
1437
 
1438
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:461
1439
  msgctxt "s2member-front"
1440
  msgid "Must be at least %s %s."
1441
  msgstr ""
1442
 
1443
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:514
1444
  msgctxt "s2member-front"
1445
  msgid "Processing"
1446
  msgstr ""
@@ -3936,22 +3936,22 @@ msgstr ""
3936
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:73
3937
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:167
3938
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:253
3939
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:502
3940
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:786
3941
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3942
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:73
3943
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:167
3944
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:253
3945
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:542
3946
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:874
3947
  msgctxt "s2member-front"
3948
  msgid "Security Code missing. Please try again."
3949
  msgstr ""
3950
 
3951
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3952
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:142
3953
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:477
3954
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:747
3955
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3956
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:142
3957
  msgctxt "s2member-front"
@@ -3959,61 +3959,61 @@ msgid "Please choose a Billing Method."
3959
  msgstr ""
3960
 
3961
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3962
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:321
3963
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:571
3964
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3965
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:325
3966
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:615
3967
  msgctxt "s2member-front"
3968
  msgid "Calculating Sales Tax..."
3969
  msgstr ""
3970
 
3971
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3972
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:321
3973
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:571
3974
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3975
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:325
3976
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:615
3977
  msgctxt "s2member-front"
3978
  msgid "calculating sales tax..."
3979
  msgstr ""
3980
 
3981
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3982
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:332
3983
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:582
3984
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3985
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:336
3986
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:626
3987
  msgctxt "s2member-front"
3988
  msgid "<strong>Sales Tax%s:</strong> %s<br /><strong>— Total%s:</strong> %s"
3989
  msgstr ""
3990
 
3991
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3992
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:332
3993
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:582
3994
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3995
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:336
3996
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:626
3997
  msgctxt "s2member-front"
3998
  msgid "Today"
3999
  msgstr ""
4000
 
4001
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4002
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:644
4003
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4004
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:688
4005
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:60
4006
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:28
4007
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:60
4008
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:28
4009
  msgctxt "s2member-front"
4010
  msgid "Create Profile"
4011
  msgstr ""
4012
 
4013
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4014
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:645
4015
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4016
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:689
4017
  msgctxt "s2member-front"
4018
  msgid "Your Profile"
4019
  msgstr ""
@@ -4021,18 +4021,18 @@ msgstr ""
4021
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4022
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:269
4023
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:270
4024
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:559
4025
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:560
4026
- #: s2member-pro/includes/templates/forms/authnet-cancellation-form.php:34
4027
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:196
4028
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:79
4029
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:177
4030
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:115
4031
- #: s2member-pro/includes/templates/forms/paypal-cancellation-form.php:34
4032
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:196
4033
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:79
4034
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:177
4035
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:115
4036
  msgctxt "s2member-front"
4037
  msgid "Submit Form"
4038
  msgstr ""
@@ -4074,206 +4074,206 @@ msgid ""
4074
  "%s"
4075
  msgstr ""
4076
 
4077
- #: s2member-pro/includes/templates/forms/authnet-cancellation-form.php:30
4078
- #: s2member-pro/includes/templates/forms/paypal-cancellation-form.php:30
4079
  msgctxt "s2member-front"
4080
  msgid "Confirm Cancellation"
4081
  msgstr ""
4082
 
4083
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:19
4084
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:19
4085
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:19
4086
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:19
4087
  msgctxt "s2member-front"
4088
  msgid "Checkout Options"
4089
  msgstr ""
4090
 
4091
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:40
4092
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:40
4093
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:40
4094
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:40
4095
  msgctxt "s2member-front"
4096
  msgid "Coupon Code"
4097
  msgstr ""
4098
 
4099
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:47
4100
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:47
4101
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:47
4102
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:47
4103
  msgctxt "s2member-front"
4104
  msgid "Have a Coupon Code? (please enter it here)"
4105
  msgstr ""
4106
 
4107
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:50
4108
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:50
4109
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:50
4110
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:50
4111
  msgctxt "s2member-front"
4112
  msgid "Apply Coupon"
4113
  msgstr ""
4114
 
4115
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:82
4116
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:50
4117
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:82
4118
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:50
4119
  msgctxt "s2member-front"
4120
  msgid "Username (lowercase letters and/or numbers)"
4121
  msgstr ""
4122
 
4123
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:88
4124
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:56
4125
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:88
4126
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:56
4127
  msgctxt "s2member-front"
4128
  msgid "Password (type this twice please)"
4129
  msgstr ""
4130
 
4131
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:104
4132
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:86
4133
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:104
4134
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:86
4135
  msgctxt "s2member-front"
4136
  msgid "Billing Method"
4137
  msgstr ""
4138
 
4139
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:111
4140
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:93
4141
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:34
4142
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:111
4143
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:93
4144
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:34
4145
  msgctxt "s2member-front"
4146
  msgid "Card Number (no dashes or spaces)"
4147
  msgstr ""
4148
 
4149
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:117
4150
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:99
4151
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:40
4152
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:117
4153
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:99
4154
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:40
4155
  msgctxt "s2member-front"
4156
  msgid "Card Expiration Date (mm/yyyy)"
4157
  msgstr ""
4158
 
4159
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:128
4160
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:110
4161
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:51
4162
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:128
4163
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:110
4164
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:51
4165
  msgctxt "s2member-front"
4166
  msgid "Card Verification Code (3-4 digits)"
4167
  msgstr ""
4168
 
4169
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:128
4170
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:110
4171
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:51
4172
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:128
4173
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:110
4174
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:51
4175
  msgctxt "s2member-front"
4176
  msgid "need help?"
4177
  msgstr ""
4178
 
4179
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:135
4180
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:117
4181
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:58
4182
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:135
4183
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:117
4184
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:58
4185
  msgctxt "s2member-front"
4186
  msgid "Card Start Date (mm/yyyy), or Issue Number"
4187
  msgstr ""
4188
 
4189
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:145
4190
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:127
4191
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:68
4192
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:145
4193
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:127
4194
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:68
4195
  msgctxt "s2member-front"
4196
  msgid "Billing Address"
4197
  msgstr ""
4198
 
4199
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:149
4200
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:131
4201
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:72
4202
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:149
4203
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:131
4204
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:72
4205
  msgctxt "s2member-front"
4206
  msgid "Street Address"
4207
  msgstr ""
4208
 
4209
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:155
4210
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:137
4211
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:78
4212
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:155
4213
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:137
4214
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:78
4215
  msgctxt "s2member-front"
4216
  msgid "City / Town"
4217
  msgstr ""
4218
 
4219
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:161
4220
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:143
4221
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:84
4222
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:161
4223
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:143
4224
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:84
4225
  msgctxt "s2member-front"
4226
  msgid "State / Province"
4227
  msgstr ""
4228
 
4229
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:167
4230
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:149
4231
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:90
4232
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:167
4233
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:149
4234
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:90
4235
  msgctxt "s2member-front"
4236
  msgid "Country"
4237
  msgstr ""
4238
 
4239
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:175
4240
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:157
4241
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:98
4242
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:175
4243
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:157
4244
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:98
4245
  msgctxt "s2member-front"
4246
  msgid "Postal / Zip Code"
4247
  msgstr ""
4248
 
4249
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:191
4250
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:173
4251
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:191
4252
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:173
4253
  msgctxt "s2member-front"
4254
  msgid "Checkout Now"
4255
  msgstr ""
4256
 
4257
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:74
4258
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:74
4259
  msgctxt "s2member-front"
4260
  msgid "Complete Registration"
4261
  msgstr ""
4262
 
4263
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:60
4264
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:60
4265
  msgctxt "s2member-front"
4266
  msgid "Contact Info"
4267
  msgstr ""
4268
 
4269
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:27
4270
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:27
4271
  msgctxt "s2member-front"
4272
  msgid "New Billing Method"
4273
  msgstr ""
4274
 
4275
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:111
4276
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:111
4277
  msgctxt "s2member-front"
4278
  msgid "Update Billing Information"
4279
  msgstr ""
4
  msgstr ""
5
  "Project-Id-Version: s2Member® Framework 130816\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2013-11-09 09:23:22+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
21
  #: s2member/includes/classes/custom-reg-fields.inc.php:464
22
  #: s2member/includes/classes/profile-in.inc.php:120
23
  #: s2member/includes/classes/sc-profile-in.inc.php:136
24
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:66
25
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:34
26
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:66
27
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:66
28
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:34
29
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:66
30
  msgctxt "s2member-front"
31
  msgid "First Name"
32
  msgstr ""
35
  #: s2member/includes/classes/custom-reg-fields.inc.php:479
36
  #: s2member/includes/classes/profile-in.inc.php:140
37
  #: s2member/includes/classes/sc-profile-in.inc.php:156
38
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:72
39
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:40
40
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:72
41
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:72
42
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:40
43
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:72
44
  msgctxt "s2member-front"
45
  msgid "Last Name"
46
  msgstr ""
63
  #: s2member/includes/classes/custom-reg-fields.inc.php:446
64
  #: s2member/includes/classes/profile-in.inc.php:243
65
  #: s2member/includes/classes/sc-profile-in.inc.php:259
66
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:94
67
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:62
68
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:94
69
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:62
70
  msgctxt "s2member-front"
71
  msgid "password strength indicator"
72
  msgstr ""
728
 
729
  #: s2member/includes/classes/profile-in.inc.php:98
730
  #: s2member/includes/classes/sc-profile-in.inc.php:114
731
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:78
732
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:46
733
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:78
734
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:78
735
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:46
736
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:78
737
  msgctxt "s2member-front"
738
  msgid "Email Address"
739
  msgstr ""
818
  #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
819
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
820
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:270
821
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:562
822
  msgctxt "s2member-front paypal-button-lang-code"
823
  msgid "en_US"
824
  msgstr ""
891
  msgid "(for this site)"
892
  msgstr ""
893
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
894
  #: s2member/includes/classes/utils-time.inc.php:53
895
  msgctxt "s2member-front"
896
  msgid "less than a minute"
1195
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:239
1196
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:246
1197
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:253
1198
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:497
1199
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:504
1200
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:769
1201
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:776
1202
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:783
1203
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:790
1204
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1205
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:66
1206
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:73
1210
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:239
1211
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:246
1212
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:253
1213
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:537
1214
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:544
1215
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:857
1216
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:864
1217
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:871
1218
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:878
1219
  msgctxt "s2member-front"
1220
  msgid "— Oops, you missed something: —"
1221
  msgstr ""
1224
  #: s2member/includes/s2member.js:192
1225
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1226
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:239
1227
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:776
1228
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1229
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:239
1230
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:864
1231
  msgctxt "s2member-front"
1232
  msgid "Passwords do not match up. Please try again."
1233
  msgstr ""
1236
  #: s2member/includes/s2member.js:199
1237
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1238
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:246
1239
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:783
1240
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1241
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:246
1242
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:871
1243
  msgctxt "s2member-front"
1244
  msgid "Password MUST be at least 6 characters. Please try again."
1245
  msgstr ""
1246
 
1247
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:330
1248
+ msgctxt "s2member-front"
1249
+ msgid "Strength indicator"
1250
+ msgstr ""
1251
+
1252
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:331
1253
+ msgctxt "s2member-front"
1254
+ msgid "Very weak"
1255
+ msgstr ""
1256
+
1257
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:332
1258
+ msgctxt "s2member-front"
1259
+ msgid "Weak"
1260
+ msgstr ""
1261
+
1262
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:333
1263
+ msgctxt "s2member-front"
1264
+ msgid "Medium"
1265
+ msgstr ""
1266
+
1267
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:334
1268
+ msgctxt "s2member-front"
1269
+ msgid "Strong"
1270
+ msgstr ""
1271
+
1272
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:335
1273
+ msgctxt "s2member-front"
1274
+ msgid "Mismatch"
1275
+ msgstr ""
1276
+
1277
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:364
1278
  msgctxt "s2member-front"
1279
  msgid "Please check at least one of the boxes."
1280
  msgstr ""
1281
 
1282
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:369
1283
  msgctxt "s2member-front"
1284
  msgid "Required. This box must be checked."
1285
  msgstr ""
1286
 
1287
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:375
1288
  msgctxt "s2member-front"
1289
  msgid "Please select one of the options."
1290
  msgstr ""
1291
 
1292
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:380
1293
  msgctxt "s2member-front"
1294
  msgid "Please select at least one of the options."
1295
  msgstr ""
1296
 
1297
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:384
1298
  msgctxt "s2member-front"
1299
  msgid "This is a required field, please try again."
1300
  msgstr ""
1301
 
1302
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:390
1303
  msgctxt "s2member-front"
1304
  msgid "Must be numeric (with or without decimals, commas allowed)."
1305
  msgstr ""
1306
 
1307
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:394
1308
  msgctxt "s2member-front"
1309
  msgid "Must be numeric (with or without decimals, no commas)."
1310
  msgstr ""
1311
 
1312
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:398
1313
  msgctxt "s2member-front"
1314
  msgid "Must be an integer (a whole number, without any decimals)."
1315
  msgstr ""
1316
 
1317
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:402
1318
  msgctxt "s2member-front"
1319
  msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
1320
  msgstr ""
1321
 
1322
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:406
1323
  msgctxt "s2member-front"
1324
  msgid "Must be a float (floating point number, decimals required)."
1325
  msgstr ""
1326
 
1327
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:410
1328
  msgctxt "s2member-front"
1329
  msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
1330
  msgstr ""
1331
 
1332
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:414
1333
  msgctxt "s2member-front"
1334
  msgid "Must be a date (required date format: dd/mm/yyyy)."
1335
  msgstr ""
1336
 
1337
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:418
1338
  msgctxt "s2member-front"
1339
  msgid "Must be a valid email address."
1340
  msgstr ""
1341
 
1342
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:422
1343
  msgctxt "s2member-front"
1344
  msgid ""
1345
  "Please use a personal email address.\n"
1346
  "Addresses like <%s@> are problematic."
1347
  msgstr ""
1348
 
1349
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:426
1350
  msgctxt "s2member-front"
1351
  msgid "Must be a full URL (starting with http or https)."
1352
  msgstr ""
1353
 
1354
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:430
1355
  msgctxt "s2member-front"
1356
  msgid "Must be a domain name (domain name only, without http)."
1357
  msgstr ""
1358
 
1359
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:434
1360
  msgctxt "s2member-front"
1361
  msgid "Must be a phone # (10 digits w/possible hyphens,spaces,brackets)."
1362
  msgstr ""
1363
 
1364
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:438
1365
  msgctxt "s2member-front"
1366
  msgid "Must be a US zipcode (5-9 digits w/possible hyphen)."
1367
  msgstr ""
1368
 
1369
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:442
1370
  msgctxt "s2member-front"
1371
  msgid "Must be a Canadian zipcode (6 alpha-numerics w/possible space)."
1372
  msgstr ""
1373
 
1374
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:446
1375
  msgctxt "s2member-front"
1376
  msgid "Must be a zipcode (either a US or Canadian zipcode)."
1377
  msgstr ""
1378
 
1379
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:450
1380
  msgctxt "s2member-front"
1381
  msgid "Please use alphanumerics, spaces & punctuation only."
1382
  msgstr ""
1383
 
1384
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:454
1385
  msgctxt "s2member-front"
1386
  msgid "Please use alphanumerics & spaces only."
1387
  msgstr ""
1388
 
1389
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:458
1390
  msgctxt "s2member-front"
1391
  msgid "Please use alphanumerics & punctuation only (no spaces)."
1392
  msgstr ""
1393
 
1394
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:462
1395
  msgctxt "s2member-front"
1396
  msgid "Please use alphanumerics only (no spaces/punctuation)."
1397
  msgstr ""
1398
 
1399
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:466
1400
  msgctxt "s2member-front"
1401
  msgid "Please use alphabetics only (no digits/spaces/punctuation)."
1402
  msgstr ""
1403
 
1404
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:470
1405
  msgctxt "s2member-front"
1406
  msgid "Please use numeric digits only."
1407
  msgstr ""
1408
 
1409
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1410
  msgctxt "s2member-front"
1411
  msgid "Must be exactly %s %s."
1412
  msgstr ""
1413
 
1414
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1415
+ #: s2member/includes/s2member.js:480
1416
  msgctxt "s2member-front"
1417
  msgid "digit"
1418
  msgstr ""
1419
 
1420
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1421
+ #: s2member/includes/s2member.js:480
1422
  msgctxt "s2member-front"
1423
  msgid "digits"
1424
  msgstr ""
1425
 
1426
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1427
+ #: s2member/includes/s2member.js:480
1428
  msgctxt "s2member-front"
1429
  msgid "character"
1430
  msgstr ""
1431
 
1432
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1433
+ #: s2member/includes/s2member.js:480
1434
  msgctxt "s2member-front"
1435
  msgid "characters"
1436
  msgstr ""
1437
 
1438
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:480
1439
  msgctxt "s2member-front"
1440
  msgid "Must be at least %s %s."
1441
  msgstr ""
1442
 
1443
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:533
1444
  msgctxt "s2member-front"
1445
  msgid "Processing"
1446
  msgstr ""
3936
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:73
3937
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:167
3938
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:253
3939
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:504
3940
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:790
3941
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3942
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:73
3943
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:167
3944
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:253
3945
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:544
3946
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:878
3947
  msgctxt "s2member-front"
3948
  msgid "Security Code missing. Please try again."
3949
  msgstr ""
3950
 
3951
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3952
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:142
3953
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:479
3954
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:751
3955
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3956
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:142
3957
  msgctxt "s2member-front"
3959
  msgstr ""
3960
 
3961
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3962
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:323
3963
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:575
3964
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3965
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:327
3966
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:619
3967
  msgctxt "s2member-front"
3968
  msgid "Calculating Sales Tax..."
3969
  msgstr ""
3970
 
3971
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3972
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:323
3973
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:575
3974
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3975
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:327
3976
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:619
3977
  msgctxt "s2member-front"
3978
  msgid "calculating sales tax..."
3979
  msgstr ""
3980
 
3981
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3982
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:334
3983
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:586
3984
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3985
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:338
3986
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:630
3987
  msgctxt "s2member-front"
3988
  msgid "<strong>Sales Tax%s:</strong> %s<br /><strong>— Total%s:</strong> %s"
3989
  msgstr ""
3990
 
3991
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3992
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:334
3993
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:586
3994
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3995
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:338
3996
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:630
3997
  msgctxt "s2member-front"
3998
  msgid "Today"
3999
  msgstr ""
4000
 
4001
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4002
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:648
4003
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4004
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:692
4005
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:62
4006
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:30
4007
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:62
4008
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:30
4009
  msgctxt "s2member-front"
4010
  msgid "Create Profile"
4011
  msgstr ""
4012
 
4013
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4014
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:649
4015
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4016
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:693
4017
  msgctxt "s2member-front"
4018
  msgid "Your Profile"
4019
  msgstr ""
4021
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4022
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:269
4023
  #: s2member-pro/includes/separates/gateways/paypal/paypal.js:270
4024
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:561
4025
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:562
4026
+ #: s2member-pro/includes/templates/forms/authnet-cancellation-form.php:36
4027
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:198
4028
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:81
4029
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:179
4030
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:117
4031
+ #: s2member-pro/includes/templates/forms/paypal-cancellation-form.php:36
4032
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:198
4033
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:81
4034
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:179
4035
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:117
4036
  msgctxt "s2member-front"
4037
  msgid "Submit Form"
4038
  msgstr ""
4074
  "%s"
4075
  msgstr ""
4076
 
4077
+ #: s2member-pro/includes/templates/forms/authnet-cancellation-form.php:32
4078
+ #: s2member-pro/includes/templates/forms/paypal-cancellation-form.php:32
4079
  msgctxt "s2member-front"
4080
  msgid "Confirm Cancellation"
4081
  msgstr ""
4082
 
4083
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:21
4084
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:21
4085
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:21
4086
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:21
4087
  msgctxt "s2member-front"
4088
  msgid "Checkout Options"
4089
  msgstr ""
4090
 
4091
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:42
4092
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:42
4093
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:42
4094
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:42
4095
  msgctxt "s2member-front"
4096
  msgid "Coupon Code"
4097
  msgstr ""
4098
 
4099
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:49
4100
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:49
4101
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:49
4102
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:49
4103
  msgctxt "s2member-front"
4104
  msgid "Have a Coupon Code? (please enter it here)"
4105
  msgstr ""
4106
 
4107
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:52
4108
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:52
4109
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:52
4110
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:52
4111
  msgctxt "s2member-front"
4112
  msgid "Apply Coupon"
4113
  msgstr ""
4114
 
4115
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:84
4116
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:52
4117
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:84
4118
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:52
4119
  msgctxt "s2member-front"
4120
  msgid "Username (lowercase letters and/or numbers)"
4121
  msgstr ""
4122
 
4123
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:90
4124
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:58
4125
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:90
4126
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:58
4127
  msgctxt "s2member-front"
4128
  msgid "Password (type this twice please)"
4129
  msgstr ""
4130
 
4131
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:106
4132
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:88
4133
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:106
4134
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:88
4135
  msgctxt "s2member-front"
4136
  msgid "Billing Method"
4137
  msgstr ""
4138
 
4139
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:113
4140
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:95
4141
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:36
4142
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:113
4143
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:95
4144
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:36
4145
  msgctxt "s2member-front"
4146
  msgid "Card Number (no dashes or spaces)"
4147
  msgstr ""
4148
 
4149
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:119
4150
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:101
4151
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:42
4152
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:119
4153
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:101
4154
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:42
4155
  msgctxt "s2member-front"
4156
  msgid "Card Expiration Date (mm/yyyy)"
4157
  msgstr ""
4158
 
4159
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:130
4160
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:112
4161
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:53
4162
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:130
4163
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:112
4164
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:53
4165
  msgctxt "s2member-front"
4166
  msgid "Card Verification Code (3-4 digits)"
4167
  msgstr ""
4168
 
4169
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:130
4170
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:112
4171
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:53
4172
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:130
4173
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:112
4174
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:53
4175
  msgctxt "s2member-front"
4176
  msgid "need help?"
4177
  msgstr ""
4178
 
4179
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:137
4180
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:119
4181
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:60
4182
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:137
4183
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:119
4184
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:60
4185
  msgctxt "s2member-front"
4186
  msgid "Card Start Date (mm/yyyy), or Issue Number"
4187
  msgstr ""
4188
 
4189
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:147
4190
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:129
4191
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:70
4192
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:147
4193
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:129
4194
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:70
4195
  msgctxt "s2member-front"
4196
  msgid "Billing Address"
4197
  msgstr ""
4198
 
4199
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:151
4200
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:133
4201
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:74
4202
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:151
4203
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:133
4204
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:74
4205
  msgctxt "s2member-front"
4206
  msgid "Street Address"
4207
  msgstr ""
4208
 
4209
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:157
4210
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:139
4211
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:80
4212
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:157
4213
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:139
4214
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:80
4215
  msgctxt "s2member-front"
4216
  msgid "City / Town"
4217
  msgstr ""
4218
 
4219
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:163
4220
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:145
4221
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:86
4222
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:163
4223
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:145
4224
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:86
4225
  msgctxt "s2member-front"
4226
  msgid "State / Province"
4227
  msgstr ""
4228
 
4229
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:169
4230
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:151
4231
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:92
4232
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:169
4233
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:151
4234
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:92
4235
  msgctxt "s2member-front"
4236
  msgid "Country"
4237
  msgstr ""
4238
 
4239
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:177
4240
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:159
4241
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:100
4242
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:177
4243
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:159
4244
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:100
4245
  msgctxt "s2member-front"
4246
  msgid "Postal / Zip Code"
4247
  msgstr ""
4248
 
4249
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:193
4250
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:175
4251
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:193
4252
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:175
4253
  msgctxt "s2member-front"
4254
  msgid "Checkout Now"
4255
  msgstr ""
4256
 
4257
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:76
4258
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:76
4259
  msgctxt "s2member-front"
4260
  msgid "Complete Registration"
4261
  msgstr ""
4262
 
4263
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:62
4264
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:62
4265
  msgctxt "s2member-front"
4266
  msgid "Contact Info"
4267
  msgstr ""
4268
 
4269
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:29
4270
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:29
4271
  msgctxt "s2member-front"
4272
  msgid "New Billing Method"
4273
  msgstr ""
4274
 
4275
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:113
4276
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:113
4277
  msgctxt "s2member-front"
4278
  msgid "Update Billing Information"
4279
  msgstr ""
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
- === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 131026
4
- Stable tag: 131026
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -16,7 +16,7 @@ Authorize.Net® Compatible: yes w/s2Member® Pro
16
  Google® Checkout Compatible: yes w/s2Member® Pro
17
  ClickBank® Compatible: yes w/s2Member® Pro
18
 
19
- Tested up to: 3.7
20
  Requires at least: 3.3
21
 
22
  Copyright: © 2009 WebSharks, Inc.
@@ -36,6 +36,7 @@ Plugin URI: http://www.s2member.com/framework/
36
  Privacy URI: http://www.s2member.com/privacy/
37
  Video Tutorials: http://www.s2member.com/videos/
38
  Knowledge Base: http://www.s2member.com/kb/
 
39
  Pro Module / Home Page: http://www.s2member.com/
40
  Pro Module / Prices: http://www.s2member.com/prices/
41
  Pro Module / Auto-Update URL: https://www.s2member.com/
@@ -72,6 +73,16 @@ s2Member allows you to protect Pages, Posts, Tags, Categories, URIs, URI word fr
72
 
73
  You can learn more about s2Member® at [s2Member.com](http://www.s2member.com/).
74
 
 
 
 
 
 
 
 
 
 
 
75
  == Frequently Asked Questions ==
76
 
77
  = Please check the following s2Member® resources: =
@@ -86,11 +97,22 @@ Please see [this FAQ entry](http://www.s2member.com/faqs/#s2-faqs-translations)
86
 
87
  == Upgrade Notice ==
88
 
89
- = v131026 =
90
  (Maintenance Release) Upgrade immediately.
91
 
92
  == Changelog ==
93
 
 
 
 
 
 
 
 
 
 
 
 
94
  = v131026 =
95
  * (s2Member) **WordPress v3.7 Compatibility** s2Member further updated to support subtle changes in the WordPress v3.7 `wp-login.php` file. This release corrects a minor issue w/ patches applied by s2Member when running in a Multisite Network environment. If you are running s2Member on a Multisite Network, please be sure to run the automatic patcher provided in your Dashboard against WordPress v3.7 after updating to this release of s2Member.
96
  * (s2Member Pro) **PayPal Central IPN** Updating the example file: `s2m-pro-extras/paypal-central-ipn.php` to use one of the latest PayPal IP addresses listed [here](https://ppmts.custhelp.com/app/answers/detail/a_id/92).
@@ -397,4 +419,4 @@ Please see [this FAQ entry](http://www.s2member.com/faqs/#s2-faqs-translations)
397
 
398
  = v120301 - 1.0 =
399
  * ... trimmed away at v111220.
400
- * Initial release: v1.0.
1
+ === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 131109
4
+ Stable tag: 131109
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
16
  Google® Checkout Compatible: yes w/s2Member® Pro
17
  ClickBank® Compatible: yes w/s2Member® Pro
18
 
19
+ Tested up to: 3.7.1
20
  Requires at least: 3.3
21
 
22
  Copyright: © 2009 WebSharks, Inc.
36
  Privacy URI: http://www.s2member.com/privacy/
37
  Video Tutorials: http://www.s2member.com/videos/
38
  Knowledge Base: http://www.s2member.com/kb/
39
+ Newsletter: http://www.s2member.com/r/subscribe/
40
  Pro Module / Home Page: http://www.s2member.com/
41
  Pro Module / Prices: http://www.s2member.com/prices/
42
  Pro Module / Auto-Update URL: https://www.s2member.com/
73
 
74
  You can learn more about s2Member® at [s2Member.com](http://www.s2member.com/).
75
 
76
+ == Screenshots ==
77
+
78
+ 1. s2Member Screenshot #1
79
+ 2. s2Member Screenshot #2
80
+ 3. s2Member Screenshot #3
81
+ 4. s2Member Screenshot #4
82
+ 5. s2Member Screenshot #5
83
+ 6. s2Member Screenshot #6
84
+ 7. s2Member Screenshot #7
85
+
86
  == Frequently Asked Questions ==
87
 
88
  = Please check the following s2Member® resources: =
97
 
98
  == Upgrade Notice ==
99
 
100
+ = v131109 =
101
  (Maintenance Release) Upgrade immediately.
102
 
103
  == Changelog ==
104
 
105
+ = v131109 =
106
+ * (s2Member/s2Member Pro) **UI Makeover** This release of s2Member upgrades all administrative UI panels.
107
+ * (s2Member/s2Member Pro) **Compatibility** Updating s2Member for compatibility with the coming release of both Quick Cache LITE and Quick Cache Pro for WordPress. These are not available publicly yet, but they are expected for release very soon. This release of s2Member is compatible with both the current and future releases of Quick Cache for WordPress.
108
+ * (s2Member/s2Member Pro) **Improvement (Speed)** Lazy load s2Member's JS file at all times. Done, this release will speed your site up for first-time visitors.
109
+ * (s2Member/s2Member Pro) **Improvement (Speed)** Lazy load s2Member's CSS file at all times. Done, this release will speed your site up for first-time visitors.
110
+ * (s2Member/s2Member Pro) **Improvement (Speed)** Load s2Member's JS library in the footer if at all possible (instead of the `<head>`). Done, this will improve the speed of your site for first-time visitors.
111
+ * (s2Member/s2Member Pro) **Debug Notices** Resolved all of the most obvious PHP notices when running s2Member in debug mode. This improvement impacts developers only.
112
+ * (s2Member/s2Member Pro) **Password Strength Meter** Removed dependence on `password-strength-meter` (a JavaScript library) from the WordPress core. This was causing some SSL issues for site owners. In the past it was necessary for s2Member to load an additional JS resource for registration/checkout and Pro Forms (`password-strength-meter`). Starting with this release, s2Member handles password strength meters all by itself, thereby avoiding the additional overhead; and also the issues associated with this core functionality over SSL pages. Fixed in this release.
113
+ * (s2Member/s2Member Pro) **Mobile Devices** The s2Stream shortcode (for protected audio/video files) was updated to better support mobile device playback. See also: <http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#s2stream-mobile-devices>.
114
+ * (s2Member Pro) **Checkout Options** Improving support for multiple Checkout Options. When a customer changes to a new Checkout Option by selecting an option from the drop-down menu in a Pro Form; this action will now result in a hash jump back to the location of the Pro Form on any given page; instead of to the top of the page, which could potentially result in a confusing experience on some sites (depending on the implementation). Aside: for developers, it's helpful to know that all s2Member Pro Forms now have a hashable ID `#s2p-form` that is cleaner than the longer (product-specific) IDs associated with Pro Forms; e.g. `s2member-pro-paypal-form...`, etc. If you need to hash a Pro Form, please use the more general `#s2p-form` on the end of a URL. This will take a customer directly to that Pro Form in the context of any given page.
115
+
116
  = v131026 =
117
  * (s2Member) **WordPress v3.7 Compatibility** s2Member further updated to support subtle changes in the WordPress v3.7 `wp-login.php` file. This release corrects a minor issue w/ patches applied by s2Member when running in a Multisite Network environment. If you are running s2Member on a Multisite Network, please be sure to run the automatic patcher provided in your Dashboard against WordPress v3.7 after updating to this release of s2Member.
118
  * (s2Member Pro) **PayPal Central IPN** Updating the example file: `s2m-pro-extras/paypal-central-ipn.php` to use one of the latest PayPal IP addresses listed [here](https://ppmts.custhelp.com/app/answers/detail/a_id/92).
419
 
420
  = v120301 - 1.0 =
421
  * ... trimmed away at v111220.
422
+ * Initial release: v1.0.
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 131026
23
- Stable tag: 131026
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
@@ -35,7 +35,7 @@ Authorize.Net Compatible: yes w/s2Member Pro
35
  Google Checkout Compatible: yes w/s2Member Pro
36
  ClickBank Compatible: yes w/s2Member Pro
37
 
38
- Tested up to: 3.7
39
  Requires at least: 3.3
40
 
41
  Copyright: © 2009 WebSharks, Inc.
@@ -75,7 +75,7 @@ if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
- define("WS_PLUGIN__S2MEMBER_VERSION", "131026" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
@@ -105,7 +105,7 @@ if(!defined("WS_PLUGIN__S2MEMBER_MIN_WP_VERSION"))
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
- define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "131026" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
+ Version: 131109
23
+ Stable tag: 131109
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
35
  Google Checkout Compatible: yes w/s2Member Pro
36
  ClickBank Compatible: yes w/s2Member Pro
37
 
38
+ Tested up to: 3.7.1
39
  Requires at least: 3.3
40
 
41
  Copyright: © 2009 WebSharks, Inc.
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
+ define("WS_PLUGIN__S2MEMBER_VERSION", "131109" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
+ define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "131109" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.