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

Version Description

= v120514 = Maintenance release. Upgrade immediately.

Download this release

Release Info

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

Code changes from version 120309 to 120514

includes/classes/paypal-utilities.inc.php CHANGED
@@ -14,10 +14,10 @@
14
  * @package s2Member\PayPal
15
  * @since 3.5
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_paypal_utilities"))
21
  {
22
  /**
23
  * PayPal® utilities.
@@ -35,20 +35,20 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
35
  *
36
  * @return array|bool An array of verified ``$_POST`` or ``$_REQUEST`` variables, else false.
37
  */
38
- public static function paypal_postvars ()
39
  {
40
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
41
- do_action ("ws_plugin__s2member_before_paypal_postvars", get_defined_vars ());
42
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
43
  /*
44
  Custom conditionals can be applied by filters.
45
  */
46
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
47
- if (!($postvars = apply_filters ("ws_plugin__s2member_during_paypal_postvars_conditionals", array (), get_defined_vars ())))
48
  {
49
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
50
  /**/
51
- if (!empty ($_GET["tx"]) && empty ($_GET["s2member_paypal_proxy"]))
52
  {
53
  $postback["tx"] = $_GET["tx"];
54
  $postback["cmd"] = "_notify-synch";
@@ -56,53 +56,53 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
56
  /**/
57
  $endpoint = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com";
58
  /**/
59
- if (preg_match ("/^SUCCESS/i", ($response = trim (c_ws_plugin__s2member_utils_urls::remote ("https://" . $endpoint . "/cgi-bin/webscr", $postback, array ("timeout" => 20))))))
60
  {
61
- foreach (preg_split ("/[\r\n]+/", preg_replace ("/^SUCCESS/i", "", $response)) as $varline)
62
  {
63
- list ($key, $value) = preg_split ("/\=/", $varline, 2);
64
- if (strlen ($key = trim ($key)) && strlen ($value = trim ($value)))
65
- $postvars[$key] = trim (stripslashes (urldecode ($value)));
66
  }
67
  /**/
68
- return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
69
  }
70
  else /* Nope. */
71
- return false;
72
  }
73
- else if (!empty ($_REQUEST) && is_array ($postvars = stripslashes_deep ($_REQUEST)))
74
  {
75
- foreach ($postvars as $key => $value)
76
- if (preg_match ("/^s2member_/", $key))
77
- unset ($postvars[$key]);
78
  /**/
79
  $postback = $postvars; /* Copy. */
80
  $postback["cmd"] = "_notify-validate";
81
  /**/
82
- $postvars = c_ws_plugin__s2member_utils_strings::trim_deep ($postvars);
83
  /**/
84
  $endpoint = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com";
85
  /**/
86
- if (!empty ($_GET["s2member_paypal_proxy"]) && !empty ($_GET["s2member_paypal_proxy_verification"]) && $_GET["s2member_paypal_proxy_verification"] === c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen ())
87
- return apply_filters ("ws_plugin__s2member_paypal_postvars", array_merge ($postvars, array ("proxy_verified" => $_GET["s2member_paypal_proxy"])), get_defined_vars ());
88
  /**/
89
- else if (empty ($_POST) && !empty ($_GET["s2member_paypal_proxy"]) && !empty ($_GET["s2member_paypal_proxy_verification"]) && c_ws_plugin__s2member_utils_urls::s2member_sig_ok ($_SERVER["REQUEST_URI"], false, false, "s2member_paypal_proxy_verification"))
90
- return apply_filters ("ws_plugin__s2member_paypal_postvars", array_merge ($postvars, array ("proxy_verified" => $_GET["s2member_paypal_proxy"])), get_defined_vars ());
91
  /**/
92
- else if (trim (strtolower (c_ws_plugin__s2member_utils_urls::remote ("https://" . $endpoint . "/cgi-bin/webscr", $postback, array ("timeout" => 20)))) === "verified")
93
- return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
94
  /**/
95
  else /* Nope. */
96
- return false;
97
  }
98
  else /* Nope. */
99
- return false;
100
  }
101
  else /* Else a custom conditional has been applied by Filters. */
102
  {
103
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
104
  /**/
105
- return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
106
  }
107
  }
108
  /**
@@ -113,21 +113,21 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
113
  *
114
  * @return str A Proxy Key. It's an MD5 Hash, 32 chars, URL-safe.
115
  */
116
- public static function paypal_proxy_key_gen () /* Generate Key. */
117
  {
118
  global $current_site, $current_blog; /* Multisite Networking. */
119
  /**/
120
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
121
- do_action ("ws_plugin__s2member_before_paypal_proxy_key_gen", get_defined_vars ());
122
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
123
  /**/
124
- if (is_multisite () && !is_main_site ())
125
- $key = md5 (c_ws_plugin__s2member_utils_encryption::xencrypt ($current_blog->domain . $current_blog->path, false, false));
126
  /**/
127
  else /* Else it's a standard Proxy Key; not on a Multisite Network, or not on the Main Site anyway. */
128
- $key = md5 (c_ws_plugin__s2member_utils_encryption::xencrypt (preg_replace ("/\:[0-9]+$/", "", $_SERVER["HTTP_HOST"]), false, false));
129
  /**/
130
- return apply_filters ("ws_plugin__s2member_paypal_proxy_key_gen", $key, get_defined_vars ());
131
  }
132
  /**
133
  * Calls upon the PayPal® API, and returns the response.
@@ -141,60 +141,60 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
141
  * @todo Optimize this routine with ``empty()`` and ``isset()``.
142
  * @todo Possibly integrate this API: {@link http://msdn.microsoft.com/en-us/library/ff512417.aspx}.
143
  */
144
- public static function paypal_api_response ($post_vars = FALSE)
145
  {
146
  global /* For Multisite support. */ $current_site, $current_blog;
147
  /**/
148
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
149
- do_action ("ws_plugin__s2member_before_paypal_api_response", get_defined_vars ());
150
- unset /* Unset defined __refs, __v. */ ($__refs, $__v);
151
  /**/
152
- $url = "https://" . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "api-3t.sandbox.paypal.com" : "api-3t.paypal.com") . "/nvp";
153
  /**/
154
- $post_vars = apply_filters ("ws_plugin__s2member_paypal_api_post_vars", $post_vars, get_defined_vars ());
155
- $post_vars = (is_array ($post_vars)) ? $post_vars : array ();
156
  /**/
157
  $post_vars["VERSION"] = /* Configure the PayPal® API version. */ "71.0";
158
  $post_vars["USER"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_username"];
159
  $post_vars["PWD"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_password"];
160
  $post_vars["SIGNATURE"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_signature"];
161
  /**/
162
- $input_time = /* Record input/nvp for logging. */ date ("D M j, Y g:i:s a T");
163
  /**/
164
- $nvp = trim (c_ws_plugin__s2member_utils_urls::remote ($url, $post_vars, array ("timeout" => 20)));
165
  /**/
166
- $output_time = /* Now record after output time. */ date ("D M j, Y g:i:s a T");
167
  /**/
168
- wp_parse_str /* Parse NVP response. */ ($nvp, $response);
169
- $response = c_ws_plugin__s2member_utils_strings::trim_deep ($response);
170
  /**/
171
- if (!$response["ACK"] || !preg_match ("/^(Success|SuccessWithWarning)$/i", $response["ACK"]))
172
  {
173
- if (strlen ($response["L_ERRORCODE0"]) || $response["L_SHORTMESSAGE0"] || $response["L_LONGMESSAGE0"])
174
  /* translators: Exclude `%2$s` and `%3$s`. These are English details returned by PayPal®. Replace `%2$s` and `%3$s` with: `Unable to process, please try again`, or something to that affect. Or, if you prefer, you could Filter ``$response["__error"]`` with `ws_plugin__s2member_paypal_api_response`. */
175
- $response["__error"] = sprintf (_x ('Error #%1$s. %2$s. %3$s.', "s2member-front", "s2member"), $response["L_ERRORCODE0"], rtrim ($response["L_SHORTMESSAGE0"], "."), rtrim ($response["L_LONGMESSAGE0"], "."));
176
  /**/
177
  else /* Else, generate an error messsage - so something is reported back to the Customer. */
178
- $response["__error"] = _x ("Error. Please contact Support for assistance.", "s2member-front", "s2member");
179
  }
180
  /**/
181
- $logv = c_ws_plugin__s2member_utilities::ver_details ();
182
- $logm = c_ws_plugin__s2member_utilities::mem_details ();
183
- $log4 = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . "\nUser-Agent: " . $_SERVER["HTTP_USER_AGENT"];
184
- $log4 = (is_multisite () && !is_main_site ()) ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4;
185
- $log2 = (is_multisite () && !is_main_site ()) ? "paypal-api-4-" . trim (preg_replace ("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "paypal-api.log";
186
  /**/
187
- if (isset ($post_vars["ACCT"]) && strlen ($post_vars["ACCT"]) > 4)
188
- $post_vars["ACCT"] = str_repeat ("*", strlen ($post_vars["ACCT"]) - 4) . substr ($post_vars["ACCT"], -4);
189
  /**/
190
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"])
191
- if (is_dir ($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
192
- if (is_writable ($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files ())
193
- if (($log = "-------- Input vars: ( " . $input_time . " ) --------\n" . var_export ($post_vars, true) . "\n"))
194
- if (($log .= "-------- Output string/vars: ( " . $output_time . " ) --------\n" . $nvp . "\n" . var_export ($response, true)))
195
- file_put_contents ($logs_dir . "/" . $log2, $logv . "\n" . $logm . "\n" . $log4 . "\n" . $log . "\n\n", FILE_APPEND);
196
  /**/
197
- return apply_filters ("ws_plugin__s2member_paypal_api_response", c_ws_plugin__s2member_paypal_utilities::_paypal_api_response_filters ($response), get_defined_vars ());
198
  }
199
  /**
200
  * A sort of callback function that Filters PayPal® responses.
@@ -207,27 +207,130 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
207
  * @param array $response Expects an array of response variables returned by the PayPal® API.
208
  * @return array An array of variables returned by the PayPal® API, after ``$response["__error"]`` is Filtered.
209
  */
210
- public static function _paypal_api_response_filters ($response = FALSE)
211
  {
212
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
213
- do_action ("_ws_plugin__s2member_before_paypal_api_response_filters", get_defined_vars ());
214
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
215
  /**/
216
- if (!empty ($response["__error"]) && !empty ($response["L_ERRORCODE0"]))
217
  {
218
- if ((int)$response["L_ERRORCODE0"] === 10422)
219
- $response["__error"] = sprintf (_x ("Error #%s. Transaction declined. Please use an alternate funding source.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
220
  /**/
221
- else if ((int)$response["L_ERRORCODE0"] === 10435)
222
- $response["__error"] = sprintf (_x ("Error #%s. Transaction declined. Express Checkout was NOT confirmed.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
223
  /**/
224
- else if ((int)$response["L_ERRORCODE0"] === 10417)
225
- $response["__error"] = sprintf (_x ("Error #%s. Transaction declined. Please use an alternate funding source.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
226
  }
227
  /**/
228
  return $response; /* Filters already applied with: ``ws_plugin__s2member_paypal_api_response``. */
229
  }
230
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
  * Converts a term `D|W|M|Y` into PayPal® Pro format.
232
  *
233
  * @package s2Member\PayPal
@@ -236,17 +339,48 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
236
  * @param str $term Expects one of `D|W|M|Y`.
237
  * @return bool|str A full singular description of the term *( i.e. `Day|Week|Month|Year` )*, else false.
238
  */
239
- public static function paypal_pro_term ($term = FALSE)
240
  {
241
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
242
- do_action ("ws_plugin__s2member_before_paypal_pro_term", get_defined_vars ());
243
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
244
  /**/
245
- $paypal_pro_terms = array ("D" => "Day", "W" => "Week", "M" => "Month", "Y" => "Year");
246
  /**/
247
- $pro_term = (!empty ($paypal_pro_terms[strtoupper ($term)])) ? $paypal_pro_terms[strtoupper ($term)] : false;
248
  /**/
249
- return apply_filters ("ws_plugin__s2member_paypal_pro_term", $pro_term, get_defined_vars ());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  }
251
  /**
252
  * Converts a term `Day|Week|Month|Year` into PayPal® Standard format.
@@ -257,17 +391,17 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
257
  * @param str $term Expects one of `Day|Week|Month|Year`.
258
  * @return bool|str A term code *( i.e. `D|W|M|Y` )*, else false.
259
  */
260
- public static function paypal_std_term ($term = FALSE)
261
  {
262
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
263
- do_action ("ws_plugin__s2member_before_paypal_std_term", get_defined_vars ());
264
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
265
  /**/
266
- $paypal_std_terms = array ("DAY" => "D", "WEEK" => "W", "MONTH" => "M", "YEAR" => "Y");
267
  /**/
268
- $std_term = (!empty ($paypal_std_terms[strtoupper ($term)])) ? $paypal_std_terms[strtoupper ($term)] : false;
269
  /**/
270
- return apply_filters ("ws_plugin__s2member_paypal_std_term", $std_term, get_defined_vars ());
271
  }
272
  /**
273
  * Get `subscr_id` from either an array with `recurring_payment_id|subscr_id`, or use an existing string.
@@ -278,22 +412,22 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
278
  * @param str|array $array_or_string Either an array of PayPal® post vars, or a string.
279
  * @return str|bool A `subscr_id` string if non-empty, else false.
280
  */
281
- public static function paypal_pro_subscr_id ($array_or_string = FALSE)
282
  {
283
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
284
- do_action ("ws_plugin__s2member_before_paypal_pro_subscr_id", get_defined_vars ());
285
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
286
  /**/
287
- if (is_array ($array = $array_or_string) && !empty ($array["recurring_payment_id"]))
288
- $subscr_id = trim ($array["recurring_payment_id"]);
289
  /**/
290
- else if (is_array ($array = $array_or_string) && !empty ($array["subscr_id"]))
291
- $subscr_id = trim ($array["subscr_id"]);
292
  /**/
293
- else if (is_string ($string = $array_or_string) && !empty ($string))
294
- $subscr_id = trim ($string);
295
  /**/
296
- return apply_filters ("ws_plugin__s2member_paypal_pro_subscr_id", ((!empty ($subscr_id)) ? $subscr_id : false), get_defined_vars ());
297
  }
298
  /**
299
  * Get `item_number` from either an array with `PROFILEREFERENCE|rp_invoice_id|item_number1|item_number`, or use an existing string.
@@ -305,31 +439,34 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
305
  * If it's a string, we make sure it is a valid `level:ccaps:eotper` or `sp:ids:expiration` combination.
306
  * @return str|bool An `item_number` string if non-empty, else false.
307
  */
308
- public static function paypal_pro_item_number ($array_or_string = FALSE)
309
  {
310
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
311
- do_action ("ws_plugin__s2member_before_paypal_pro_item_number", get_defined_vars ());
312
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
313
  /**/
314
- if (is_array ($array = $array_or_string) && (!empty ($array["PROFILEREFERENCE"]) || !empty ($array["rp_invoice_id"])))
315
- list ($_reference, $_domain, $_item_number) = array_map ("trim", preg_split ("/~/", ((!empty ($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
316
  /**/
317
- else if (is_array ($array = $array_or_string) && !empty ($array["item_number1"]))
318
- $_item_number = trim ($array["item_number1"]);
319
  /**/
320
- else if (is_array ($array = $array_or_string) && !empty ($array["item_number"]))
321
- $_item_number = trim ($array["item_number"]);
322
  /**/
323
- else if (is_string ($string = $array_or_string) && !empty ($string))
324
- $_item_number = trim ($string);
325
  /**/
326
- if (!empty ($_item_number) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_or_wo_level_regex"], $_item_number))
 
 
 
327
  $item_number = $_item_number;
328
  /**/
329
- else if (!empty ($_item_number) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["sp_access_item_number_regex"], $_item_number))
330
  $item_number = $_item_number;
331
  /**/
332
- return apply_filters ("ws_plugin__s2member_paypal_pro_item_number", ((!empty ($item_number)) ? $item_number : false), get_defined_vars ());
333
  }
334
  /**
335
  * Get `item_name` from either an array with `product_name|item_name1|item_name`, or use an existing string.
@@ -340,25 +477,25 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
340
  * @param str|array $array_or_string Either an array of PayPal® post vars, or a string.
341
  * @return str|bool An `item_name` string if non-empty, else false.
342
  */
343
- public static function paypal_pro_item_name ($array_or_string = FALSE)
344
  {
345
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
346
- do_action ("ws_plugin__s2member_before_paypal_pro_item_name", get_defined_vars ());
347
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
348
  /**/
349
- if (is_array ($array = $array_or_string) && !empty ($array["product_name"]))
350
- $item_name = trim ($array["product_name"]);
351
  /**/
352
- else if (is_array ($array = $array_or_string) && !empty ($array["item_name1"]))
353
- $item_name = trim ($array["item_name1"]);
354
  /**/
355
- else if (is_array ($array = $array_or_string) && !empty ($array["item_name"]))
356
- $item_name = trim ($array["item_name"]);
357
  /**/
358
- else if (is_string ($string = $array_or_string) && !empty ($string))
359
- $item_name = trim ($string);
360
  /**/
361
- return apply_filters ("ws_plugin__s2member_paypal_pro_item_name", ((!empty ($item_name)) ? $item_name : false), get_defined_vars ());
362
  }
363
  /**
364
  * Get `period1` from either an array with `PROFILEREFERENCE|rp_invoice_id|period1`, or use an existing string.
@@ -374,43 +511,46 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
374
  * @param str $default Optional. Value if unavailable. Defaults to `0 D`.
375
  * @return str A `period1` string if possible, or defaults to `0 D`.
376
  */
377
- public static function paypal_pro_period1 ($array_or_string = FALSE, $default = "0 D")
378
  {
379
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
380
- do_action ("ws_plugin__s2member_before_paypal_pro_period1", get_defined_vars ());
381
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
 
 
 
382
  /**/
383
- if (is_array ($array = $array_or_string) && (!empty ($array["PROFILEREFERENCE"]) || !empty ($array["rp_invoice_id"])))
384
  {
385
- list ($_reference, $_domain, $_item_number) = array_map ("trim", preg_split ("/~/", ((!empty ($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
386
- list ($_start_time, $_period1, $_period3) = array_map ("trim", preg_split ("/\:/", $_reference, 3));
387
  }
388
- else if (is_array ($array = $array_or_string) && !empty ($array["period1"]))
389
- $_period1 = trim ($array["period1"]);
390
  /**/
391
- else if (is_string ($string = $array_or_string) && !empty ($string))
392
- $_period1 = trim ($string);
393
  /**/
394
- if (!empty ($_period1)) /* Were we able to get a `period1` string? */
395
  {
396
- list ($num, $span) = array_map ("trim", preg_split ("/ /", $_period1, 2));
397
  /**/
398
- if (strtoupper ($span) === "SEMIMONTH")
399
- if (is_numeric ($num) && $num >= 1)
400
- eval ('$num = "2"; $span = "W";');
401
  /**/
402
- if (strlen ($span) !== 1) /* To Standard format. */
403
- $span = c_ws_plugin__s2member_paypal_utilities::paypal_std_term ($span);
404
  /**/
405
- $span = (preg_match ("/^[DWMY]$/i", $span)) ? $span : "";
406
- $num = ($span && is_numeric ($num) && $num >= 0) ? $num : "";
407
  /**/
408
- $period1 = ($num && $span) ? $num . " " . strtoupper ($span) : $default;
409
  /**/
410
- return apply_filters ("ws_plugin__s2member_paypal_pro_period1", $period1, get_defined_vars ());
411
  }
412
  else /* Default. */
413
- return apply_filters ("ws_plugin__s2member_paypal_pro_period1", $default, get_defined_vars ());
414
  }
415
  /**
416
  * Get `period3` from either an array with `PROFILEREFERENCE|rp_invoice_id|period3`, or use an existing string.
@@ -427,43 +567,46 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_utilities"))
427
  * @param str $default Optional. Value if unavailable. Defaults to `1 D`.
428
  * @return str A `period3` string if possible, or defaults to `1 D`.
429
  */
430
- public static function paypal_pro_period3 ($array_or_string = FALSE, $default = "1 D")
431
  {
432
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
433
- do_action ("ws_plugin__s2member_before_paypal_pro_period3", get_defined_vars ());
434
- unset ($__refs, $__v); /* Unset defined __refs, __v. */
 
 
 
435
  /**/
436
- if (is_array ($array = $array_or_string) && (!empty ($array["PROFILEREFERENCE"]) || !empty ($array["rp_invoice_id"])))
437
  {
438
- list ($_reference, $_domain, $_item_number) = array_map ("trim", preg_split ("/~/", ((!empty ($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
439
- list ($_start_time, $_period1, $_period3) = array_map ("trim", preg_split ("/\:/", $_reference, 3));
440
  }
441
- else if (is_array ($array = $array_or_string) && !empty ($array["period3"]))
442
- $_period3 = trim ($array["period3"]);
443
  /**/
444
- else if (is_string ($string = $array_or_string) && !empty ($string))
445
- $_period3 = trim ($string);
446
  /**/
447
- if (!empty ($_period3)) /* Were we able to get a `period3` string? */
448
  {
449
- list ($num, $span) = array_map ("trim", preg_split ("/ /", $_period3, 2));
450
  /**/
451
- if (strtoupper ($span) === "SEMIMONTH")
452
- if (is_numeric ($num) && $num >= 1)
453
- eval ('$num = "2"; $span = "W";');
454
  /**/
455
- if (strlen ($span) !== 1) /* To Standard format. */
456
- $span = c_ws_plugin__s2member_paypal_utilities::paypal_std_term ($span);
457
  /**/
458
- $span = (preg_match ("/^[DWMY]$/i", $span)) ? $span : "";
459
- $num = ($span && is_numeric ($num) && $num >= 0) ? $num : "";
460
  /**/
461
- $period3 = ($num && $span) ? $num . " " . strtoupper ($span) : $default;
462
  /**/
463
- return apply_filters ("ws_plugin__s2member_paypal_pro_period3", $period3, get_defined_vars ());
464
  }
465
  else /* Default. */
466
- return apply_filters ("ws_plugin__s2member_paypal_pro_period3", $default, get_defined_vars ());
467
  }
468
  }
469
  }
14
  * @package s2Member\PayPal
15
  * @since 3.5
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_paypal_utilities"))
21
  {
22
  /**
23
  * PayPal® utilities.
35
  *
36
  * @return array|bool An array of verified ``$_POST`` or ``$_REQUEST`` variables, else false.
37
  */
38
+ public static function paypal_postvars()
39
  {
40
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
41
+ do_action("ws_plugin__s2member_before_paypal_postvars", get_defined_vars());
42
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
43
  /*
44
  Custom conditionals can be applied by filters.
45
  */
46
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
47
+ if(!($postvars = apply_filters("ws_plugin__s2member_during_paypal_postvars_conditionals", array(), get_defined_vars())))
48
  {
49
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
50
  /**/
51
+ if(!empty($_GET["tx"]) && empty($_GET["s2member_paypal_proxy"]))
52
  {
53
  $postback["tx"] = $_GET["tx"];
54
  $postback["cmd"] = "_notify-synch";
56
  /**/
57
  $endpoint = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com";
58
  /**/
59
+ if(preg_match("/^SUCCESS/i", ($response = trim(c_ws_plugin__s2member_utils_urls::remote("https://".$endpoint."/cgi-bin/webscr", $postback, array("timeout" => 20))))))
60
  {
61
+ foreach(preg_split("/[\r\n]+/", preg_replace("/^SUCCESS/i", "", $response)) as $varline)
62
  {
63
+ list($key, $value) = preg_split("/\=/", $varline, 2);
64
+ if(strlen($key = trim($key)) && strlen($value = trim($value)))
65
+ $postvars[$key] = trim(stripslashes(urldecode($value)));
66
  }
67
  /**/
68
+ return apply_filters("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars());
69
  }
70
  else /* Nope. */
71
+ return false;
72
  }
73
+ else if(!empty($_REQUEST) && is_array($postvars = stripslashes_deep($_REQUEST)))
74
  {
75
+ foreach($postvars as $key => $value)
76
+ if(preg_match("/^s2member_/", $key))
77
+ unset($postvars[$key]);
78
  /**/
79
  $postback = $postvars; /* Copy. */
80
  $postback["cmd"] = "_notify-validate";
81
  /**/
82
+ $postvars = c_ws_plugin__s2member_utils_strings::trim_deep($postvars);
83
  /**/
84
  $endpoint = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com";
85
  /**/
86
+ if(!empty($_GET["s2member_paypal_proxy"]) && !empty($_GET["s2member_paypal_proxy_verification"]) && $_GET["s2member_paypal_proxy_verification"] === c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen())
87
+ return apply_filters("ws_plugin__s2member_paypal_postvars", array_merge($postvars, array("proxy_verified" => $_GET["s2member_paypal_proxy"])), get_defined_vars());
88
  /**/
89
+ else if(empty($_POST) && !empty($_GET["s2member_paypal_proxy"]) && !empty($_GET["s2member_paypal_proxy_verification"]) && c_ws_plugin__s2member_utils_urls::s2member_sig_ok($_SERVER["REQUEST_URI"], false, false, "s2member_paypal_proxy_verification"))
90
+ return apply_filters("ws_plugin__s2member_paypal_postvars", array_merge($postvars, array("proxy_verified" => $_GET["s2member_paypal_proxy"])), get_defined_vars());
91
  /**/
92
+ else if(trim(strtolower(c_ws_plugin__s2member_utils_urls::remote("https://".$endpoint."/cgi-bin/webscr", $postback, array("timeout" => 20)))) === "verified")
93
+ return apply_filters("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars());
94
  /**/
95
  else /* Nope. */
96
+ return false;
97
  }
98
  else /* Nope. */
99
+ return false;
100
  }
101
  else /* Else a custom conditional has been applied by Filters. */
102
  {
103
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
104
  /**/
105
+ return apply_filters("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars());
106
  }
107
  }
108
  /**
113
  *
114
  * @return str A Proxy Key. It's an MD5 Hash, 32 chars, URL-safe.
115
  */
116
+ public static function paypal_proxy_key_gen() /* Generate Key. */
117
  {
118
  global $current_site, $current_blog; /* Multisite Networking. */
119
  /**/
120
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
121
+ do_action("ws_plugin__s2member_before_paypal_proxy_key_gen", get_defined_vars());
122
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
123
  /**/
124
+ if(is_multisite() && !is_main_site())
125
+ $key = md5(c_ws_plugin__s2member_utils_encryption::xencrypt($current_blog->domain.$current_blog->path, false, false));
126
  /**/
127
  else /* Else it's a standard Proxy Key; not on a Multisite Network, or not on the Main Site anyway. */
128
+ $key = md5(c_ws_plugin__s2member_utils_encryption::xencrypt(preg_replace("/\:[0-9]+$/", "", $_SERVER["HTTP_HOST"]), false, false));
129
  /**/
130
+ return apply_filters("ws_plugin__s2member_paypal_proxy_key_gen", $key, get_defined_vars());
131
  }
132
  /**
133
  * Calls upon the PayPal® API, and returns the response.
141
  * @todo Optimize this routine with ``empty()`` and ``isset()``.
142
  * @todo Possibly integrate this API: {@link http://msdn.microsoft.com/en-us/library/ff512417.aspx}.
143
  */
144
+ public static function paypal_api_response($post_vars = FALSE)
145
  {
146
  global /* For Multisite support. */ $current_site, $current_blog;
147
  /**/
148
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
149
+ do_action("ws_plugin__s2member_before_paypal_api_response", get_defined_vars());
150
+ unset /* Unset defined __refs, __v. */($__refs, $__v);
151
  /**/
152
+ $url = "https://".(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "api-3t.sandbox.paypal.com" : "api-3t.paypal.com")."/nvp";
153
  /**/
154
+ $post_vars = apply_filters("ws_plugin__s2member_paypal_api_post_vars", $post_vars, get_defined_vars());
155
+ $post_vars = (is_array($post_vars)) ? $post_vars : array();
156
  /**/
157
  $post_vars["VERSION"] = /* Configure the PayPal® API version. */ "71.0";
158
  $post_vars["USER"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_username"];
159
  $post_vars["PWD"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_password"];
160
  $post_vars["SIGNATURE"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_signature"];
161
  /**/
162
+ $input_time = /* Record input/nvp for logging. */ date("D M j, Y g:i:s a T");
163
  /**/
164
+ $nvp = trim(c_ws_plugin__s2member_utils_urls::remote($url, $post_vars, array("timeout" => 20)));
165
  /**/
166
+ $output_time = /* Now record after output time. */ date("D M j, Y g:i:s a T");
167
  /**/
168
+ wp_parse_str /* Parse NVP response. */($nvp, $response);
169
+ $response = c_ws_plugin__s2member_utils_strings::trim_deep($response);
170
  /**/
171
+ if(!$response["ACK"] || !preg_match("/^(Success|SuccessWithWarning)$/i", $response["ACK"]))
172
  {
173
+ if(strlen($response["L_ERRORCODE0"]) || $response["L_SHORTMESSAGE0"] || $response["L_LONGMESSAGE0"])
174
  /* translators: Exclude `%2$s` and `%3$s`. These are English details returned by PayPal®. Replace `%2$s` and `%3$s` with: `Unable to process, please try again`, or something to that affect. Or, if you prefer, you could Filter ``$response["__error"]`` with `ws_plugin__s2member_paypal_api_response`. */
175
+ $response["__error"] = sprintf(_x('Error #%1$s. %2$s. %3$s.', "s2member-front", "s2member"), $response["L_ERRORCODE0"], rtrim($response["L_SHORTMESSAGE0"], "."), rtrim($response["L_LONGMESSAGE0"], "."));
176
  /**/
177
  else /* Else, generate an error messsage - so something is reported back to the Customer. */
178
+ $response["__error"] = _x("Error. Please contact Support for assistance.", "s2member-front", "s2member");
179
  }
180
  /**/
181
+ $logv = c_ws_plugin__s2member_utilities::ver_details();
182
+ $logm = c_ws_plugin__s2member_utilities::mem_details();
183
+ $log4 = $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]."\nUser-Agent: ".$_SERVER["HTTP_USER_AGENT"];
184
+ $log4 = (is_multisite() && !is_main_site()) ? ($_log4 = $current_blog->domain.$current_blog->path)."\n".$log4 : $log4;
185
+ $log2 = (is_multisite() && !is_main_site()) ? "paypal-api-4-".trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-").".log" : "paypal-api.log";
186
  /**/
187
+ if(isset($post_vars["ACCT"]) && strlen($post_vars["ACCT"]) > 4)
188
+ $post_vars["ACCT"] = str_repeat("*", strlen($post_vars["ACCT"]) - 4).substr($post_vars["ACCT"], -4);
189
  /**/
190
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"])
191
+ if(is_dir($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
192
+ if(is_writable($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files())
193
+ if(($log = "-------- Input vars: ( ".$input_time." ) --------\n".var_export($post_vars, true)."\n"))
194
+ if(($log .= "-------- Output string/vars: ( ".$output_time." ) --------\n".$nvp."\n".var_export($response, true)))
195
+ file_put_contents($logs_dir."/".$log2, $logv."\n".$logm."\n".$log4."\n".$log."\n\n", FILE_APPEND);
196
  /**/
197
+ return apply_filters("ws_plugin__s2member_paypal_api_response", c_ws_plugin__s2member_paypal_utilities::_paypal_api_response_filters($response), get_defined_vars());
198
  }
199
  /**
200
  * A sort of callback function that Filters PayPal® responses.
207
  * @param array $response Expects an array of response variables returned by the PayPal® API.
208
  * @return array An array of variables returned by the PayPal® API, after ``$response["__error"]`` is Filtered.
209
  */
210
+ public static function _paypal_api_response_filters($response = FALSE)
211
  {
212
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
213
+ do_action("_ws_plugin__s2member_before_paypal_api_response_filters", get_defined_vars());
214
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
215
  /**/
216
+ if(!empty($response["__error"]) && !empty($response["L_ERRORCODE0"]))
217
  {
218
+ if((int)$response["L_ERRORCODE0"] === 10422)
219
+ $response["__error"] = sprintf(_x("Error #%s. Transaction declined. Please use an alternate funding source.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
220
  /**/
221
+ else if((int)$response["L_ERRORCODE0"] === 10435)
222
+ $response["__error"] = sprintf(_x("Error #%s. Transaction declined. Express Checkout was NOT confirmed.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
223
  /**/
224
+ else if((int)$response["L_ERRORCODE0"] === 10417)
225
+ $response["__error"] = sprintf(_x("Error #%s. Transaction declined. Please use an alternate funding source.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
226
  }
227
  /**/
228
  return $response; /* Filters already applied with: ``ws_plugin__s2member_paypal_api_response``. */
229
  }
230
  /**
231
+ * Calls upon the PayPal® PayFlow API, and returns the response.
232
+ *
233
+ * @package s2Member\PayPal
234
+ * @since 120514
235
+ *
236
+ * @param array $post_vars An array of variables to send through the PayPal® PayFlow API call.
237
+ * @return array An array of variables returned by the PayPal® PayFlow API.
238
+ */
239
+ public static function paypal_payflow_api_response($post_vars = FALSE)
240
+ {
241
+ global /* For Multisite support. */ $current_site, $current_blog;
242
+ /**/
243
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
244
+ do_action("ws_plugin__s2member_before_paypal_payflow_api_response", get_defined_vars());
245
+ unset /* Unset defined __refs, __v. */($__refs, $__v);
246
+ /**/
247
+ $url = "https://".(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "pilot-payflowpro.paypal.com" : "payflowpro.paypal.com");
248
+ /**/
249
+ $post_vars = apply_filters("ws_plugin__s2member_paypal_payflow_api_post_vars", $post_vars, get_defined_vars());
250
+ $post_vars = (is_array($post_vars)) ? $post_vars : array();
251
+ /**/
252
+ $post_vars["VERBOSITY"] = "HIGH";
253
+ $post_vars["USER"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_username"];
254
+ $post_vars["PARTNER"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_partner"];
255
+ $post_vars["VENDOR"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_vendor"];
256
+ $post_vars["PWD"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_password"];
257
+ /**/
258
+ $input_time = /* Record input/nvp for logging. */ date("D M j, Y g:i:s a T");
259
+ /**/
260
+ $nvp = trim(c_ws_plugin__s2member_utils_urls::remote($url, $post_vars, array("timeout" => 20)));
261
+ /**/
262
+ $output_time = /* Now record after output time. */ date("D M j, Y g:i:s a T");
263
+ /**/
264
+ wp_parse_str /* Parse NVP response. */($nvp, $response);
265
+ $response = c_ws_plugin__s2member_utils_strings::trim_deep($response);
266
+ /**/
267
+ if($response["RESULT"] !== "0")
268
+ {
269
+ if(strlen($response["RESPMSG"]))
270
+ /* translators: Exclude `%2$s`. These are English details returned by PayPal®. Replace `%2$s` with: `Unable to process, please try again`, or something to that affect. Or, if you prefer, you could Filter ``$response["__error"]`` with `ws_plugin__s2member_paypal_payflow_api_response`. */
271
+ $response["__error"] = sprintf(_x('Error #%1$s. %2$s.', "s2member-front", "s2member"), $response["RESULT"], rtrim($response["RESPMSG"], "."));
272
+ /**/
273
+ else $response["__error"] = _x("Error. Please contact Support for assistance.", "s2member-front", "s2member");
274
+ }
275
+ else if(isset($response["TRXRESULT"]) && $response["TRXRESULT"] !== "0")
276
+ {
277
+ if(strlen($response["TRXRESPMSG"]))
278
+ /* translators: Exclude `%2$s`. These are English details returned by PayPal®. Replace `%2$s` with: `Unable to process, please try again`, or something to that affect. Or, if you prefer, you could Filter ``$response["__error"]`` with `ws_plugin__s2member_paypal_payflow_api_response`. */
279
+ $response["__error"] = sprintf(_x('Error #%1$s. %2$s.', "s2member-front", "s2member"), $response["TRXRESULT"], rtrim($response["TRXRESPMSG"], "."));
280
+ /**/
281
+ else $response["__error"] = _x("Error. Please contact Support for assistance.", "s2member-front", "s2member");
282
+ }
283
+ /**/
284
+ $logv = c_ws_plugin__s2member_utilities::ver_details();
285
+ $logm = c_ws_plugin__s2member_utilities::mem_details();
286
+ $log4 = $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]."\nUser-Agent: ".$_SERVER["HTTP_USER_AGENT"];
287
+ $log4 = (is_multisite() && !is_main_site()) ? ($_log4 = $current_blog->domain.$current_blog->path)."\n".$log4 : $log4;
288
+ $log2 = (is_multisite() && !is_main_site()) ? "paypal-payflow-api-4-".trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-").".log" : "paypal-payflow-api.log";
289
+ /**/
290
+ if(isset($post_vars["ACCT"]) && strlen($post_vars["ACCT"]) > 4)
291
+ $post_vars["ACCT"] = str_repeat("*", strlen($post_vars["ACCT"]) - 4).substr($post_vars["ACCT"], -4);
292
+ /**/
293
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"])
294
+ if(is_dir($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
295
+ if(is_writable($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files())
296
+ if(($log = "-------- Input vars: ( ".$input_time." ) --------\n".var_export($post_vars, true)."\n"))
297
+ if(($log .= "-------- Output string/vars: ( ".$output_time." ) --------\n".$nvp."\n".var_export($response, true)))
298
+ file_put_contents($logs_dir."/".$log2, $logv."\n".$logm."\n".$log4."\n".$log."\n\n", FILE_APPEND);
299
+ /**/
300
+ return apply_filters("ws_plugin__s2member_paypal_payflow_api_response", c_ws_plugin__s2member_paypal_utilities::_paypal_payflow_api_response_filters($response), get_defined_vars());
301
+ }
302
+ /**
303
+ * A sort of callback function that Filters Payflow® responses.
304
+ *
305
+ * Provides alternative explanations in some cases that require special attention.
306
+ *
307
+ * @package s2Member\PayPal
308
+ * @since 120514
309
+ *
310
+ * @param array $response Expects an array of response variables returned by the Payflow® API.
311
+ * @return array An array of variables returned by the Payflow® API, after ``$response["__error"]`` is Filtered.
312
+ */
313
+ public static function _paypal_payflow_api_response_filters($response = FALSE)
314
+ {
315
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
316
+ do_action("_ws_plugin__s2member_before_paypal_payflow_api_response_filters", get_defined_vars());
317
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
318
+ /**/
319
+ if(!empty($response["__error"]) && !empty($response["L_ERRORCODE0"]))
320
+ {
321
+ if((int)$response["L_ERRORCODE0"] === 10422)
322
+ $response["__error"] = sprintf(_x("Error #%s. Transaction declined. Please use an alternate funding source.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
323
+ /**/
324
+ else if((int)$response["L_ERRORCODE0"] === 10435)
325
+ $response["__error"] = sprintf(_x("Error #%s. Transaction declined. Express Checkout was NOT confirmed.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
326
+ /**/
327
+ else if((int)$response["L_ERRORCODE0"] === 10417)
328
+ $response["__error"] = sprintf(_x("Error #%s. Transaction declined. Please use an alternate funding source.", "s2member-front", "s2member"), $response["L_ERRORCODE0"]);
329
+ }
330
+ /**/
331
+ return $response; /* Filters already applied with: ``ws_plugin__s2member_paypal_payflow_api_response``. */
332
+ }
333
+ /**
334
  * Converts a term `D|W|M|Y` into PayPal® Pro format.
335
  *
336
  * @package s2Member\PayPal
339
  * @param str $term Expects one of `D|W|M|Y`.
340
  * @return bool|str A full singular description of the term *( i.e. `Day|Week|Month|Year` )*, else false.
341
  */
342
+ public static function paypal_pro_term($term = FALSE)
343
  {
344
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
345
+ do_action("ws_plugin__s2member_before_paypal_pro_term", get_defined_vars());
346
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
347
  /**/
348
+ $paypal_pro_terms = array("D" => "Day", "W" => "Week", "M" => "Month", "Y" => "Year");
349
  /**/
350
+ $pro_term = (!empty($paypal_pro_terms[strtoupper($term)])) ? $paypal_pro_terms[strtoupper($term)] : false;
351
  /**/
352
+ return apply_filters("ws_plugin__s2member_paypal_pro_term", $pro_term, get_defined_vars());
353
+ }
354
+ /**
355
+ * Converts a term `D|W|M|Y` into Payflow® format.
356
+ *
357
+ * @package s2Member\PayPal
358
+ * @since 120514
359
+ *
360
+ * @param str $term Expects one of `D|W|M|Y`.
361
+ * @param str $period Expects a numeric value.
362
+ * @return bool|str A full singular description of the term *( i.e. `DAY|WEEK|BIWK|MONT|QTER|YEAR` )*, else false.
363
+ *
364
+ * @note Payflow® unfortunately does NOT support bi-monthly billing.
365
+ * It DOES support semi-monthly billing, but that can be confusing for customers.
366
+ */
367
+ public static function paypal_payflow_term($term = FALSE, $period = FALSE)
368
+ {
369
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
370
+ do_action("ws_plugin__s2member_before_paypal_payflow_term", get_defined_vars());
371
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
372
+ /**/
373
+ $paypal_payflow_terms = array("D" => "DAY", "W" => "WEEK", "M" => "MONT", "Y" => "YEAR");
374
+ /**/
375
+ $payflow_term = (!empty($paypal_payflow_terms[strtoupper($term)])) ? $paypal_payflow_terms[strtoupper($term)] : false;
376
+ /**/
377
+ if($payflow_term === "WEEK" && $period === "2")
378
+ $payflow_term = "BIWK";
379
+ /**/
380
+ else if($payflow_term === "MONT" && $period === "3")
381
+ $payflow_term = "QTER";
382
+ /**/
383
+ return apply_filters("ws_plugin__s2member_paypal_payflow_term", $payflow_term, get_defined_vars());
384
  }
385
  /**
386
  * Converts a term `Day|Week|Month|Year` into PayPal® Standard format.
391
  * @param str $term Expects one of `Day|Week|Month|Year`.
392
  * @return bool|str A term code *( i.e. `D|W|M|Y` )*, else false.
393
  */
394
+ public static function paypal_std_term($term = FALSE)
395
  {
396
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
397
+ do_action("ws_plugin__s2member_before_paypal_std_term", get_defined_vars());
398
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
399
  /**/
400
+ $paypal_std_terms = array("DAY" => "D", "WEEK" => "W", "MONTH" => "M", "YEAR" => "Y");
401
  /**/
402
+ $std_term = (!empty($paypal_std_terms[strtoupper($term)])) ? $paypal_std_terms[strtoupper($term)] : false;
403
  /**/
404
+ return apply_filters("ws_plugin__s2member_paypal_std_term", $std_term, get_defined_vars());
405
  }
406
  /**
407
  * Get `subscr_id` from either an array with `recurring_payment_id|subscr_id`, or use an existing string.
412
  * @param str|array $array_or_string Either an array of PayPal® post vars, or a string.
413
  * @return str|bool A `subscr_id` string if non-empty, else false.
414
  */
415
+ public static function paypal_pro_subscr_id($array_or_string = FALSE)
416
  {
417
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
418
+ do_action("ws_plugin__s2member_before_paypal_pro_subscr_id", get_defined_vars());
419
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
420
  /**/
421
+ if(is_array($array = $array_or_string) && !empty($array["recurring_payment_id"]))
422
+ $subscr_id = trim($array["recurring_payment_id"]);
423
  /**/
424
+ else if(is_array($array = $array_or_string) && !empty($array["subscr_id"]))
425
+ $subscr_id = trim($array["subscr_id"]);
426
  /**/
427
+ else if(is_string($string = $array_or_string) && !empty($string))
428
+ $subscr_id = trim($string);
429
  /**/
430
+ return apply_filters("ws_plugin__s2member_paypal_pro_subscr_id", ((!empty($subscr_id)) ? $subscr_id : false), get_defined_vars());
431
  }
432
  /**
433
  * Get `item_number` from either an array with `PROFILEREFERENCE|rp_invoice_id|item_number1|item_number`, or use an existing string.
439
  * If it's a string, we make sure it is a valid `level:ccaps:eotper` or `sp:ids:expiration` combination.
440
  * @return str|bool An `item_number` string if non-empty, else false.
441
  */
442
+ public static function paypal_pro_item_number($array_or_string = FALSE)
443
  {
444
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
445
+ do_action("ws_plugin__s2member_before_paypal_pro_item_number", get_defined_vars());
446
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
447
  /**/
448
+ if(isset($array_or_string["PROFILENAME"]) /* Payflow® API alternative. */)
449
+ $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
450
  /**/
451
+ if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
452
+ list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
453
  /**/
454
+ else if(is_array($array = $array_or_string) && !empty($array["item_number1"]))
455
+ $_item_number = trim($array["item_number1"]);
456
  /**/
457
+ else if(is_array($array = $array_or_string) && !empty($array["item_number"]))
458
+ $_item_number = trim($array["item_number"]);
459
  /**/
460
+ else if(is_string($string = $array_or_string) && !empty($string))
461
+ $_item_number = trim($string);
462
+ /**/
463
+ if(!empty($_item_number) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_or_wo_level_regex"], $_item_number))
464
  $item_number = $_item_number;
465
  /**/
466
+ else if(!empty($_item_number) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["sp_access_item_number_regex"], $_item_number))
467
  $item_number = $_item_number;
468
  /**/
469
+ return apply_filters("ws_plugin__s2member_paypal_pro_item_number", ((!empty($item_number)) ? $item_number : false), get_defined_vars());
470
  }
471
  /**
472
  * Get `item_name` from either an array with `product_name|item_name1|item_name`, or use an existing string.
477
  * @param str|array $array_or_string Either an array of PayPal® post vars, or a string.
478
  * @return str|bool An `item_name` string if non-empty, else false.
479
  */
480
+ public static function paypal_pro_item_name($array_or_string = FALSE)
481
  {
482
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
483
+ do_action("ws_plugin__s2member_before_paypal_pro_item_name", get_defined_vars());
484
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
485
  /**/
486
+ if(is_array($array = $array_or_string) && !empty($array["product_name"]))
487
+ $item_name = trim($array["product_name"]);
488
  /**/
489
+ else if(is_array($array = $array_or_string) && !empty($array["item_name1"]))
490
+ $item_name = trim($array["item_name1"]);
491
  /**/
492
+ else if(is_array($array = $array_or_string) && !empty($array["item_name"]))
493
+ $item_name = trim($array["item_name"]);
494
  /**/
495
+ else if(is_string($string = $array_or_string) && !empty($string))
496
+ $item_name = trim($string);
497
  /**/
498
+ return apply_filters("ws_plugin__s2member_paypal_pro_item_name", ((!empty($item_name)) ? $item_name : false), get_defined_vars());
499
  }
500
  /**
501
  * Get `period1` from either an array with `PROFILEREFERENCE|rp_invoice_id|period1`, or use an existing string.
511
  * @param str $default Optional. Value if unavailable. Defaults to `0 D`.
512
  * @return str A `period1` string if possible, or defaults to `0 D`.
513
  */
514
+ public static function paypal_pro_period1($array_or_string = FALSE, $default = "0 D")
515
  {
516
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
517
+ do_action("ws_plugin__s2member_before_paypal_pro_period1", get_defined_vars());
518
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
519
+ /**/
520
+ if(isset($array_or_string["PROFILENAME"]) /* Payflow® API alternative. */)
521
+ $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
522
  /**/
523
+ if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
524
  {
525
+ list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
526
+ list($_start_time, $_period1, $_period3) = array_map("trim", preg_split("/\:/", $_reference, 3));
527
  }
528
+ else if(is_array($array = $array_or_string) && !empty($array["period1"]))
529
+ $_period1 = trim($array["period1"]);
530
  /**/
531
+ else if(is_string($string = $array_or_string) && !empty($string))
532
+ $_period1 = trim($string);
533
  /**/
534
+ if(!empty($_period1)) /* Were we able to get a `period1` string? */
535
  {
536
+ list($num, $span) = array_map("trim", preg_split("/ /", $_period1, 2));
537
  /**/
538
+ if(strtoupper($span) === "SEMIMONTH")
539
+ if(is_numeric($num) && $num >= 1)
540
+ eval('$num = "2"; $span = "W";');
541
  /**/
542
+ if(strlen($span) !== 1) /* To Standard format. */
543
+ $span = c_ws_plugin__s2member_paypal_utilities::paypal_std_term($span);
544
  /**/
545
+ $span = (preg_match("/^[DWMY]$/i", $span)) ? $span : "";
546
+ $num = ($span && is_numeric($num) && $num >= 0) ? $num : "";
547
  /**/
548
+ $period1 = ($num && $span) ? $num." ".strtoupper($span) : $default;
549
  /**/
550
+ return apply_filters("ws_plugin__s2member_paypal_pro_period1", $period1, get_defined_vars());
551
  }
552
  else /* Default. */
553
+ return apply_filters("ws_plugin__s2member_paypal_pro_period1", $default, get_defined_vars());
554
  }
555
  /**
556
  * Get `period3` from either an array with `PROFILEREFERENCE|rp_invoice_id|period3`, or use an existing string.
567
  * @param str $default Optional. Value if unavailable. Defaults to `1 D`.
568
  * @return str A `period3` string if possible, or defaults to `1 D`.
569
  */
570
+ public static function paypal_pro_period3($array_or_string = FALSE, $default = "1 D")
571
  {
572
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
573
+ do_action("ws_plugin__s2member_before_paypal_pro_period3", get_defined_vars());
574
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
575
+ /**/
576
+ if(isset($array_or_string["PROFILENAME"]) /* Payflow® API alternative. */)
577
+ $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
578
  /**/
579
+ if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
580
  {
581
+ list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
582
+ list($_start_time, $_period1, $_period3) = array_map("trim", preg_split("/\:/", $_reference, 3));
583
  }
584
+ else if(is_array($array = $array_or_string) && !empty($array["period3"]))
585
+ $_period3 = trim($array["period3"]);
586
  /**/
587
+ else if(is_string($string = $array_or_string) && !empty($string))
588
+ $_period3 = trim($string);
589
  /**/
590
+ if(!empty($_period3)) /* Were we able to get a `period3` string? */
591
  {
592
+ list($num, $span) = array_map("trim", preg_split("/ /", $_period3, 2));
593
  /**/
594
+ if(strtoupper($span) === "SEMIMONTH")
595
+ if(is_numeric($num) && $num >= 1)
596
+ eval('$num = "2"; $span = "W";');
597
  /**/
598
+ if(strlen($span) !== 1) /* To Standard format. */
599
+ $span = c_ws_plugin__s2member_paypal_utilities::paypal_std_term($span);
600
  /**/
601
+ $span = (preg_match("/^[DWMY]$/i", $span)) ? $span : "";
602
+ $num = ($span && is_numeric($num) && $num >= 0) ? $num : "";
603
  /**/
604
+ $period3 = ($num && $span) ? $num." ".strtoupper($span) : $default;
605
  /**/
606
+ return apply_filters("ws_plugin__s2member_paypal_pro_period3", $period3, get_defined_vars());
607
  }
608
  else /* Default. */
609
+ return apply_filters("ws_plugin__s2member_paypal_pro_period3", $default, get_defined_vars());
610
  }
611
  }
612
  }
includes/classes/utils-urls.inc.php CHANGED
@@ -14,10 +14,10 @@
14
  * @package s2Member\Utilities
15
  * @since 3.5
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_utils_urls"))
21
  {
22
  /**
23
  * URL utilities.
@@ -35,9 +35,9 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
35
  *
36
  * @return str Full URL to `/wp-signup.php`.
37
  */
38
- public static function wp_signup_url ()
39
  {
40
- return apply_filters ("wp_signup_location", site_url ("/wp-signup.php"));
41
  }
42
  /**
43
  * Builds a WordPress® registration URL to `/wp-login.php?action=register`.
@@ -47,9 +47,9 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
47
  *
48
  * @return str Full URL to `/wp-login.php?action=register`.
49
  */
50
- public static function wp_register_url ()
51
  {
52
- return apply_filters ("wp_register_location", add_query_arg ("action", urlencode ("register"), wp_login_url ()), get_defined_vars ());
53
  }
54
  /**
55
  * Builds a BuddyPress registration URL to `/register`.
@@ -59,10 +59,10 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
59
  *
60
  * @return str|bool Full URL to `/register`, if BuddyPress is installed; else false.
61
  */
62
- public static function bp_register_url ()
63
  {
64
- if ( /* If BuddyPress is installed. */c_ws_plugin__s2member_utils_conds::bp_is_installed ())
65
- return site_url (((function_exists ("bp_get_signup_slug")) ? bp_get_signup_slug () . "/" : BP_REGISTER_SLUG . "/"));
66
  /**/
67
  return /* Default return false. */ false;
68
  }
@@ -79,12 +79,12 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
79
  *
80
  * @see http://en.wikipedia.org/wiki/Web_browser_engine
81
  */
82
- public static function redirect_browsers_using_302_status ($status = FALSE)
83
  {
84
  $engines = "msie|trident|gecko|webkit|presto|konqueror|playstation";
85
  /**/
86
- if ( /* Default `301` status? */(int)$status === 301 && /* Have User-Agent? */ !empty ($_SERVER["HTTP_USER_AGENT"]))
87
- if (($is_browser = preg_match ("/(" . $engines . ")[\/ ]([0-9\.]+)/i", $_SERVER["HTTP_USER_AGENT"])))
88
  return /* Use 302 status. */ ($status = 302);
89
  /**/
90
  return /* Else use existing status. */ $status;
@@ -100,9 +100,9 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
100
  * @param str $url_uri_query A full URL, a partial URI, or just the query string.
101
  * @return str A full URL, a partial URI, or just the query string; after having been encoded by this routine.
102
  */
103
- public static function e_amps ($url_uri_query = FALSE)
104
  {
105
- return str_replace ("&", "&", c_ws_plugin__s2member_utils_urls::n_amps ((string)$url_uri_query));
106
  }
107
  /**
108
  * Normalizes amperands to `&` when working with URLs, URIs, and/or query strings.
@@ -113,11 +113,11 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
113
  * @param str $url_uri_query A full URL, a partial URI, or just the query string.
114
  * @return str A full URL, a partial URI, or just the query string; after having been normalized by this routine.
115
  */
116
- public static function n_amps ($url_uri_query = FALSE)
117
  {
118
- $amps = implode ("|", array_keys /* Keys are regex patterns. */ (c_ws_plugin__s2member_utils_strings::$ampersand_entities));
119
  /**/
120
- return /* Normalizes amperands to `&`. */ preg_replace ("/(?:" . $amps . ")/", "&", (string)$url_uri_query);
121
  }
122
  /**
123
  * Parses out a full valid URI, from either a full URL, or a partial URI.
@@ -130,16 +130,16 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
130
  * @param str $url_uri Either a full URL, or a partial URI.
131
  * @return str A valid URI, starting with `/` on success, else an empty string.
132
  */
133
- public static function parse_uri ($url_uri = FALSE)
134
  {
135
- if (is_string ($url_uri) && is_array ($parse = c_ws_plugin__s2member_utils_urls::parse_url ($url_uri)))
136
  {
137
- $parse["path"] = (!empty ($parse["path"])) ? ((strpos ($parse["path"], "/") === 0) ? $parse["path"] : "/" . $parse["path"]) : "/";
138
  /**/
139
- return (!empty ($parse["query"])) ? $parse["path"] . "?" . $parse["query"] : $parse["path"];
140
  }
141
  else /* Force a string return value here. */
142
- return /* Empty string. */ "";
143
  }
144
  /**
145
  * Parses a URL/URI with same args as PHP's ``parse_url()`` function.
@@ -155,21 +155,21 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
155
  * @return str|array|bool The return value from PHP's ``parse_url()`` function.
156
  * However, if ``$component`` is passed, s2Member forces a string return.
157
  */
158
- public static function parse_url ($url_uri = FALSE, $component = FALSE, $clean_path = TRUE)
159
  {
160
  $component = ($component === false || $component === -1) ? -1 : $component;
161
  /**/
162
- if (is_string ($url_uri) && /* And, there is a query string? */ strpos ($url_uri, "?") !== false)
163
  {
164
- list ($_, $query) = preg_split /* Split @ query string marker. */ ("/\?/", $url_uri, 2);
165
- $query = /* See: <https://bugs.php.net/bug.php?id=38143>. */ str_replace ("://", urlencode ("://"), $query);
166
- $url_uri = /* Put it all back together again, after the above modifications. */ $_ . "?" . $query;
167
- unset /* A little housekeeping here. Unset these vars. */ ($_, $query);
168
  }
169
- $parse = @parse_url /* Let PHP work its magic via ``parse_url()``. */ ($url_uri, $component);
170
  /**/
171
- if ($clean_path && isset ($parse["path"]) && is_string ($parse["path"]) && !empty ($parse["path"]))
172
- $parse["path"] = /* Clean up the path now. */ preg_replace ("/\/+/", "/", $parse["path"]);
173
  /**/
174
  return ($component !== -1) ? /* Force a string return value? */ (string)$parse : $parse;
175
  }
@@ -188,42 +188,46 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
188
  * `code` *(http response code)*, `message` *(http response message)*, `headers` *(an array of lowercase headers)*, `body` *(the response body string)*, `response` *(full response array)*.
189
  * @return str|array|bool Requested response str|array from remote location *(see ``$return_array`` parameter )*; else (bool)`false` on failure.
190
  */
191
- public static function remote ($url = FALSE, $post_vars = FALSE, $args = FALSE, $return_array = FALSE)
192
  {
193
- if ($url && /* We MUST have a valid full URL (string) before we do anything in this routine. */ is_string ($url))
194
  {
195
- $args = /* Force array, and disable SSL verification. */ (!is_array ($args)) ? array (): $args;
196
- $args["sslverify"] = (!isset ($args["sslverify"])) ? /* Off. */ false : $args["sslverify"];
197
  /**/
198
- if ((is_array ($post_vars) || is_string ($post_vars)) && !empty ($post_vars))
199
- $args = array_merge ($args, array ("method" => "POST", "body" => $post_vars));
200
  /**/
201
- if (!empty ($args["method"]) && strcasecmp ((string)$args["method"], "DELETE") === 0)
202
  /* WordPress® v3.3 and prior, does NOT support `DELETE` via cURL unfortunately. */
203
- add_filter ("use_curl_transport", "__return_false", /* ID via priority. */ 111209554);
204
  /**/
205
- $response = /* Process remote request via ``wp_remote_request()``. */ wp_remote_request ($url, $args);
 
 
206
  /**/
207
- remove_filter /* Remove this Filter now. */ ("use_curl_transport", "__return_false", 111209554);
208
  /**/
209
- if ($return_array && !is_wp_error ($response) && is_array ($response))
 
 
210
  {
211
- $a = array ("code" => (int)wp_remote_retrieve_response_code ($response));
212
- $a = array_merge ($a, array ("message" => wp_remote_retrieve_response_message ($response)));
213
- $a = array_merge ($a, array ("headers" => wp_remote_retrieve_headers ($response)));
214
- $a = array_merge ($a, array ("body" => wp_remote_retrieve_body ($response)));
215
- $a = array_merge ($a, array ("response" => $response));
216
  /**/
217
  return /* Return array w/ ``$response`` too. */ $a;
218
  }
219
- else if (!is_wp_error ($response) && is_array ($response) /* Return body only. */)
220
- return /* Return ``$response`` body only. */ wp_remote_retrieve_body ($response);
221
  /**/
222
  else /* Else this remote request has failed completely. Return false. */
223
- return false; /* Remote request failed, return false. */
224
  }
225
  else /* Else, return false. */
226
- return false;
227
  }
228
  /**
229
  * Shortens a long URL, based on s2Member configuration.
@@ -236,34 +240,34 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
236
  * @param bool $try_backups Defaults to true. If a failure occurs with the first API, we'll try others until we have success.
237
  * @return str|bool The shortened URL on success, else false on failure.
238
  */
239
- public static function shorten ($url = FALSE, $api_sp = FALSE, $try_backups = TRUE)
240
  {
241
- $url = /* Force strings, else false. */ ($url && is_string ($url)) ? $url : false;
242
- $api_sp = ($api_sp && is_string ($api_sp)) ? strtolower ($api_sp) : false;
243
  /**/
244
  $default_url_shortener = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"];
245
  $default_custom_str_url_shortener = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_custom_str_url_shortener"];
246
  /**/
247
- $apis = /* The shortening APIs currently pre-integrated in this release of s2Member. */ array ("tiny_url", "goo_gl");
248
  /**/
249
- if ($url && ($api = /* If specific, use it. Otherwise, use the default shortening API. */ ($api_sp) ? $api_sp : $default_url_shortener))
250
  {
251
- if (!$api_sp && ($custom_url = trim (apply_filters ("ws_plugin__s2member_url_shorten", false, get_defined_vars ()))) && stripos ($custom_url, "http") === 0)
252
  return /* Using whatever other shortener API you prefer, over the ones available by default with s2Member. */ ($shorter_url = $custom_url);
253
  /**/
254
- else if (!$api_sp && stripos ($default_custom_str_url_shortener, "http") === 0 && ($custom_url = trim (c_ws_plugin__s2member_utils_urls::remote (str_ireplace (array ("%%s2_long_url%%", "%%s2_long_url_md5%%"), array (rawurlencode ($url), urlencode (md5 ($url))), $default_custom_str_url_shortener)))) && stripos ($custom_url, "http") === 0)
255
  return /* Using whatever other shortener API that a site owner prefers, over the ones available by default with s2Member. */ ($shorter_url = $custom_url);
256
  /**/
257
- else if ($api === "tiny_url" && ($tiny_url = trim (c_ws_plugin__s2member_utils_urls::remote ("http://tinyurl.com/api-create.php?url=" . rawurlencode ($url)))) && stripos ($tiny_url, "http") === 0)
258
  return /* The default tinyURL API: <http://tinyurl.com/api-create.php?url=http://www.example.com/>. */ ($shorter_url = $tiny_url);
259
  /**/
260
- else if ($api === "goo_gl" && ($goo_gl = json_decode (trim (c_ws_plugin__s2member_utils_urls::remote ("https://www.googleapis.com/urlshortener/v1/url" . ((($goo_gl_key = apply_filters ("ws_plugin__s2member_url_shorten_api_goo_gl_key", false))) ? "?key=" . urlencode ($goo_gl_key) : ""), json_encode (array ("longUrl" => $url)), array ("headers" => array ("Content-Type" => "application/json")))), true)) && !empty ($goo_gl["id"]) && is_string ($goo_gl_url = $goo_gl["id"]) && stripos ($goo_gl_url, "http") === 0)
261
  return /* Google® API: <http://code.google.com/apis/urlshortener/v1/getting_started.html>. */ ($shorter_url = $goo_gl_url);
262
  /**/
263
- else if /* Try backups? This way we can still shorten the URL with a backup. */ ($try_backups && count ($apis) > 1)
264
  /**/
265
- foreach /* Try other backup APIs now. */ (array_diff ($apis, array ($api)) as $backup)
266
- if (($backup = c_ws_plugin__s2member_utils_urls::shorten ($url, $backup, false)))
267
  return /* Success, we can return now. */ ($shorter_url = $backup);
268
  }
269
  return /* Default return value. */ false;
@@ -278,13 +282,13 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
278
  * @param str $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`.
279
  * @return str A full URL, a partial URI, or just the query string; without any s2Member-generated signatures.
280
  */
281
- public static function remove_s2member_sigs ($url_uri_query = FALSE, $sig_var = FALSE)
282
  {
283
- $url_uri_query = c_ws_plugin__s2member_utils_strings::trim ((string)$url_uri_query, false, "?&=");
284
- $sig_var = ($sig_var && is_string ($sig_var)) ? $sig_var : /* Use default. */ "_s2member_sig";
285
- $sigs = /* Remove all signatures. */ array_unique (array ($sig_var, "_s2member_sig"));
286
  /**/
287
- return trim (remove_query_arg ($sigs, $url_uri_query), "?&=");
288
  }
289
  /**
290
  * Adds an s2Member-generated signature onto a full URL, a partial URI, or just a query string.
@@ -296,26 +300,26 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
296
  * @param str $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`.
297
  * @return str A full URL, a partial URI, or just a query string; with an s2Member-generated signature.
298
  */
299
- public static function add_s2member_sig ($url_uri_query = FALSE, $sig_var = FALSE)
300
  {
301
- $url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim ((string)$url_uri_query, false, "?&=");
302
- $sig_var = ($sig_var && is_string ($sig_var)) ? $sig_var : /* Use default. */ "_s2member_sig";
303
  /**/
304
- $url_uri_query = $query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs ($url_uri_query, $sig_var);
305
- if ( /* Is this a full URL, or a partial URI? */preg_match ("/^(?:[a-z]+\:\/\/|\/)/i", ($url_uri_query)))
306
- $query = trim (c_ws_plugin__s2member_utils_urls::parse_url ($url_uri_query, PHP_URL_QUERY), "?&=");
307
  /**/
308
- $key = /* Obtain the proper encryption/decryption key. */ c_ws_plugin__s2member_utils_encryption::key ();
309
  /**/
310
- if ($url_uri_query && is_string /* We DO allow empty query strings. So we can sign a URL without one. */ ($query))
311
  {
312
- wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */ ($query, $vars);
313
- $vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings (c_ws_plugin__s2member_utils_strings::trim_deep ($vars));
314
- $vars = serialize (c_ws_plugin__s2member_utils_arrays::ksort_deep ($vars));
315
  /**/
316
- $sig = /* The s2Member-generated signature. */ ($time = time ()) . "-" . md5 ($key . $time . $vars);
317
  /**/
318
- $url_uri_query = add_query_arg ($sig_var, urlencode ($sig), $url_uri_query);
319
  }
320
  return /* Possibly with a ``$sig_var`` variable. */ $url_uri_query;
321
  }
@@ -331,36 +335,36 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
331
  * @param str $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`.
332
  * @return bool True if the s2Member-generated signature is OK, else false.
333
  */
334
- public static function s2member_sig_ok ($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE)
335
  {
336
- $url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim ((string)$url_uri_query, false, "?&=");
337
- if ( /* Is this a full URL, or a partial URI? */preg_match ("/^(?:[a-z]+\:\/\/|\/)/i", ($url_uri_query)))
338
- $query = trim (c_ws_plugin__s2member_utils_urls::parse_url ($url_uri_query, PHP_URL_QUERY), "?&=");
339
  /**/
340
  $check_time = /* Are we checking time? Force a boolean value here. */ ($check_time) ? true : false;
341
- $exp_secs = (is_numeric ($exp_secs)) ? (int)$exp_secs : /* Else 10 seconds by default here. */ 10;
342
- $sig_var = ($sig_var && is_string ($sig_var)) ? $sig_var : /* Use default. */ "_s2member_sig";
343
  /**/
344
- $key = /* Obtain the proper encryption/decryption key. */ c_ws_plugin__s2member_utils_encryption::key ();
345
  /**/
346
- if (preg_match_all /* Does ``$query`` have an s2Member-generated signature? */ ("/" . preg_quote ($sig_var, "/") . "\=([0-9]+)-([^&$]+)/", $query, $sigs))
347
  {
348
- $query = /* Remove existing s2Member-generated signatures. */ c_ws_plugin__s2member_utils_urls::remove_s2member_sigs ($query, $sig_var);
349
  /**/
350
- wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */ ($query, $vars);
351
- $vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings (c_ws_plugin__s2member_utils_strings::trim_deep ($vars));
352
- $vars = serialize (c_ws_plugin__s2member_utils_arrays::ksort_deep ($vars));
353
  /**/
354
- ($time = $sigs[1][($i = count ($sigs[1]) - 1)]) . ($sig = $sigs[2][$i]) . ($valid_sig = md5 ($key . $time . $vars));
355
  /**/
356
- if /* Checking time? This must NOT be older than ``$exp_secs`` seconds ago. */ ($check_time)
357
- return ($sig === $valid_sig && $time >= strtotime ("-" . $exp_secs . " seconds"));
358
  /**/
359
  else /* Ignoring time? Just need to compare signatures in this case. */
360
- return /* Do they match up? */ ($sig === $valid_sig);
361
  }
362
  else /* Return false. No ``$query``, or no ``$sigs``. */
363
- return /* False, it's NOT ok. */ false;
364
  }
365
  }
366
  }
14
  * @package s2Member\Utilities
15
  * @since 3.5
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_utils_urls"))
21
  {
22
  /**
23
  * URL utilities.
35
  *
36
  * @return str Full URL to `/wp-signup.php`.
37
  */
38
+ public static function wp_signup_url()
39
  {
40
+ return apply_filters("wp_signup_location", site_url("/wp-signup.php"));
41
  }
42
  /**
43
  * Builds a WordPress® registration URL to `/wp-login.php?action=register`.
47
  *
48
  * @return str Full URL to `/wp-login.php?action=register`.
49
  */
50
+ public static function wp_register_url()
51
  {
52
+ return apply_filters("wp_register_location", add_query_arg("action", urlencode("register"), wp_login_url()), get_defined_vars());
53
  }
54
  /**
55
  * Builds a BuddyPress registration URL to `/register`.
59
  *
60
  * @return str|bool Full URL to `/register`, if BuddyPress is installed; else false.
61
  */
62
+ public static function bp_register_url()
63
  {
64
+ if( /* If BuddyPress is installed. */c_ws_plugin__s2member_utils_conds::bp_is_installed())
65
+ return site_url(((function_exists("bp_get_signup_slug")) ? bp_get_signup_slug()."/" : BP_REGISTER_SLUG."/"));
66
  /**/
67
  return /* Default return false. */ false;
68
  }
79
  *
80
  * @see http://en.wikipedia.org/wiki/Web_browser_engine
81
  */
82
+ public static function redirect_browsers_using_302_status($status = FALSE)
83
  {
84
  $engines = "msie|trident|gecko|webkit|presto|konqueror|playstation";
85
  /**/
86
+ if( /* Default `301` status? */(int)$status === 301 && /* Have User-Agent? */ !empty($_SERVER["HTTP_USER_AGENT"]))
87
+ if(($is_browser = preg_match("/(".$engines.")[\/ ]([0-9\.]+)/i", $_SERVER["HTTP_USER_AGENT"])))
88
  return /* Use 302 status. */ ($status = 302);
89
  /**/
90
  return /* Else use existing status. */ $status;
100
  * @param str $url_uri_query A full URL, a partial URI, or just the query string.
101
  * @return str A full URL, a partial URI, or just the query string; after having been encoded by this routine.
102
  */
103
+ public static function e_amps($url_uri_query = FALSE)
104
  {
105
+ return str_replace("&", "&amp;", c_ws_plugin__s2member_utils_urls::n_amps((string)$url_uri_query));
106
  }
107
  /**
108
  * Normalizes amperands to `&` when working with URLs, URIs, and/or query strings.
113
  * @param str $url_uri_query A full URL, a partial URI, or just the query string.
114
  * @return str A full URL, a partial URI, or just the query string; after having been normalized by this routine.
115
  */
116
+ public static function n_amps($url_uri_query = FALSE)
117
  {
118
+ $amps = implode("|", array_keys /* Keys are regex patterns. */(c_ws_plugin__s2member_utils_strings::$ampersand_entities));
119
  /**/
120
+ return /* Normalizes amperands to `&`. */ preg_replace("/(?:".$amps.")/", "&", (string)$url_uri_query);
121
  }
122
  /**
123
  * Parses out a full valid URI, from either a full URL, or a partial URI.
130
  * @param str $url_uri Either a full URL, or a partial URI.
131
  * @return str A valid URI, starting with `/` on success, else an empty string.
132
  */
133
+ public static function parse_uri($url_uri = FALSE)
134
  {
135
+ if(is_string($url_uri) && is_array($parse = c_ws_plugin__s2member_utils_urls::parse_url($url_uri)))
136
  {
137
+ $parse["path"] = (!empty($parse["path"])) ? ((strpos($parse["path"], "/") === 0) ? $parse["path"] : "/".$parse["path"]) : "/";
138
  /**/
139
+ return (!empty($parse["query"])) ? $parse["path"]."?".$parse["query"] : $parse["path"];
140
  }
141
  else /* Force a string return value here. */
142
+ return /* Empty string. */ "";
143
  }
144
  /**
145
  * Parses a URL/URI with same args as PHP's ``parse_url()`` function.
155
  * @return str|array|bool The return value from PHP's ``parse_url()`` function.
156
  * However, if ``$component`` is passed, s2Member forces a string return.
157
  */
158
+ public static function parse_url($url_uri = FALSE, $component = FALSE, $clean_path = TRUE)
159
  {
160
  $component = ($component === false || $component === -1) ? -1 : $component;
161
  /**/
162
+ if(is_string($url_uri) && /* And, there is a query string? */ strpos($url_uri, "?") !== false)
163
  {
164
+ list($_, $query) = preg_split /* Split @ query string marker. */("/\?/", $url_uri, 2);
165
+ $query = /* See: <https://bugs.php.net/bug.php?id=38143>. */ str_replace("://", urlencode("://"), $query);
166
+ $url_uri = /* Put it all back together again, after the above modifications. */ $_."?".$query;
167
+ unset /* A little housekeeping here. Unset these vars. */($_, $query);
168
  }
169
+ $parse = @parse_url /* Let PHP work its magic via ``parse_url()``. */($url_uri, $component);
170
  /**/
171
+ if($clean_path && isset($parse["path"]) && is_string($parse["path"]) && !empty($parse["path"]))
172
+ $parse["path"] = /* Clean up the path now. */ preg_replace("/\/+/", "/", $parse["path"]);
173
  /**/
174
  return ($component !== -1) ? /* Force a string return value? */ (string)$parse : $parse;
175
  }
188
  * `code` *(http response code)*, `message` *(http response message)*, `headers` *(an array of lowercase headers)*, `body` *(the response body string)*, `response` *(full response array)*.
189
  * @return str|array|bool Requested response str|array from remote location *(see ``$return_array`` parameter )*; else (bool)`false` on failure.
190
  */
191
+ public static function remote($url = FALSE, $post_vars = FALSE, $args = FALSE, $return_array = FALSE)
192
  {
193
+ if($url && /* We MUST have a valid full URL (string) before we do anything in this routine. */ is_string($url))
194
  {
195
+ $args = /* Force array, and disable SSL verification. */ (!is_array($args)) ? array(): $args;
196
+ $args["sslverify"] = (!isset($args["sslverify"])) ? /* Off. */ false : $args["sslverify"];
197
  /**/
198
+ if((is_array($post_vars) || is_string($post_vars)) && !empty($post_vars))
199
+ $args = array_merge($args, array("method" => "POST", "body" => $post_vars));
200
  /**/
201
+ if(!empty($args["method"]) && strcasecmp((string)$args["method"], "DELETE") === 0)
202
  /* WordPress® v3.3 and prior, does NOT support `DELETE` via cURL unfortunately. */
203
+ add_filter("use_curl_transport", "__return_false", /* ID via priority. */ 111209554);
204
  /**/
205
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
206
+ do_action("ws_plugin__s2member_before_wp_remote_request", get_defined_vars());
207
+ unset($__refs, $__v); /* Unset defined __refs, __v. */
208
  /**/
209
+ $response = /* Process remote request via ``wp_remote_request()``. */ wp_remote_request($url, $args);
210
  /**/
211
+ remove_filter /* Remove this Filter now. */("use_curl_transport", "__return_false", 111209554);
212
+ /**/
213
+ if($return_array && !is_wp_error($response) && is_array($response))
214
  {
215
+ $a = array("code" => (int)wp_remote_retrieve_response_code($response));
216
+ $a = array_merge($a, array("message" => wp_remote_retrieve_response_message($response)));
217
+ $a = array_merge($a, array("headers" => wp_remote_retrieve_headers($response)));
218
+ $a = array_merge($a, array("body" => wp_remote_retrieve_body($response)));
219
+ $a = array_merge($a, array("response" => $response));
220
  /**/
221
  return /* Return array w/ ``$response`` too. */ $a;
222
  }
223
+ else if(!is_wp_error($response) && is_array($response) /* Return body only. */)
224
+ return /* Return ``$response`` body only. */ wp_remote_retrieve_body($response);
225
  /**/
226
  else /* Else this remote request has failed completely. Return false. */
227
+ return false; /* Remote request failed, return false. */
228
  }
229
  else /* Else, return false. */
230
+ return false;
231
  }
232
  /**
233
  * Shortens a long URL, based on s2Member configuration.
240
  * @param bool $try_backups Defaults to true. If a failure occurs with the first API, we'll try others until we have success.
241
  * @return str|bool The shortened URL on success, else false on failure.
242
  */
243
+ public static function shorten($url = FALSE, $api_sp = FALSE, $try_backups = TRUE)
244
  {
245
+ $url = /* Force strings, else false. */ ($url && is_string($url)) ? $url : false;
246
+ $api_sp = ($api_sp && is_string($api_sp)) ? strtolower($api_sp) : false;
247
  /**/
248
  $default_url_shortener = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"];
249
  $default_custom_str_url_shortener = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_custom_str_url_shortener"];
250
  /**/
251
+ $apis = /* The shortening APIs currently pre-integrated in this release of s2Member. */ array("tiny_url", "goo_gl");
252
  /**/
253
+ if($url && ($api = /* If specific, use it. Otherwise, use the default shortening API. */ ($api_sp) ? $api_sp : $default_url_shortener))
254
  {
255
+ if(!$api_sp && ($custom_url = trim(apply_filters("ws_plugin__s2member_url_shorten", false, get_defined_vars()))) && stripos($custom_url, "http") === 0)
256
  return /* Using whatever other shortener API you prefer, over the ones available by default with s2Member. */ ($shorter_url = $custom_url);
257
  /**/
258
+ else if(!$api_sp && stripos($default_custom_str_url_shortener, "http") === 0 && ($custom_url = trim(c_ws_plugin__s2member_utils_urls::remote(str_ireplace(array("%%s2_long_url%%", "%%s2_long_url_md5%%"), array(rawurlencode($url), urlencode(md5($url))), $default_custom_str_url_shortener)))) && stripos($custom_url, "http") === 0)
259
  return /* Using whatever other shortener API that a site owner prefers, over the ones available by default with s2Member. */ ($shorter_url = $custom_url);
260
  /**/
261
+ else if($api === "tiny_url" && ($tiny_url = trim(c_ws_plugin__s2member_utils_urls::remote("http://tinyurl.com/api-create.php?url=".rawurlencode($url)))) && stripos($tiny_url, "http") === 0)
262
  return /* The default tinyURL API: <http://tinyurl.com/api-create.php?url=http://www.example.com/>. */ ($shorter_url = $tiny_url);
263
  /**/
264
+ else if($api === "goo_gl" && ($goo_gl = json_decode(trim(c_ws_plugin__s2member_utils_urls::remote("https://www.googleapis.com/urlshortener/v1/url".((($goo_gl_key = apply_filters("ws_plugin__s2member_url_shorten_api_goo_gl_key", false))) ? "?key=".urlencode($goo_gl_key) : ""), json_encode(array("longUrl" => $url)), array("headers" => array("Content-Type" => "application/json")))), true)) && !empty($goo_gl["id"]) && is_string($goo_gl_url = $goo_gl["id"]) && stripos($goo_gl_url, "http") === 0)
265
  return /* Google® API: <http://code.google.com/apis/urlshortener/v1/getting_started.html>. */ ($shorter_url = $goo_gl_url);
266
  /**/
267
+ else if /* Try backups? This way we can still shorten the URL with a backup. */($try_backups && count($apis) > 1)
268
  /**/
269
+ foreach /* Try other backup APIs now. */(array_diff($apis, array($api)) as $backup)
270
+ if(($backup = c_ws_plugin__s2member_utils_urls::shorten($url, $backup, false)))
271
  return /* Success, we can return now. */ ($shorter_url = $backup);
272
  }
273
  return /* Default return value. */ false;
282
  * @param str $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`.
283
  * @return str A full URL, a partial URI, or just the query string; without any s2Member-generated signatures.
284
  */
285
+ public static function remove_s2member_sigs($url_uri_query = FALSE, $sig_var = FALSE)
286
  {
287
+ $url_uri_query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false, "?&=");
288
+ $sig_var = ($sig_var && is_string($sig_var)) ? $sig_var : /* Use default. */ "_s2member_sig";
289
+ $sigs = /* Remove all signatures. */ array_unique(array($sig_var, "_s2member_sig"));
290
  /**/
291
+ return trim(remove_query_arg($sigs, $url_uri_query), "?&=");
292
  }
293
  /**
294
  * Adds an s2Member-generated signature onto a full URL, a partial URI, or just a query string.
300
  * @param str $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`.
301
  * @return str A full URL, a partial URI, or just a query string; with an s2Member-generated signature.
302
  */
303
+ public static function add_s2member_sig($url_uri_query = FALSE, $sig_var = FALSE)
304
  {
305
+ $url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false, "?&=");
306
+ $sig_var = ($sig_var && is_string($sig_var)) ? $sig_var : /* Use default. */ "_s2member_sig";
307
  /**/
308
+ $url_uri_query = $query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($url_uri_query, $sig_var);
309
+ if( /* Is this a full URL, or a partial URI? */preg_match("/^(?:[a-z]+\:\/\/|\/)/i", ($url_uri_query)))
310
+ $query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), "?&=");
311
  /**/
312
+ $key = /* Obtain the proper encryption/decryption key. */ c_ws_plugin__s2member_utils_encryption::key();
313
  /**/
314
+ if($url_uri_query && is_string /* We DO allow empty query strings. So we can sign a URL without one. */($query))
315
  {
316
+ wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */($query, $vars);
317
+ $vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars));
318
+ $vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars));
319
  /**/
320
+ $sig = /* The s2Member-generated signature. */ ($time = time())."-".md5($key.$time.$vars);
321
  /**/
322
+ $url_uri_query = add_query_arg($sig_var, urlencode($sig), $url_uri_query);
323
  }
324
  return /* Possibly with a ``$sig_var`` variable. */ $url_uri_query;
325
  }
335
  * @param str $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`.
336
  * @return bool True if the s2Member-generated signature is OK, else false.
337
  */
338
+ public static function s2member_sig_ok($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE)
339
  {
340
+ $url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string)$url_uri_query, false, "?&=");
341
+ if( /* Is this a full URL, or a partial URI? */preg_match("/^(?:[a-z]+\:\/\/|\/)/i", ($url_uri_query)))
342
+ $query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), "?&=");
343
  /**/
344
  $check_time = /* Are we checking time? Force a boolean value here. */ ($check_time) ? true : false;
345
+ $exp_secs = (is_numeric($exp_secs)) ? (int)$exp_secs : /* Else 10 seconds by default here. */ 10;
346
+ $sig_var = ($sig_var && is_string($sig_var)) ? $sig_var : /* Use default. */ "_s2member_sig";
347
  /**/
348
+ $key = /* Obtain the proper encryption/decryption key. */ c_ws_plugin__s2member_utils_encryption::key();
349
  /**/
350
+ if(preg_match_all /* Does ``$query`` have an s2Member-generated signature? */("/".preg_quote($sig_var, "/")."\=([0-9]+)-([^&$]+)/", $query, $sigs))
351
  {
352
+ $query = /* Remove existing s2Member-generated signatures. */ c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($query, $sig_var);
353
  /**/
354
+ wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */($query, $vars);
355
+ $vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars));
356
+ $vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars));
357
  /**/
358
+ ($time = $sigs[1][($i = count($sigs[1]) - 1)]).($sig = $sigs[2][$i]).($valid_sig = md5($key.$time.$vars));
359
  /**/
360
+ if /* Checking time? This must NOT be older than ``$exp_secs`` seconds ago. */($check_time)
361
+ return ($sig === $valid_sig && $time >= strtotime("-".$exp_secs." seconds"));
362
  /**/
363
  else /* Ignoring time? Just need to compare signatures in this case. */
364
+ return /* Do they match up? */ ($sig === $valid_sig);
365
  }
366
  else /* Return false. No ``$query``, or no ``$sigs``. */
367
+ return /* False, it's NOT ok. */ false;
368
  }
369
  }
370
  }
includes/functions/api-functions.inc.php CHANGED
@@ -242,10 +242,10 @@ if (!function_exists ("user_is_not"))
242
  *
243
  * ———— Shortcode Conditional Equivalent ————
244
  * ```
245
- * [s2If curent_user_is(subscriber)]
246
  * You ARE a Free Subscriber at Level #0.
247
  * [/s2If]
248
- * [s2If curent_user_is(s2member_level1)]
249
  * You ARE a Member at Level #1.
250
  * [/s2If]
251
  * [s2If current_user_can(access_s2member_level2)]
242
  *
243
  * ———— Shortcode Conditional Equivalent ————
244
  * ```
245
+ * [s2If current_user_is(subscriber)]
246
  * You ARE a Free Subscriber at Level #0.
247
  * [/s2If]
248
+ * [s2If current_user_is(s2member_level1)]
249
  * You ARE a Member at Level #1.
250
  * [/s2If]
251
  * [s2If current_user_can(access_s2member_level2)]
includes/hooks.inc.php CHANGED
@@ -14,163 +14,164 @@
14
  * @package s2Member
15
  * @since 3.0
16
  */
17
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18
  exit("Do not access this file directly.");
19
  /*
20
  Add the plugin Actions/Filters here.
21
  */
22
- add_action ("init", "c_ws_plugin__s2member_translations::load", 2);
23
  /**/
24
- add_action ("init", "c_ws_plugin__s2member_ssl::check_force_ssl", 3);
25
- add_action ("init", "c_ws_plugin__s2member_user_securities::initialize", 3);
26
- add_action ("init", "c_ws_plugin__s2member_no_cache::no_cache", 3);
27
  /**/
28
- add_action ("init", "c_ws_plugin__s2member_register::register", 4);
29
- add_action ("init", "c_ws_plugin__s2member_paypal_notify::paypal_notify", 4);
30
- add_action ("init", "c_ws_plugin__s2member_files::check_file_download_access", 4);
31
- add_action ("init", "c_ws_plugin__s2member_profile_mods::handle_profile_modifications", 4);
32
- add_action ("init", "c_ws_plugin__s2member_profile_mods_4bp::handle_profile_modifications_4bp", 4);
33
- add_action ("init", "c_ws_plugin__s2member_tracking_cookies::delete_sp_tracking_cookie", 4);
34
- add_action ("init", "c_ws_plugin__s2member_tracking_cookies::delete_tracking_cookie", 4);
35
- add_action ("init", "c_ws_plugin__s2member_cron_jobs::auto_eot_system_via_cron", 4);
36
- add_action ("init", "c_ws_plugin__s2member_mo_page::membership_options_page", 4);
37
- add_action ("init", "c_ws_plugin__s2member_s_badge_status::s_badge_status", 4);
38
- /**/
39
- add_action ("init", "c_ws_plugin__s2member_admin_css_js::menu_pages_css", 5);
40
- add_action ("init", "c_ws_plugin__s2member_admin_css_js::menu_pages_js", 5);
41
- add_action ("init", "c_ws_plugin__s2member_css_js::css", 5);
42
- /**/
43
- add_action ("init", "c_ws_plugin__s2member_constants::constants", 6);
44
  /**/
45
- add_action ("init", "c_ws_plugin__s2member_css_js::js_w_globals", 7);
46
- add_action ("init", "c_ws_plugin__s2member_paypal_return::paypal_return", 7);
47
- add_action ("init", "c_ws_plugin__s2member_profile::profile", 7);
48
- /**/
49
- add_action ("init", "c_ws_plugin__s2member_labels::config_label_translations", 10);
50
- /**/
51
- add_action ("init", "c_ws_plugin__s2member_login_redirects_r::remove_login_redirect_filters", 11);
52
- /**/
53
- add_action ("pre_get_posts", "c_ws_plugin__s2member_security::security_gate_query", 100);
54
- /**/
55
- add_action ("wp", "c_ws_plugin__s2member_ssl::check_force_ssl", 2);
56
- add_action ("wp", "c_ws_plugin__s2member_security::security_gate", 2);
57
- /* Stay ahead of BuddyPress® @ `3`, in `bp-core-hooks.php`. */
58
- /**/
59
- add_filter ("wp_mail", "c_ws_plugin__s2member_email_configs::email_filter");
60
- /**/
61
- add_filter ("widget_text", "do_shortcode"); /* Shortcodes in widgets. */
62
- /**/
63
- add_action ("wp_print_styles", "c_ws_plugin__s2member_css_js_themes::add_css");
64
- add_action ("wp_print_scripts", "c_ws_plugin__s2member_css_js_themes::add_js_w_globals");
65
- /**/
66
- add_action ("wp_login_failed", "c_ws_plugin__s2member_brute_force::track_failed_logins");
67
- add_filter ("authenticate", "c_ws_plugin__s2member_brute_force::stop_brute_force_logins", 100);
 
 
 
 
 
68
  /**/
69
- add_action ("delete_user", "c_ws_plugin__s2member_user_deletions::handle_user_deletions");
70
- add_action ("wpmu_delete_user", "c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions");
71
- add_action ("remove_user_from_blog", "c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions", 10, 2);
72
  /**/
73
- add_filter ("enable_edit_any_user_configuration", "c_ws_plugin__s2member_user_securities::ms_allow_edits");
 
 
 
 
 
 
 
74
  /**/
75
- add_filter ("pre_option_default_role", "c_ws_plugin__s2member_option_forces::force_default_role");
76
- add_filter ("pre_site_option_default_user_role", "c_ws_plugin__s2member_option_forces::force_mms_default_role");
77
- add_filter ("pre_site_option_add_new_users", "c_ws_plugin__s2member_option_forces::mms_allow_new_users");
78
- add_filter ("pre_site_option_dashboard_blog", "c_ws_plugin__s2member_option_forces::mms_dashboard_blog");
79
- add_filter ("pre_option_users_can_register", "c_ws_plugin__s2member_option_forces::check_register_access");
80
- add_filter ("pre_site_option_registration", "c_ws_plugin__s2member_option_forces::check_mms_register_access");
81
- add_filter ("bp_core_get_root_options", "c_ws_plugin__s2member_option_forces::check_bp_mms_register_access");
82
- add_filter ("bp_core_get_site_options", "c_ws_plugin__s2member_option_forces::check_bp_mms_register_access");
83
  /**/
84
- add_filter ("random_password", "c_ws_plugin__s2member_registrations::generate_password");
85
- add_action ("user_register", "c_ws_plugin__s2member_registrations::configure_user_registration");
86
- add_action ("register_form", "c_ws_plugin__s2member_custom_reg_fields::custom_registration_fields");
 
 
 
 
 
 
 
87
  /**/
88
- add_filter ("add_signup_meta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");
89
- add_filter ("bp_signup_usermeta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");
90
- add_filter ("wpmu_validate_user_signup", "c_ws_plugin__s2member_registrations::ms_validate_user_signup");
91
- add_action ("signup_hidden_fields", "c_ws_plugin__s2member_registrations::ms_process_signup_hidden_fields");
92
- add_filter ("registration_errors", "c_ws_plugin__s2member_registrations::ms_register_existing_user", 11, 3);
93
- add_filter ("wpmu_signup_user_notification_email", "c_ws_plugin__s2member_email_configs::ms_nice_email_roles", 11);
94
- add_filter ("_wpmu_activate_existing_error_", "c_ws_plugin__s2member_registrations::ms_activate_existing_user", 10, 2);
95
- add_action ("wpmu_activate_user", "c_ws_plugin__s2member_registrations::configure_user_on_ms_user_activation", 10, 3);
96
- add_action ("wpmu_activate_blog", "c_ws_plugin__s2member_registrations::configure_user_on_ms_blog_activation", 10, 5);
97
- add_action ("signup_extra_fields", "c_ws_plugin__s2member_custom_reg_fields::ms_custom_registration_fields");
98
  /**/
99
- add_action ("bp_after_signup_profile_fields", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_registration_fields_4bp");
100
- add_action ("bp_after_profile_field_content", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_fields_4bp");
101
- add_action ("bp_profile_field_item", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_field_items_4bp");
 
 
102
  /**/
103
- add_action ("wp_login", "c_ws_plugin__s2member_login_redirects::login_redirect");
104
- add_action ("login_head", "c_ws_plugin__s2member_login_customizations::login_header_styles");
105
- add_filter ("login_headerurl", "c_ws_plugin__s2member_login_customizations::login_header_url");
106
- add_filter ("login_headertitle", "c_ws_plugin__s2member_login_customizations::login_header_title");
107
- add_action ("login_footer", "c_ws_plugin__s2member_login_customizations::login_footer_design");
108
  /**/
109
- add_action ("login_footer", "c_ws_plugin__s2member_tracking_codes::display_signup_tracking_codes");
110
- add_action ("wp_footer", "c_ws_plugin__s2member_tracking_codes::display_signup_tracking_codes");
111
  /**/
112
- add_action ("login_footer", "c_ws_plugin__s2member_tracking_codes::display_modification_tracking_codes");
113
- add_action ("wp_footer", "c_ws_plugin__s2member_tracking_codes::display_modification_tracking_codes");
114
  /**/
115
- add_action ("login_footer", "c_ws_plugin__s2member_tracking_codes::display_ccap_tracking_codes");
116
- add_action ("wp_footer", "c_ws_plugin__s2member_tracking_codes::display_ccap_tracking_codes");
117
  /**/
118
- add_action ("login_footer", "c_ws_plugin__s2member_tracking_codes::display_sp_tracking_codes");
119
- add_action ("wp_footer", "c_ws_plugin__s2member_tracking_codes::display_sp_tracking_codes");
120
  /**/
121
- add_action ("wp_footer", "c_ws_plugin__s2member_wp_footer::wp_footer_code");
 
122
  /**/
123
- add_action ("admin_init", "c_ws_plugin__s2member_admin_lockouts::admin_lockout", 1);
124
- add_action ("admin_init", "c_ws_plugin__s2member_check_activation::check");
 
 
125
  /**/
126
- add_action ("load-settings.php", "c_ws_plugin__s2member_op_notices::multisite_ops_notice");
127
- add_action ("load-options-general.php", "c_ws_plugin__s2member_op_notices::general_ops_notice");
128
- add_action ("load-options-reading.php", "c_ws_plugin__s2member_op_notices::reading_ops_notice");
129
- add_action ("load-user-new.php", "c_ws_plugin__s2member_user_new::admin_user_new_fields");
 
 
 
 
130
  /**/
131
- add_action ("add_meta_boxes", "c_ws_plugin__s2member_meta_boxes::add_meta_boxes");
132
- add_action ("save_post", "c_ws_plugin__s2member_meta_box_saves::save_meta_boxes");
133
- add_action ("admin_menu", "c_ws_plugin__s2member_menu_pages::add_admin_options");
134
- add_action ("network_admin_menu", "c_ws_plugin__s2member_menu_pages::add_network_admin_options");
135
- add_action ("admin_bar_menu", "c_ws_plugin__s2member_admin_lockouts::filter_admin_menu_bar", 100);
136
- add_action ("admin_print_scripts", "c_ws_plugin__s2member_menu_pages::add_admin_scripts");
137
- add_action ("admin_print_styles", "c_ws_plugin__s2member_menu_pages::add_admin_styles");
138
- add_filter ("update_feedback", "c_ws_plugin__s2member_mms_patches::sync_mms_patches");
139
  /**/
140
- add_action ("admin_notices", "c_ws_plugin__s2member_admin_notices::admin_notices");
141
- add_action ("user_admin_notices", "c_ws_plugin__s2member_admin_notices::admin_notices");
142
- add_action ("network_admin_notices", "c_ws_plugin__s2member_admin_notices::admin_notices");
 
 
 
 
 
 
143
  /**/
144
- add_action ("pre_user_query", "c_ws_plugin__s2member_users_list::users_list_query");
145
- add_filter ("manage_users_columns", "c_ws_plugin__s2member_users_list::users_list_cols");
146
- add_filter ("manage_users_custom_column", "c_ws_plugin__s2member_users_list::users_list_display_cols", 10, 3);
147
- add_action ("edit_user_profile", "c_ws_plugin__s2member_users_list::users_list_edit_cols");
148
- add_action ("show_user_profile", "c_ws_plugin__s2member_users_list::users_list_edit_cols");
149
- add_action ("edit_user_profile_update", "c_ws_plugin__s2member_users_list::users_list_update_cols");
150
- add_action ("personal_options_update", "c_ws_plugin__s2member_users_list::users_list_update_cols");
151
- add_action ("set_user_role", "c_ws_plugin__s2member_registration_times::synchronize_paid_reg_times", 10, 2);
152
- add_filter ("show_password_fields", "c_ws_plugin__s2member_user_securities::hide_password_fields", 10, 2);
153
  /**/
154
- add_filter ("cron_schedules", "c_ws_plugin__s2member_cron_jobs::extend_cron_schedules");
155
- add_action ("ws_plugin__s2member_auto_eot_system__schedule", "c_ws_plugin__s2member_auto_eots::auto_eot_system");
156
  /**/
157
- add_action ("wp_ajax_ws_plugin__s2member_update_roles_via_ajax", "c_ws_plugin__s2member_roles_caps::update_roles_via_ajax");
158
- /**/
159
- add_action ("wp_ajax_ws_plugin__s2member_sp_access_link_via_ajax", "c_ws_plugin__s2member_sp_access::sp_access_link_via_ajax");
160
- add_action ("wp_ajax_ws_plugin__s2member_reg_access_link_via_ajax", "c_ws_plugin__s2member_register_access::reg_access_link_via_ajax");
161
- /**/
162
- add_action ("wp_ajax_ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax", "c_ws_plugin__s2member_ip_restrictions::delete_reset_all_ip_restrictions_via_ajax");
163
- add_action ("wp_ajax_ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax", "c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions_via_ajax");
164
- /**/
165
- add_action ("ws_plugin__s2member_during_collective_mods", "c_ws_plugin__s2member_list_servers::auto_process_list_server_removals", 10, 7);
166
- add_action ("ws_plugin__s2member_during_collective_eots", "c_ws_plugin__s2member_list_servers::auto_process_list_server_removals", 10, 4);
167
- /**/
168
- add_filter ("ws_plugin__s2member_content_redirect_status", "c_ws_plugin__s2member_utils_urls::redirect_browsers_using_302_status");
169
- /**/
170
- add_action ("bbp_activation", "c_ws_plugin__s2member_roles_caps::config_roles", 11);
171
  /*
172
  Register the activation | de-activation routines.
173
  */
174
- register_activation_hook ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["plugin_basename"], "c_ws_plugin__s2member_installation::activate");
175
- register_deactivation_hook ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["plugin_basename"], "c_ws_plugin__s2member_installation::deactivate");
176
  ?>
14
  * @package s2Member
15
  * @since 3.0
16
  */
17
+ if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
18
  exit("Do not access this file directly.");
19
  /*
20
  Add the plugin Actions/Filters here.
21
  */
22
+ add_action("init", "c_ws_plugin__s2member_translations::load", 2);
23
  /**/
24
+ add_action("init", "c_ws_plugin__s2member_ssl::check_force_ssl", 3);
25
+ add_action("init", "c_ws_plugin__s2member_user_securities::initialize", 3);
26
+ add_action("init", "c_ws_plugin__s2member_no_cache::no_cache", 3);
27
  /**/
28
+ add_action("init", "c_ws_plugin__s2member_register::register", 4);
29
+ add_action("init", "c_ws_plugin__s2member_paypal_notify::paypal_notify", 4);
30
+ add_action("init", "c_ws_plugin__s2member_files::check_file_download_access", 4);
31
+ add_action("init", "c_ws_plugin__s2member_profile_mods::handle_profile_modifications", 4);
32
+ add_action("init", "c_ws_plugin__s2member_profile_mods_4bp::handle_profile_modifications_4bp", 4);
33
+ add_action("init", "c_ws_plugin__s2member_tracking_cookies::delete_sp_tracking_cookie", 4);
34
+ add_action("init", "c_ws_plugin__s2member_tracking_cookies::delete_tracking_cookie", 4);
35
+ add_action("init", "c_ws_plugin__s2member_cron_jobs::auto_eot_system_via_cron", 4);
36
+ add_action("init", "c_ws_plugin__s2member_mo_page::membership_options_page", 4);
37
+ add_action("init", "c_ws_plugin__s2member_s_badge_status::s_badge_status", 4);
38
+ /**/
39
+ add_action("init", "c_ws_plugin__s2member_admin_css_js::menu_pages_css", 5);
40
+ add_action("init", "c_ws_plugin__s2member_admin_css_js::menu_pages_js", 5);
41
+ add_action("init", "c_ws_plugin__s2member_css_js::css", 5);
42
+ /**/
43
+ add_action("init", "c_ws_plugin__s2member_constants::constants", 6);
44
  /**/
45
+ add_action("init", "c_ws_plugin__s2member_css_js::js_w_globals", 7);
46
+ add_action("init", "c_ws_plugin__s2member_paypal_return::paypal_return", 7);
47
+ add_action("init", "c_ws_plugin__s2member_profile::profile", 7);
48
+ /**/
49
+ add_action("init", "c_ws_plugin__s2member_labels::config_label_translations", 10);
50
+ /**/
51
+ add_action("init", "c_ws_plugin__s2member_login_redirects_r::remove_login_redirect_filters", 11);
52
+ /**/
53
+ add_action("pre_get_posts", "c_ws_plugin__s2member_security::security_gate_query", 100);
54
+ /**/
55
+ add_action("wp", "c_ws_plugin__s2member_ssl::check_force_ssl", 1);
56
+ add_action("wp", "c_ws_plugin__s2member_security::security_gate", 1);
57
+ /* Stay ahead of BuddyPress® at `3` on `wp in `bp-core-hooks.php`. */
58
+ /* Set to `1` so other plugins may come between these. */
59
+ /**/
60
+ add_filter("wp_mail", "c_ws_plugin__s2member_email_configs::email_filter");
61
+ /**/
62
+ add_filter("widget_text", "do_shortcode"); /* Shortcodes in widgets. */
63
+ /**/
64
+ add_action("wp_print_styles", "c_ws_plugin__s2member_css_js_themes::add_css");
65
+ add_action("wp_print_scripts", "c_ws_plugin__s2member_css_js_themes::add_js_w_globals");
66
+ /**/
67
+ add_action("wp_login_failed", "c_ws_plugin__s2member_brute_force::track_failed_logins");
68
+ add_filter("authenticate", "c_ws_plugin__s2member_brute_force::stop_brute_force_logins", 100);
69
+ /**/
70
+ add_action("delete_user", "c_ws_plugin__s2member_user_deletions::handle_user_deletions");
71
+ add_action("wpmu_delete_user", "c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions");
72
+ add_action("remove_user_from_blog", "c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions", 10, 2);
73
  /**/
74
+ add_filter("enable_edit_any_user_configuration", "c_ws_plugin__s2member_user_securities::ms_allow_edits");
 
 
75
  /**/
76
+ add_filter("pre_option_default_role", "c_ws_plugin__s2member_option_forces::force_default_role");
77
+ add_filter("pre_site_option_default_user_role", "c_ws_plugin__s2member_option_forces::force_mms_default_role");
78
+ add_filter("pre_site_option_add_new_users", "c_ws_plugin__s2member_option_forces::mms_allow_new_users");
79
+ add_filter("pre_site_option_dashboard_blog", "c_ws_plugin__s2member_option_forces::mms_dashboard_blog");
80
+ add_filter("pre_option_users_can_register", "c_ws_plugin__s2member_option_forces::check_register_access");
81
+ add_filter("pre_site_option_registration", "c_ws_plugin__s2member_option_forces::check_mms_register_access");
82
+ add_filter("bp_core_get_root_options", "c_ws_plugin__s2member_option_forces::check_bp_mms_register_access");
83
+ add_filter("bp_core_get_site_options", "c_ws_plugin__s2member_option_forces::check_bp_mms_register_access");
84
  /**/
85
+ add_filter("random_password", "c_ws_plugin__s2member_registrations::generate_password");
86
+ add_action("user_register", "c_ws_plugin__s2member_registrations::configure_user_registration");
87
+ add_action("register_form", "c_ws_plugin__s2member_custom_reg_fields::custom_registration_fields");
 
 
 
 
 
88
  /**/
89
+ add_filter("add_signup_meta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");
90
+ add_filter("bp_signup_usermeta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");
91
+ add_filter("wpmu_validate_user_signup", "c_ws_plugin__s2member_registrations::ms_validate_user_signup");
92
+ add_action("signup_hidden_fields", "c_ws_plugin__s2member_registrations::ms_process_signup_hidden_fields");
93
+ add_filter("registration_errors", "c_ws_plugin__s2member_registrations::ms_register_existing_user", 11, 3);
94
+ add_filter("wpmu_signup_user_notification_email", "c_ws_plugin__s2member_email_configs::ms_nice_email_roles", 11);
95
+ add_filter("_wpmu_activate_existing_error_", "c_ws_plugin__s2member_registrations::ms_activate_existing_user", 10, 2);
96
+ add_action("wpmu_activate_user", "c_ws_plugin__s2member_registrations::configure_user_on_ms_user_activation", 10, 3);
97
+ add_action("wpmu_activate_blog", "c_ws_plugin__s2member_registrations::configure_user_on_ms_blog_activation", 10, 5);
98
+ add_action("signup_extra_fields", "c_ws_plugin__s2member_custom_reg_fields::ms_custom_registration_fields");
99
  /**/
100
+ add_action("bp_after_signup_profile_fields", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_registration_fields_4bp");
101
+ add_action("bp_after_profile_field_content", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_fields_4bp");
102
+ add_action("bp_profile_field_item", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_field_items_4bp");
 
 
 
 
 
 
 
103
  /**/
104
+ add_action("wp_login", "c_ws_plugin__s2member_login_redirects::login_redirect");
105
+ add_action("login_head", "c_ws_plugin__s2member_login_customizations::login_header_styles");
106
+ add_filter("login_headerurl", "c_ws_plugin__s2member_login_customizations::login_header_url");
107
+ add_filter("login_headertitle", "c_ws_plugin__s2member_login_customizations::login_header_title");
108
+ add_action("login_footer", "c_ws_plugin__s2member_login_customizations::login_footer_design");
109
  /**/
110
+ add_action("login_footer", "c_ws_plugin__s2member_tracking_codes::display_signup_tracking_codes");
111
+ add_action("wp_footer", "c_ws_plugin__s2member_tracking_codes::display_signup_tracking_codes");
 
 
 
112
  /**/
113
+ add_action("login_footer", "c_ws_plugin__s2member_tracking_codes::display_modification_tracking_codes");
114
+ add_action("wp_footer", "c_ws_plugin__s2member_tracking_codes::display_modification_tracking_codes");
115
  /**/
116
+ add_action("login_footer", "c_ws_plugin__s2member_tracking_codes::display_ccap_tracking_codes");
117
+ add_action("wp_footer", "c_ws_plugin__s2member_tracking_codes::display_ccap_tracking_codes");
118
  /**/
119
+ add_action("login_footer", "c_ws_plugin__s2member_tracking_codes::display_sp_tracking_codes");
120
+ add_action("wp_footer", "c_ws_plugin__s2member_tracking_codes::display_sp_tracking_codes");
121
  /**/
122
+ add_action("wp_footer", "c_ws_plugin__s2member_wp_footer::wp_footer_code");
 
123
  /**/
124
+ add_action("admin_init", "c_ws_plugin__s2member_admin_lockouts::admin_lockout", 1);
125
+ add_action("admin_init", "c_ws_plugin__s2member_check_activation::check");
126
  /**/
127
+ add_action("load-settings.php", "c_ws_plugin__s2member_op_notices::multisite_ops_notice");
128
+ add_action("load-options-general.php", "c_ws_plugin__s2member_op_notices::general_ops_notice");
129
+ add_action("load-options-reading.php", "c_ws_plugin__s2member_op_notices::reading_ops_notice");
130
+ add_action("load-user-new.php", "c_ws_plugin__s2member_user_new::admin_user_new_fields");
131
  /**/
132
+ add_action("add_meta_boxes", "c_ws_plugin__s2member_meta_boxes::add_meta_boxes");
133
+ add_action("save_post", "c_ws_plugin__s2member_meta_box_saves::save_meta_boxes");
134
+ add_action("admin_menu", "c_ws_plugin__s2member_menu_pages::add_admin_options");
135
+ add_action("network_admin_menu", "c_ws_plugin__s2member_menu_pages::add_network_admin_options");
136
+ add_action("admin_bar_menu", "c_ws_plugin__s2member_admin_lockouts::filter_admin_menu_bar", 100);
137
+ add_action("admin_print_scripts", "c_ws_plugin__s2member_menu_pages::add_admin_scripts");
138
+ add_action("admin_print_styles", "c_ws_plugin__s2member_menu_pages::add_admin_styles");
139
+ add_filter("update_feedback", "c_ws_plugin__s2member_mms_patches::sync_mms_patches");
140
  /**/
141
+ add_action("admin_notices", "c_ws_plugin__s2member_admin_notices::admin_notices");
142
+ add_action("user_admin_notices", "c_ws_plugin__s2member_admin_notices::admin_notices");
143
+ add_action("network_admin_notices", "c_ws_plugin__s2member_admin_notices::admin_notices");
 
 
 
 
 
144
  /**/
145
+ add_action("pre_user_query", "c_ws_plugin__s2member_users_list::users_list_query");
146
+ add_filter("manage_users_columns", "c_ws_plugin__s2member_users_list::users_list_cols");
147
+ add_filter("manage_users_custom_column", "c_ws_plugin__s2member_users_list::users_list_display_cols", 10, 3);
148
+ add_action("edit_user_profile", "c_ws_plugin__s2member_users_list::users_list_edit_cols");
149
+ add_action("show_user_profile", "c_ws_plugin__s2member_users_list::users_list_edit_cols");
150
+ add_action("edit_user_profile_update", "c_ws_plugin__s2member_users_list::users_list_update_cols");
151
+ add_action("personal_options_update", "c_ws_plugin__s2member_users_list::users_list_update_cols");
152
+ add_action("set_user_role", "c_ws_plugin__s2member_registration_times::synchronize_paid_reg_times", 10, 2);
153
+ add_filter("show_password_fields", "c_ws_plugin__s2member_user_securities::hide_password_fields", 10, 2);
154
  /**/
155
+ add_filter("cron_schedules", "c_ws_plugin__s2member_cron_jobs::extend_cron_schedules");
156
+ add_action("ws_plugin__s2member_auto_eot_system__schedule", "c_ws_plugin__s2member_auto_eots::auto_eot_system");
 
 
 
 
 
 
 
157
  /**/
158
+ add_action("wp_ajax_ws_plugin__s2member_update_roles_via_ajax", "c_ws_plugin__s2member_roles_caps::update_roles_via_ajax");
 
159
  /**/
160
+ add_action("wp_ajax_ws_plugin__s2member_sp_access_link_via_ajax", "c_ws_plugin__s2member_sp_access::sp_access_link_via_ajax");
161
+ add_action("wp_ajax_ws_plugin__s2member_reg_access_link_via_ajax", "c_ws_plugin__s2member_register_access::reg_access_link_via_ajax");
162
+ /**/
163
+ add_action("wp_ajax_ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax", "c_ws_plugin__s2member_ip_restrictions::delete_reset_all_ip_restrictions_via_ajax");
164
+ add_action("wp_ajax_ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax", "c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions_via_ajax");
165
+ /**/
166
+ add_action("ws_plugin__s2member_during_collective_mods", "c_ws_plugin__s2member_list_servers::auto_process_list_server_removals", 10, 7);
167
+ add_action("ws_plugin__s2member_during_collective_eots", "c_ws_plugin__s2member_list_servers::auto_process_list_server_removals", 10, 4);
168
+ /**/
169
+ add_filter("ws_plugin__s2member_content_redirect_status", "c_ws_plugin__s2member_utils_urls::redirect_browsers_using_302_status");
170
+ /**/
171
+ add_action("bbp_activation", "c_ws_plugin__s2member_roles_caps::config_roles", 11);
 
 
172
  /*
173
  Register the activation | de-activation routines.
174
  */
175
+ register_activation_hook($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["plugin_basename"], "c_ws_plugin__s2member_installation::activate");
176
+ register_deactivation_hook($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["plugin_basename"], "c_ws_plugin__s2member_installation::deactivate");
177
  ?>
includes/menu-pages/code-samples/jwplayer-standard-mp4.x-php CHANGED
@@ -1,22 +1,29 @@
 
 
 
 
 
 
 
1
  <div id="jw-container">JW Player® appears here.</div>
2
- <script type="text/javascript" src="/jwplayer/jwplayer.js"></script>
3
  <script type="text/javascript">
4
  jwplayer("jw-container").setup({modes: /* JW Player®. */
5
  [
6
  /* First try psuedo-streaming with Flash® player. */
7
- {type: "flash", provider: "http", src: "/jwplayer/player.swf",
8
- config: {file: "/wp-content/plugins/s2member-files/s2member-file-inline/video.mp4"}},
9
- /* Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="video.mp4" /] */
10
 
11
  /* Else, try an HTML5 video tag. */
12
  {type: "html5", provider: "video",
13
- config: {file: "/wp-content/plugins/s2member-files/s2member-file-inline/video.mp4"}},
14
- /* Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="video.mp4" /] */
15
 
16
  /* Else, this is a safe fallback. */
17
  {type: "download", /* Download the file. */
18
- config: {file: "/wp-content/plugins/s2member-files/s2member-file-inline/video.mp4"}}
19
- /* Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="video.mp4" /] */
20
  ],
21
  /* Set video dimensions. */ width: 480, height: 270
22
  });
1
+ <?php
2
+ // Configuration.
3
+ $config["jwplayer"] = "/jwplayer/"; // Relative URL path to JW Player files directory.
4
+ $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 $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 $config["jwplayer"]; ?>player.swf",
15
+ config: {file: "/wp-content/plugins/s2member-files/s2member-file-inline/<?php echo $config["mp4_video_file_name"]; ?>"}},
16
+ /* Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="<?php echo $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 $config["mp4_video_file_name"]; ?>"}},
21
+ /* Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="<?php echo $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 $config["mp4_video_file_name"]; ?>"}}
26
+ /* Shortcode equivalent: [s2File rewrite="yes" inline="yes" download="<?php echo $config["mp4_video_file_name"]; ?>" /] */
27
  ],
28
  /* Set video dimensions. */ width: 480, height: 270
29
  });
includes/menu-pages/code-samples/jwplayer-streaming-mp4-sca.x-php CHANGED
@@ -1,11 +1,18 @@
 
 
 
 
 
 
 
1
  <div id="jw-container">JW Player® appears here.</div>
2
- <script type="text/javascript" src="/jwplayer/jwplayer.js"></script>
3
 
4
  <script type="text/javascript">
5
  /* The Shortcode here will return a JSON object for JavaScript notation. */
6
  /* A direct URL to the RTMP source; counting the file against the current User in real-time. */
7
  /* API Shortcode `s2File` returns a null object if access is denied to the current User/Member. */
8
- var mp4 = [s2File download="video.mp4" url_to_storage_source="true" count_against_user="true" get_streamer_json="true" /];
9
  </script>
10
 
11
  <script type="text/javascript">
@@ -14,7 +21,7 @@
14
  jwplayer("jw-container").setup({modes: /* JW Player®. */
15
  [
16
  /* First try real-time streaming with Flash® player. */
17
- {type: "flash", provider: "rtmp", src: "/jwplayer/player.swf",
18
  config: {streamer: mp4['streamer'], file: mp4['file']}},
19
 
20
  /* Else, try an HTML5 video tag. */
1
+ <?php
2
+ // Configuration.
3
+ $config["jwplayer"] = "/jwplayer/"; // Relative URL path to JW Player files directory.
4
+ $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 $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 $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">
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 $config["jwplayer"]; ?>player.swf",
25
  config: {streamer: mp4['streamer'], file: mp4['file']}},
26
 
27
  /* Else, try an HTML5 video tag. */
includes/menu-pages/code-samples/jwplayer-streaming-mp4-webm.x-php CHANGED
@@ -1,9 +1,17 @@
 
 
 
 
 
 
 
 
1
  <div id="jw-container">JW Player® appears here.</div>
2
- <script type="text/javascript" src="/jwplayer/jwplayer.js"></script>
3
 
4
  <?php /* A direct URL to the RTMP source; counting the file against the current User in real-time. */
5
- $mp4_cfg = array ("file_download" => "video.mp4", "url_to_storage_source" => true, "count_against_user" => true);
6
- $webm_cfg = array ("file_download" => "video.webm", "url_to_storage_source" => true /* Don't count variations. */); ?>
7
 
8
  <?php /* API Function `s2member_file_download_url()` returns false if access is denied to the current User. */
9
  if (($mp4 = s2member_file_download_url ($mp4_cfg, "get-streamer-array"))
@@ -13,7 +21,7 @@ if (($mp4 = s2member_file_download_url ($mp4_cfg, "get-streamer-array"))
13
  jwplayer("jw-container").setup({modes: /* JW Player®. */
14
  [
15
  /* First try real-time streaming with Flash® player. */
16
- {type: "flash", provider: "rtmp", src: "/jwplayer/player.swf",
17
  config: {streamer: "<?php echo $mp4["streamer"]; ?>", file: "<?php echo $mp4["file"]; ?>"}},
18
 
19
  /* Else, try an HTML5 video tag with the `mp4` file. */
1
+ <?php
2
+ // Configuration.
3
+ $config["jwplayer"] = "/jwplayer/"; // Relative URL path to JW Player files directory.
4
+ $config["mp4_video_file_name"] = "video.mp4"; // Name of your MP4 test file.
5
+ $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 $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" => $config["mp4_video_file_name"], "url_to_storage_source" => true, "count_against_user" => true);
14
+ $webm_cfg = array ("file_download" => $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"))
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 $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. */
includes/menu-pages/code-samples/jwplayer-streaming-mp4.x-php CHANGED
@@ -1,8 +1,15 @@
 
 
 
 
 
 
 
1
  <div id="jw-container">JW Player® appears here.</div>
2
- <script type="text/javascript" src="/jwplayer/jwplayer.js"></script>
3
 
4
  <?php /* A direct URL to the RTMP source; counting the file against the current User in real-time. */
5
- $cfg = array ("file_download" => "video.mp4", "url_to_storage_source" => true, "count_against_user" => true); ?>
6
 
7
  <?php /* API Function `s2member_file_download_url()` returns false if access is denied to the current User. */
8
  if (($mp4 = s2member_file_download_url ($cfg, "get-streamer-array"))) { ?>
@@ -11,7 +18,7 @@ if (($mp4 = s2member_file_download_url ($cfg, "get-streamer-array"))) { ?>
11
  jwplayer("jw-container").setup({modes: /* JW Player®. */
12
  [
13
  /* First try real-time streaming with Flash® player. */
14
- {type: "flash", provider: "rtmp", src: "/jwplayer/player.swf",
15
  config: {streamer: "<?php echo $mp4["streamer"]; ?>", file: "<?php echo $mp4["file"]; ?>"}},
16
 
17
  /* Else, try an HTML5 video tag. */
1
+ <?php
2
+ // Configuration.
3
+ $config["jwplayer"] = "/jwplayer/"; // Relative URL path to JW Player files directory.
4
+ $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 $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" => $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"))) { ?>
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 $config["jwplayer"]; ?>player.swf",
22
  config: {streamer: "<?php echo $mp4["streamer"]; ?>", file: "<?php echo $mp4["file"]; ?>"}},
23
 
24
  /* Else, try an HTML5 video tag. */
includes/menu-pages/code-samples/s2member-paid-registration-time-examples.x-php CHANGED
@@ -20,11 +20,14 @@
20
 
21
  This is some content that will be displayed to all Members that have paid you at some point.
22
 
23
- <?php if(s2member_paid_registration_time("level1") >= ($_30_days_ago = strtotime("-30 days"))){ ?>
 
 
 
24
  Drip content to Members that started paying you at Level#1, at least 30 days ago.
25
  <?php } ?>
26
 
27
- <?php if(s2member_paid_registration_time("level1") >= ($_60_days_ago = strtotime("-60 days"))){ ?>
28
  Drip more content to Members that started paying you at Level#1, at least 60 days ago.
29
  <?php } ?>
30
 
20
 
21
  This is some content that will be displayed to all Members that have paid you at some point.
22
 
23
+ <?php /* Timestamp at Level #1, or `0` if they've NOT yet paid for Level #1. */
24
+ $level1_payment_time = s2member_paid_registration_time("level1"); ?>
25
+
26
+ <?php if($level1_payment_time && $level1_payment_time <= ($_30_days_ago = strtotime("-30 days"))){ ?>
27
  Drip content to Members that started paying you at Level#1, at least 30 days ago.
28
  <?php } ?>
29
 
30
+ <?php if($level1_payment_time && $level1_payment_time <= ($_60_days_ago = strtotime("-60 days"))){ ?>
31
  Drip more content to Members that started paying you at Level#1, at least 60 days ago.
32
  <?php } ?>
33
 
includes/menu-pages/down-ops.inc.php CHANGED
@@ -273,7 +273,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
273
  /**/
274
  echo '<th style="padding-top:0;">'."\n";
275
  echo '<label for="ws-plugin--s2member-amazon-s3-files-bucket">'."\n";
276
- echo 'Amazon® S3 File Bucket ( where protected files are ):'."\n";
277
  echo '</label>'."\n";
278
  echo '</th>'."\n";
279
  /**/
@@ -282,7 +282,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
282
  /**/
283
  echo '<td>'."\n";
284
  echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_bucket" id="ws-plugin--s2member-amazon-s3-files-bucket" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket"]).'" /><br />'."\n";
285
- echo 'Your Amazon® S3 Bucket will be used, instead of the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory.'."\n";
 
286
  echo '</td>'."\n";
287
  /**/
288
  echo '</tr>'."\n";
273
  /**/
274
  echo '<th style="padding-top:0;">'."\n";
275
  echo '<label for="ws-plugin--s2member-amazon-s3-files-bucket">'."\n";
276
+ echo 'Amazon® S3 File Bucket Name ( where protected files are ):'."\n";
277
  echo '</label>'."\n";
278
  echo '</th>'."\n";
279
  /**/
282
  /**/
283
  echo '<td>'."\n";
284
  echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_bucket" id="ws-plugin--s2member-amazon-s3-files-bucket" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket"]).'" /><br />'."\n";
285
+ echo 'Your Amazon® S3 Bucket will be used, instead of the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory.<br />'."\n";
286
+ echo 'Please type the name of your Bucket. Ex: <code>mys3bucket</code>'."\n";
287
  echo '</td>'."\n";
288
  /**/
289
  echo '</tr>'."\n";
includes/menu-pages/menu-pages-s-min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function($){var esc_attr=esc_html=function(str){return String(str).replace(/"/g,"&quot;").replace(/\</g,"&lt;").replace(/\>/g,"&gt;")};if(location.href.match(/page\=ws-plugin--s2member/)){$("input.ws-plugin--s2member-update-roles-button, input.ws-plugin--s2member-reset-roles-button").click(function(){var $this=$(this);$this.val("one moment please ...");var levels='<?php echo (int)$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; ?>';var resetUpdate=($this.hasClass("ws-plugin--s2member-reset-roles-button"))?"Reset":"Update";$.post(ajaxurl,{action:"ws_plugin__s2member_update_roles_via_ajax",ws_plugin__s2member_update_roles_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-update-roles-via-ajax")); ?>'},function(response){if(response==="1"){alert("s2Member's Roles/Capabilities "+((resetUpdate.toLowerCase()==="reset")?"have been successfully reset":"updated successfully")+".\nYour installation of s2Member has Membership Levels 0-"+levels+"."),$this.val(resetUpdate+" Roles/Capabilities")}else{if(response==="l"){alert("Sorry, your request failed.\ns2Member's Roles/Capabilities are locked by Filter:\nws_plugin__s2member_lock_roles_caps"),$this.val(resetUpdate+" Roles/Capabilities")}else{alert("Sorry, your request failed.\nAccess denied. Do you have the ability to `create_users`?"),$this.val(resetUpdate+" Roles/Capabilities")}}});return false})}if(location.href.match(/page\=ws-plugin--s2member-mms-ops/)){$("select#ws-plugin--s2member-mms-registration-file").change(function(){if($(this).val()==="wp-signup"){var gv=$("select#ws-plugin--s2member-mms-registration-grants").val(),l0v=$("input#ws-plugin--s2member-mms-registration-blogs-level0").val();$("div#ws-plugin--s2member-mms-registration-support-package-details-wrapper").show(),$("div.ws-plugin--s2member-mms-registration-wp-login, table.ws-plugin--s2member-mms-registration-wp-login").hide(),$("div.ws-plugin--s2member-mms-registration-wp-signup, table.ws-plugin--s2member-mms-registration-wp-signup").show();$("div.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0, table.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0")[((gv==="all")?"show":"hide")]();$("input#ws-plugin--s2member-mms-registration-blogs-level0").val(((gv==="all")?((l0v>0)?l0v:"1"):"0"))}else{if($(this).val()==="wp-login"){var gv=$("select#ws-plugin--s2member-mms-registration-grants").val(),l0v=$("input#ws-plugin--s2member-mms-registration-blogs-level0").val();$("div#ws-plugin--s2member-mms-registration-support-package-details-wrapper").hide(),$("div.ws-plugin--s2member-mms-registration-wp-login, table.ws-plugin--s2member-mms-registration-wp-login").show(),$("div.ws-plugin--s2member-mms-registration-wp-signup, table.ws-plugin--s2member-mms-registration-wp-signup").hide();$("div.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0, table.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0").hide();$("input#ws-plugin--s2member-mms-registration-blogs-level0").val("0")}}}).trigger("change");$("select#ws-plugin--s2member-mms-registration-grants").change(function(){$("select#ws-plugin--s2member-mms-registration-file").trigger("change")})}if(location.href.match(/page\=ws-plugin--s2member-gen-ops/)){ws_plugin__s2member_generateSecurityKey=function(){var mt_rand=function(min,max){min=(arguments.length<1)?0:min;max=(arguments.length<2)?2147483647:max;return Math.floor(Math.random()*(max-min+1))+min};var chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()";for(var i=0,key="";i<64;i++){key+=chars.substr(mt_rand(0,chars.length-1),1)}$("input#ws-plugin--s2member-sec-encryption-key").val(key);return false};ws_plugin__s2member_enableSecurityKey=function(){if(confirm("Edit Key? Are you sure?\nThis could break your installation!\n\n*Note* If you've been testing s2Member, feel free to change this Key before you go live. Just don't go live, and then change it. You'll have unhappy Customers. Data corruption WILL occur! For your safety, s2Member keeps a history of the last 10 Keys that you've used. If you get yourself into a real situation, s2Member will let you revert back to a previous Key.")){$("input#ws-plugin--s2member-sec-encryption-key").removeAttr("disabled")}return false};ws_plugin__s2member_securityKeyHistory=function(){$("div#ws-plugin--s2member-sec-encryption-key-history").toggle();return false};$("select#ws-plugin--s2member-new-user-emails-enabled").change(function(){var $pluggable=$("input#ws-plugin--s2member-pluggables-wp-new-user-notification"),$this=$(this),$newUserEmails=$("div#ws-plugin--s2member-new-user-emails");if($pluggable.val()==="0"||$this.val()==="0"){($pluggable.val()==="0")?$this.attr("disabled","disabled"):$this.removeAttr("disabled");$(":input",$newUserEmails).attr("disabled","disabled"),$newUserEmails.css("opacity","0.5")}else{$this.removeAttr("disabled"),$(":input",$newUserEmails).removeAttr("disabled"),$newUserEmails.css("opacity","")}}).trigger("change");if($("input#ws-plugin--s2member-custom-reg-fields").length&&$("div#ws-plugin--s2member-custom-reg-field-configuration").length){(function(){var i,fieldDefaults,tools,table,$tools,$table;var $fields=$("input#ws-plugin--s2member-custom-reg-fields");var $configuration=$("div#ws-plugin--s2member-custom-reg-field-configuration");var fields=($fields.val())?$.JSON.parse($fields.val()):[];fields=(fields instanceof Array)?fields:[];fieldDefaults={section:"no",sectitle:"",id:"",label:"",type:"text",deflt:"",options:"",expected:"",required:"yes",levels:"all",editable:"yes",classes:"",styles:"",attrs:""};for(i=0;i<fields.length;i++){fields[i]=$.extend(true,{},fieldDefaults,fields[i])}tools='<div id="ws-plugin--s2member-custom-reg-field-configuration-tools"></div>',table='<table id="ws-plugin--s2member-custom-reg-field-configuration-table"></table>';$configuration.html(tools+table);$tools=$("div#ws-plugin--s2member-custom-reg-field-configuration-tools"),$table=$("table#ws-plugin--s2member-custom-reg-field-configuration-table");ws_plugin__s2member_customRegFieldSectionChange=function(select){var section=$(select).val();var sectitle_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle";(section==="yes")?$(sectitle_trs).css("display",""):$(sectitle_trs).css("display","none")};ws_plugin__s2member_customRegFieldTypeChange=function(select){var type=$(select).val();var deflt_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt",options_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-options",expected_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected";(type.match(/^(text|textarea)$/))?$(deflt_trs).css("display",""):$(deflt_trs).css("display","none");(type.match(/^(select|selects|checkboxes|radios)$/))?$(options_trs).css("display",""):$(options_trs).css("display","none");(type.match(/^(text|textarea)$/))?$(expected_trs).css("display",""):$(expected_trs).css("display","none")};ws_plugin__s2member_customRegFieldDelete=function(index){var newFields=new Array();for(var i=0;i<fields.length;i++){if(i!==index){newFields.push(fields[i])}}fields=newFields,updateFields(),buildTable()};ws_plugin__s2member_customRegFieldMoveUp=function(index){if(typeof fields[index]==="object"&&typeof fields[index-1]==="object"){var prevFieldObj=fields[index-1],thisFieldObj=fields[index];fields[index-1]=thisFieldObj,fields[index]=prevFieldObj;updateFields(),buildTable()}};ws_plugin__s2member_customRegFieldMoveDown=function(index){if(typeof fields[index]==="object"&&typeof fields[index+1]==="object"){var nextFieldObj=fields[index+1],thisFieldObj=fields[index];fields[index+1]=thisFieldObj,fields[index]=nextFieldObj;updateFields(),buildTable()}};ws_plugin__s2member_customRegFieldCreate=function(){var $table=$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form"),field={};$(":input[property]",$table).each(function(){var $this=$(this),property=$this.attr("property"),val=$.trim($this.val());field[property]=val});if((field=validateField(field))){fields.push(field),updateFields(),buildTools(),buildTable(),scrollReset();setTimeout(function(){var row="tr.ws-plugin--s2member-custom-reg-field-configuration-table-row-"+(fields.length-1);alert('Field created successfully.\n* Remember to "Save All Changes".');$(row).effect("highlight",1500)},500)}};ws_plugin__s2member_customRegFieldUpdate=function(index){var $table=$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form"),field={};$(":input[property]",$table).each(function(){var $this=$(this),property=$this.attr("property"),val=$.trim($this.val());field[property]=val});if((field=validateField(field,index))){fields[index]=field,updateFields(),buildTools(),buildTable(),scrollReset();setTimeout(function(){var row="tr.ws-plugin--s2member-custom-reg-field-configuration-table-row-"+index;alert('Field updated successfully.\n* Remember to "Save All Changes".');$(row).effect("highlight",1500)},500)}};ws_plugin__s2member_customRegFieldAdd=function(){buildTools(true)};ws_plugin__s2member_customRegFieldEdit=function(index){buildTools(false,index),scrollReset()};ws_plugin__s2member_customRegFieldCancel=function(){buildTools(),scrollReset()};var validateField=function(field,index){var editing=(typeof index==="number"&&typeof fields[index]==="object")?true:false,errors=[],options,i;if(typeof field!=="object"||typeof(field=$.extend(true,{},fieldDefaults,field))!=="object"){alert("Invalid field object. Please try again.");return false}field.sectitle=(field.section==="yes")?field.sectitle:"";field.deflt=(field.type.match(/^(text|textarea)$/))?field.deflt:"";field.deflt=(field.type.match(/^(text)$/))?field.deflt.replace(/[\r\n\t ]+/g," "):field.deflt;field.options=(field.type.match(/^(select|selects|checkboxes|radios)$/))?field.options:"";field.expected=(field.type.match(/^(text|textarea)$/))?field.expected:"";if(!field.id){errors.push("Unique Field ID:\nThis is required. Please try again.")}else{if(fieldIdExists(field.id)&&(!editing||field.id!==fields[index].id)){errors.push("Unique Field ID:\nThat Field ID already exists. Please try again.")}}if(!field.label){errors.push("Field Label/Description:\nThis is required. Please try again.")}if(field.type.match(/^(select|selects|checkboxes|radios)$/)&&!field.options){errors.push("Option Configuration File:\nThis is required. Please try again.")}else{if(field.type.match(/^(select|selects|checkboxes|radios)$/)){for(i=0;i<(options=field.options.split(/[\r\n]+/)).length;i++){if(!(options[i]=$.trim(options[i])).match(/^([^\|]*)(\|)([^\|]*)(\|default)?$/)){errors.push("Option Configuration File:\nInvalid configuration at line #"+(i+1)+".");break}}field.options=$.trim(options.join("\n"))}}if(!(field.levels=field.levels.replace(/ /g,""))){errors.push("Applicable Levels:\nThis is required. Please try again.")}else{if(!field.levels.match(/^(all|[0-9,]+)$/)){errors.push("Applicable Levels:\nShould be comma-delimited Levels, or just type: all.\n( examples: 0,1,2,3,4 or type the word: all )")}}if(field.classes&&field.classes.match(/[^a-z 0-9 _ \-]/i)){errors.push("CSS Classes:\nContains invalid characters. Please try again.\n( only: alphanumerics, underscores, hyphens, spaces )")}if(field.styles&&field.styles.match(/["\=\>\<]/)){errors.push('CSS Styles:\nContains invalid characters. Please try again.\n( do NOT use these characters: = " < > )')}if(field.attrs&&field.attrs.match(/[\>\<]/)){errors.push("Other Attributes:\nContains invalid characters. Please try again.\n( do NOT use these characters: < > )")}if(errors.length>0){alert(errors.join("\n\n"));return false}else{return field}};var updateFields=function(){$fields.val(((fields.length>0)?$.JSON.stringify(fields):""))};var fieldId2Var=function(fieldId){return(typeof fieldId==="string")?$.trim(fieldId).toLowerCase().replace(/[^a-z0-9]/g,"_"):""};var fieldTypeDesc=function(type){var types={text:"Text ( single line )",textarea:"Textarea ( multi-line )",select:"Select Menu ( drop-down )",selects:"Select Menu ( multi-option )",checkbox:"Checkbox ( single )",pre_checkbox:"Checkbox ( pre-checked )",checkboxes:"Checkboxes ( multi-option )",radios:"Radio Buttons ( multi-option )"};if(typeof types[type]==="string"){return types[type]}return""};var fieldIdExists=function(fieldId){for(var i=0;i<fields.length;i++){if(fields[i].id===fieldId){return true}}};var scrollReset=function(){scrollTo(0,$("div.ws-plugin--s2member-custom-reg-fields-section").offset()["top"]-100)};var buildTools=function(adding,index){var i=0,html="",form="",w=0,h=0,editing=(typeof index==="number"&&typeof fields[index]==="object")?true:false,displayForm=(adding||editing)?true:false,field=(editing)?$.extend(true,{},fieldDefaults,fields[index]):fieldDefaults;html+='<a href="#" onclick="ws_plugin__s2member_customRegFieldAdd(); return false;">Add New Field</a>';tb_remove(),$("div#ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form").remove();if(displayForm){form+='<div id="ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form">';form+='<table id="ws-plugin--s2member-custom-reg-field-configuration-tools-form">';form+="<tbody>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">Starts A New Section?</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">';form+='<td colspan="2">';form+='<select property="section" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section" onchange="ws_plugin__s2member_customRegFieldSectionChange(this);">';form+='<option value="no"'+((field.section==="no")?' selected="selected"':"")+'">No ( this Field flows normally )</option>';form+='<option value="yes"'+((field.section==="yes")?' selected="selected"':"")+'">Yes ( this Field begins a new section )</option>';form+="</select><br />";form+="<small>Optional. Allows Fields to be grouped into sections.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle ws-plugin--s2member-custom-reg-field-configuration-tools-form-section"'+((field.section==="yes")?"":' style="display:none;"')+'><td colspan="2"><hr /></td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle ws-plugin--s2member-custom-reg-field-configuration-tools-form-section"'+((field.section==="yes")?"":' style="display:none;"')+">";form+='<td colspan="2">';form+="Title for this new section? ( optional )<br />";form+='<input type="text" property="sectitle" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle" value="'+esc_attr(field.sectitle)+'" /><br />';form+="<small>If empty, a simple divider will be used by default.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-type"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">Form Field Type: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">';form+='<td colspan="2">';form+='<select property="type" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type" onchange="ws_plugin__s2member_customRegFieldTypeChange(this);">';form+='<option value="text"'+((field.type==="text")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("text"))+"</option>";form+='<option value="textarea"'+((field.type==="textarea")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("textarea"))+"</option>";form+='<option value="select"'+((field.type==="select")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("select"))+"</option>";form+='<option value="selects"'+((field.type==="selects")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("selects"))+"</option>";form+='<option value="checkbox"'+((field.type==="checkbox")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("checkbox"))+"</option>";form+='<option value="pre_checkbox"'+((field.type==="pre_checkbox")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("pre_checkbox"))+"</option>";form+='<option value="checkboxes"'+((field.type==="checkboxes")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("checkboxes"))+"</option>";form+='<option value="radios"'+((field.type==="radios")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("radios"))+"</option>";form+="</select><br />";form+="<small>The options below may change, based on the Field Type you choose here.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-label"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">Field Label/Desc: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">';form+='<td colspan="2">';form+='<input type="text" property="label" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label" value="'+esc_attr(field.label)+'" /><br />';form+="<small>Examples: <code>Choose Country</code>, <code>Street Address</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-id"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">Unique Field ID: *</label></label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">';form+='<td colspan="2">';form+='<input type="text" property="id" maxlength="25" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id" value="'+esc_attr(field.id)+'" /><br />';form+="<small>Examples: <code>country_code</code>, <code>street_address</code></small><br />";form+='<small>e.g. <code>[s2Get user_field="country_code" /]</code></small>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-required"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">Field Required: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<td colspan="2">';form+='<select property="required" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<option value="yes"'+((field.required==="yes")?' selected="selected"':"")+'">Yes ( required )</option>';form+='<option value="no"'+((field.required==="no")?' selected="selected"':"")+'">No ( optional )</option>';form+="</select><br />";form+='<small>If <code>yes</code>, only Users/Members will be "required" to enter this field.</small><br />';form+="<small>* Administrators are exempt from this requirement.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+'><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt">Default Text Value: ( optional )</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<textarea property="deflt" wrap="off" spellcheck="false" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt" rows="1">'+esc_html(field.deflt)+"</textarea><br />";form+="<small>Default value before user input is received.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+'><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options">Option Configuration File: * ( one option per line )</label><br />';form+="<small>Use a pipe <code>|</code> delimited format: <code>option value|option label</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<textarea property="options" wrap="off" spellcheck="false" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options" rows="3">'+esc_html(field.options)+"</textarea><br />";form+="Here is a quick example:<br />";form+="<small>You can also specify a <em>default</em> option:</small><br />";form+="<code>US|United States|default</code><br />";form+="<code>CA|Canada</code><br />";form+="<code>VI|Virgin Islands (U.S.)</code>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+'><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected">Expected Format: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<select property="expected" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected">';form+='<option value=""'+((field.expected==="")?' selected="selected"':"")+'">Anything Goes</option>';form+='<option disabled="disabled"></option>';form+='<optgroup label="Specific Input Types">';form+='<option value="numeric-wp-commas"'+((field.expected==="numeric-wp-commas")?' selected="selected"':"")+'">Numeric ( with or without decimals, commas allowed )</option>';form+='<option value="numeric"'+((field.expected==="numeric")?' selected="selected"':"")+'">Numeric ( with or without decimals, no commas )</option>';form+='<option value="integer"'+((field.expected==="integer")?' selected="selected"':"")+'">Integer ( whole number, without any decimals )</option>';form+='<option value="integer-gt-0"'+((field.expected==="integer-gt-0")?' selected="selected"':"")+'">Integer > 0 ( whole number, no decimals, greater than 0 )</option>';form+='<option value="float"'+((field.expected==="float")?' selected="selected"':"")+'">Float ( floating point number, decimals required )</option>';form+='<option value="float-gt-0"'+((field.expected==="float-gt-0")?' selected="selected"':"")+'">Float > 0 ( floating point number, decimals required, greater than 0 )</option>';form+='<option value="date"'+((field.expected==="date")?' selected="selected"':"")+'">Date ( required date format: dd/mm/yyyy )</option>';form+='<option value="email"'+((field.expected==="email")?' selected="selected"':"")+'">Email ( require valid email )</option>';form+='<option value="url"'+((field.expected==="url")?' selected="selected"':"")+'">Full URL ( starting with http or https )</option>';form+='<option value="domain"'+((field.expected==="domain")?' selected="selected"':"")+'">Domain Name ( domain name only, without http )</option>';form+='<option value="phone"'+((field.expected==="phone")?' selected="selected"':"")+'">Phone # ( 10 digits w/possible hyphens,spaces,brackets )</option>';form+='<option value="uszip"'+((field.expected==="uszip")?' selected="selected"':"")+'">US Zipcode ( 5-9 digits w/possible hyphen )</option>';form+='<option value="cazip"'+((field.expected==="cazip")?' selected="selected"':"")+'">Canadian Zipcode ( 6 alpha-numerics w/possible space )</option>';form+='<option value="uczip"'+((field.expected==="uczip")?' selected="selected"':"")+'">US/Canadian Zipcode ( either a US or Canadian zipcode )</option>';form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Any Character Combination">';for(i=1;i<=25;i++){form+='<option value="any-'+i+'"'+((field.expected==="any-"+i)?' selected="selected"':"")+'">Any Character Combination ( '+i+" character minimum )</option>";form+='<option value="any-'+i+'-e"'+((field.expected==="any-"+i+"-e")?' selected="selected"':"")+'">Any Character Combination ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics, Spaces &amp; Punctuation Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-spaces-punctuation-'+i+'"'+((field.expected==="alphanumerics-spaces-punctuation-"+i)?' selected="selected"':"")+'">Alphanumerics, Spaces &amp; Punctuation ( '+i+" character minimum )</option>";form+='<option value="alphanumerics-spaces-punctuation-'+i+'-e"'+((field.expected==="alphanumerics-spaces-punctuation-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics, Spaces &amp; Punctuation ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics &amp; Spaces Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-spaces-'+i+'"'+((field.expected==="alphanumerics-spaces-"+i)?' selected="selected"':"")+'">Alphanumerics &amp; Spaces ( '+i+" character minimum )</option>";form+='<option value="alphanumerics-spaces-'+i+'-e"'+((field.expected==="alphanumerics-spaces-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics &amp; Spaces ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics &amp; Punctuation Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-punctuation-'+i+'"'+((field.expected==="alphanumerics-punctuation-"+i)?' selected="selected"':"")+'">Alphanumerics &amp; Punctuation ( '+i+" character minimum )</option>";form+='<option value="alphanumerics-punctuation-'+i+'-e"'+((field.expected==="alphanumerics-punctuation-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics &amp; Punctuation ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-'+i+'"'+((field.expected==="alphanumerics-"+i)?' selected="selected"':"")+'">Alphanumerics ( '+i+" character minimum )</option>";form+='<option value="alphanumerics-'+i+'-e"'+((field.expected==="alphanumerics-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphabetics Only">';for(i=1;i<=25;i++){form+='<option value="alphabetics-'+i+'"'+((field.expected==="alphabetics-"+i)?' selected="selected"':"")+'">Alphabetics ( '+i+" character minimum )</option>";form+='<option value="alphabetics-'+i+'-e"'+((field.expected==="alphabetics-"+i+"-e")?' selected="selected"':"")+'">Alphabetics ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Numeric Digits Only">';for(i=1;i<=25;i++){form+='<option value="numerics-'+i+'"'+((field.expected==="numerics-"+i)?' selected="selected"':"")+'">Numeric Digits ( '+i+" digit minimum )</option>";form+='<option value="numerics-'+i+'-e"'+((field.expected==="numerics-"+i+"-e")?' selected="selected"':"")+'">Numeric Digits ( exactly '+i+" digit"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+="</select><br />";form+="<small>Only Users/Members will be required to meet this criteria.</small><br />";form+="<small>* Administrators are exempt from this.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">Applicable Membership Levels: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">';form+='<td colspan="2">';form+='<input type="text" property="levels" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels" value="'+esc_attr(field.levels)+'" /><br />';form+="<small>Please use comma-delimited Level #'s: <code>0,1,2,3,4</code> or type: <code>all</code>.</small><br />";form+="<small>This allows you to enable this field - only at specific Membership Levels.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">Allow Profile Edits: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<td colspan="2">';form+='<select property="editable" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<option value="yes"'+((field.editable==="yes")?' selected="selected"':"")+'">Yes ( editable )</option>';form+='<option value="no"'+((field.editable==="no")?' selected="selected"':"")+'">No ( uneditable after registration )</option>';form+='<option value="no-invisible"'+((field.editable==="no-invisible")?' selected="selected"':"")+'">No ( uneditable &amp; totally invisible after registration )</option>';form+='<option value="no-always-invisible"'+((field.editable==="no-always-invisible")?' selected="selected"':"")+'">No ( uneditable &amp; totally invisible, both during &amp; after registration )</option>';form+='<option value="yes-invisible"'+((field.editable==="yes-invisible")?' selected="selected"':"")+'">Yes ( editable after registration / invisible during registration )</option>';form+="</select><br />";form+="<small>If <code>No</code>, this field will be un-editable after registration.</small><br />";form+="<small>* Administrators are exempt from this.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">CSS Classes: ( optional )</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">';form+='<td colspan="2">';form+='<input type="text" property="classes" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes" value="'+esc_attr(field.classes)+'" /><br />';form+="<small>Example: <code>my-style-1 my-style-2</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">CSS Styles: ( optional )</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">';form+='<td colspan="2">';form+='<input type="text" property="styles" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles" value="'+esc_attr(field.styles)+'" /><br />';form+="<small>Example: <code>color:#000000; background:#FFFFFF;</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">Other Attributes: ( optional )</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">';form+='<td colspan="2">';form+='<input type="text" property="attrs" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs" value="'+esc_attr(field.attrs)+'" /><br />';form+='<small>Example: <code>onkeyup="" onblur=""</code></small>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-buttons"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-buttons">';form+='<td align="left">';form+='<input type="button" value="Cancel" onclick="ws_plugin__s2member_customRegFieldCancel();" />';form+="</td>";form+='<td align="right">';form+='<input type="button" value="'+((editing)?"Update This Field":"Create Registration Field")+'" onclick="'+((editing)?"ws_plugin__s2member_customRegFieldUpdate("+index+");":"ws_plugin__s2member_customRegFieldCreate();")+'" />';form+="</td>";form+="</tr>";form+="</tbody>";form+="</table>";form+="<div>";$("body").append(form);tb_show(((editing)?"Editing Registration/Profile Field":"New Custom Registration/Profile Field"),"#TB_inline?inlineId=ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form");$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form").show()}$tools.html(html)};var buildTable=function(){var l=fields.length,i=0,html="",eo="o";html+="<tbody>";html+="<tr>";html+="<th>Order</th>";html+="<th>Field Type</th>";html+="<th>Unique ID</th>";html+="<th>Required</th>";html+="<th>Levels</th>";html+="<th>- Tools -</th>";html+="</tr>";if(fields.length>0){for(i=0;i<fields.length;i++){html+='<tr class="'+esc_attr((eo=(eo==="o")?"e":"o"))+((fields[i].section==="yes")?" s":"")+" ws-plugin--s2member-custom-reg-field-configuration-table-row-"+i+'">';html+='<td nowrap="nowrap"><a class="ws-plugin--s2member-custom-reg-field-configuration-move-up" href="#" onclick="ws_plugin__s2member_customRegFieldMoveUp('+i+'); return false;"></a><a class="ws-plugin--s2member-custom-reg-field-configuration-move-down" href="#" onclick="ws_plugin__s2member_customRegFieldMoveDown('+i+'); return false;"></a></td>';html+='<td nowrap="nowrap">'+esc_html(fieldTypeDesc(fields[i].type))+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].id)+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].required)+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].levels)+"</td>";html+='<td nowrap="nowrap"><a class="ws-plugin--s2member-custom-reg-field-configuration-edit" href="#" onclick="ws_plugin__s2member_customRegFieldEdit('+i+'); return false;"></a><a class="ws-plugin--s2member-custom-reg-field-configuration-delete" href="#" onclick="ws_plugin__s2member_customRegFieldDelete('+i+'); return false;"></a></td>';html+="</tr>"}}else{html+="<tr>";html+='<td colspan="6">No Custom Fields are configured.</td>';html+="</tr>"}html+="</tbody>";$table.html(html)};buildTools(),buildTable()})()}}if(location.href.match(/page\=ws-plugin--s2member-res-ops/)){$("input#ws-plugin--s2member-brute-force-restrictions-reset-button").click(function(){var $this=$(this);$this.val("one moment please ...");$.post(ajaxurl,{action:"ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax",ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax")); ?>'},function(response){alert("s2Member's Brute Force Restriction Logs have all been reset."),$this.val("Reset Brute Force Logs")});return false});$("input#ws-plugin--s2member-ip-restrictions-reset-button").click(function(){var $this=$(this);$this.val("one moment please ...");$.post(ajaxurl,{action:"ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax",ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax")); ?>'},function(response){alert("s2Member's IP Restriction Logs have all been reset."),$this.val("Reset IP Restriction Logs")});return false});$('div.ws-plugin--s2member-query-level-access-section input[type="checkbox"][name="ws_plugin__s2member_filter_wp_query[]"]').change(function(){var thisChange=$(this).val();$('div.ws-plugin--s2member-query-level-access-section input[type="checkbox"][name="ws_plugin__s2member_filter_wp_query[]"]').each(function(){var $this=$(this),val=$this.val(),checkboxes='input[type="checkbox"]';if(val==="all"&&this.checked){$this.nextAll(checkboxes).attr({checked:"checked",disabled:"disabled"})}else{if(val==="all"&&!this.checked){$this.nextAll(checkboxes).removeAttr("disabled");(thisChange==="all")?$this.nextAll(checkboxes).removeAttr("checked"):null}}})}).last().trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-down-ops/)){var updateCloudFrontPrivateKey=function(){var $hiddenPrivateKey=$("input#ws-plugin--s2member-amazon-cf-files-private-key");var $visiblePrivateKeyEntry=$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry");var hiddenPrivateKeyValue=$.trim($hiddenPrivateKey.val()),visiblePrivateKeyEntryValue=$.trim($visiblePrivateKeyEntry.val());if((hiddenPrivateKeyValue&&!visiblePrivateKeyEntryValue)||visiblePrivateKeyEntryValue.match(/[^\r\n\u25CF]/)){$hiddenPrivateKey.val(visiblePrivateKeyEntryValue),$visiblePrivateKeyEntry.val(visiblePrivateKeyEntryValue.replace(/[^\r\n]/g,String.fromCharCode(9679)))}};$("form#ws-plugin--s2member-options-form").submit(updateCloudFrontPrivateKey);$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry").change(updateCloudFrontPrivateKey).trigger("change");var updateCloudFrontDistroCfgs=function(){var $hiddenPrivateKey=$("input#ws-plugin--s2member-amazon-cf-files-private-key");var $visiblePrivateKeyId=$("input#ws-plugin--s2member-amazon-cf-files-private-key-id");var $autoConfigDistros=$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros");var $autoConfigDistrosStatus=$("input#ws-plugin--s2member-amazon-cf-files-distros-auto-config-status");var autoConfigDistrosStatusValue=$.trim($autoConfigDistrosStatus.val());var hiddenPrivateKeyValue=$.trim($hiddenPrivateKey.val()),visiblePrivateKeyIdValue=$.trim($visiblePrivateKeyId.val());var hiddenPrivateKeyPrevConfigValue=$.trim($hiddenPrivateKey.attr("data-s-prev-config-value")),visiblePrivateKeyIdPrevConfigValue=$.trim($visiblePrivateKeyId.attr("data-s-prev-config-value"));if(autoConfigDistrosStatusValue==="configured"&&((visiblePrivateKeyIdPrevConfigValue&&visiblePrivateKeyIdValue!==visiblePrivateKeyIdPrevConfigValue)||(hiddenPrivateKeyPrevConfigValue&&hiddenPrivateKeyValue!==hiddenPrivateKeyPrevConfigValue))){alert("s2Member will need to delete and re-configure your Amazon® CloudFront distributions if you change this. When you're done editing, click (Save All Changes) below.");$autoConfigDistros.attr("checked","checked")}else{if(autoConfigDistrosStatusValue!=="configured"&&visiblePrivateKeyIdValue&&hiddenPrivateKeyValue){alert("s2Member will need to auto-configure your Amazon® CloudFront distributions for you. When you're done editing, click (Save All Changes) below.");$autoConfigDistros.attr("checked","checked")}}};$("input#ws-plugin--s2member-amazon-cf-files-private-key-id").change(updateCloudFrontDistroCfgs);$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry").change(updateCloudFrontDistroCfgs);$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames").change(function(){var $this=$(this),thisChecked=(this.checked)?true:false;var $autoConfigDistros=$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros");var $autoConfigDistroCnames=$("div#ws-plugin--s2member-amazon-cf-files-auto-configure-distro-cnames");(thisChecked)?$autoConfigDistroCnames.show():$autoConfigDistroCnames.hide();(thisChecked)?$autoConfigDistros.attr("checked","checked"):null}).trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-paypal-ops/)){$("select#ws-plugin--s2member-auto-eot-system-enabled").change(function(){var $this=$(this),val=$this.val();var $viaCron=$("p#ws-plugin--s2member-auto-eot-system-enabled-via-cron");if(val==2){$viaCron.show()}else{$viaCron.hide()}})}if(location.href.match(/page\=ws-plugin--s2member-paypal-buttons/)){$("div.ws-menu-page select[id]").filter(function(){return this.id.match(/^ws-plugin--s2member-(level[1-9][0-9]*|modification)-term$/)}).change(function(){var button=this.id.replace(/^ws-plugin--s2member-(.+?)-term$/g,"$1");var trialDisabled=($(this).val().split("-")[2].replace(/[^0-1BN]/g,"")==="BN")?1:0;$("p#ws-plugin--s2member-"+button+"-trial-line").css("display",(trialDisabled?"none":""));$("span#ws-plugin--s2member-"+button+"-trial-then").css("display",(trialDisabled?"none":""));$("span#ws-plugin--s2member-"+button+"-20p-rule").css("display",(trialDisabled?"none":""));(trialDisabled)?$("input#ws-plugin--s2member-"+button+"-trial-period").val(0):null;(trialDisabled)?$("input#ws-plugin--s2member-"+button+"-trial-amount").val("0.00"):null});$("div.ws-menu-page input[id]").filter(function(){return this.id.match(/^ws-plugin--s2member-(level[1-9][0-9]*|modification|ccap)-ccaps$/)}).keyup(function(){var value=this.value.replace(/^(-all|-al|-a|-)[;,]*/gi,""),_all=(this.value.match(/^(-all|-al|-a|-)[;,]*/i))?"-all,":"";if(value.match(/[^a-z_0-9,]/)){this.value=_all+$.trim($.trim(value).replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase())}});ws_plugin__s2member_paypalButtonGenerate=function(button){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="",labels={};eval("<?php echo c_ws_plugin__s2member_utils_strings::esc_dq($labels); ?>");var shortCode=$("input#ws-plugin--s2member-"+button+"-shortcode");var code=$("textarea#ws-plugin--s2member-"+button+"-button");var modLevel=$("select#ws-plugin--s2member-modification-level");var level=(button==="modification")?modLevel.val().split(":",2)[1]:button.replace(/^level/,"");var label=labels["level"+level].replace(/"/g,"");var desc=$.trim($("input#ws-plugin--s2member-"+button+"-desc").val().replace(/"/g,""));var trialAmount=$("input#ws-plugin--s2member-"+button+"-trial-amount").val().replace(/[^0-9\.]/g,"");var trialPeriod=$("input#ws-plugin--s2member-"+button+"-trial-period").val().replace(/[^0-9]/g,"");var trialTerm=$("select#ws-plugin--s2member-"+button+"-trial-term").val().replace(/[^A-Z]/g,"");var regAmount=$("input#ws-plugin--s2member-"+button+"-amount").val().replace(/[^0-9\.]/g,"");var regPeriod=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[0].replace(/[^0-9]/g,"");var regTerm=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[1].replace(/[^A-Z]/g,"");var regRecur=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var regRecurTimes="",regRecurRetry="1";var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-"+button+"-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-"+button+"-currency").val().replace(/[^A-Z]/g,"");var cCaps=$.trim($.trim($("input#ws-plugin--s2member-"+button+"-ccaps").val()).replace(/^(-all|-al|-a|-)[;,]*/gi,"").replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());cCaps=($.trim($("input#ws-plugin--s2member-"+button+"-ccaps").val()).match(/^(-all|-al|-a|-)[;,]*/i))?((cCaps)?"-all,":"-all")+cCaps.toLowerCase():cCaps.toLowerCase();trialPeriod=(regRecur==="BN")?"0":trialPeriod;trialAmount=(!trialAmount||isNaN(trialAmount)||trialAmount<0.01||trialPeriod<=0)?"0":trialAmount;var levelCcapsPer=(regRecur==="BN"&&regTerm!=="L")?level+":"+cCaps+":"+regPeriod+" "+regTerm:level+":"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(trialAmount!=="0"&&(isNaN(trialAmount)||trialAmount<0)){alert("— Oops, a slight problem: —\n\nWhen provided, Trial Amount must be >= 0.00");return false}else{if(trialAmount!=="0"&&trialAmount>10000){alert("— Oops, a slight problem: —\n\nMaximum Trial Amount is: 10000.00");return false}else{if(trialTerm==="D"&&trialPeriod>7){alert("— Oops, a slight problem: —\n\nMaximum Trial Days is: 7.\nIf you want to offer more than 7 days, please choose Weeks or Months from the drop-down.");return false}else{if(trialTerm==="W"&&trialPeriod>52){alert("— Oops, a slight problem: —\n\nMaximum Trial Weeks is: 52.\nIf you want to offer more than 52 weeks, please choose Months from the drop-down.");return false}else{if(trialTerm==="M"&&trialPeriod>12){alert("— Oops, a slight problem: —\n\nMaximum Trial Months is: 12.\nIf you want to offer more than 12 months, please choose Years from the drop-down.");return false}else{if(trialTerm==="Y"&&trialPeriod>1){alert("— Oops, a slight problem: —\n\nMax Trial Period Years is: 1.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}}}}}}code.html(code.val().replace(/ \<\!--(\<input type\="hidden" name\="(amount|src|srt|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)--\>/g," $1"));(parseInt(trialPeriod)<=0)?code.html(code.val().replace(/ (\<input type\="hidden" name\="(a1|p1|t1)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(regRecur==="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick$3")):null;(regRecur==="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="(src|srt|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(regRecur!=="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick-subscriptions$3")):null;(regRecur!=="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="amount" value\="(.*?)" \/\>)/g," <!--$1-->")):null;shortCodeTemplateAttrs+=(button==="modification")?'modify="1" ':"";shortCodeTemplateAttrs+='level="'+esc_attr(level)+'" ccaps="'+esc_attr(cCaps)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'" custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"';shortCodeTemplateAttrs+=' ta="'+esc_attr(trialAmount)+'" tp="'+esc_attr(trialPeriod)+'" tt="'+esc_attr(trialTerm)+'" ra="'+esc_attr(regAmount)+'" rp="'+esc_attr(regPeriod)+'" rt="'+esc_attr(regTerm)+'" rr="'+esc_attr(regRecur)+'" rrt="'+esc_attr(regRecurTimes)+'" rra="'+esc_attr(regRecurRetry)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(levelCcapsPer)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="modify" value\="(.*?)"/,' name="modify" value="'+((button==="modification")?"1":"0")+'"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));code.html(code.val().replace(/ name\="src" value\="(.*?)"/,' name="src" value="'+esc_attr(regRecur)+'"'));code.html(code.val().replace(/ name\="srt" value\="(.*?)"/,' name="srt" value="'+esc_attr(regRecurTimes)+'"'));code.html(code.val().replace(/ name\="sra" value\="(.*?)"/,' name="sra" value="'+esc_attr(regRecurRetry)+'"'));code.html(code.val().replace(/ name\="a1" value\="(.*?)"/,' name="a1" value="'+esc_attr(trialAmount)+'"'));code.html(code.val().replace(/ name\="p1" value\="(.*?)"/,' name="p1" value="'+esc_attr(trialPeriod)+'"'));code.html(code.val().replace(/ name\="t1" value\="(.*?)"/,' name="t1" value="'+esc_attr(trialTerm)+'"'));code.html(code.val().replace(/ name\="a3" value\="(.*?)"/,' name="a3" value="'+esc_attr(regAmount)+'"'));code.html(code.val().replace(/ name\="p3" value\="(.*?)"/,' name="p3" value="'+esc_attr(regPeriod)+'"'));code.html(code.val().replace(/ name\="t3" value\="(.*?)"/,' name="t3" value="'+esc_attr(regTerm)+'"'));$("div#ws-plugin--s2member-"+button+"-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));(button==="modification")?alert("Your Modification Button has been generated.\nPlease copy/paste the Shortcode into your Login Welcome Page, or wherever you feel it would be most appropriate.\n\n* Remember, Modification Buttons should be displayed to existing Users/Members, and they should be logged-in, BEFORE clicking this Button."):alert("Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalCcapButtonGenerate=function(){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="";var shortCode=$("input#ws-plugin--s2member-ccap-shortcode");var code=$("textarea#ws-plugin--s2member-ccap-button");var desc=$.trim($("input#ws-plugin--s2member-ccap-desc").val().replace(/"/g,""));var regAmount=$("input#ws-plugin--s2member-ccap-amount").val().replace(/[^0-9\.]/g,"");var regPeriod=$("select#ws-plugin--s2member-ccap-term").val().split("-")[0].replace(/[^0-9]/g,"");var regTerm=$("select#ws-plugin--s2member-ccap-term").val().split("-")[1].replace(/[^A-Z]/g,"");var regRecur=$("select#ws-plugin--s2member-ccap-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-ccap-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-ccap-currency").val().replace(/[^A-Z]/g,"");var cCaps=$.trim($.trim($("input#ws-plugin--s2member-ccap-ccaps").val()).replace(/^(-all|-al|-a|-)[;,]*/gi,"").replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());cCaps=($.trim($("input#ws-plugin--s2member-ccap-ccaps").val()).match(/^(-all|-al|-a|-)[;,]*/i))?((cCaps)?"-all,":"-all")+cCaps.toLowerCase():cCaps.toLowerCase();var levelCcapsPer=(regRecur==="BN"&&regTerm!=="L")?"*:"+cCaps+":"+regPeriod+" "+regTerm:"*:"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(!cCaps||cCaps==="-all"){alert("— Oops, a slight problem: —\n\nPlease provide at least one Custom Capability.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}shortCodeTemplateAttrs+='level="*" ccaps="'+esc_attr(cCaps)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'"';shortCodeTemplateAttrs+=' custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>" ra="'+esc_attr(regAmount)+'" rp="'+esc_attr(regPeriod)+'" rt="'+esc_attr(regTerm)+'" rr="'+esc_attr(regRecur)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(levelCcapsPer)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));$("div#ws-plugin--s2member-ccap-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));alert("Your Button has been generated.\nPlease copy/paste the Shortcode into your Login Welcome Page, or wherever you feel it would be most appropriate.\n\n* Remember, Independent Custom Capability Buttons should ONLY be displayed to existing Users/Members, and they MUST be logged-in, BEFORE clicking this Button.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalSpButtonGenerate=function(){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="";var shortCode=$("input#ws-plugin--s2member-sp-shortcode");var code=$("textarea#ws-plugin--s2member-sp-button");var leading=$("select#ws-plugin--s2member-sp-leading-id").val().replace(/[^0-9]/g,"");var additionals=$("select#ws-plugin--s2member-sp-additional-ids").val()||[];var hours=$("select#ws-plugin--s2member-sp-hours").val().replace(/[^0-9]/g,"");var regAmount=$("input#ws-plugin--s2member-sp-amount").val().replace(/[^0-9\.]/g,"");var desc=$.trim($("input#ws-plugin--s2member-sp-desc").val().replace(/"/g,""));var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-sp-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-sp-currency").val().replace(/[^A-Z]/g,"");if(!leading){alert("— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the 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}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}for(var i=0,ids=leading;i<additionals.length;i++){if(additionals[i]&&additionals[i]!==leading){ids+=","+additionals[i]}}var spIdsHours="sp:"+ids+":"+hours;shortCodeTemplateAttrs+='sp="1" ids="'+esc_attr(ids)+'" exp="'+esc_attr(hours)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'"';shortCodeTemplateAttrs+=' custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>" ra="'+esc_attr(regAmount)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(spIdsHours)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));$("div#ws-plugin--s2member-sp-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));alert("Your Button has been generated.\nPlease copy/paste the Shortcode into your WordPress® Editor.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalRegLinkGenerate=function(){var level=$("select#ws-plugin--s2member-reg-link-level").val().replace(/[^0-9]/g,"");var subscrID=$.trim($("input#ws-plugin--s2member-reg-link-subscr-id").val());var custom=$.trim($("input#ws-plugin--s2member-reg-link-custom").val());var cCaps=$.trim($.trim($("input#ws-plugin--s2member-reg-link-ccaps").val()).replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());var fixedTerm=$.trim($("input#ws-plugin--s2member-reg-link-fixed-term").val().replace(/[^A-Z 0-9]/gi,"").toUpperCase());var $link=$("p#ws-plugin--s2member-reg-link"),$loading=$("img#ws-plugin--s2member-reg-link-loading");var levelCcapsPer=(fixedTerm&&!fixedTerm.match(/L$/))?level+":"+cCaps+":"+fixedTerm:level+":"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(!subscrID){alert("— Oops, a slight problem: —\n\nPaid Subscr. ID is a required value.");return false}else{if(!custom||custom.indexOf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq ($_SERVER["HTTP_HOST"]); ?>')!==0){alert("— Oops, a slight problem: —\n\nThe Custom Value MUST start with your domain name.");return false}else{if(fixedTerm&&!fixedTerm.match(/^[1-9]+ (D|W|M|Y|L)$/)){alert("— Oops, a slight problem: —\n\nThe Fixed Term Length is not formatted properly.");return false}}}$link.hide(),$loading.show(),$.post(ajaxurl,{action:"ws_plugin__s2member_reg_access_link_via_ajax",ws_plugin__s2member_reg_access_link_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-reg-access-link-via-ajax")); ?>',s2member_reg_access_link_subscr_gateway:"paypal",s2member_reg_access_link_subscr_id:subscrID,s2member_reg_access_link_custom:custom,s2member_reg_access_link_item_number:levelCcapsPer},function(response){$link.show().html('<a href="'+esc_attr(response)+'" target="_blank" rel="external">'+esc_html(response)+"</a>"),$loading.hide()});return false};ws_plugin__s2member_paypalSpLinkGenerate=function(){var leading=$("select#ws-plugin--s2member-sp-link-leading-id").val().replace(/[^0-9]/g,"");var additionals=$("select#ws-plugin--s2member-sp-link-additional-ids").val()||[];var hours=$("select#ws-plugin--s2member-sp-link-hours").val().replace(/[^0-9]/g,"");var $link=$("p#ws-plugin--s2member-sp-link"),$loading=$("img#ws-plugin--s2member-sp-link-loading");if(!leading){alert("— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the 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}for(var i=0,ids=leading;i<additionals.length;i++){if(additionals[i]&&additionals[i]!==leading){ids+=","+additionals[i]}}$link.hide(),$loading.show(),$.post(ajaxurl,{action:"ws_plugin__s2member_sp_access_link_via_ajax",ws_plugin__s2member_sp_access_link_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-sp-access-link-via-ajax")); ?>',s2member_sp_access_link_ids:ids,s2member_sp_access_link_hours:hours},function(response){$link.show().html('<a href="'+esc_attr(response)+'" target="_blank" rel="external">'+esc_html(response)+"</a>"),$loading.hide()});return false}}if(location.href.match(/page\=ws-plugin--s2member-els-ops/)){$("select#ws-plugin--s2member-custom-reg-opt-in").change(function(){var $this=$(this),val=$this.val();var $rows=$("tr.ws-plugin--s2member-custom-reg-opt-in-label-row");var $prevImg=$("img.ws-plugin--s2member-custom-reg-opt-in-label-prev-img");if(val<=0){$rows.css("display","none"),$prevImg.attr("src",$prevImg.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}else{if(val==1){$rows.css("display",""),$prevImg.attr("src",$prevImg.attr("src").replace(/\/unchecked\.png$/,"/checked.png"))}else{if(val==2){$rows.css("display",""),$prevImg.attr("src",$prevImg.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}}}});$('div.ws-plugin--s2member-opt-out-section input[type="checkbox"][name="ws_plugin__s2member_custom_reg_auto_opt_outs[]"]').change(function(){var thisChange=$(this).val(),checkedIndexes=[];$('div.ws-plugin--s2member-opt-out-section input[type="checkbox"][name="ws_plugin__s2member_custom_reg_auto_opt_outs[]"]').each(function(){var $this=$(this),val=$this.val(),checkboxes='input[type="checkbox"]';if(val==="removal-deletion"&&this.checked){$this.nextAll(checkboxes).slice(0,2).attr({checked:"checked",disabled:"disabled"})}else{if(val==="removal-deletion"&&!this.checked){$this.nextAll(checkboxes).slice(0,2).removeAttr("disabled");(thisChange==="removal-deletion")?$this.nextAll(checkboxes).slice(0,2).removeAttr("checked"):null}else{if(val==="modification"&&this.checked){$this.nextAll(checkboxes).slice(0,3).attr({checked:"checked",disabled:"disabled"})}else{if(val==="modification"&&!this.checked){(thisChange==="modification")?$this.nextAll(checkboxes).slice(0,3).removeAttr("checked"):null;$this.nextAll(checkboxes).slice(0,3).removeAttr("disabled")}}}}}).each(function(index){(this.checked)?checkedIndexes.push(index):null});$("select#ws-plugin--s2member-custom-reg-auto-opt-out-transitions").removeAttr("disabled");if($.inArray(3,checkedIndexes)===-1&&$.inArray(4,checkedIndexes)===-1&&$.inArray(5,checkedIndexes)===-1&&$.inArray(6,checkedIndexes)===-1){$("select#ws-plugin--s2member-custom-reg-auto-opt-out-transitions").attr("disabled","disabled")}}).last().trigger("change")}});
1
+ jQuery(document).ready(function($){var esc_attr=esc_html=function(str){return String(str).replace(/"/g,"&quot;").replace(/\</g,"&lt;").replace(/\>/g,"&gt;")};if(location.href.match(/page\=ws-plugin--s2member/)){$("input.ws-plugin--s2member-update-roles-button, input.ws-plugin--s2member-reset-roles-button").click(function(){var $this=$(this);$this.val("one moment please ...");var levels='<?php echo (int)$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; ?>';var resetUpdate=($this.hasClass("ws-plugin--s2member-reset-roles-button"))?"Reset":"Update";$.post(ajaxurl,{action:"ws_plugin__s2member_update_roles_via_ajax",ws_plugin__s2member_update_roles_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-update-roles-via-ajax")); ?>'},function(response){if(response==="1"){alert("s2Member's Roles/Capabilities "+((resetUpdate.toLowerCase()==="reset")?"have been successfully reset":"updated successfully")+".\nYour installation of s2Member has Membership Levels 0-"+levels+"."),$this.val(resetUpdate+" Roles/Capabilities")}else{if(response==="l"){alert("Sorry, your request failed.\ns2Member's Roles/Capabilities are locked by Filter:\nws_plugin__s2member_lock_roles_caps"),$this.val(resetUpdate+" Roles/Capabilities")}else{alert("Sorry, your request failed.\nAccess denied. Do you have the ability to `create_users`?"),$this.val(resetUpdate+" Roles/Capabilities")}}});return false})}if(location.href.match(/page\=ws-plugin--s2member-mms-ops/)){$("select#ws-plugin--s2member-mms-registration-file").change(function(){if($(this).val()==="wp-signup"){var gv=$("select#ws-plugin--s2member-mms-registration-grants").val(),l0v=$("input#ws-plugin--s2member-mms-registration-blogs-level0").val();$("div#ws-plugin--s2member-mms-registration-support-package-details-wrapper").show(),$("div.ws-plugin--s2member-mms-registration-wp-login, table.ws-plugin--s2member-mms-registration-wp-login").hide(),$("div.ws-plugin--s2member-mms-registration-wp-signup, table.ws-plugin--s2member-mms-registration-wp-signup").show();$("div.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0, table.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0")[((gv==="all")?"show":"hide")]();$("input#ws-plugin--s2member-mms-registration-blogs-level0").val(((gv==="all")?((l0v>0)?l0v:"1"):"0"))}else{if($(this).val()==="wp-login"){var gv=$("select#ws-plugin--s2member-mms-registration-grants").val(),l0v=$("input#ws-plugin--s2member-mms-registration-blogs-level0").val();$("div#ws-plugin--s2member-mms-registration-support-package-details-wrapper").hide(),$("div.ws-plugin--s2member-mms-registration-wp-login, table.ws-plugin--s2member-mms-registration-wp-login").show(),$("div.ws-plugin--s2member-mms-registration-wp-signup, table.ws-plugin--s2member-mms-registration-wp-signup").hide();$("div.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0, table.ws-plugin--s2member-mms-registration-wp-signup-blogs-level0").hide();$("input#ws-plugin--s2member-mms-registration-blogs-level0").val("0")}}}).trigger("change");$("select#ws-plugin--s2member-mms-registration-grants").change(function(){$("select#ws-plugin--s2member-mms-registration-file").trigger("change")})}if(location.href.match(/page\=ws-plugin--s2member-gen-ops/)){ws_plugin__s2member_generateSecurityKey=function(){var mt_rand=function(min,max){min=(arguments.length<1)?0:min;max=(arguments.length<2)?2147483647:max;return Math.floor(Math.random()*(max-min+1))+min};var chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()";for(var i=0,key="";i<64;i++){key+=chars.substr(mt_rand(0,chars.length-1),1)}$("input#ws-plugin--s2member-sec-encryption-key").val(key);return false};ws_plugin__s2member_enableSecurityKey=function(){if(confirm("Edit Key? Are you sure?\nThis could break your installation!\n\n*Note* If you've been testing s2Member, feel free to change this Key before you go live. Just don't go live, and then change it. You'll have unhappy Customers. Data corruption WILL occur! For your safety, s2Member keeps a history of the last 10 Keys that you've used. If you get yourself into a real situation, s2Member will let you revert back to a previous Key.")){$("input#ws-plugin--s2member-sec-encryption-key").removeAttr("disabled")}return false};ws_plugin__s2member_securityKeyHistory=function(){$("div#ws-plugin--s2member-sec-encryption-key-history").toggle();return false};$("select#ws-plugin--s2member-new-user-emails-enabled").change(function(){var $pluggable=$("input#ws-plugin--s2member-pluggables-wp-new-user-notification"),$this=$(this),$newUserEmails=$("div#ws-plugin--s2member-new-user-emails");if($pluggable.val()==="0"||$this.val()==="0"){($pluggable.val()==="0")?$this.attr("disabled","disabled"):$this.removeAttr("disabled");$(":input",$newUserEmails).attr("disabled","disabled"),$newUserEmails.css("opacity","0.5")}else{$this.removeAttr("disabled"),$(":input",$newUserEmails).removeAttr("disabled"),$newUserEmails.css("opacity","")}}).trigger("change");if($("input#ws-plugin--s2member-custom-reg-fields").length&&$("div#ws-plugin--s2member-custom-reg-field-configuration").length){(function(){var i,fieldDefaults,tools,table,$tools,$table;var $fields=$("input#ws-plugin--s2member-custom-reg-fields");var $configuration=$("div#ws-plugin--s2member-custom-reg-field-configuration");var fields=($fields.val())?$.JSON.parse($fields.val()):[];fields=(fields instanceof Array)?fields:[];fieldDefaults={section:"no",sectitle:"",id:"",label:"",type:"text",deflt:"",options:"",expected:"",required:"yes",levels:"all",editable:"yes",classes:"",styles:"",attrs:""};for(i=0;i<fields.length;i++){fields[i]=$.extend(true,{},fieldDefaults,fields[i])}tools='<div id="ws-plugin--s2member-custom-reg-field-configuration-tools"></div>',table='<table id="ws-plugin--s2member-custom-reg-field-configuration-table"></table>';$configuration.html(tools+table);$tools=$("div#ws-plugin--s2member-custom-reg-field-configuration-tools"),$table=$("table#ws-plugin--s2member-custom-reg-field-configuration-table");ws_plugin__s2member_customRegFieldSectionChange=function(select){var section=$(select).val();var sectitle_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle";(section==="yes")?$(sectitle_trs).css("display",""):$(sectitle_trs).css("display","none")};ws_plugin__s2member_customRegFieldTypeChange=function(select){var type=$(select).val();var deflt_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt",options_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-options",expected_trs="tr.ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected";(type.match(/^(text|textarea)$/))?$(deflt_trs).css("display",""):$(deflt_trs).css("display","none");(type.match(/^(select|selects|checkboxes|radios)$/))?$(options_trs).css("display",""):$(options_trs).css("display","none");(type.match(/^(text|textarea)$/))?$(expected_trs).css("display",""):$(expected_trs).css("display","none")};ws_plugin__s2member_customRegFieldDelete=function(index){var newFields=new Array();for(var i=0;i<fields.length;i++){if(i!==index){newFields.push(fields[i])}}fields=newFields,updateFields(),buildTable()};ws_plugin__s2member_customRegFieldMoveUp=function(index){if(typeof fields[index]==="object"&&typeof fields[index-1]==="object"){var prevFieldObj=fields[index-1],thisFieldObj=fields[index];fields[index-1]=thisFieldObj,fields[index]=prevFieldObj;updateFields(),buildTable()}};ws_plugin__s2member_customRegFieldMoveDown=function(index){if(typeof fields[index]==="object"&&typeof fields[index+1]==="object"){var nextFieldObj=fields[index+1],thisFieldObj=fields[index];fields[index+1]=thisFieldObj,fields[index]=nextFieldObj;updateFields(),buildTable()}};ws_plugin__s2member_customRegFieldCreate=function(){var $table=$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form"),field={};$(":input[property]",$table).each(function(){var $this=$(this),property=$this.attr("property"),val=$.trim($this.val());field[property]=val});if((field=validateField(field))){fields.push(field),updateFields(),buildTools(),buildTable(),scrollReset();setTimeout(function(){var row="tr.ws-plugin--s2member-custom-reg-field-configuration-table-row-"+(fields.length-1);alert('Field created successfully.\n* Remember to "Save All Changes".');$(row).effect("highlight",1500)},500)}};ws_plugin__s2member_customRegFieldUpdate=function(index){var $table=$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form"),field={};$(":input[property]",$table).each(function(){var $this=$(this),property=$this.attr("property"),val=$.trim($this.val());field[property]=val});if((field=validateField(field,index))){fields[index]=field,updateFields(),buildTools(),buildTable(),scrollReset();setTimeout(function(){var row="tr.ws-plugin--s2member-custom-reg-field-configuration-table-row-"+index;alert('Field updated successfully.\n* Remember to "Save All Changes".');$(row).effect("highlight",1500)},500)}};ws_plugin__s2member_customRegFieldAdd=function(){buildTools(true)};ws_plugin__s2member_customRegFieldEdit=function(index){buildTools(false,index),scrollReset()};ws_plugin__s2member_customRegFieldCancel=function(){buildTools(),scrollReset()};var validateField=function(field,index){var editing=(typeof index==="number"&&typeof fields[index]==="object")?true:false,errors=[],options,i;if(typeof field!=="object"||typeof(field=$.extend(true,{},fieldDefaults,field))!=="object"){alert("Invalid field object. Please try again.");return false}field.sectitle=(field.section==="yes")?field.sectitle:"";field.deflt=(field.type.match(/^(text|textarea)$/))?field.deflt:"";field.deflt=(field.type.match(/^(text)$/))?field.deflt.replace(/[\r\n\t ]+/g," "):field.deflt;field.options=(field.type.match(/^(select|selects|checkboxes|radios)$/))?field.options:"";field.expected=(field.type.match(/^(text|textarea)$/))?field.expected:"";if(!field.id){errors.push("Unique Field ID:\nThis is required. Please try again.")}else{if(fieldIdExists(field.id)&&(!editing||field.id!==fields[index].id)){errors.push("Unique Field ID:\nThat Field ID already exists. Please try again.")}}if(!field.label){errors.push("Field Label/Description:\nThis is required. Please try again.")}if(field.type.match(/^(select|selects|checkboxes|radios)$/)&&!field.options){errors.push("Option Configuration File:\nThis is required. Please try again.")}else{if(field.type.match(/^(select|selects|checkboxes|radios)$/)){for(i=0;i<(options=field.options.split(/[\r\n]+/)).length;i++){if(!(options[i]=$.trim(options[i])).match(/^([^\|]*)(\|)([^\|]*)(\|default)?$/)){errors.push("Option Configuration File:\nInvalid configuration at line #"+(i+1)+".");break}}field.options=$.trim(options.join("\n"))}}if(!(field.levels=field.levels.replace(/ /g,""))){errors.push("Applicable Levels:\nThis is required. Please try again.")}else{if(!field.levels.match(/^(all|[0-9,]+)$/)){errors.push("Applicable Levels:\nShould be comma-delimited Levels, or just type: all.\n( examples: 0,1,2,3,4 or type the word: all )")}}if(field.classes&&field.classes.match(/[^a-z 0-9 _ \-]/i)){errors.push("CSS Classes:\nContains invalid characters. Please try again.\n( only: alphanumerics, underscores, hyphens, spaces )")}if(field.styles&&field.styles.match(/["\=\>\<]/)){errors.push('CSS Styles:\nContains invalid characters. Please try again.\n( do NOT use these characters: = " < > )')}if(field.attrs&&field.attrs.match(/[\>\<]/)){errors.push("Other Attributes:\nContains invalid characters. Please try again.\n( do NOT use these characters: < > )")}if(errors.length>0){alert(errors.join("\n\n"));return false}else{return field}};var updateFields=function(){$fields.val(((fields.length>0)?$.JSON.stringify(fields):""))};var fieldId2Var=function(fieldId){return(typeof fieldId==="string")?$.trim(fieldId).toLowerCase().replace(/[^a-z0-9]/g,"_"):""};var fieldTypeDesc=function(type){var types={text:"Text ( single line )",textarea:"Textarea ( multi-line )",select:"Select Menu ( drop-down )",selects:"Select Menu ( multi-option )",checkbox:"Checkbox ( single )",pre_checkbox:"Checkbox ( pre-checked )",checkboxes:"Checkboxes ( multi-option )",radios:"Radio Buttons ( multi-option )"};if(typeof types[type]==="string"){return types[type]}return""};var fieldIdExists=function(fieldId){for(var i=0;i<fields.length;i++){if(fields[i].id===fieldId){return true}}};var scrollReset=function(){scrollTo(0,$("div.ws-plugin--s2member-custom-reg-fields-section").offset()["top"]-100)};var buildTools=function(adding,index){var i=0,html="",form="",w=0,h=0,editing=(typeof index==="number"&&typeof fields[index]==="object")?true:false,displayForm=(adding||editing)?true:false,field=(editing)?$.extend(true,{},fieldDefaults,fields[index]):fieldDefaults;html+='<a href="#" onclick="ws_plugin__s2member_customRegFieldAdd(); return false;">Add New Field</a>';tb_remove(),$("div#ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form").remove();if(displayForm){form+='<div id="ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form">';form+='<table id="ws-plugin--s2member-custom-reg-field-configuration-tools-form">';form+="<tbody>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">Starts A New Section?</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section">';form+='<td colspan="2">';form+='<select property="section" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-section" onchange="ws_plugin__s2member_customRegFieldSectionChange(this);">';form+='<option value="no"'+((field.section==="no")?' selected="selected"':"")+'">No ( this Field flows normally )</option>';form+='<option value="yes"'+((field.section==="yes")?' selected="selected"':"")+'">Yes ( this Field begins a new section )</option>';form+="</select><br />";form+="<small>Optional. Allows Fields to be grouped into sections.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle ws-plugin--s2member-custom-reg-field-configuration-tools-form-section"'+((field.section==="yes")?"":' style="display:none;"')+'><td colspan="2"><hr /></td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle ws-plugin--s2member-custom-reg-field-configuration-tools-form-section"'+((field.section==="yes")?"":' style="display:none;"')+">";form+='<td colspan="2">';form+="Title for this new section? ( optional )<br />";form+='<input type="text" property="sectitle" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-sectitle" value="'+esc_attr(field.sectitle)+'" /><br />';form+="<small>If empty, a simple divider will be used by default.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-type"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">Form Field Type: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type">';form+='<td colspan="2">';form+='<select property="type" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-type" onchange="ws_plugin__s2member_customRegFieldTypeChange(this);">';form+='<option value="text"'+((field.type==="text")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("text"))+"</option>";form+='<option value="textarea"'+((field.type==="textarea")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("textarea"))+"</option>";form+='<option value="select"'+((field.type==="select")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("select"))+"</option>";form+='<option value="selects"'+((field.type==="selects")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("selects"))+"</option>";form+='<option value="checkbox"'+((field.type==="checkbox")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("checkbox"))+"</option>";form+='<option value="pre_checkbox"'+((field.type==="pre_checkbox")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("pre_checkbox"))+"</option>";form+='<option value="checkboxes"'+((field.type==="checkboxes")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("checkboxes"))+"</option>";form+='<option value="radios"'+((field.type==="radios")?' selected="selected"':"")+'">'+esc_html(fieldTypeDesc("radios"))+"</option>";form+="</select><br />";form+="<small>The options below may change, based on the Field Type you choose here.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-label"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">Field Label/Desc: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label">';form+='<td colspan="2">';form+='<input type="text" property="label" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-label" value="'+esc_attr(field.label)+'" /><br />';form+="<small>Examples: <code>Choose Country</code>, <code>Street Address</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-id"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">Unique Field ID: *</label></label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id">';form+='<td colspan="2">';form+='<input type="text" property="id" maxlength="25" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-id" value="'+esc_attr(field.id)+'" /><br />';form+="<small>Examples: <code>country_code</code>, <code>street_address</code></small><br />";form+='<small>e.g. <code>[s2Get user_field="country_code" /]</code></small>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-required"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">Field Required: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<td colspan="2">';form+='<select property="required" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-required">';form+='<option value="yes"'+((field.required==="yes")?' selected="selected"':"")+'">Yes ( required )</option>';form+='<option value="no"'+((field.required==="no")?' selected="selected"':"")+'">No ( optional )</option>';form+="</select><br />";form+='<small>If <code>yes</code>, only Users/Members will be "required" to enter this field.</small><br />';form+="<small>* Administrators are exempt from this requirement.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+'><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt">Default Text Value: ( optional )</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<textarea property="deflt" wrap="off" spellcheck="false" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-deflt" rows="1">'+esc_html(field.deflt)+"</textarea><br />";form+="<small>Default value before user input is received.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+'><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options">Option Configuration File: * ( one option per line )</label><br />';form+="<small>Use a pipe <code>|</code> delimited format: <code>option value|option label</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options"'+((field.type.match(/^(select|selects|checkboxes|radios)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<textarea property="options" wrap="off" spellcheck="false" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-options" rows="3">'+esc_html(field.options)+"</textarea><br />";form+="Here is a quick example:<br />";form+="<small>You can also specify a <em>default</em> option:</small><br />";form+="<code>US|United States|default</code><br />";form+="<code>CA|Canada</code><br />";form+="<code>VI|Virgin Islands (U.S.)</code>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+'><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected">Expected Format: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected"'+((field.type.match(/^(text|textarea)$/))?"":' style="display:none;"')+">";form+='<td colspan="2">';form+='<select property="expected" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-expected">';form+='<option value=""'+((field.expected==="")?' selected="selected"':"")+'">Anything Goes</option>';form+='<option disabled="disabled"></option>';form+='<optgroup label="Specific Input Types">';form+='<option value="numeric-wp-commas"'+((field.expected==="numeric-wp-commas")?' selected="selected"':"")+'">Numeric ( with or without decimals, commas allowed )</option>';form+='<option value="numeric"'+((field.expected==="numeric")?' selected="selected"':"")+'">Numeric ( with or without decimals, no commas )</option>';form+='<option value="integer"'+((field.expected==="integer")?' selected="selected"':"")+'">Integer ( whole number, without any decimals )</option>';form+='<option value="integer-gt-0"'+((field.expected==="integer-gt-0")?' selected="selected"':"")+'">Integer > 0 ( whole number, no decimals, greater than 0 )</option>';form+='<option value="float"'+((field.expected==="float")?' selected="selected"':"")+'">Float ( floating point number, decimals required )</option>';form+='<option value="float-gt-0"'+((field.expected==="float-gt-0")?' selected="selected"':"")+'">Float > 0 ( floating point number, decimals required, greater than 0 )</option>';form+='<option value="date"'+((field.expected==="date")?' selected="selected"':"")+'">Date ( required date format: dd/mm/yyyy )</option>';form+='<option value="email"'+((field.expected==="email")?' selected="selected"':"")+'">Email ( require valid email )</option>';form+='<option value="url"'+((field.expected==="url")?' selected="selected"':"")+'">Full URL ( starting with http or https )</option>';form+='<option value="domain"'+((field.expected==="domain")?' selected="selected"':"")+'">Domain Name ( domain name only, without http )</option>';form+='<option value="phone"'+((field.expected==="phone")?' selected="selected"':"")+'">Phone # ( 10 digits w/possible hyphens,spaces,brackets )</option>';form+='<option value="uszip"'+((field.expected==="uszip")?' selected="selected"':"")+'">US Zipcode ( 5-9 digits w/possible hyphen )</option>';form+='<option value="cazip"'+((field.expected==="cazip")?' selected="selected"':"")+'">Canadian Zipcode ( 6 alpha-numerics w/possible space )</option>';form+='<option value="uczip"'+((field.expected==="uczip")?' selected="selected"':"")+'">US/Canadian Zipcode ( either a US or Canadian zipcode )</option>';form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Any Character Combination">';for(i=1;i<=25;i++){form+='<option value="any-'+i+'"'+((field.expected==="any-"+i)?' selected="selected"':"")+'">Any Character Combination ( '+i+" character minimum )</option>";form+='<option value="any-'+i+'-e"'+((field.expected==="any-"+i+"-e")?' selected="selected"':"")+'">Any Character Combination ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics, Spaces &amp; Punctuation Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-spaces-punctuation-'+i+'"'+((field.expected==="alphanumerics-spaces-punctuation-"+i)?' selected="selected"':"")+'">Alphanumerics, Spaces &amp; Punctuation ( '+i+" character minimum )</option>";form+='<option value="alphanumerics-spaces-punctuation-'+i+'-e"'+((field.expected==="alphanumerics-spaces-punctuation-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics, Spaces &amp; Punctuation ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics &amp; Spaces Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-spaces-'+i+'"'+((field.expected==="alphanumerics-spaces-"+i)?' selected="selected"':"")+'">Alphanumerics &amp; Spaces ( '+i+" character minimum )</option>";form+='<option value="alphanumerics-spaces-'+i+'-e"'+((field.expected==="alphanumerics-spaces-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics &amp; Spaces ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics &amp; Punctuation Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-punctuation-'+i+'"'+((field.expected==="alphanumerics-punctuation-"+i)?' selected="selected"':"")+'">Alphanumerics &amp; Punctuation ( '+i+" character minimum )</option>";form+='<option value="alphanumerics-punctuation-'+i+'-e"'+((field.expected==="alphanumerics-punctuation-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics &amp; Punctuation ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphanumerics Only">';for(i=1;i<=25;i++){form+='<option value="alphanumerics-'+i+'"'+((field.expected==="alphanumerics-"+i)?' selected="selected"':"")+'">Alphanumerics ( '+i+" character minimum )</option>";form+='<option value="alphanumerics-'+i+'-e"'+((field.expected==="alphanumerics-"+i+"-e")?' selected="selected"':"")+'">Alphanumerics ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Alphabetics Only">';for(i=1;i<=25;i++){form+='<option value="alphabetics-'+i+'"'+((field.expected==="alphabetics-"+i)?' selected="selected"':"")+'">Alphabetics ( '+i+" character minimum )</option>";form+='<option value="alphabetics-'+i+'-e"'+((field.expected==="alphabetics-"+i+"-e")?' selected="selected"':"")+'">Alphabetics ( exactly '+i+" character"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+='<option disabled="disabled"></option>';form+='<optgroup label="Numeric Digits Only">';for(i=1;i<=25;i++){form+='<option value="numerics-'+i+'"'+((field.expected==="numerics-"+i)?' selected="selected"':"")+'">Numeric Digits ( '+i+" digit minimum )</option>";form+='<option value="numerics-'+i+'-e"'+((field.expected==="numerics-"+i+"-e")?' selected="selected"':"")+'">Numeric Digits ( exactly '+i+" digit"+((i>1)?"s":"")+" )</option>"}form+="</optgroup>";form+="</select><br />";form+="<small>Only Users/Members will be required to meet this criteria.</small><br />";form+="<small>* Administrators are exempt from this.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">Applicable Membership Levels: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels">';form+='<td colspan="2">';form+='<input type="text" property="levels" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-levels" value="'+esc_attr(field.levels)+'" /><br />';form+="<small>Please use comma-delimited Level #'s: <code>0,1,2,3,4</code> or type: <code>all</code>.</small><br />";form+="<small>This allows you to enable this field - only at specific Membership Levels.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">Allow Profile Edits: *</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<td colspan="2">';form+='<select property="editable" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-editable">';form+='<option value="yes"'+((field.editable==="yes")?' selected="selected"':"")+'">Yes ( editable )</option>';form+='<option value="no"'+((field.editable==="no")?' selected="selected"':"")+'">No ( uneditable after registration )</option>';form+='<option value="no-invisible"'+((field.editable==="no-invisible")?' selected="selected"':"")+'">No ( uneditable &amp; totally invisible after registration )</option>';form+='<option value="no-always-invisible"'+((field.editable==="no-always-invisible")?' selected="selected"':"")+'">No ( uneditable &amp; totally invisible, both during &amp; after registration )</option>';form+='<option value="yes-invisible"'+((field.editable==="yes-invisible")?' selected="selected"':"")+'">Yes ( editable after registration / invisible during registration )</option>';form+="</select><br />";form+="<small>If <code>No</code>, this field will be un-editable after registration.</small><br />";form+="<small>* Administrators are exempt from this.</small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">CSS Classes: ( optional )</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes">';form+='<td colspan="2">';form+='<input type="text" property="classes" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-classes" value="'+esc_attr(field.classes)+'" /><br />';form+="<small>Example: <code>my-style-1 my-style-2</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">CSS Styles: ( optional )</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles">';form+='<td colspan="2">';form+='<input type="text" property="styles" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-styles" value="'+esc_attr(field.styles)+'" /><br />';form+="<small>Example: <code>color:#000000; background:#FFFFFF;</code></small>";form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">';form+='<td colspan="2">';form+='<label for="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">Other Attributes: ( optional )</label>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs">';form+='<td colspan="2">';form+='<input type="text" property="attrs" autocomplete="off" id="ws-plugin--s2member-custom-reg-field-configuration-tools-form-attrs" value="'+esc_attr(field.attrs)+'" /><br />';form+='<small>Example: <code>onkeyup="" onblur=""</code></small>';form+="</td>";form+="</tr>";form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-spacer ws-plugin--s2member-custom-reg-field-configuration-tools-form-buttons"><td colspan="2">&nbsp;</td></tr>';form+='<tr class="ws-plugin--s2member-custom-reg-field-configuration-tools-form-buttons">';form+='<td align="left">';form+='<input type="button" value="Cancel" onclick="ws_plugin__s2member_customRegFieldCancel();" />';form+="</td>";form+='<td align="right">';form+='<input type="button" value="'+((editing)?"Update This Field":"Create Registration Field")+'" onclick="'+((editing)?"ws_plugin__s2member_customRegFieldUpdate("+index+");":"ws_plugin__s2member_customRegFieldCreate();")+'" />';form+="</td>";form+="</tr>";form+="</tbody>";form+="</table>";form+="<div>";$("body").append(form);tb_show(((editing)?"Editing Registration/Profile Field":"New Custom Registration/Profile Field"),"#TB_inline?inlineId=ws-plugin--s2member-custom-reg-field-configuration-thickbox-tools-form");$("table#ws-plugin--s2member-custom-reg-field-configuration-tools-form").show()}$tools.html(html)};var buildTable=function(){var l=fields.length,i=0,html="",eo="o";html+="<tbody>";html+="<tr>";html+="<th>Order</th>";html+="<th>Field Type</th>";html+="<th>Unique ID</th>";html+="<th>Required</th>";html+="<th>Levels</th>";html+="<th>- Tools -</th>";html+="</tr>";if(fields.length>0){for(i=0;i<fields.length;i++){html+='<tr class="'+esc_attr((eo=(eo==="o")?"e":"o"))+((fields[i].section==="yes")?" s":"")+" ws-plugin--s2member-custom-reg-field-configuration-table-row-"+i+'">';html+='<td nowrap="nowrap"><a class="ws-plugin--s2member-custom-reg-field-configuration-move-up" href="#" onclick="ws_plugin__s2member_customRegFieldMoveUp('+i+'); return false;"></a><a class="ws-plugin--s2member-custom-reg-field-configuration-move-down" href="#" onclick="ws_plugin__s2member_customRegFieldMoveDown('+i+'); return false;"></a></td>';html+='<td nowrap="nowrap">'+esc_html(fieldTypeDesc(fields[i].type))+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].id)+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].required)+"</td>";html+='<td nowrap="nowrap">'+esc_html(fields[i].levels)+"</td>";html+='<td nowrap="nowrap"><a class="ws-plugin--s2member-custom-reg-field-configuration-edit" href="#" onclick="ws_plugin__s2member_customRegFieldEdit('+i+'); return false;"></a><a class="ws-plugin--s2member-custom-reg-field-configuration-delete" href="#" onclick="ws_plugin__s2member_customRegFieldDelete('+i+'); return false;"></a></td>';html+="</tr>"}}else{html+="<tr>";html+='<td colspan="6">No Custom Fields are configured.</td>';html+="</tr>"}html+="</tbody>";$table.html(html)};buildTools(),buildTable()})()}}if(location.href.match(/page\=ws-plugin--s2member-res-ops/)){$("input#ws-plugin--s2member-brute-force-restrictions-reset-button").click(function(){var $this=$(this);$this.val("one moment please ...");$.post(ajaxurl,{action:"ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax",ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax")); ?>'},function(response){alert("s2Member's Brute Force Restriction Logs have all been reset."),$this.val("Reset Brute Force Logs")});return false});$("input#ws-plugin--s2member-ip-restrictions-reset-button").click(function(){var $this=$(this);$this.val("one moment please ...");$.post(ajaxurl,{action:"ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax",ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax")); ?>'},function(response){alert("s2Member's IP Restriction Logs have all been reset."),$this.val("Reset IP Restriction Logs")});return false});$('div.ws-plugin--s2member-query-level-access-section input[type="checkbox"][name="ws_plugin__s2member_filter_wp_query[]"]').change(function(){var thisChange=$(this).val();$('div.ws-plugin--s2member-query-level-access-section input[type="checkbox"][name="ws_plugin__s2member_filter_wp_query[]"]').each(function(){var $this=$(this),val=$this.val(),checkboxes='input[type="checkbox"]';if(val==="all"&&this.checked){$this.nextAll(checkboxes).attr({checked:"checked",disabled:"disabled"})}else{if(val==="all"&&!this.checked){$this.nextAll(checkboxes).removeAttr("disabled");(thisChange==="all")?$this.nextAll(checkboxes).removeAttr("checked"):null}}})}).last().trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-down-ops/)){var updateCloudFrontPrivateKey=function(){var $hiddenPrivateKey=$("input#ws-plugin--s2member-amazon-cf-files-private-key");var $visiblePrivateKeyEntry=$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry");var hiddenPrivateKeyValue=$.trim($hiddenPrivateKey.val()),visiblePrivateKeyEntryValue=$.trim($visiblePrivateKeyEntry.val());if((hiddenPrivateKeyValue&&!visiblePrivateKeyEntryValue)||visiblePrivateKeyEntryValue.match(/[^\r\n\u25CF]/)){$hiddenPrivateKey.val(visiblePrivateKeyEntryValue),$visiblePrivateKeyEntry.val(visiblePrivateKeyEntryValue.replace(/[^\r\n]/g,String.fromCharCode(9679)))}};$("form#ws-plugin--s2member-options-form").submit(updateCloudFrontPrivateKey);$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry").change(updateCloudFrontPrivateKey).trigger("change");var updateCloudFrontDistroCfgs=function(){var $hiddenPrivateKey=$("input#ws-plugin--s2member-amazon-cf-files-private-key");var $visiblePrivateKeyId=$("input#ws-plugin--s2member-amazon-cf-files-private-key-id");var $autoConfigDistros=$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros");var $autoConfigDistrosStatus=$("input#ws-plugin--s2member-amazon-cf-files-distros-auto-config-status");var autoConfigDistrosStatusValue=$.trim($autoConfigDistrosStatus.val());var hiddenPrivateKeyValue=$.trim($hiddenPrivateKey.val()),visiblePrivateKeyIdValue=$.trim($visiblePrivateKeyId.val());var hiddenPrivateKeyPrevConfigValue=$.trim($hiddenPrivateKey.attr("data-s-prev-config-value")),visiblePrivateKeyIdPrevConfigValue=$.trim($visiblePrivateKeyId.attr("data-s-prev-config-value"));if(autoConfigDistrosStatusValue==="configured"&&((visiblePrivateKeyIdPrevConfigValue&&visiblePrivateKeyIdValue!==visiblePrivateKeyIdPrevConfigValue)||(hiddenPrivateKeyPrevConfigValue&&hiddenPrivateKeyValue!==hiddenPrivateKeyPrevConfigValue))){alert("s2Member will need to delete and re-configure your Amazon® CloudFront distributions if you change this. When you're done editing, click (Save All Changes) below.");$autoConfigDistros.attr("checked","checked")}else{if(autoConfigDistrosStatusValue!=="configured"&&visiblePrivateKeyIdValue&&hiddenPrivateKeyValue){alert("s2Member will need to auto-configure your Amazon® CloudFront distributions for you. When you're done editing, click (Save All Changes) below.");$autoConfigDistros.attr("checked","checked")}}};$("input#ws-plugin--s2member-amazon-cf-files-private-key-id").change(updateCloudFrontDistroCfgs);$("textarea#ws-plugin--s2member-amazon-cf-files-private-key-entry").change(updateCloudFrontDistroCfgs);$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames").change(function(){var $this=$(this),thisChecked=(this.checked)?true:false;var $autoConfigDistros=$("input#ws-plugin--s2member-amazon-cf-files-auto-configure-distros");var $autoConfigDistroCnames=$("div#ws-plugin--s2member-amazon-cf-files-auto-configure-distro-cnames");(thisChecked)?$autoConfigDistroCnames.show():$autoConfigDistroCnames.hide();(thisChecked)?$autoConfigDistros.attr("checked","checked"):null}).trigger("change")}if(location.href.match(/page\=ws-plugin--s2member-paypal-ops/)){$("select#ws-plugin--s2member-auto-eot-system-enabled").change(function(){var $this=$(this),val=$this.val();var $viaCron=$("p#ws-plugin--s2member-auto-eot-system-enabled-via-cron");if(val==2){$viaCron.show()}else{$viaCron.hide()}})}if(location.href.match(/page\=ws-plugin--s2member-paypal-buttons/)){$("div.ws-menu-page select[id]").filter(function(){return this.id.match(/^ws-plugin--s2member-(level[1-9][0-9]*|modification)-term$/)}).change(function(){var button=this.id.replace(/^ws-plugin--s2member-(.+?)-term$/g,"$1");var trialDisabled=($(this).val().split("-")[2].replace(/[^0-1BN]/g,"")==="BN")?1:0;$("p#ws-plugin--s2member-"+button+"-trial-line").css("display",(trialDisabled?"none":""));$("span#ws-plugin--s2member-"+button+"-trial-then").css("display",(trialDisabled?"none":""));$("span#ws-plugin--s2member-"+button+"-20p-rule").css("display",(trialDisabled?"none":""));(trialDisabled)?$("input#ws-plugin--s2member-"+button+"-trial-period").val(0):null;(trialDisabled)?$("input#ws-plugin--s2member-"+button+"-trial-amount").val("0.00"):null});$("div.ws-menu-page input[id]").filter(function(){return this.id.match(/^ws-plugin--s2member-(level[1-9][0-9]*|modification|ccap)-ccaps$/)}).keyup(function(){var value=this.value.replace(/^(-all|-al|-a|-)[;,]*/gi,""),_all=(this.value.match(/^(-all|-al|-a|-)[;,]*/i))?"-all,":"";if(value.match(/[^a-z_0-9,]/)){this.value=_all+$.trim($.trim(value).replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase())}});ws_plugin__s2member_paypalButtonGenerate=function(button){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="",labels={};eval("<?php echo c_ws_plugin__s2member_utils_strings::esc_dq($labels); ?>");var shortCode=$("input#ws-plugin--s2member-"+button+"-shortcode");var code=$("textarea#ws-plugin--s2member-"+button+"-button");var modLevel=$("select#ws-plugin--s2member-modification-level");var level=(button==="modification")?modLevel.val().split(":",2)[1]:button.replace(/^level/,"");var label=labels["level"+level].replace(/"/g,"");var desc=$.trim($("input#ws-plugin--s2member-"+button+"-desc").val().replace(/"/g,""));var trialAmount=$("input#ws-plugin--s2member-"+button+"-trial-amount").val().replace(/[^0-9\.]/g,"");var trialPeriod=$("input#ws-plugin--s2member-"+button+"-trial-period").val().replace(/[^0-9]/g,"");var trialTerm=$("select#ws-plugin--s2member-"+button+"-trial-term").val().replace(/[^A-Z]/g,"");var regAmount=$("input#ws-plugin--s2member-"+button+"-amount").val().replace(/[^0-9\.]/g,"");var regPeriod=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[0].replace(/[^0-9]/g,"");var regTerm=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[1].replace(/[^A-Z]/g,"");var regRecur=$("select#ws-plugin--s2member-"+button+"-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var regRecurTimes="",regRecurRetry="1";var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-"+button+"-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-"+button+"-currency").val().replace(/[^A-Z]/g,"");var cCaps=$.trim($.trim($("input#ws-plugin--s2member-"+button+"-ccaps").val()).replace(/^(-all|-al|-a|-)[;,]*/gi,"").replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());cCaps=($.trim($("input#ws-plugin--s2member-"+button+"-ccaps").val()).match(/^(-all|-al|-a|-)[;,]*/i))?((cCaps)?"-all,":"-all")+cCaps.toLowerCase():cCaps.toLowerCase();trialPeriod=(regRecur==="BN")?"0":trialPeriod;trialAmount=(!trialAmount||isNaN(trialAmount)||trialAmount<0.01||trialPeriod<=0)?"0":trialAmount;var levelCcapsPer=(regRecur==="BN"&&regTerm!=="L")?level+":"+cCaps+":"+regPeriod+" "+regTerm:level+":"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(trialAmount!=="0"&&(isNaN(trialAmount)||trialAmount<0)){alert("— Oops, a slight problem: —\n\nWhen provided, Trial Amount must be >= 0.00");return false}else{if(trialAmount!=="0"&&trialAmount>10000){alert("— Oops, a slight problem: —\n\nMaximum Trial Amount is: 10000.00");return false}else{if(trialTerm==="D"&&trialPeriod>90){alert("— Oops, a slight problem: —\n\nMaximum Trial Days is: 90.\nIf you want to offer more than 90 days, please choose Weeks or Months from the drop-down.");return false}else{if(trialTerm==="W"&&trialPeriod>52){alert("— Oops, a slight problem: —\n\nMaximum Trial Weeks is: 52.\nIf you want to offer more than 52 weeks, please choose Months from the drop-down.");return false}else{if(trialTerm==="M"&&trialPeriod>24){alert("— Oops, a slight problem: —\n\nMaximum Trial Months is: 24.\nIf you want to offer more than 24 months, please choose Years from the drop-down.");return false}else{if(trialTerm==="Y"&&trialPeriod>5){alert("— Oops, a slight problem: —\n\nMax Trial Period Years is: 5.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}}}}}}code.html(code.val().replace(/ \<\!--(\<input type\="hidden" name\="(amount|src|srt|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)--\>/g," $1"));(parseInt(trialPeriod)<=0)?code.html(code.val().replace(/ (\<input type\="hidden" name\="(a1|p1|t1)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(regRecur==="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick$3")):null;(regRecur==="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="(src|srt|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(regRecur!=="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick-subscriptions$3")):null;(regRecur!=="BN")?code.html(code.val().replace(/ (\<input type\="hidden" name\="amount" value\="(.*?)" \/\>)/g," <!--$1-->")):null;shortCodeTemplateAttrs+=(button==="modification")?'modify="1" ':"";shortCodeTemplateAttrs+='level="'+esc_attr(level)+'" ccaps="'+esc_attr(cCaps)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'" custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"';shortCodeTemplateAttrs+=' ta="'+esc_attr(trialAmount)+'" tp="'+esc_attr(trialPeriod)+'" tt="'+esc_attr(trialTerm)+'" ra="'+esc_attr(regAmount)+'" rp="'+esc_attr(regPeriod)+'" rt="'+esc_attr(regTerm)+'" rr="'+esc_attr(regRecur)+'" rrt="'+esc_attr(regRecurTimes)+'" rra="'+esc_attr(regRecurRetry)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(levelCcapsPer)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="modify" value\="(.*?)"/,' name="modify" value="'+((button==="modification")?"1":"0")+'"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));code.html(code.val().replace(/ name\="src" value\="(.*?)"/,' name="src" value="'+esc_attr(regRecur)+'"'));code.html(code.val().replace(/ name\="srt" value\="(.*?)"/,' name="srt" value="'+esc_attr(regRecurTimes)+'"'));code.html(code.val().replace(/ name\="sra" value\="(.*?)"/,' name="sra" value="'+esc_attr(regRecurRetry)+'"'));code.html(code.val().replace(/ name\="a1" value\="(.*?)"/,' name="a1" value="'+esc_attr(trialAmount)+'"'));code.html(code.val().replace(/ name\="p1" value\="(.*?)"/,' name="p1" value="'+esc_attr(trialPeriod)+'"'));code.html(code.val().replace(/ name\="t1" value\="(.*?)"/,' name="t1" value="'+esc_attr(trialTerm)+'"'));code.html(code.val().replace(/ name\="a3" value\="(.*?)"/,' name="a3" value="'+esc_attr(regAmount)+'"'));code.html(code.val().replace(/ name\="p3" value\="(.*?)"/,' name="p3" value="'+esc_attr(regPeriod)+'"'));code.html(code.val().replace(/ name\="t3" value\="(.*?)"/,' name="t3" value="'+esc_attr(regTerm)+'"'));$("div#ws-plugin--s2member-"+button+"-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));(button==="modification")?alert("Your Modification Button has been generated.\nPlease copy/paste the Shortcode into your Login Welcome Page, or wherever you feel it would be most appropriate.\n\n* Remember, Modification Buttons should be displayed to existing Users/Members, and they should be logged-in, BEFORE clicking this Button."):alert("Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalCcapButtonGenerate=function(){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="";var shortCode=$("input#ws-plugin--s2member-ccap-shortcode");var code=$("textarea#ws-plugin--s2member-ccap-button");var desc=$.trim($("input#ws-plugin--s2member-ccap-desc").val().replace(/"/g,""));var regAmount=$("input#ws-plugin--s2member-ccap-amount").val().replace(/[^0-9\.]/g,"");var regPeriod=$("select#ws-plugin--s2member-ccap-term").val().split("-")[0].replace(/[^0-9]/g,"");var regTerm=$("select#ws-plugin--s2member-ccap-term").val().split("-")[1].replace(/[^A-Z]/g,"");var regRecur=$("select#ws-plugin--s2member-ccap-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-ccap-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-ccap-currency").val().replace(/[^A-Z]/g,"");var cCaps=$.trim($.trim($("input#ws-plugin--s2member-ccap-ccaps").val()).replace(/^(-all|-al|-a|-)[;,]*/gi,"").replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());cCaps=($.trim($("input#ws-plugin--s2member-ccap-ccaps").val()).match(/^(-all|-al|-a|-)[;,]*/i))?((cCaps)?"-all,":"-all")+cCaps.toLowerCase():cCaps.toLowerCase();var levelCcapsPer=(regRecur==="BN"&&regTerm!=="L")?"*:"+cCaps+":"+regPeriod+" "+regTerm:"*:"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(!cCaps||cCaps==="-all"){alert("— Oops, a slight problem: —\n\nPlease provide at least one Custom Capability.");return false}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}shortCodeTemplateAttrs+='level="*" ccaps="'+esc_attr(cCaps)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'"';shortCodeTemplateAttrs+=' custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>" ra="'+esc_attr(regAmount)+'" rp="'+esc_attr(regPeriod)+'" rt="'+esc_attr(regTerm)+'" rr="'+esc_attr(regRecur)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(levelCcapsPer)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));$("div#ws-plugin--s2member-ccap-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));alert("Your Button has been generated.\nPlease copy/paste the Shortcode into your Login Welcome Page, or wherever you feel it would be most appropriate.\n\n* Remember, Independent Custom Capability Buttons should ONLY be displayed to existing Users/Members, and they MUST be logged-in, BEFORE clicking this Button.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalSpButtonGenerate=function(){var shortCodeTemplate='[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]',shortCodeTemplateAttrs="";var shortCode=$("input#ws-plugin--s2member-sp-shortcode");var code=$("textarea#ws-plugin--s2member-sp-button");var leading=$("select#ws-plugin--s2member-sp-leading-id").val().replace(/[^0-9]/g,"");var additionals=$("select#ws-plugin--s2member-sp-additional-ids").val()||[];var hours=$("select#ws-plugin--s2member-sp-hours").val().replace(/[^0-9]/g,"");var regAmount=$("input#ws-plugin--s2member-sp-amount").val().replace(/[^0-9\.]/g,"");var desc=$.trim($("input#ws-plugin--s2member-sp-desc").val().replace(/"/g,""));var localeCode="",digital="0",noShipping="1";var pageStyle=$.trim($("input#ws-plugin--s2member-sp-page-style").val().replace(/"/g,""));var currencyCode=$("select#ws-plugin--s2member-sp-currency").val().replace(/[^A-Z]/g,"");if(!leading){alert("— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the 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}else{if(!regAmount||isNaN(regAmount)||regAmount<0.01){alert("— Oops, a slight problem: —\n\nAmount must be >= 0.01");return false}else{if(regAmount>10000){alert("— Oops, a slight problem: —\n\nMaximum Amount is: 10000.00");return false}else{if(!desc){alert("— Oops, a slight problem: —\n\nPlease type a Description for this Button.");return false}}}}for(var i=0,ids=leading;i<additionals.length;i++){if(additionals[i]&&additionals[i]!==leading){ids+=","+additionals[i]}}var spIdsHours="sp:"+ids+":"+hours;shortCodeTemplateAttrs+='sp="1" ids="'+esc_attr(ids)+'" exp="'+esc_attr(hours)+'" desc="'+esc_attr(desc)+'" ps="'+esc_attr(pageStyle)+'" lc="'+esc_attr(localeCode)+'" cc="'+esc_attr(currencyCode)+'" dg="'+esc_attr(digital)+'" ns="'+esc_attr(noShipping)+'"';shortCodeTemplateAttrs+=' custom="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>" ra="'+esc_attr(regAmount)+'"';shortCode.val(shortCodeTemplate.replace(/%%attrs%%/,shortCodeTemplateAttrs));code.html(code.val().replace(/ name\="lc" value\="(.*?)"/,' name="lc" value="'+esc_attr(localeCode)+'"'));code.html(code.val().replace(/ name\="no_shipping" value\="(.*?)"/,' name="no_shipping" value="'+esc_attr(noShipping)+'"'));code.html(code.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+esc_attr(desc)+'"'));code.html(code.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+esc_attr(spIdsHours)+'"'));code.html(code.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+esc_attr(pageStyle)+'"'));code.html(code.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+esc_attr(currencyCode)+'"'));code.html(code.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["HTTP_HOST"])); ?>"'));code.html(code.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+esc_attr(regAmount)+'"'));$("div#ws-plugin--s2member-sp-button-prev").html(code.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_VALUE_FOR_PP_INV\(\); \?\>/g,Math.round(new Date().getTime())+'~<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (esc_attr ($_SERVER["REMOTE_ADDR"])); ?>').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0|ON1|OS1); \?\>/g,""));alert("Your Button has been generated.\nPlease copy/paste the Shortcode into your WordPress® Editor.");shortCode.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalRegLinkGenerate=function(){var level=$("select#ws-plugin--s2member-reg-link-level").val().replace(/[^0-9]/g,"");var subscrID=$.trim($("input#ws-plugin--s2member-reg-link-subscr-id").val());var custom=$.trim($("input#ws-plugin--s2member-reg-link-custom").val());var cCaps=$.trim($.trim($("input#ws-plugin--s2member-reg-link-ccaps").val()).replace(/[ \-]/g,"_").replace(/[^a-z_0-9,]/gi,"").toLowerCase());var fixedTerm=$.trim($("input#ws-plugin--s2member-reg-link-fixed-term").val().replace(/[^A-Z 0-9]/gi,"").toUpperCase());var $link=$("p#ws-plugin--s2member-reg-link"),$loading=$("img#ws-plugin--s2member-reg-link-loading");var levelCcapsPer=(fixedTerm&&!fixedTerm.match(/L$/))?level+":"+cCaps+":"+fixedTerm:level+":"+cCaps;levelCcapsPer=levelCcapsPer.replace(/\:+$/g,"");if(!subscrID){alert("— Oops, a slight problem: —\n\nPaid Subscr. ID is a required value.");return false}else{if(!custom||custom.indexOf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq ($_SERVER["HTTP_HOST"]); ?>')!==0){alert("— Oops, a slight problem: —\n\nThe Custom Value MUST start with your domain name.");return false}else{if(fixedTerm&&!fixedTerm.match(/^[1-9]+ (D|W|M|Y|L)$/)){alert("— Oops, a slight problem: —\n\nThe Fixed Term Length is not formatted properly.");return false}}}$link.hide(),$loading.show(),$.post(ajaxurl,{action:"ws_plugin__s2member_reg_access_link_via_ajax",ws_plugin__s2member_reg_access_link_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-reg-access-link-via-ajax")); ?>',s2member_reg_access_link_subscr_gateway:"paypal",s2member_reg_access_link_subscr_id:subscrID,s2member_reg_access_link_custom:custom,s2member_reg_access_link_item_number:levelCcapsPer},function(response){$link.show().html('<a href="'+esc_attr(response)+'" target="_blank" rel="external">'+esc_html(response)+"</a>"),$loading.hide()});return false};ws_plugin__s2member_paypalSpLinkGenerate=function(){var leading=$("select#ws-plugin--s2member-sp-link-leading-id").val().replace(/[^0-9]/g,"");var additionals=$("select#ws-plugin--s2member-sp-link-additional-ids").val()||[];var hours=$("select#ws-plugin--s2member-sp-link-hours").val().replace(/[^0-9]/g,"");var $link=$("p#ws-plugin--s2member-sp-link"),$loading=$("img#ws-plugin--s2member-sp-link-loading");if(!leading){alert("— Oops, a slight problem: —\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the 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}for(var i=0,ids=leading;i<additionals.length;i++){if(additionals[i]&&additionals[i]!==leading){ids+=","+additionals[i]}}$link.hide(),$loading.show(),$.post(ajaxurl,{action:"ws_plugin__s2member_sp_access_link_via_ajax",ws_plugin__s2member_sp_access_link_via_ajax:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (wp_create_nonce ("ws-plugin--s2member-sp-access-link-via-ajax")); ?>',s2member_sp_access_link_ids:ids,s2member_sp_access_link_hours:hours},function(response){$link.show().html('<a href="'+esc_attr(response)+'" target="_blank" rel="external">'+esc_html(response)+"</a>"),$loading.hide()});return false}}if(location.href.match(/page\=ws-plugin--s2member-els-ops/)){$("select#ws-plugin--s2member-custom-reg-opt-in").change(function(){var $this=$(this),val=$this.val();var $rows=$("tr.ws-plugin--s2member-custom-reg-opt-in-label-row");var $prevImg=$("img.ws-plugin--s2member-custom-reg-opt-in-label-prev-img");if(val<=0){$rows.css("display","none"),$prevImg.attr("src",$prevImg.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}else{if(val==1){$rows.css("display",""),$prevImg.attr("src",$prevImg.attr("src").replace(/\/unchecked\.png$/,"/checked.png"))}else{if(val==2){$rows.css("display",""),$prevImg.attr("src",$prevImg.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}}}});$('div.ws-plugin--s2member-opt-out-section input[type="checkbox"][name="ws_plugin__s2member_custom_reg_auto_opt_outs[]"]').change(function(){var thisChange=$(this).val(),checkedIndexes=[];$('div.ws-plugin--s2member-opt-out-section input[type="checkbox"][name="ws_plugin__s2member_custom_reg_auto_opt_outs[]"]').each(function(){var $this=$(this),val=$this.val(),checkboxes='input[type="checkbox"]';if(val==="removal-deletion"&&this.checked){$this.nextAll(checkboxes).slice(0,2).attr({checked:"checked",disabled:"disabled"})}else{if(val==="removal-deletion"&&!this.checked){$this.nextAll(checkboxes).slice(0,2).removeAttr("disabled");(thisChange==="removal-deletion")?$this.nextAll(checkboxes).slice(0,2).removeAttr("checked"):null}else{if(val==="modification"&&this.checked){$this.nextAll(checkboxes).slice(0,3).attr({checked:"checked",disabled:"disabled"})}else{if(val==="modification"&&!this.checked){(thisChange==="modification")?$this.nextAll(checkboxes).slice(0,3).removeAttr("checked"):null;$this.nextAll(checkboxes).slice(0,3).removeAttr("disabled")}}}}}).each(function(index){(this.checked)?checkedIndexes.push(index):null});$("select#ws-plugin--s2member-custom-reg-auto-opt-out-transitions").removeAttr("disabled");if($.inArray(3,checkedIndexes)===-1&&$.inArray(4,checkedIndexes)===-1&&$.inArray(5,checkedIndexes)===-1&&$.inArray(6,checkedIndexes)===-1){$("select#ws-plugin--s2member-custom-reg-auto-opt-out-transitions").attr("disabled","disabled")}}).last().trigger("change")}});
includes/menu-pages/menu-pages-s.js CHANGED
@@ -203,8 +203,7 @@ jQuery(document).ready(function($)
203
  /**/
204
  ws_plugin__s2member_customRegFieldCreate = function()
205
  {
206
- var $table = $('table#ws-plugin--s2member-custom-reg-field-configuration-tools-form'), field = {
207
- };
208
  /**/
209
  $(':input[property]', $table).each( /* Go through each property value. */function()
210
  {
@@ -228,8 +227,7 @@ jQuery(document).ready(function($)
228
  /**/
229
  ws_plugin__s2member_customRegFieldUpdate = function(index)
230
  {
231
- var $table = $('table#ws-plugin--s2member-custom-reg-field-configuration-tools-form'), field = {
232
- };
233
  /**/
234
  $(':input[property]', $table).each( /* Go through each property value. */function()
235
  {
@@ -355,7 +353,7 @@ jQuery(document).ready(function($)
355
  /**/
356
  var fieldId2Var = /* Convert ids to variables. */ function(fieldId)
357
  {
358
- return( typeof fieldId === 'string') ? $.trim(fieldId).toLowerCase().replace(/[^a-z0-9]/g, '_') : '';
359
  };
360
  /**/
361
  var fieldTypeDesc = function(type)
@@ -942,8 +940,7 @@ jQuery(document).ready(function($)
942
  /**/
943
  ws_plugin__s2member_paypalButtonGenerate = /* Handles PayPal® Button Generation. */ function(button)
944
  {
945
- var shortCodeTemplate = '[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]', shortCodeTemplateAttrs = '', labels = {
946
- };
947
  /**/
948
  eval("<?php echo c_ws_plugin__s2member_utils_strings::esc_dq($labels); ?>");
949
  /**/
@@ -988,9 +985,9 @@ jQuery(document).ready(function($)
988
  alert('— Oops, a slight problem: —\n\nMaximum Trial Amount is: 10000.00');
989
  return false;
990
  }
991
- else if(trialTerm === 'D' && /* Some validation on the Trial Period. Max days: 7. */ trialPeriod > 7)
992
  {
993
- alert('— Oops, a slight problem: —\n\nMaximum Trial Days is: 7.\nIf you want to offer more than 7 days, please choose Weeks or Months from the drop-down.');
994
  return false;
995
  }
996
  else if(trialTerm === 'W' && /* Some validation on the Trial Period. 52 max. */ trialPeriod > 52)
@@ -998,14 +995,14 @@ jQuery(document).ready(function($)
998
  alert('— Oops, a slight problem: —\n\nMaximum Trial Weeks is: 52.\nIf you want to offer more than 52 weeks, please choose Months from the drop-down.');
999
  return false;
1000
  }
1001
- else if(trialTerm === 'M' && /* Some validation on the Trial Period. 12 max. */ trialPeriod > 12)
1002
  {
1003
- alert('— Oops, a slight problem: —\n\nMaximum Trial Months is: 12.\nIf you want to offer more than 12 months, please choose Years from the drop-down.');
1004
  return false;
1005
  }
1006
- else if(trialTerm === 'Y' && /* 1 year max. */ trialPeriod > 1)
1007
  {
1008
- alert('— Oops, a slight problem: —\n\nMax Trial Period Years is: 1.');
1009
  return false;
1010
  }
1011
  else if(!regAmount || isNaN(regAmount) || regAmount < 0.01)
203
  /**/
204
  ws_plugin__s2member_customRegFieldCreate = function()
205
  {
206
+ var $table = $('table#ws-plugin--s2member-custom-reg-field-configuration-tools-form'), field = {};
 
207
  /**/
208
  $(':input[property]', $table).each( /* Go through each property value. */function()
209
  {
227
  /**/
228
  ws_plugin__s2member_customRegFieldUpdate = function(index)
229
  {
230
+ var $table = $('table#ws-plugin--s2member-custom-reg-field-configuration-tools-form'), field = {};
 
231
  /**/
232
  $(':input[property]', $table).each( /* Go through each property value. */function()
233
  {
353
  /**/
354
  var fieldId2Var = /* Convert ids to variables. */ function(fieldId)
355
  {
356
+ return ( typeof fieldId === 'string') ? $.trim(fieldId).toLowerCase().replace(/[^a-z0-9]/g, '_') : '';
357
  };
358
  /**/
359
  var fieldTypeDesc = function(type)
940
  /**/
941
  ws_plugin__s2member_paypalButtonGenerate = /* Handles PayPal® Button Generation. */ function(button)
942
  {
943
+ var shortCodeTemplate = '[s2Member-PayPal-Button %%attrs%% image="default" output="button" /]', shortCodeTemplateAttrs = '', labels = {};
 
944
  /**/
945
  eval("<?php echo c_ws_plugin__s2member_utils_strings::esc_dq($labels); ?>");
946
  /**/
985
  alert('— Oops, a slight problem: —\n\nMaximum Trial Amount is: 10000.00');
986
  return false;
987
  }
988
+ else if(trialTerm === 'D' && /* Some validation on the Trial Period. Max days: 90. */ trialPeriod > 90)
989
  {
990
+ alert('— Oops, a slight problem: —\n\nMaximum Trial Days is: 90.\nIf you want to offer more than 90 days, please choose Weeks or Months from the drop-down.');
991
  return false;
992
  }
993
  else if(trialTerm === 'W' && /* Some validation on the Trial Period. 52 max. */ trialPeriod > 52)
995
  alert('— Oops, a slight problem: —\n\nMaximum Trial Weeks is: 52.\nIf you want to offer more than 52 weeks, please choose Months from the drop-down.');
996
  return false;
997
  }
998
+ else if(trialTerm === 'M' && /* Some validation on the Trial Period. 24 max. */ trialPeriod > 24)
999
  {
1000
+ alert('— Oops, a slight problem: —\n\nMaximum Trial Months is: 24.\nIf you want to offer more than 24 months, please choose Years from the drop-down.');
1001
  return false;
1002
  }
1003
+ else if(trialTerm === 'Y' && /* 5 years max. */ trialPeriod > 5)
1004
  {
1005
+ alert('— Oops, a slight problem: —\n\nMax Trial Period Years is: 5.');
1006
  return false;
1007
  }
1008
  else if(!regAmount || isNaN(regAmount) || regAmount < 0.01)
includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -14,10 +14,10 @@
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
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_page_paypal_ops"))
21
  {
22
  /**
23
  * Menu page for the s2Member plugin ( PayPal® Options page ).
@@ -27,609 +27,703 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_ops"))
27
  */
28
  class c_ws_plugin__s2member_menu_page_paypal_ops
29
  {
30
- public function __construct ()
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";
39
- echo '<tr class="ws-menu-page-table-tr">' . "\n";
40
- echo '<td class="ws-menu-page-table-l">' . "\n";
41
  /**/
42
- echo '<form method="post" name="ws_plugin__s2member_options_form" id="ws-plugin--s2member-options-form">' . "\n";
43
- echo '<input type="hidden" name="ws_plugin__s2member_options_save" id="ws-plugin--s2member-options-save" value="' . esc_attr (wp_create_nonce ("ws-plugin--s2member-options-save")) . '" />' . "\n";
44
- echo '<input type="hidden" name="ws_plugin__s2member_configured" id="ws-plugin--s2member-configured" value="1" />' . "\n";
45
  /**/
46
- do_action ("ws_plugin__s2member_during_paypal_ops_page_before_left_sections", get_defined_vars ());
47
  /**/
48
- if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_paypal_account_details", true, get_defined_vars ()))
49
  {
50
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_paypal_account_details", get_defined_vars ());
51
- /**/
52
- echo '<div class="ws-menu-page-group" title="PayPal® Account Details">' . "\n";
53
- /**/
54
- echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-account-details-section">' . "\n";
55
- echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
56
- echo '<h3>PayPal® Account Details ( required, if using PayPal® )</h3>' . "\n";
57
- echo '<p>This plugin works in conjunction with <a href="http://www.s2member.com/paypal" target="_blank" rel="external">PayPal® Website Payments Standard</a>, for businesses. You do NOT need a PayPal® Pro account. You just need to upgrade your Personal PayPal® account to a Business status, which is free. A PayPal® account can be <a href="http://pages.ebay.com/help/buy/questions/upgrade-paypal-account.html" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account, simply by going to the `Profile` button under the `My Account` tab, selecting the `Personal Business Information` button, and then clicking the `Upgrade Your Account` button.</p>' . "\n";
58
- echo '<p><em><strong>*PayPal® API Credentials*</strong> Once you have a PayPal® Business account, you\'ll need access to your <a href="http://www.s2member.com/paypal-profile-api-access" target="_blank" rel="external">PayPal® API Credentials</a>. Log into your PayPal® account, and navigate to <code>Profile -> API Access (or Request API Credentials)</code>. You\'ll choose <code>( Request API Signature )</code>.</em></p>' . "\n";
59
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars ());
60
- /**/
61
- echo '<table class="form-table">' . "\n";
62
- echo '<tbody>' . "\n";
63
- echo '<tr>' . "\n";
64
- /**/
65
- echo '<th>' . "\n";
66
- echo '<label for="ws-plugin--s2member-paypal-business">' . "\n";
67
- echo 'Your PayPal® EMail Address:' . "\n";
68
- echo '</label>' . "\n";
69
- echo '</th>' . "\n";
70
- /**/
71
- echo '</tr>' . "\n";
72
- echo '<tr>' . "\n";
73
- /**/
74
- echo '<td>' . "\n";
75
- echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_business" id="ws-plugin--s2member-paypal-business" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]) . '" /><br />' . "\n";
76
- echo 'Enter the email address you\'ve associated with your PayPal® Business account.' . "\n";
77
- echo '</td>' . "\n";
78
- /**/
79
- echo '</tr>' . "\n";
80
- echo '<tr>' . "\n";
81
- /**/
82
- echo '<th>' . "\n";
83
- echo '<label for="ws-plugin--s2member-paypal-api-username">' . "\n";
84
- echo 'Your PayPal® API Username:' . "\n";
85
- echo '</label>' . "\n";
86
- echo '</th>' . "\n";
87
- /**/
88
- echo '</tr>' . "\n";
89
- echo '<tr>' . "\n";
90
- /**/
91
- echo '<td>' . "\n";
92
- echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_api_username" id="ws-plugin--s2member-paypal-api-username" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_username"]) . '" /><br />' . "\n";
93
- echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials)</code>.' . "\n";
94
- echo '</td>' . "\n";
95
- /**/
96
- echo '</tr>' . "\n";
97
- echo '<tr>' . "\n";
98
- /**/
99
- echo '<th>' . "\n";
100
- echo '<label for="ws-plugin--s2member-paypal-api-password">' . "\n";
101
- echo 'Your PayPal® API Password:' . "\n";
102
- echo '</label>' . "\n";
103
- echo '</th>' . "\n";
104
- /**/
105
- echo '</tr>' . "\n";
106
- echo '<tr>' . "\n";
107
- /**/
108
- echo '<td>' . "\n";
109
- echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_api_password" id="ws-plugin--s2member-paypal-api-password" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_password"]) . '" /><br />' . "\n";
110
- echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials)</code>.' . "\n";
111
- echo '</td>' . "\n";
112
- /**/
113
- echo '</tr>' . "\n";
114
- echo '<tr>' . "\n";
115
- /**/
116
- echo '<th>' . "\n";
117
- echo '<label for="ws-plugin--s2member-paypal-api-signature">' . "\n";
118
- echo 'Your PayPal® API Signature:' . "\n";
119
- echo '</label>' . "\n";
120
- echo '</th>' . "\n";
121
- /**/
122
- echo '</tr>' . "\n";
123
- echo '<tr>' . "\n";
124
- /**/
125
- echo '<td>' . "\n";
126
- echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_api_signature" id="ws-plugin--s2member-paypal-api-signature" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_signature"]) . '" /><br />' . "\n";
127
- echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials)</code>.' . "\n";
128
- echo '</td>' . "\n";
129
- /**/
130
- echo '</tr>' . "\n";
131
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_detail_rows", get_defined_vars ());
132
- echo '</tbody>' . "\n";
133
- echo '</table>' . "\n";
134
- /**/
135
- echo '<div class="ws-menu-page-hr"></div>' . "\n";
136
- /**/
137
- echo '<table class="form-table" style="margin:0;">' . "\n";
138
- echo '<tbody>' . "\n";
139
- echo '<tr>' . "\n";
140
- /**/
141
- echo '<th style="padding-top:0;">' . "\n";
142
- echo '<label for="ws-plugin--s2member-paypal-sandbox">' . "\n";
143
- echo 'Developer/Sandbox Testing?' . "\n";
144
- echo '</label>' . "\n";
145
- echo '</th>' . "\n";
146
- /**/
147
- echo '</tr>' . "\n";
148
- echo '<tr>' . "\n";
149
- /**/
150
- echo '<td>' . "\n";
151
- echo '<input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-0" value="0"' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-paypal-sandbox-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-1" value="1"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-paypal-sandbox-1">Yes, enable support for Sandbox testing.</label><br />' . "\n";
152
- echo '<em>Only enable this if you\'ve provided Sandbox credentials above.<br />This puts the API, IPN, PDT and Form/Button Generators all into Sandbox mode.<br />See: <a href="http://www.s2member.com/paypal-developers" target="_blank" rel="external">PayPal® Developers</a></em>' . "\n";
153
- echo '</td>' . "\n";
154
- /**/
155
- echo '</tr>' . "\n";
156
- echo '<tr>' . "\n";
157
- /**/
158
- echo '<th>' . "\n";
159
- echo '<label for="ws-plugin--s2member-paypal-btn-encryption">' . "\n";
160
- echo 'Enable Button Encryption?' . "\n";
161
- echo '</label>' . "\n";
162
- echo '</th>' . "\n";
163
- /**/
164
- echo '</tr>' . "\n";
165
- echo '<tr>' . "\n";
166
- /**/
167
- echo '<td>' . "\n";
168
- echo '<input type="radio" name="ws_plugin__s2member_paypal_btn_encryption" id="ws-plugin--s2member-paypal-btn-encryption-0" value="0"' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-paypal-btn-encryption-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_paypal_btn_encryption" id="ws-plugin--s2member-paypal-btn-encryption-1" value="1"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-paypal-btn-encryption-1">Yes, enable PayPal® Button encryption.</label><br />' . "\n";
169
- echo '<em>If enabled, all of your PayPal® Button Shortcodes will produce *encrypted* PayPal® Buttons. This improves security against fraudulent transactions. For extra security, you should update your PayPal® account too, under: <code>My Profile -> Website Payment Preferences</code>. You\'ll want to block all non-encrypted payments. <strong>*Note*</strong> this will NOT work until you\'ve supplied s2Member with your PayPal® Email Address, and also with your API Username/Password/Signature.</em>' . "\n";
170
- echo '</td>' . "\n";
171
- /**/
172
- echo '</tr>' . "\n";
173
  /**/
174
- if (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ())
175
  {
176
- echo '<tr>' . "\n";
177
  /**/
178
- echo '<th>' . "\n";
179
- echo '<label for="ws-plugin--s2member-gateway-debug-logs">' . "\n";
180
- echo 'Enable Logging Routines?' . "\n";
181
- echo '</label>' . "\n";
182
- echo '</th>' . "\n";
183
  /**/
184
- echo '</tr>' . "\n";
185
- echo '<tr>' . "\n";
186
  /**/
187
- echo '<td>' . "\n";
188
- echo '<input type="radio" name="ws_plugin__s2member_gateway_debug_logs" id="ws-plugin--s2member-gateway-debug-logs-0" value="0"' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-gateway-debug-logs-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_gateway_debug_logs" id="ws-plugin--s2member-gateway-debug-logs-1" value="1"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-gateway-debug-logs-1">Yes, enable debugging, with API, IPN &amp; Return Page logging.</label><br />' . "\n";
189
- echo '<em>This enables API, IPN and Return Page logging. The log files are stored here:<br /><code>' . esc_html (c_ws_plugin__s2member_utils_dirs::doc_root_path ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])) . '</code></em>' . "\n";
190
- echo '</td>' . "\n";
191
  /**/
192
- echo '</tr>' . "\n";
193
  }
194
  /**/
195
- echo '</tbody>' . "\n";
196
- echo '</table>' . "\n";
197
  /**/
198
- echo '<div class="ws-menu-page-hr"></div>' . "\n";
199
  /**/
200
- echo '<p><em><strong>*Sandbox Tip*</strong> If you\'re testing your site through a PayPal® Sandbox account, please remember that Email Confirmations from s2Member will NOT be received after a test purchase. s2Member sends its Confirmation Emails to the PayPal® Email Address of the Customer. Since PayPal® Sandbox addresses are usually bogus ( for testing ), you will have to run live transactions before Email Confirmations from s2Member are received. That being said, all other s2Member functionality CAN be tested through a PayPal® Sandbox account. Email Confirmations are the only hang-up.</em></p>' . "\n";
201
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details_after_sandbox_tip", get_defined_vars ());
202
- echo '</div>' . "\n";
203
  /**/
204
- echo '</div>' . "\n";
205
  /**/
206
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_paypal_account_details", get_defined_vars ());
207
  }
208
  /**/
209
- if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_paypal_ipn", true, get_defined_vars ()))
210
  {
211
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_paypal_ipn", get_defined_vars ());
212
- /**/
213
- echo '<div class="ws-menu-page-group" title="PayPal® IPN Integration">' . "\n";
214
- /**/
215
- echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-ipn-section">' . "\n";
216
- echo '<h3>PayPal® IPN / Instant Payment Notifications ( required, please enable )</h3>' . "\n";
217
- echo '<p>Log into your PayPal® account and navigate to this section:<br /><code>Account Profile -> Instant Payment Notification Preferences</code></p>' . "\n";
218
- echo '<p>Edit your IPN settings &amp; turn IPN Notifications: <strong><code>On</code></strong></p>' . "\n";
219
- echo '<p>You\'ll need your IPN URL, which is:<br /><code>' . esc_html (site_url ("/?s2member_paypal_notify=1")) . '</code></p>' . "\n";
220
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars ());
221
- /**/
222
- 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";
223
- echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="display:none;">' . "\n";
224
- 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";
225
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_quick_tip", get_defined_vars ());
226
- echo '<p><em><strong>*IPN Communications*</strong> You\'ll be happy to know that s2Member handles cancellations, expirations, failed payments, terminations ( e.g. refunds &amp; chargebacks ) for you automatically. If you log into your PayPal® account and cancel a Member\'s Subscription, or, if the Member logs into their PayPal® account and cancels their own Subscription, s2Member will be notified of these important changes and react accordingly through the PayPal® IPN service that runs silently behind-the-scene. The PayPal® IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds &amp; chargeback reversals are supported through the IPN service. If you issue a refund to an unhappy Customer through PayPal®, s2Member will be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically ( based on your configuration ). The communication from PayPal® -> s2Member is seamless.</em></p>' . "\n";
227
- echo '</div>' . "\n";
228
- /**/
229
- echo '<div class="ws-menu-page-hr"></div>' . "\n";
230
- /**/
231
- 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";
232
- echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="display:none;">' . "\n";
233
- 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";
234
- 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";
235
- echo '<p><em>Any 3rd-party application that is sending IPN transactions to your s2Member installation, must ALWAYS include the <code>custom</code> POST variable, and that variable must always start with your installation domain ( i.e. custom=<code>' . esc_html ($_SERVER["HTTP_HOST"]) . '</code> ). In addition, the <code>item_number</code> variable, must always match a format that s2Member looks for. Generally speaking, the <code>item_number</code> should be <code>1, 2, 3, or 4</code>, indicating a specific s2Member Level #. However, s2Member also uses some advanced formats in this field. Just to be sure, we suggest creating a PayPal® Button with the s2Member Button Generator, and then taking a look at the Full Button Code to see how s2Member expects <code>item_number</code> to be formatted. Other than the aforementioned exceptions; all other POST variables should follow PayPal® standards. Please see: <a href="http://www.s2member.com/paypal-ipn-pdt-vars" target="_blank" rel="external">PayPal\'s IPN/PDT reference guide</a> for full documentation.</em></p>' . "\n";
236
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_proxy", get_defined_vars ());
237
- echo '</div>' . "\n";
238
- echo '</div>' . "\n";
239
- /**/
240
- echo '</div>' . "\n";
241
- /**/
242
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_paypal_ipn", get_defined_vars ());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  }
244
  /**/
245
- if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_paypal_pdt", true, get_defined_vars ()))
246
  {
247
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_paypal_pdt", get_defined_vars ());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
  /**/
249
- echo '<div class="ws-menu-page-group" title="PayPal® PDT/Auto-Return Integration">' . "\n";
250
  /**/
251
- echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-pdt-section">' . "\n";
252
- echo '<h3>PayPal® PDT Identity Token ( required, please enable )</h3>' . "\n";
253
- echo '<p>Log into your PayPal® account and navigate to this section:<br /><code>Account Profile -> Website Payment Preferences</code></p>' . "\n";
254
- echo '<p>Turn the Auto-Return feature: <strong><code>On</code></strong></p>' . "\n";
255
- echo '<p>You\'ll need your <a href="' . esc_attr (site_url ("/?s2member_paypal_return=1&s2member_paypal_proxy=paypal&s2member_paypal_proxy_use=x-preview")) . '" target="_blank" rel="external">Auto-Return URL</a>, which is:<br /><code>' . esc_html (site_url ("/?s2member_paypal_return=1")) . '</code></p>' . "\n";
256
- echo '<p>You MUST also enable PDT ( Payment Data Transfer ): <strong><code>On</code></strong><br /><em>You\'ll be issued an Identity Token that you MUST enter below.</em></p>' . "\n";
257
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt", get_defined_vars ());
258
  /**/
259
- echo '<table class="form-table">' . "\n";
260
- echo '<tbody>' . "\n";
261
- echo '<tr>' . "\n";
262
  /**/
263
- echo '<th>' . "\n";
264
- echo '<label for="ws-plugin--s2member-paypal-identity-token">' . "\n";
265
- echo 'PayPal® PDT Identity Token:' . "\n";
266
- echo '</label>' . "\n";
267
- echo '</th>' . "\n";
268
  /**/
269
- echo '</tr>' . "\n";
270
- echo '<tr>' . "\n";
271
  /**/
272
- echo '<td>' . "\n";
273
- echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_identity_token" id="ws-plugin--s2member-paypal-identity-token" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_identity_token"]) . '" /><br />' . "\n";
274
- echo 'Your PDT Identity Token will appear under <em>Profile -> Website Payment Preferences</em> in your PayPal® account.' . "\n";
275
- echo '</td>' . "\n";
276
  /**/
277
- echo '</tr>' . "\n";
278
- echo '</tbody>' . "\n";
279
- echo '</table>' . "\n";
280
  /**/
281
- echo '<div class="ws-menu-page-hr"></div>' . "\n";
282
  /**/
283
- 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";
284
- echo '<div id="ws-plugin--s2member-paypal-pdt-details" style="display:none;">' . "\n";
285
- 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";
286
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_quick_tip", get_defined_vars ());
287
- echo '</div>' . "\n";
288
  /**/
289
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_more_info", get_defined_vars ());
290
  /**/
291
- echo '</div>' . "\n";
292
  /**/
293
- echo '</div>' . "\n";
294
  /**/
295
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_paypal_pdt", get_defined_vars ());
296
  }
297
  /**/
298
- if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_signup_confirmation_email", true, get_defined_vars ()))
299
  {
300
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_signup_confirmation_email", get_defined_vars ());
301
- /**/
302
- echo '<div class="ws-menu-page-group" title="Signup Confirmation Email ( Standard )">' . "\n";
303
- /**/
304
- echo '<div class="ws-menu-page-section ws-plugin--s2member-signup-confirmation-email-section">' . "\n";
305
- echo '<h3>Signup Confirmation Email ( required, but the default works fine )</h3>' . "\n";
306
- echo '<p>This email is sent to new Customers after they return from a successful signup at PayPal®. The <strong>primary</strong> purpose of this email, is to provide the Customer with instructions, along with a link to register a Username for their Membership. You may also customize this further, by providing details that are specifically geared to your site.</p>' . "\n";
307
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_signup_confirmation_email", get_defined_vars ());
308
- /**/
309
- echo '<table class="form-table">' . "\n";
310
- echo '<tbody>' . "\n";
311
- echo '<tr>' . "\n";
312
- /**/
313
- echo '<th>' . "\n";
314
- echo '<label for="ws-plugin--s2member-signup-email-recipients">' . "\n";
315
- echo 'Signup Confirmation Recipients:' . "\n";
316
- echo '</label>' . "\n";
317
- echo '</th>' . "\n";
318
- /**/
319
- echo '</tr>' . "\n";
320
- echo '<tr>' . "\n";
321
- /**/
322
- echo '<td>' . "\n";
323
- echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_signup_email_recipients" id="ws-plugin--s2member-signup-email-recipients" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_email_recipients"]) . '" /><br />' . "\n";
324
- echo 'This is a semicolon ( ; ) delimited list of Recipients. Here is an example:<br />' . "\n";
325
- echo '<code>"%%full_name%%" &lt;%%payer_email%%&gt;; admin@example.com; "Webmaster" &lt;webmaster@example.com&gt;</code>' . "\n";
326
- echo '</td>' . "\n";
327
- /**/
328
- echo '</tr>' . "\n";
329
- echo '<tr>' . "\n";
330
- /**/
331
- echo '<th>' . "\n";
332
- echo '<label for="ws-plugin--s2member-signup-email-subject">' . "\n";
333
- echo 'Signup Confirmation Email Subject:' . "\n";
334
- echo '</label>' . "\n";
335
- echo '</th>' . "\n";
336
- /**/
337
- echo '</tr>' . "\n";
338
- echo '<tr>' . "\n";
339
- /**/
340
- echo '<td>' . "\n";
341
- echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_signup_email_subject" id="ws-plugin--s2member-signup-email-subject" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_email_subject"]) . '" /><br />' . "\n";
342
- echo 'Subject Line used in the email sent to a Customer after a successful signup has occurred through PayPal®.' . "\n";
343
- echo '</td>' . "\n";
344
- /**/
345
- echo '</tr>' . "\n";
346
- echo '<tr>' . "\n";
347
- /**/
348
- echo '<th>' . "\n";
349
- echo '<label for="ws-plugin--s2member-signup-email-message">' . "\n";
350
- echo 'Signup Confirmation Email Message:' . "\n";
351
- echo '</label>' . "\n";
352
- echo '</th>' . "\n";
353
- /**/
354
- echo '</tr>' . "\n";
355
- echo '<tr>' . "\n";
356
- /**/
357
- echo '<td>' . "\n";
358
- echo '<textarea name="ws_plugin__s2member_signup_email_message" id="ws-plugin--s2member-signup-email-message" rows="10">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_email_message"]) . '</textarea><br />' . "\n";
359
- echo 'Message Body used in the email sent to a Customer after a successful signup has occurred through PayPal®.<br /><br />' . "\n";
360
- echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
361
- echo '<ul>' . "\n";
362
- echo '<li><code>%%registration_url%%</code> = The full URL ( generated by s2Member ) where the Customer can get registered.</li>' . "\n";
363
- echo '<li><code>%%subscr_id%%</code> = The PayPal® Subscription ID, which remains constant throughout any &amp; all future payments. [ <a href="#" onclick="alert(\'There is one exception. If you are selling Lifetime or Fixed-Term ( non-recurring ) access, using Buy Now functionality; the %%subscr_id%% is actually set to the Transaction ID for the purchase. PayPal® does not provide a specific Subscription ID for Buy Now purchases. Since Lifetime &amp; Fixed-Term Subscriptions are NOT recurring ( i.e. there is only ONE payment ), using the Transaction ID as the Subscription ID is a graceful way to deal with this minor conflict.\'); return false;">?</a> ]</li>' . "\n";
364
- echo '<li><code>%%initial%%</code> = The Initial Fee charged during signup. If you offered a 100% Free Trial, this will be <code>0</code>. [ <a href="#" onclick="alert(\'This will always represent the amount of money the Customer spent, whenever they initially signed up, no matter what. If a Customer signs up, under the terms of a 100% Free Trial Period, this will be 0.\'); return false;">?</a> ]</li>' . "\n";
365
- echo '<li><code>%%regular%%</code> = The Regular Amount of the Subscription. This value is <code>always > 0</code>, no matter what. [ <a href="#" onclick="alert(\'This is how much the Subscription costs after an Initial Period expires. The %%regular%% rate is always > 0. If you did NOT offer an Initial Period at a different price, %%initial%% and %%regular%% will be equal to the same thing.\'); return false;">?</a> ]</li>' . "\n";
366
- echo '<li><code>%%recurring%%</code> = This is the amount that will be charged on a recurring basis, or <code>0</code> if non-recurring. [ <a href="#" onclick="alert(\'If Recurring Payments have not been required, this will be equal to 0. That being said, %%regular%% &amp; %%recurring%% are usually the same value. This variable can be used in two different ways. You can use it to determine what the Regular Recurring Rate is, or to determine whether the Subscription will recur or not. If it is going to recur, %%recurring%% will be > 0.\'); return false;">?</a> ]</li>' . "\n";
367
- echo '<li><code>%%first_name%%</code> = The First Name of the Customer who purchased the Membership Subscription.</li>' . "\n";
368
- echo '<li><code>%%last_name%%</code> = The Last Name of the Customer who purchased the Membership Subscription.</li>' . "\n";
369
- echo '<li><code>%%full_name%%</code> = The Full Name ( First &amp; Last ) of the Customer who purchased the Membership Subscription.</li>' . "\n";
370
- echo '<li><code>%%payer_email%%</code> = The Email Address of the Customer who purchased the Membership Subscription.</li>' . "\n";
371
- echo '<li><code>%%user_ip%%</code> = The Customer\'s IP Address, detected during checkout via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>' . "\n";
372
- echo '<li><code>%%item_number%%</code> = The Item Number ( colon separated <code><em>level:custom_capabilities:fixed term</em></code> ) that the Subscription is for.</li>' . "\n";
373
- echo '<li><code>%%item_name%%</code> = The Item Name ( as provided by the <code>desc=""</code> attribute in your Shortcode, which briefly describes the Item Number ).</li>' . "\n";
374
- echo '<li><code>%%initial_term%%</code> = This is the term length of the Initial Period. This will be a numeric value, followed by a space, then a single letter. [ <a href="#" onclick="alert(\'Here are some examples:\\n\\n%%initial_term%% = 1 D ( this means 1 Day )\\n%%initial_term%% = 1 W ( this means 1 Week )\\n%%initial_term%% = 1 M ( this means 1 Month )\\n%%initial_term%% = 1 Y ( this means 1 Year )\\n\\nThe Initial Period never recurs, so this only lasts for the term length specified, then it is over.\'); return false;">?</a> ]</li>' . "\n";
375
- echo '<li><code>%%initial_cycle%%</code> = This is the <code>%%initial_term%%</code> from above, converted to a cycle representation of: <code><em>X days/weeks/months/years</em></code>.</li>' . "\n";
376
- echo '<li><code>%%regular_term%%</code> = This is the term length of the Regular Period. This will be a numeric value, followed by a space, then a single letter. [ <a href="#" onclick="alert(\'Here are some examples:\\n\\n%%regular_term%% = 1 D ( this means 1 Day )\\n%%regular_term%% = 1 W ( this means 1 Week )\\n%%regular_term%% = 1 M ( this means 1 Month )\\n%%regular_term%% = 1 Y ( this means 1 Year )\\n%%regular_term%% = 1 L ( this means 1 Lifetime )\\n\\nThe Regular Term is usually recurring. So the Regular Term value represents the period ( or duration ) of each recurring period. If %%recurring%% = 0, then the Regular Term only applies once, because it is not recurring. So if it is not recurring, the value of %%regular_term%% simply represents how long their Membership privileges are going to last after the %%initial_term%% has expired, if there was an Initial Term. The value of this variable ( %%regular_term%% ) will never be empty, it will always be at least: 1 D, meaning 1 day. No exceptions.\'); return false;">?</a> ]</li>' . "\n";
377
- echo '<li><code>%%regular_cycle%%</code> = This is the <code>%%regular_term%%</code> from above, converted to a cycle representation of: <code><em>[every] X days/weeks/months/years — OR daily, weekly, bi-weekly, monthly, bi-monthly, quarterly, yearly, or lifetime</em></code>. This is a very useful Replacment Code. Its value is dynamic; depending on term length, recurring status, and period/term lengths configured.</li>' . "\n";
378
- echo '<li><code>%%recurring/regular_cycle%%</code> = Example ( <code>14.95 / Monthly</code> ), or ... ( <code>0 / non-recurring</code> ); depending on the value of <code>%%recurring%%</code>.</li>' . "\n";
379
- echo '</ul>' . "\n";
380
- /**/
381
- echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
382
- echo '<ul>' . "\n";
383
- echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
384
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>' . "\n";
385
- echo '</ul>' . "\n";
386
- echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />' . "\n";
387
- echo '<em>( The campaign ( i.e. christmas-promo ) could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
388
- echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|christmas-promo"</code>' . "\n";
389
- /**/
390
- echo '</td>' . "\n";
391
- /**/
392
- echo '</tr>' . "\n";
393
- echo '</tbody>' . "\n";
394
- echo '</table>' . "\n";
395
- echo '</div>' . "\n";
396
- /**/
397
- echo '</div>' . "\n";
398
- /**/
399
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_signup_confirmation_email", get_defined_vars ());
400
  }
401
  /**/
402
- if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_sp_confirmation_email", true, get_defined_vars ()))
403
  {
404
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_sp_confirmation_email", get_defined_vars ());
405
- /**/
406
- echo '<div class="ws-menu-page-group" title="Specific Post/Page Confirmation Email ( Standard )">' . "\n";
407
- /**/
408
- echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-confirmation-email-section">' . "\n";
409
- echo '<h3>Specific Post/Page Confirmation Email ( required, but the default works fine )</h3>' . "\n";
410
- echo '<p>This email is sent to new Customers after they return from a successful purchase at PayPal®, for Specific Post/Page Access. ( see: <code>s2Member -> Restriction Options -> Specific Post/Page Access</code> ). This is NOT used for Membership sales, only for Specific Post/Page Access. The <strong>primary</strong> purpose of this email, is to provide the Customer with instructions, along with a link to access the Specific Post/Page they\'ve purchased access to. If you\'ve created a Specific Post/Page Package ( with multiple Posts/Pages bundled together into one transaction ), this ONE link ( <code>%%sp_access_url%%</code> ) will automatically authenticate them for access to ALL of the Posts/Pages included in their transaction. You may customize this email further, by providing details that are specifically geared to your site.</p>' . "\n";
411
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_sp_confirmation_email", get_defined_vars ());
412
- /**/
413
- echo '<table class="form-table">' . "\n";
414
- echo '<tbody>' . "\n";
415
- echo '<tr>' . "\n";
416
- /**/
417
- echo '<th>' . "\n";
418
- echo '<label for="ws-plugin--s2member-sp-email-recipients">' . "\n";
419
- echo 'Specific Post/Page Confirmation Recipients:' . "\n";
420
- echo '</label>' . "\n";
421
- echo '</th>' . "\n";
422
- /**/
423
- echo '</tr>' . "\n";
424
- echo '<tr>' . "\n";
425
- /**/
426
- echo '<td>' . "\n";
427
- echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_sp_email_recipients" id="ws-plugin--s2member-sp-email-recipients" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_email_recipients"]) . '" /><br />' . "\n";
428
- echo 'This is a semicolon ( ; ) delimited list of Recipients. Here is an example:<br />' . "\n";
429
- echo '<code>"%%full_name%%" &lt;%%payer_email%%&gt;; admin@example.com; "Webmaster" &lt;webmaster@example.com&gt;</code>' . "\n";
430
- echo '</td>' . "\n";
431
- /**/
432
- echo '</tr>' . "\n";
433
- echo '<tr>' . "\n";
434
- /**/
435
- echo '<th>' . "\n";
436
- echo '<label for="ws-plugin--s2member-sp-email-subject">' . "\n";
437
- echo 'Specific Post/Page Confirmation Email Subject:' . "\n";
438
- echo '</label>' . "\n";
439
- echo '</th>' . "\n";
440
- /**/
441
- echo '</tr>' . "\n";
442
- echo '<tr>' . "\n";
443
- /**/
444
- echo '<td>' . "\n";
445
- echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_sp_email_subject" id="ws-plugin--s2member-sp-email-subject" value="' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_email_subject"]) . '" /><br />' . "\n";
446
- echo 'Subject Line used in the email sent to a Customer after a successful purchase has occurred through PayPal®, for Specific Post/Page Access.' . "\n";
447
- echo '</td>' . "\n";
448
- /**/
449
- echo '</tr>' . "\n";
450
- echo '<tr>' . "\n";
451
- /**/
452
- echo '<th>' . "\n";
453
- echo '<label for="ws-plugin--s2member-sp-email-message">' . "\n";
454
- echo 'Specific Post/Page Confirmation Email Message:' . "\n";
455
- echo '</label>' . "\n";
456
- echo '</th>' . "\n";
457
- /**/
458
- echo '</tr>' . "\n";
459
- echo '<tr>' . "\n";
460
- /**/
461
- echo '<td>' . "\n";
462
- echo '<textarea name="ws_plugin__s2member_sp_email_message" id="ws-plugin--s2member-sp-email-message" rows="10">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_email_message"]) . '</textarea><br />' . "\n";
463
- echo 'Message Body used in the email sent to a Customer after a successful purchase has occurred through PayPal®, for Specific Post/Page Access.<br /><br />' . "\n";
464
- echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
465
- echo '<ul>' . "\n";
466
- echo '<li><code>%%sp_access_url%%</code> = The full URL ( generated by s2Member ) where the Customer can gain access.</li>' . "\n";
467
- echo '<li><code>%%sp_access_exp%%</code> = Human readable expiration for <code>%%sp_access_url%%</code>. Ex: <em>( link expires in <code>%%sp_access_exp%%</code> )</em>.</li>' . "\n";
468
- echo '<li><code>%%txn_id%%</code> = The PayPal® Transaction ID. PayPal® assigns a unique identifier for every purchase.</li>' . "\n";
469
- echo '<li><code>%%amount%%</code> = The full Amount that you charged for Specific Post/Page Access. This value will <code>always be > 0</code>.</li>' . "\n";
470
- echo '<li><code>%%first_name%%</code> = The First Name of the Customer who purchased Specific Post/Page Access.</li>' . "\n";
471
- echo '<li><code>%%last_name%%</code> = The Last Name of the Customer who purchased Specific Post/Page Access.</li>' . "\n";
472
- echo '<li><code>%%full_name%%</code> = The Full Name ( First &amp; Last ) of the Customer who purchased Specific Post/Page Access.</li>' . "\n";
473
- echo '<li><code>%%payer_email%%</code> = The Email Address of the Customer who purchased Specific Post/Page Access.</li>' . "\n";
474
- echo '<li><code>%%user_ip%%</code> = The Customer\'s IP Address, detected during checkout via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>' . "\n";
475
- echo '<li><code>%%item_number%%</code> = The Item Number. Ex: <code><em>sp:13,24,36:72</em></code> ( translates to: <code><em>sp:comma-delimited IDs:expiration hours</em></code> ).</li>' . "\n";
476
- echo '<li><code>%%item_name%%</code> = The Item Name ( as provided by the <code>desc=""</code> attribute in your Shortcode, which briefly describes the Item Number ).</li>' . "\n";
477
- echo '</ul>' . "\n";
478
- /**/
479
- echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
480
- echo '<ul>' . "\n";
481
- echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
482
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>' . "\n";
483
- echo '</ul>' . "\n";
484
- echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />' . "\n";
485
- echo '<em>( The campaign ( i.e. christmas-promo ) could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
486
- echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|christmas-promo"</code>' . "\n";
487
- /**/
488
- echo '</td>' . "\n";
489
- /**/
490
- echo '</tr>' . "\n";
491
- echo '</tbody>' . "\n";
492
- echo '</table>' . "\n";
493
- echo '</div>' . "\n";
494
- /**/
495
- echo '</div>' . "\n";
496
- /**/
497
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_sp_confirmation_email", get_defined_vars ());
498
  }
499
  /**/
500
- if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_eot_behavior", true, get_defined_vars ()))
501
  {
502
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_eot_behavior", get_defined_vars ());
503
  /**/
504
- echo '<div class="ws-menu-page-group" title="Automatic EOT Behavior">' . "\n";
505
  /**/
506
- echo '<div class="ws-menu-page-section ws-plugin--s2member-eot-behavior-section">' . "\n";
507
- echo '<h3>PayPal® EOT Behavior ( required, please choose )</h3>' . "\n";
508
- echo '<p>EOT = End Of Term. By default, s2Member will demote a paid Member to a Free Subscriber whenever their Subscription term has ended ( i.e. expired ), been cancelled, refunded, charged back to you, etc. s2Member demotes them to a Free Subscriber, so they will no longer have Member Level Access to your site. However, in some cases, you may prefer to have Customer accounts deleted completely, instead of just being demoted. This is where you choose which method works best for your site. If you don\'t want s2Member to take ANY action at all, you can disable s2Member\'s EOT System temporarily, or even completely.</p>' . "\n";
509
- echo '<p>The PayPal® IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds &amp; chargeback reversals are supported through the IPN service. For example, if you issue a refund to an unhappy Customer through PayPal®, s2Member will eventually be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically ( based on your configuration ). The communication from PayPal® -> s2Member is seamless.</p>' . "\n";
510
- echo '<p><em><strong>*Some Hairy Details*</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through PayPal®... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT ( End Of Term ) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by s2Member.</em></p>' . "\n";
511
- echo '<p><em>s2Member will not process an EOT until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system ( based on your configuration ). s2Member also calculates one extra day ( 24 hours ) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>' . "\n";
512
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_eot_behavior", get_defined_vars ());
513
  /**/
514
- echo '<p id="ws-plugin--s2member-auto-eot-system-enabled-via-cron"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 2 && (!function_exists ("wp_cron") || !wp_get_schedule ("ws_plugin__s2member_auto_eot_system__schedule"))) ? '' : ' style="display:none;"') . '>If you\'d like to run s2Member\'s Auto-EOT System through a more traditional Cron Job; instead of through <code>WP-Cron</code>, you will need to configure a Cron Job through your server control panel; provided by your hosting company. Set the Cron Job to run <code>once about every 10 minutes to an hour</code>. You\'ll want to configure an HTTP Cron Job that loads this URL:<br /><code>' . esc_html (site_url ("/?s2member_auto_eot_system_via_cron=1")) . '</code></p>' . "\n";
515
  /**/
516
- echo '<table class="form-table">' . "\n";
517
- echo '<tbody>' . "\n";
518
- echo '<tr>' . "\n";
519
  /**/
520
- echo '<th>' . "\n";
521
- echo '<label for="ws-plugin--s2member-auto-eot-system-enabled">' . "\n";
522
- echo 'Enable s2Member\'s Auto-EOT System?' . "\n";
523
- echo '</label>' . "\n";
524
- echo '</th>' . "\n";
525
  /**/
526
- echo '</tr>' . "\n";
527
- echo '<tr>' . "\n";
528
  /**/
529
- echo '<td>' . "\n";
530
- echo '<select name="ws_plugin__s2member_auto_eot_system_enabled" id="ws-plugin--s2member-auto-eot-system-enabled">' . "\n";
531
  /* Very advanced conditionals here. If the Auto-EOT System is NOT running, or NOT fully configured, this will indicate that no option is set - as sort of a built-in acknowledgment/warning in the UI panel. */
532
- echo (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 1 && (!function_exists ("wp_cron") || !wp_get_schedule ("ws_plugin__s2member_auto_eot_system__schedule"))) || ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 2 && (function_exists ("wp_cron") && wp_get_schedule ("ws_plugin__s2member_auto_eot_system__schedule"))) || (!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] && (function_exists ("wp_cron") && wp_get_schedule ("ws_plugin__s2member_auto_eot_system__schedule")))) ? '<option value=""></option>' . "\n" : '';
533
- echo '<option value="1"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 1 && function_exists ("wp_cron") && wp_get_schedule ("ws_plugin__s2member_auto_eot_system__schedule")) ? ' selected="selected"' : '') . '>Yes ( enable the Auto-EOT System through WP-Cron )</option>' . "\n";
534
- echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<option value="2"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 2 && (!function_exists ("wp_cron") || !wp_get_schedule ("ws_plugin__s2member_auto_eot_system__schedule"))) ? ' selected="selected"' : '') . '>Yes ( but, I\'ll run it with my own Cron Job )</option>' . "\n" : '';
535
- echo '<option value="0"' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] && (!function_exists ("wp_cron") || !wp_get_schedule ("ws_plugin__s2member_auto_eot_system__schedule"))) ? ' selected="selected"' : '') . '>No ( disable the Auto-EOT System )</option>' . "\n";
536
- echo '</select><br />' . "\n";
537
- echo 'Recommended setting: ( <code>Yes / enable via WP-Cron</code> )' . "\n";
538
- echo '</td>' . "\n";
539
- /**/
540
- echo '</tr>' . "\n";
541
- echo '<tr>' . "\n";
542
- /**/
543
- echo '<th>' . "\n";
544
- echo '<label for="ws-plugin--s2member-membership-eot-behavior">' . "\n";
545
- echo 'Membership EOT Behavior ( demote or delete )?' . "\n";
546
- echo '</label>' . "\n";
547
- echo '</th>' . "\n";
548
- /**/
549
- echo '</tr>' . "\n";
550
- echo '<tr>' . "\n";
551
- /**/
552
- echo '<td>' . "\n";
553
- echo '<select name="ws_plugin__s2member_membership_eot_behavior" id="ws-plugin--s2member-membership-eot-behavior">' . "\n";
554
- echo '<option value="demote"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "demote") ? ' selected="selected"' : '') . '>Demote ( convert them to a Free Subscriber )</option>' . "\n";
555
- echo '<option value="delete"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "delete") ? ' selected="selected"' : '') . '>Delete ( erase their account completely )</option>' . "\n";
556
- echo '</select>' . "\n";
557
- echo '</td>' . "\n";
558
- /**/
559
- echo '</tr>' . "\n";
560
- echo '<tr>' . "\n";
561
- /**/
562
- echo '<th>' . "\n";
563
- echo '<label for="ws-plugin--s2member-triggers-immediate-eot">' . "\n";
564
- echo 'Refunds/Reversals ( trigger immediate EOT )?' . "\n";
565
- echo '</label>' . "\n";
566
- echo '</th>' . "\n";
567
- /**/
568
- echo '</tr>' . "\n";
569
- echo '<tr>' . "\n";
570
- /**/
571
- echo '<td>' . "\n";
572
- echo '<select name="ws_plugin__s2member_triggers_immediate_eot" id="ws-plugin--s2member-triggers-immediate-eot">' . "\n";
573
- echo '<option value="none"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "none") ? ' selected="selected"' : '') . '>Neither ( I\'ll review these two events manually )</option>' . "\n";
574
- echo '<option value="refunds"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds") ? ' selected="selected"' : '') . '>Refunds ( refunds ALWAYS trigger an immediate EOT action )</option>' . "\n";
575
- echo '<option value="reversals"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "reversals") ? ' selected="selected"' : '') . '>Reversals ( chargebacks ALWAYS trigger an immediate EOT action )</option>' . "\n";
576
- echo '<option value="refunds,reversals"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals") ? ' selected="selected"' : '') . '>Refunds/Reversals ( ALWAYS trigger an immediate EOT action )</option>' . "\n";
577
- echo '</select><br />' . "\n";
578
- echo 'This setting will <a href="#" onclick="alert(\'A Refund/Reversal Notification will ALWAYS be processed internally by s2Member, even if no action is taken by s2Member. This way you\\\'ll have the full ability to listen for these two events on your own; if you prefer ( optional ). For more information, check your Dashboard under: `s2Member -> API Notifications -> Refunds/Reversals`.\'); return false;">NOT affect</a> s2Member\'s internal API Notifications for Refund/Reversal events.' . "\n";
579
- echo '</td>' . "\n";
580
- /**/
581
- echo '</tr>' . "\n";
582
- echo '<tr>' . "\n";
583
- /**/
584
- echo '<th>' . "\n";
585
- echo '<label for="ws-plugin--s2member-eot-time-ext-behavior">' . "\n";
586
- echo 'Fixed-Term Extensions ( auto-extend )?' . "\n";
587
- echo '</label>' . "\n";
588
- echo '</th>' . "\n";
589
- /**/
590
- echo '</tr>' . "\n";
591
- echo '<tr>' . "\n";
592
- /**/
593
- echo '<td>' . "\n";
594
- echo '<select name="ws_plugin__s2member_eot_time_ext_behavior" id="ws-plugin--s2member-eot-time-ext-behavior">' . "\n";
595
- echo '<option value="extend"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_time_ext_behavior"] === "extend") ? ' selected="selected"' : '') . '>Yes ( default, automatically extend any existing EOT Time )</option>' . "\n";
596
- echo '<option value="reset"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_time_ext_behavior"] === "reset") ? ' selected="selected"' : '') . '>No ( do NOT extend; s2Member should reset EOT Time completely )</option>' . "\n";
597
- echo '</select><br />' . "\n";
598
- echo 'This setting will only affect Buy Now transactions for fixed-term lengths. By default, s2Member will automatically extend any existing EOT Time that a Customer may have.' . "\n";
599
- echo '</td>' . "\n";
600
- /**/
601
- echo '</tr>' . "\n";
602
- echo '</tbody>' . "\n";
603
- echo '</table>' . "\n";
604
- echo '</div>' . "\n";
605
- /**/
606
- echo '</div>' . "\n";
607
- /**/
608
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_eot_behavior", get_defined_vars ());
609
  }
610
  /**/
611
- do_action ("ws_plugin__s2member_during_paypal_ops_page_after_left_sections", get_defined_vars ());
612
  /**/
613
- echo '<div class="ws-menu-page-hr"></div>' . "\n";
614
  /**/
615
- echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>' . "\n";
616
  /**/
617
- echo '</form>' . "\n";
618
  /**/
619
- echo '</td>' . "\n";
620
  /**/
621
- echo '<td class="ws-menu-page-table-r">' . "\n";
622
- c_ws_plugin__s2member_menu_pages_rs::display ();
623
- echo '</td>' . "\n";
624
  /**/
625
- echo '</tr>' . "\n";
626
- echo '</tbody>' . "\n";
627
- echo '</table>' . "\n";
628
  /**/
629
- echo '</div>' . "\n";
630
  }
631
  }
632
  }
633
  /**/
634
- new c_ws_plugin__s2member_menu_page_paypal_ops ();
635
  ?>
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
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_page_paypal_ops"))
21
  {
22
  /**
23
  * Menu page for the s2Member plugin ( PayPal® Options page ).
27
  */
28
  class c_ws_plugin__s2member_menu_page_paypal_ops
29
  {
30
+ public function __construct()
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";
39
+ echo '<tr class="ws-menu-page-table-tr">'."\n";
40
+ echo '<td class="ws-menu-page-table-l">'."\n";
41
  /**/
42
+ echo '<form method="post" name="ws_plugin__s2member_options_form" id="ws-plugin--s2member-options-form">'."\n";
43
+ echo '<input type="hidden" name="ws_plugin__s2member_options_save" id="ws-plugin--s2member-options-save" value="'.esc_attr(wp_create_nonce("ws-plugin--s2member-options-save")).'" />'."\n";
44
+ echo '<input type="hidden" name="ws_plugin__s2member_configured" id="ws-plugin--s2member-configured" value="1" />'."\n";
45
  /**/
46
+ do_action("ws_plugin__s2member_during_paypal_ops_page_before_left_sections", get_defined_vars());
47
  /**/
48
+ if(apply_filters("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_paypal_account_details", true, get_defined_vars()))
49
  {
50
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_paypal_account_details", get_defined_vars());
51
+ /**/
52
+ echo '<div class="ws-menu-page-group" title="PayPal® Account Details">'."\n";
53
+ /**/
54
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-account-details-section">'."\n";
55
+ echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
56
+ echo '<h3>PayPal® Account Details ( required, if using PayPal® )</h3>'."\n";
57
+ echo '<p>This plugin works in conjunction with <a href="http://www.s2member.com/paypal" target="_blank" rel="external">PayPal® Website Payments Standard</a>, for businesses. You do NOT need a PayPal® Pro account. You just need to upgrade your Personal PayPal® account to a Business status, which is free. A PayPal® account can be <a href="http://pages.ebay.com/help/buy/questions/upgrade-paypal-account.html" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account, simply by going to the `Profile` button under the `My Account` tab, selecting the `Personal Business Information` button, and then clicking the `Upgrade Your Account` button.</p>'."\n";
58
+ echo '<p><em><strong>*PayPal® API Credentials*</strong> Once you have a PayPal® Business account, you\'ll need access to your <a href="http://www.s2member.com/paypal-profile-api-access" target="_blank" rel="external">PayPal® API Credentials</a>. Log into your PayPal® account, and navigate to <code>Profile -> API Access (or Request API Credentials)</code>. You\'ll choose <code>( PayPal® / Request API Signature )</code>.</em></p>'."\n";
59
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars());
60
+ /**/
61
+ echo '<table class="form-table">'."\n";
62
+ echo '<tbody>'."\n";
63
+ echo '<tr>'."\n";
64
+ /**/
65
+ echo '<th>'."\n";
66
+ echo '<label for="ws-plugin--s2member-paypal-business">'."\n";
67
+ echo 'Your PayPal® EMail Address:'."\n";
68
+ echo '</label>'."\n";
69
+ echo '</th>'."\n";
70
+ /**/
71
+ echo '</tr>'."\n";
72
+ echo '<tr>'."\n";
73
+ /**/
74
+ echo '<td>'."\n";
75
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_business" id="ws-plugin--s2member-paypal-business" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]).'" /><br />'."\n";
76
+ echo 'Enter the email address you\'ve associated with your PayPal® Business account.'."\n";
77
+ echo '</td>'."\n";
78
+ /**/
79
+ echo '</tr>'."\n";
80
+ echo '<tr>'."\n";
81
+ /**/
82
+ echo '<th>'."\n";
83
+ echo '<label for="ws-plugin--s2member-paypal-api-username">'."\n";
84
+ echo 'Your PayPal® API Username:'."\n";
85
+ echo '</label>'."\n";
86
+ echo '</th>'."\n";
87
+ /**/
88
+ echo '</tr>'."\n";
89
+ echo '<tr>'."\n";
90
+ /**/
91
+ echo '<td>'."\n";
92
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_api_username" id="ws-plugin--s2member-paypal-api-username" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_username"]).'" /><br />'."\n";
93
+ echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials)</code>.'."\n";
94
+ echo '</td>'."\n";
95
+ /**/
96
+ echo '</tr>'."\n";
97
+ echo '<tr>'."\n";
98
+ /**/
99
+ echo '<th>'."\n";
100
+ echo '<label for="ws-plugin--s2member-paypal-api-password">'."\n";
101
+ echo 'Your PayPal® API Password:'."\n";
102
+ echo '</label>'."\n";
103
+ echo '</th>'."\n";
104
+ /**/
105
+ echo '</tr>'."\n";
106
+ echo '<tr>'."\n";
107
+ /**/
108
+ echo '<td>'."\n";
109
+ echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_api_password" id="ws-plugin--s2member-paypal-api-password" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_password"]).'" /><br />'."\n";
110
+ echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials)</code>.'."\n";
111
+ echo '</td>'."\n";
112
+ /**/
113
+ echo '</tr>'."\n";
114
+ echo '<tr>'."\n";
115
+ /**/
116
+ echo '<th>'."\n";
117
+ echo '<label for="ws-plugin--s2member-paypal-api-signature">'."\n";
118
+ echo 'Your PayPal® API Signature:'."\n";
119
+ echo '</label>'."\n";
120
+ echo '</th>'."\n";
121
+ /**/
122
+ echo '</tr>'."\n";
123
+ echo '<tr>'."\n";
124
+ /**/
125
+ echo '<td>'."\n";
126
+ echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_api_signature" id="ws-plugin--s2member-paypal-api-signature" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_signature"]).'" /><br />'."\n";
127
+ echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials)</code>.'."\n";
128
+ echo '</td>'."\n";
129
+ /**/
130
+ echo '</tr>'."\n";
131
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_detail_rows", get_defined_vars());
132
+ echo '</tbody>'."\n";
133
+ echo '</table>'."\n";
134
+ /**/
135
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
136
+ /**/
137
+ echo '<table class="form-table" style="margin:0;">'."\n";
138
+ echo '<tbody>'."\n";
139
+ echo '<tr>'."\n";
140
+ /**/
141
+ echo '<th style="padding-top:0;">'."\n";
142
+ echo '<label for="ws-plugin--s2member-paypal-sandbox">'."\n";
143
+ echo 'Developer/Sandbox Testing?'."\n";
144
+ echo '</label>'."\n";
145
+ echo '</th>'."\n";
146
+ /**/
147
+ echo '</tr>'."\n";
148
+ echo '<tr>'."\n";
149
+ /**/
150
+ echo '<td>'."\n";
151
+ echo '<input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-1">Yes, enable support for Sandbox testing.</label><br />'."\n";
152
+ echo '<em>Only enable this if you\'ve provided Sandbox credentials above.<br />This puts the API, IPN, PDT and Form/Button Generators all into Sandbox mode.<br />See: <a href="http://www.s2member.com/paypal-developers" target="_blank" rel="external">PayPal® Developers</a></em>'."\n";
153
+ echo '</td>'."\n";
154
+ /**/
155
+ echo '</tr>'."\n";
156
+ echo '<tr>'."\n";
157
+ /**/
158
+ echo '<th>'."\n";
159
+ echo '<label for="ws-plugin--s2member-paypal-btn-encryption">'."\n";
160
+ echo 'Enable Button Encryption?'."\n";
161
+ echo '</label>'."\n";
162
+ echo '</th>'."\n";
163
+ /**/
164
+ echo '</tr>'."\n";
165
+ echo '<tr>'."\n";
166
+ /**/
167
+ echo '<td>'."\n";
168
+ echo '<input type="radio" name="ws_plugin__s2member_paypal_btn_encryption" id="ws-plugin--s2member-paypal-btn-encryption-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-btn-encryption-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_paypal_btn_encryption" id="ws-plugin--s2member-paypal-btn-encryption-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-btn-encryption-1">Yes, enable PayPal® Button encryption.</label><br />'."\n";
169
+ echo '<em>If enabled, all of your PayPal® Button Shortcodes will produce *encrypted* PayPal® Buttons. This improves security against fraudulent transactions. For extra security, you should update your PayPal® account too, under: <code>My Profile -> Website Payment Preferences</code>. You\'ll want to block all non-encrypted payments. <strong>*Note*</strong> this will NOT work until you\'ve supplied s2Member with your PayPal® Email Address, and also with your API Username/Password/Signature.</em>'."\n";
170
+ echo '</td>'."\n";
171
+ /**/
172
+ echo '</tr>'."\n";
173
  /**/
174
+ if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site())
175
  {
176
+ echo '<tr>'."\n";
177
  /**/
178
+ echo '<th>'."\n";
179
+ echo '<label for="ws-plugin--s2member-gateway-debug-logs">'."\n";
180
+ echo 'Enable Logging Routines?'."\n";
181
+ echo '</label>'."\n";
182
+ echo '</th>'."\n";
183
  /**/
184
+ echo '</tr>'."\n";
185
+ echo '<tr>'."\n";
186
  /**/
187
+ echo '<td>'."\n";
188
+ echo '<input type="radio" name="ws_plugin__s2member_gateway_debug_logs" id="ws-plugin--s2member-gateway-debug-logs-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-gateway-debug-logs-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_gateway_debug_logs" id="ws-plugin--s2member-gateway-debug-logs-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-gateway-debug-logs-1">Yes, enable debugging, with API, IPN &amp; Return Page logging.</label><br />'."\n";
189
+ echo '<em>This enables API, IPN and Return Page logging. The log files are stored here:<br /><code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])).'</code></em>'."\n";
190
+ echo '</td>'."\n";
191
  /**/
192
+ echo '</tr>'."\n";
193
  }
194
  /**/
195
+ echo '</tbody>'."\n";
196
+ echo '</table>'."\n";
197
  /**/
198
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
199
  /**/
200
+ echo '<p><em><strong>*Sandbox Tip*</strong> If you\'re testing your site through a PayPal® Sandbox account, please remember that Email Confirmations from s2Member will NOT be received after a test purchase. s2Member sends its Confirmation Emails to the PayPal® Email Address of the Customer. Since PayPal® Sandbox addresses are usually bogus ( for testing ), you will have to run live transactions before Email Confirmations from s2Member are received. That being said, all other s2Member functionality CAN be tested through a PayPal® Sandbox account. Email Confirmations are the only hang-up.</em></p>'."\n";
201
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details_after_sandbox_tip", get_defined_vars());
202
+ echo '</div>'."\n";
203
  /**/
204
+ echo '</div>'."\n";
205
  /**/
206
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_paypal_account_details", get_defined_vars());
207
  }
208
  /**/
209
+ if(apply_filters("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_paypal_payflow_account_details", c_ws_plugin__s2member_utils_conds::pro_is_installed(), get_defined_vars()))
210
  {
211
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_paypal_payflow_account_details", get_defined_vars());
212
+ /**/
213
+ echo '<div class="ws-menu-page-group" title="Payflow™ Account Details">'."\n";
214
+ /**/
215
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-payflow-account-details-section">'."\n";
216
+ echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
217
+ echo '<h3>Payflow® Account Details ( required, if using Payflow® )</h3>'."\n";
218
+ echo '<p>Newer PayPal® Pro accounts come with the Payflow® API for Recurring Billing service. If you have a newer PayPal® Pro account, and you wish to integrate PayPal\'s Recurring Billing service with s2Member® Pro Forms, you will need to fill in the details here. Providing Payflow® API Credentials here, automatically puts s2Member\'s Recurring Billing integration through Pro Forms, into Payflow® mode. Just fill in the details below, and you\'re ready to generate Pro Forms that charge customers on a recurring basis. s2Member® will use the Payflow® API instead of the standard PayPal® Pro API, which is being slowly phased out in favor of Payflow®.</p>'."\n";
219
+ echo '<p><em><strong>*Payflow® API Credentials*</strong> Once you have a PayPal® Pro account, you\'ll need access to your <a href="http://www.s2member.com/paypal-profile-api-access" target="_blank" rel="external">Payflow® API Credentials</a>. Log into your PayPal® account, and navigate to <code>Profile -> API Access (or Request API Credentials)</code>. You\'ll choose <code>( Payflow® / API Access )</code>.</em></p>'."\n";
220
+ echo '<p><em><strong>*Important Note*</strong> s2Member® always uses the PayPal® Pro API. It can also use the Payflow® API (if details are supplied here). But please note... supplying Payflow® API Credentials here, does NOT mean you can bypass other sections. Please supply s2Member® with ALL of your PayPal® account details.</em></p>'."\n";
221
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_payflow_account_details", get_defined_vars());
222
+ /**/
223
+ echo '<table class="form-table">'."\n";
224
+ echo '<tbody>'."\n";
225
+ echo '<tr>'."\n";
226
+ /**/
227
+ echo '<th>'."\n";
228
+ echo '<label for="ws-plugin--s2member-paypal-payflow-api-username">'."\n";
229
+ echo 'Your Payflow® API Username:'."\n";
230
+ echo '</label>'."\n";
231
+ echo '</th>'."\n";
232
+ /**/
233
+ echo '</tr>'."\n";
234
+ echo '<tr>'."\n";
235
+ /**/
236
+ echo '<td>'."\n";
237
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_paypal_payflow_api_username" id="ws-plugin--s2member-paypal-payflow-api-username" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_username"]).'" /><br />'."\n";
238
+ echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials) -> Payflow® API Access</code>.'."\n";
239
+ echo '</td>'."\n";
240
+ /**/
241
+ echo '</tr>'."\n";
242
+ echo '<tr>'."\n";
243
+ /**/
244
+ echo '<th>'."\n";
245
+ echo '<label for="ws-plugin--s2member-paypal-payflow-api-password">'."\n";
246
+ echo 'Your Payflow® API Password:'."\n";
247
+ echo '</label>'."\n";
248
+ echo '</th>'."\n";
249
+ /**/
250
+ echo '</tr>'."\n";
251
+ echo '<tr>'."\n";
252
+ /**/
253
+ echo '<td>'."\n";
254
+ echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_payflow_api_password" id="ws-plugin--s2member-paypal-payflow-api-password" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_password"]).'" /><br />'."\n";
255
+ echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials) -> Payflow® API Access</code>.'."\n";
256
+ echo '</td>'."\n";
257
+ /**/
258
+ echo '</tr>'."\n";
259
+ echo '<tr>'."\n";
260
+ /**/
261
+ echo '<th>'."\n";
262
+ echo '<label for="ws-plugin--s2member-paypal-payflow-api-partner">'."\n";
263
+ echo 'Your Payflow® API Partner:'."\n";
264
+ echo '</label>'."\n";
265
+ echo '</th>'."\n";
266
+ /**/
267
+ echo '</tr>'."\n";
268
+ echo '<tr>'."\n";
269
+ /**/
270
+ echo '<td>'."\n";
271
+ echo '<input type="text" name="ws_plugin__s2member_paypal_payflow_api_partner" id="ws-plugin--s2member-paypal-payflow-api-partner" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_partner"]).'" /><br />'."\n";
272
+ echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials) -> Payflow® API Access</code>.'."\n";
273
+ echo '</td>'."\n";
274
+ /**/
275
+ echo '</tr>'."\n";
276
+ echo '<tr>'."\n";
277
+ /**/
278
+ echo '<th>'."\n";
279
+ echo '<label for="ws-plugin--s2member-paypal-payflow-api-vendor">'."\n";
280
+ echo 'Your Payflow® API Vendor:'."\n";
281
+ echo '</label>'."\n";
282
+ echo '</th>'."\n";
283
+ /**/
284
+ echo '</tr>'."\n";
285
+ echo '<tr>'."\n";
286
+ /**/
287
+ echo '<td>'."\n";
288
+ echo '<input type="text" name="ws_plugin__s2member_paypal_payflow_api_vendor" id="ws-plugin--s2member-paypal-payflow-api-vendor" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_vendor"]).'" /><br />'."\n";
289
+ echo 'At PayPal®, see: <code>Profile -> API Access (or Request API Credentials) -> Payflow® API Access</code>.'."\n";
290
+ echo '</td>'."\n";
291
+ /**/
292
+ echo '</tr>'."\n";
293
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_payflow_account_detail_rows", get_defined_vars());
294
+ echo '</tbody>'."\n";
295
+ echo '</table>'."\n";
296
+ echo '</div>'."\n";
297
+ /**/
298
+ echo '</div>'."\n";
299
+ /**/
300
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_paypal_payflow_account_details", get_defined_vars());
301
  }
302
  /**/
303
+ if(apply_filters("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_paypal_ipn", true, get_defined_vars()))
304
  {
305
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_paypal_ipn", get_defined_vars());
306
+ /**/
307
+ echo '<div class="ws-menu-page-group" title="PayPal® IPN Integration">'."\n";
308
+ /**/
309
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-ipn-section">'."\n";
310
+ echo '<h3>PayPal® IPN / Instant Payment Notifications ( required, please enable )</h3>'."\n";
311
+ echo '<p>Log into your PayPal® account and navigate to this section:<br /><code>Account Profile -> Instant Payment Notification Preferences</code></p>'."\n";
312
+ echo '<p>Edit your IPN settings &amp; turn IPN Notifications: <strong><code>On</code></strong></p>'."\n";
313
+ echo '<p>You\'ll need your IPN URL, which is:<br /><code>'.esc_html(site_url("/?s2member_paypal_notify=1")).'</code></p>'."\n";
314
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars());
315
+ /**/
316
+ 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";
317
+ echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="display:none;">'."\n";
318
+ 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";
319
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_quick_tip", get_defined_vars());
320
+ echo '<p><em><strong>*IPN Communications*</strong> You\'ll be happy to know that s2Member handles cancellations, expirations, failed payments, terminations ( e.g. refunds &amp; chargebacks ) for you automatically. If you log into your PayPal® account and cancel a Member\'s Subscription, or, if the Member logs into their PayPal® account and cancels their own Subscription, s2Member will be notified of these important changes and react accordingly through the PayPal® IPN service that runs silently behind-the-scene. The PayPal® IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds &amp; chargeback reversals are supported through the IPN service. If you issue a refund to an unhappy Customer through PayPal®, s2Member will be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically ( based on your configuration ). The communication from PayPal® -> s2Member is seamless.</em></p>'."\n";
321
+ echo '</div>'."\n";
322
+ /**/
323
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
324
+ /**/
325
+ 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";
326
+ echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="display:none;">'."\n";
327
+ 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";
328
+ 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";
329
+ echo '<p><em>Any 3rd-party application that is sending IPN transactions to your s2Member installation, must ALWAYS include the <code>custom</code> POST variable, and that variable must always start with your installation domain ( i.e. custom=<code>'.esc_html($_SERVER["HTTP_HOST"]).'</code> ). In addition, the <code>item_number</code> variable, must always match a format that s2Member looks for. Generally speaking, the <code>item_number</code> should be <code>1, 2, 3, or 4</code>, indicating a specific s2Member Level #. However, s2Member also uses some advanced formats in this field. Just to be sure, we suggest creating a PayPal® Button with the s2Member Button Generator, and then taking a look at the Full Button Code to see how s2Member expects <code>item_number</code> to be formatted. Other than the aforementioned exceptions; all other POST variables should follow PayPal® standards. Please see: <a href="http://www.s2member.com/paypal-ipn-pdt-vars" target="_blank" rel="external">PayPal\'s IPN/PDT reference guide</a> for full documentation.</em></p>'."\n";
330
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_proxy", get_defined_vars());
331
+ echo '</div>'."\n";
332
+ echo '</div>'."\n";
333
+ /**/
334
+ echo '</div>'."\n";
335
+ /**/
336
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_paypal_ipn", get_defined_vars());
337
+ }
338
+ /**/
339
+ if(apply_filters("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_paypal_pdt", true, get_defined_vars()))
340
+ {
341
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_paypal_pdt", get_defined_vars());
342
  /**/
343
+ echo '<div class="ws-menu-page-group" title="PayPal® PDT/Auto-Return Integration">'."\n";
344
  /**/
345
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-pdt-section">'."\n";
346
+ echo '<h3>PayPal® PDT Identity Token ( required, please enable )</h3>'."\n";
347
+ echo '<p>Log into your PayPal® account and navigate to this section:<br /><code>Account Profile -> Website Payment Preferences</code></p>'."\n";
348
+ echo '<p>Turn the Auto-Return feature: <strong><code>On</code></strong></p>'."\n";
349
+ echo '<p>You\'ll need your <a href="'.esc_attr(site_url("/?s2member_paypal_return=1&s2member_paypal_proxy=paypal&s2member_paypal_proxy_use=x-preview")).'" target="_blank" rel="external">Auto-Return URL</a>, which is:<br /><code>'.esc_html(site_url("/?s2member_paypal_return=1")).'</code></p>'."\n";
350
+ echo '<p>You MUST also enable PDT ( Payment Data Transfer ): <strong><code>On</code></strong><br /><em>You\'ll be issued an Identity Token that you MUST enter below.</em></p>'."\n";
351
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt", get_defined_vars());
352
  /**/
353
+ echo '<table class="form-table">'."\n";
354
+ echo '<tbody>'."\n";
355
+ echo '<tr>'."\n";
356
  /**/
357
+ echo '<th>'."\n";
358
+ echo '<label for="ws-plugin--s2member-paypal-identity-token">'."\n";
359
+ echo 'PayPal® PDT Identity Token:'."\n";
360
+ echo '</label>'."\n";
361
+ echo '</th>'."\n";
362
  /**/
363
+ echo '</tr>'."\n";
364
+ echo '<tr>'."\n";
365
  /**/
366
+ echo '<td>'."\n";
367
+ echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_paypal_identity_token" id="ws-plugin--s2member-paypal-identity-token" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_identity_token"]).'" /><br />'."\n";
368
+ echo 'Your PDT Identity Token will appear under <em>Profile -> Website Payment Preferences</em> in your PayPal® account.'."\n";
369
+ echo '</td>'."\n";
370
  /**/
371
+ echo '</tr>'."\n";
372
+ echo '</tbody>'."\n";
373
+ echo '</table>'."\n";
374
  /**/
375
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
376
  /**/
377
+ 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";
378
+ echo '<div id="ws-plugin--s2member-paypal-pdt-details" style="display:none;">'."\n";
379
+ 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";
380
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_quick_tip", get_defined_vars());
381
+ echo '</div>'."\n";
382
  /**/
383
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_more_info", get_defined_vars());
384
  /**/
385
+ echo '</div>'."\n";
386
  /**/
387
+ echo '</div>'."\n";
388
  /**/
389
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_paypal_pdt", get_defined_vars());
390
  }
391
  /**/
392
+ if(apply_filters("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_signup_confirmation_email", true, get_defined_vars()))
393
  {
394
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_signup_confirmation_email", get_defined_vars());
395
+ /**/
396
+ echo '<div class="ws-menu-page-group" title="Signup Confirmation Email ( Standard )">'."\n";
397
+ /**/
398
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-signup-confirmation-email-section">'."\n";
399
+ echo '<h3>Signup Confirmation Email ( required, but the default works fine )</h3>'."\n";
400
+ echo '<p>This email is sent to new Customers after they return from a successful signup at PayPal®. The <strong>primary</strong> purpose of this email, is to provide the Customer with instructions, along with a link to register a Username for their Membership. You may also customize this further, by providing details that are specifically geared to your site.</p>'."\n";
401
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_signup_confirmation_email", get_defined_vars());
402
+ /**/
403
+ echo '<table class="form-table">'."\n";
404
+ echo '<tbody>'."\n";
405
+ echo '<tr>'."\n";
406
+ /**/
407
+ echo '<th>'."\n";
408
+ echo '<label for="ws-plugin--s2member-signup-email-recipients">'."\n";
409
+ echo 'Signup Confirmation Recipients:'."\n";
410
+ echo '</label>'."\n";
411
+ echo '</th>'."\n";
412
+ /**/
413
+ echo '</tr>'."\n";
414
+ echo '<tr>'."\n";
415
+ /**/
416
+ echo '<td>'."\n";
417
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_signup_email_recipients" id="ws-plugin--s2member-signup-email-recipients" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_email_recipients"]).'" /><br />'."\n";
418
+ echo 'This is a semicolon ( ; ) delimited list of Recipients. Here is an example:<br />'."\n";
419
+ echo '<code>"%%full_name%%" &lt;%%payer_email%%&gt;; admin@example.com; "Webmaster" &lt;webmaster@example.com&gt;</code>'."\n";
420
+ echo '</td>'."\n";
421
+ /**/
422
+ echo '</tr>'."\n";
423
+ echo '<tr>'."\n";
424
+ /**/
425
+ echo '<th>'."\n";
426
+ echo '<label for="ws-plugin--s2member-signup-email-subject">'."\n";
427
+ echo 'Signup Confirmation Email Subject:'."\n";
428
+ echo '</label>'."\n";
429
+ echo '</th>'."\n";
430
+ /**/
431
+ echo '</tr>'."\n";
432
+ echo '<tr>'."\n";
433
+ /**/
434
+ echo '<td>'."\n";
435
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_signup_email_subject" id="ws-plugin--s2member-signup-email-subject" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_email_subject"]).'" /><br />'."\n";
436
+ echo 'Subject Line used in the email sent to a Customer after a successful signup has occurred through PayPal®.'."\n";
437
+ echo '</td>'."\n";
438
+ /**/
439
+ echo '</tr>'."\n";
440
+ echo '<tr>'."\n";
441
+ /**/
442
+ echo '<th>'."\n";
443
+ echo '<label for="ws-plugin--s2member-signup-email-message">'."\n";
444
+ echo 'Signup Confirmation Email Message:'."\n";
445
+ echo '</label>'."\n";
446
+ echo '</th>'."\n";
447
+ /**/
448
+ echo '</tr>'."\n";
449
+ echo '<tr>'."\n";
450
+ /**/
451
+ echo '<td>'."\n";
452
+ echo '<textarea name="ws_plugin__s2member_signup_email_message" id="ws-plugin--s2member-signup-email-message" rows="10">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_email_message"]).'</textarea><br />'."\n";
453
+ echo 'Message Body used in the email sent to a Customer after a successful signup has occurred through PayPal®.<br /><br />'."\n";
454
+ echo '<strong>You can also use these special Replacement Codes if you need them:</strong>'."\n";
455
+ echo '<ul>'."\n";
456
+ echo '<li><code>%%registration_url%%</code> = The full URL ( generated by s2Member ) where the Customer can get registered.</li>'."\n";
457
+ echo '<li><code>%%subscr_id%%</code> = The PayPal® Subscription ID, which remains constant throughout any &amp; all future payments. [ <a href="#" onclick="alert(\'There is one exception. If you are selling Lifetime or Fixed-Term ( non-recurring ) access, using Buy Now functionality; the %%subscr_id%% is actually set to the Transaction ID for the purchase. PayPal® does not provide a specific Subscription ID for Buy Now purchases. Since Lifetime &amp; Fixed-Term Subscriptions are NOT recurring ( i.e. there is only ONE payment ), using the Transaction ID as the Subscription ID is a graceful way to deal with this minor conflict.\'); return false;">?</a> ]</li>'."\n";
458
+ echo '<li><code>%%initial%%</code> = The Initial Fee charged during signup. If you offered a 100% Free Trial, this will be <code>0</code>. [ <a href="#" onclick="alert(\'This will always represent the amount of money the Customer spent, whenever they initially signed up, no matter what. If a Customer signs up, under the terms of a 100% Free Trial Period, this will be 0.\'); return false;">?</a> ]</li>'."\n";
459
+ echo '<li><code>%%regular%%</code> = The Regular Amount of the Subscription. This value is <code>always > 0</code>, no matter what. [ <a href="#" onclick="alert(\'This is how much the Subscription costs after an Initial Period expires. The %%regular%% rate is always > 0. If you did NOT offer an Initial Period at a different price, %%initial%% and %%regular%% will be equal to the same thing.\'); return false;">?</a> ]</li>'."\n";
460
+ echo '<li><code>%%recurring%%</code> = This is the amount that will be charged on a recurring basis, or <code>0</code> if non-recurring. [ <a href="#" onclick="alert(\'If Recurring Payments have not been required, this will be equal to 0. That being said, %%regular%% &amp; %%recurring%% are usually the same value. This variable can be used in two different ways. You can use it to determine what the Regular Recurring Rate is, or to determine whether the Subscription will recur or not. If it is going to recur, %%recurring%% will be > 0.\'); return false;">?</a> ]</li>'."\n";
461
+ echo '<li><code>%%first_name%%</code> = The First Name of the Customer who purchased the Membership Subscription.</li>'."\n";
462
+ echo '<li><code>%%last_name%%</code> = The Last Name of the Customer who purchased the Membership Subscription.</li>'."\n";
463
+ echo '<li><code>%%full_name%%</code> = The Full Name ( First &amp; Last ) of the Customer who purchased the Membership Subscription.</li>'."\n";
464
+ echo '<li><code>%%payer_email%%</code> = The Email Address of the Customer who purchased the Membership Subscription.</li>'."\n";
465
+ echo '<li><code>%%user_ip%%</code> = The Customer\'s IP Address, detected during checkout via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>'."\n";
466
+ echo '<li><code>%%item_number%%</code> = The Item Number ( colon separated <code><em>level:custom_capabilities:fixed term</em></code> ) that the Subscription is for.</li>'."\n";
467
+ echo '<li><code>%%item_name%%</code> = The Item Name ( as provided by the <code>desc=""</code> attribute in your Shortcode, which briefly describes the Item Number ).</li>'."\n";
468
+ echo '<li><code>%%initial_term%%</code> = This is the term length of the Initial Period. This will be a numeric value, followed by a space, then a single letter. [ <a href="#" onclick="alert(\'Here are some examples:\\n\\n%%initial_term%% = 1 D ( this means 1 Day )\\n%%initial_term%% = 1 W ( this means 1 Week )\\n%%initial_term%% = 1 M ( this means 1 Month )\\n%%initial_term%% = 1 Y ( this means 1 Year )\\n\\nThe Initial Period never recurs, so this only lasts for the term length specified, then it is over.\'); return false;">?</a> ]</li>'."\n";
469
+ echo '<li><code>%%initial_cycle%%</code> = This is the <code>%%initial_term%%</code> from above, converted to a cycle representation of: <code><em>X days/weeks/months/years</em></code>.</li>'."\n";
470
+ echo '<li><code>%%regular_term%%</code> = This is the term length of the Regular Period. This will be a numeric value, followed by a space, then a single letter. [ <a href="#" onclick="alert(\'Here are some examples:\\n\\n%%regular_term%% = 1 D ( this means 1 Day )\\n%%regular_term%% = 1 W ( this means 1 Week )\\n%%regular_term%% = 1 M ( this means 1 Month )\\n%%regular_term%% = 1 Y ( this means 1 Year )\\n%%regular_term%% = 1 L ( this means 1 Lifetime )\\n\\nThe Regular Term is usually recurring. So the Regular Term value represents the period ( or duration ) of each recurring period. If %%recurring%% = 0, then the Regular Term only applies once, because it is not recurring. So if it is not recurring, the value of %%regular_term%% simply represents how long their Membership privileges are going to last after the %%initial_term%% has expired, if there was an Initial Term. The value of this variable ( %%regular_term%% ) will never be empty, it will always be at least: 1 D, meaning 1 day. No exceptions.\'); return false;">?</a> ]</li>'."\n";
471
+ echo '<li><code>%%regular_cycle%%</code> = This is the <code>%%regular_term%%</code> from above, converted to a cycle representation of: <code><em>[every] X days/weeks/months/years — OR daily, weekly, bi-weekly, monthly, bi-monthly, quarterly, yearly, or lifetime</em></code>. This is a very useful Replacment Code. Its value is dynamic; depending on term length, recurring status, and period/term lengths configured.</li>'."\n";
472
+ echo '<li><code>%%recurring/regular_cycle%%</code> = Example ( <code>14.95 / Monthly</code> ), or ... ( <code>0 / non-recurring</code> ); depending on the value of <code>%%recurring%%</code>.</li>'."\n";
473
+ echo '</ul>'."\n";
474
+ /**/
475
+ echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
476
+ echo '<ul>'."\n";
477
+ echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>'."\n";
478
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>'."\n";
479
+ echo '</ul>'."\n";
480
+ echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />'."\n";
481
+ echo '<em>( The campaign ( i.e. christmas-promo ) could be referenced using <code>%%cv1%%</code> )</em><br />'."\n";
482
+ echo '<code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|christmas-promo"</code>'."\n";
483
+ /**/
484
+ echo '</td>'."\n";
485
+ /**/
486
+ echo '</tr>'."\n";
487
+ echo '</tbody>'."\n";
488
+ echo '</table>'."\n";
489
+ echo '</div>'."\n";
490
+ /**/
491
+ echo '</div>'."\n";
492
+ /**/
493
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_signup_confirmation_email", get_defined_vars());
494
  }
495
  /**/
496
+ if(apply_filters("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_sp_confirmation_email", true, get_defined_vars()))
497
  {
498
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_sp_confirmation_email", get_defined_vars());
499
+ /**/
500
+ echo '<div class="ws-menu-page-group" title="Specific Post/Page Confirmation Email ( Standard )">'."\n";
501
+ /**/
502
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-confirmation-email-section">'."\n";
503
+ echo '<h3>Specific Post/Page Confirmation Email ( required, but the default works fine )</h3>'."\n";
504
+ echo '<p>This email is sent to new Customers after they return from a successful purchase at PayPal®, for Specific Post/Page Access. ( see: <code>s2Member -> Restriction Options -> Specific Post/Page Access</code> ). This is NOT used for Membership sales, only for Specific Post/Page Access. The <strong>primary</strong> purpose of this email, is to provide the Customer with instructions, along with a link to access the Specific Post/Page they\'ve purchased access to. If you\'ve created a Specific Post/Page Package ( with multiple Posts/Pages bundled together into one transaction ), this ONE link ( <code>%%sp_access_url%%</code> ) will automatically authenticate them for access to ALL of the Posts/Pages included in their transaction. You may customize this email further, by providing details that are specifically geared to your site.</p>'."\n";
505
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_sp_confirmation_email", get_defined_vars());
506
+ /**/
507
+ echo '<table class="form-table">'."\n";
508
+ echo '<tbody>'."\n";
509
+ echo '<tr>'."\n";
510
+ /**/
511
+ echo '<th>'."\n";
512
+ echo '<label for="ws-plugin--s2member-sp-email-recipients">'."\n";
513
+ echo 'Specific Post/Page Confirmation Recipients:'."\n";
514
+ echo '</label>'."\n";
515
+ echo '</th>'."\n";
516
+ /**/
517
+ echo '</tr>'."\n";
518
+ echo '<tr>'."\n";
519
+ /**/
520
+ echo '<td>'."\n";
521
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_sp_email_recipients" id="ws-plugin--s2member-sp-email-recipients" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_email_recipients"]).'" /><br />'."\n";
522
+ echo 'This is a semicolon ( ; ) delimited list of Recipients. Here is an example:<br />'."\n";
523
+ echo '<code>"%%full_name%%" &lt;%%payer_email%%&gt;; admin@example.com; "Webmaster" &lt;webmaster@example.com&gt;</code>'."\n";
524
+ echo '</td>'."\n";
525
+ /**/
526
+ echo '</tr>'."\n";
527
+ echo '<tr>'."\n";
528
+ /**/
529
+ echo '<th>'."\n";
530
+ echo '<label for="ws-plugin--s2member-sp-email-subject">'."\n";
531
+ echo 'Specific Post/Page Confirmation Email Subject:'."\n";
532
+ echo '</label>'."\n";
533
+ echo '</th>'."\n";
534
+ /**/
535
+ echo '</tr>'."\n";
536
+ echo '<tr>'."\n";
537
+ /**/
538
+ echo '<td>'."\n";
539
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_sp_email_subject" id="ws-plugin--s2member-sp-email-subject" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_email_subject"]).'" /><br />'."\n";
540
+ echo 'Subject Line used in the email sent to a Customer after a successful purchase has occurred through PayPal®, for Specific Post/Page Access.'."\n";
541
+ echo '</td>'."\n";
542
+ /**/
543
+ echo '</tr>'."\n";
544
+ echo '<tr>'."\n";
545
+ /**/
546
+ echo '<th>'."\n";
547
+ echo '<label for="ws-plugin--s2member-sp-email-message">'."\n";
548
+ echo 'Specific Post/Page Confirmation Email Message:'."\n";
549
+ echo '</label>'."\n";
550
+ echo '</th>'."\n";
551
+ /**/
552
+ echo '</tr>'."\n";
553
+ echo '<tr>'."\n";
554
+ /**/
555
+ echo '<td>'."\n";
556
+ echo '<textarea name="ws_plugin__s2member_sp_email_message" id="ws-plugin--s2member-sp-email-message" rows="10">'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_email_message"]).'</textarea><br />'."\n";
557
+ echo 'Message Body used in the email sent to a Customer after a successful purchase has occurred through PayPal®, for Specific Post/Page Access.<br /><br />'."\n";
558
+ echo '<strong>You can also use these special Replacement Codes if you need them:</strong>'."\n";
559
+ echo '<ul>'."\n";
560
+ echo '<li><code>%%sp_access_url%%</code> = The full URL ( generated by s2Member ) where the Customer can gain access.</li>'."\n";
561
+ echo '<li><code>%%sp_access_exp%%</code> = Human readable expiration for <code>%%sp_access_url%%</code>. Ex: <em>( link expires in <code>%%sp_access_exp%%</code> )</em>.</li>'."\n";
562
+ echo '<li><code>%%txn_id%%</code> = The PayPal® Transaction ID. PayPal® assigns a unique identifier for every purchase.</li>'."\n";
563
+ echo '<li><code>%%amount%%</code> = The full Amount that you charged for Specific Post/Page Access. This value will <code>always be > 0</code>.</li>'."\n";
564
+ echo '<li><code>%%first_name%%</code> = The First Name of the Customer who purchased Specific Post/Page Access.</li>'."\n";
565
+ echo '<li><code>%%last_name%%</code> = The Last Name of the Customer who purchased Specific Post/Page Access.</li>'."\n";
566
+ echo '<li><code>%%full_name%%</code> = The Full Name ( First &amp; Last ) of the Customer who purchased Specific Post/Page Access.</li>'."\n";
567
+ echo '<li><code>%%payer_email%%</code> = The Email Address of the Customer who purchased Specific Post/Page Access.</li>'."\n";
568
+ echo '<li><code>%%user_ip%%</code> = The Customer\'s IP Address, detected during checkout via <code>$_SERVER["REMOTE_ADDR"]</code>.</li>'."\n";
569
+ echo '<li><code>%%item_number%%</code> = The Item Number. Ex: <code><em>sp:13,24,36:72</em></code> ( translates to: <code><em>sp:comma-delimited IDs:expiration hours</em></code> ).</li>'."\n";
570
+ echo '<li><code>%%item_name%%</code> = The Item Name ( as provided by the <code>desc=""</code> attribute in your Shortcode, which briefly describes the Item Number ).</li>'."\n";
571
+ echo '</ul>'."\n";
572
+ /**/
573
+ echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>'."\n";
574
+ echo '<ul>'."\n";
575
+ echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>'."\n";
576
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute; inside your Shortcode, like this: <code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables. Obviously, this is for advanced webmasters; but the functionality has been made available for those who need it.</li>'."\n";
577
+ echo '</ul>'."\n";
578
+ echo '<strong>This example uses cv1 to record a special marketing campaign:</strong><br />'."\n";
579
+ echo '<em>( The campaign ( i.e. christmas-promo ) could be referenced using <code>%%cv1%%</code> )</em><br />'."\n";
580
+ echo '<code>custom="'.esc_html($_SERVER["HTTP_HOST"]).'|christmas-promo"</code>'."\n";
581
+ /**/
582
+ echo '</td>'."\n";
583
+ /**/
584
+ echo '</tr>'."\n";
585
+ echo '</tbody>'."\n";
586
+ echo '</table>'."\n";
587
+ echo '</div>'."\n";
588
+ /**/
589
+ echo '</div>'."\n";
590
+ /**/
591
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_sp_confirmation_email", get_defined_vars());
592
  }
593
  /**/
594
+ if(apply_filters("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_display_eot_behavior", true, get_defined_vars()))
595
  {
596
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_before_eot_behavior", get_defined_vars());
597
  /**/
598
+ echo '<div class="ws-menu-page-group" title="Automatic EOT Behavior">'."\n";
599
  /**/
600
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-eot-behavior-section">'."\n";
601
+ echo '<h3>PayPal® EOT Behavior ( required, please choose )</h3>'."\n";
602
+ echo '<p>EOT = End Of Term. By default, s2Member will demote a paid Member to a Free Subscriber whenever their Subscription term has ended ( i.e. expired ), been cancelled, refunded, charged back to you, etc. s2Member demotes them to a Free Subscriber, so they will no longer have Member Level Access to your site. However, in some cases, you may prefer to have Customer accounts deleted completely, instead of just being demoted. This is where you choose which method works best for your site. If you don\'t want s2Member to take ANY action at all, you can disable s2Member\'s EOT System temporarily, or even completely.</p>'."\n";
603
+ echo '<p>The PayPal® IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds &amp; chargeback reversals are supported through the IPN service. For example, if you issue a refund to an unhappy Customer through PayPal®, s2Member will eventually be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically ( based on your configuration ). The communication from PayPal® -> s2Member is seamless.</p>'."\n";
604
+ echo '<p><em><strong>*Some Hairy Details*</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through PayPal®... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT ( End Of Term ) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by s2Member.</em></p>'."\n";
605
+ echo '<p><em>s2Member will not process an EOT until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system ( based on your configuration ). s2Member also calculates one extra day ( 24 hours ) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>'."\n";
606
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_eot_behavior", get_defined_vars());
607
  /**/
608
+ echo '<p id="ws-plugin--s2member-auto-eot-system-enabled-via-cron"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 2 && (!function_exists("wp_cron") || !wp_get_schedule("ws_plugin__s2member_auto_eot_system__schedule"))) ? '' : ' style="display:none;"').'>If you\'d like to run s2Member\'s Auto-EOT System through a more traditional Cron Job; instead of through <code>WP-Cron</code>, you will need to configure a Cron Job through your server control panel; provided by your hosting company. Set the Cron Job to run <code>once about every 10 minutes to an hour</code>. You\'ll want to configure an HTTP Cron Job that loads this URL:<br /><code>'.esc_html(site_url("/?s2member_auto_eot_system_via_cron=1")).'</code></p>'."\n";
609
  /**/
610
+ echo '<table class="form-table">'."\n";
611
+ echo '<tbody>'."\n";
612
+ echo '<tr>'."\n";
613
  /**/
614
+ echo '<th>'."\n";
615
+ echo '<label for="ws-plugin--s2member-auto-eot-system-enabled">'."\n";
616
+ echo 'Enable s2Member\'s Auto-EOT System?'."\n";
617
+ echo '</label>'."\n";
618
+ echo '</th>'."\n";
619
  /**/
620
+ echo '</tr>'."\n";
621
+ echo '<tr>'."\n";
622
  /**/
623
+ echo '<td>'."\n";
624
+ echo '<select name="ws_plugin__s2member_auto_eot_system_enabled" id="ws-plugin--s2member-auto-eot-system-enabled">'."\n";
625
  /* Very advanced conditionals here. If the Auto-EOT System is NOT running, or NOT fully configured, this will indicate that no option is set - as sort of a built-in acknowledgment/warning in the UI panel. */
626
+ echo (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 1 && (!function_exists("wp_cron") || !wp_get_schedule("ws_plugin__s2member_auto_eot_system__schedule"))) || ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 2 && (function_exists("wp_cron") && wp_get_schedule("ws_plugin__s2member_auto_eot_system__schedule"))) || (!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] && (function_exists("wp_cron") && wp_get_schedule("ws_plugin__s2member_auto_eot_system__schedule")))) ? '<option value=""></option>'."\n" : '';
627
+ echo '<option value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 1 && function_exists("wp_cron") && wp_get_schedule("ws_plugin__s2member_auto_eot_system__schedule")) ? ' selected="selected"' : '').'>Yes ( enable the Auto-EOT System through WP-Cron )</option>'."\n";
628
+ echo (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? '<option value="2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] == 2 && (!function_exists("wp_cron") || !wp_get_schedule("ws_plugin__s2member_auto_eot_system__schedule"))) ? ' selected="selected"' : '').'>Yes ( but, I\'ll run it with my own Cron Job )</option>'."\n" : '';
629
+ echo '<option value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"] && (!function_exists("wp_cron") || !wp_get_schedule("ws_plugin__s2member_auto_eot_system__schedule"))) ? ' selected="selected"' : '').'>No ( disable the Auto-EOT System )</option>'."\n";
630
+ echo '</select><br />'."\n";
631
+ echo 'Recommended setting: ( <code>Yes / enable via WP-Cron</code> )'."\n";
632
+ echo '</td>'."\n";
633
+ /**/
634
+ echo '</tr>'."\n";
635
+ echo '<tr>'."\n";
636
+ /**/
637
+ echo '<th>'."\n";
638
+ echo '<label for="ws-plugin--s2member-membership-eot-behavior">'."\n";
639
+ echo 'Membership EOT Behavior ( demote or delete )?'."\n";
640
+ echo '</label>'."\n";
641
+ echo '</th>'."\n";
642
+ /**/
643
+ echo '</tr>'."\n";
644
+ echo '<tr>'."\n";
645
+ /**/
646
+ echo '<td>'."\n";
647
+ echo '<select name="ws_plugin__s2member_membership_eot_behavior" id="ws-plugin--s2member-membership-eot-behavior">'."\n";
648
+ echo '<option value="demote"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "demote") ? ' selected="selected"' : '').'>Demote ( convert them to a Free Subscriber )</option>'."\n";
649
+ echo '<option value="delete"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "delete") ? ' selected="selected"' : '').'>Delete ( erase their account completely )</option>'."\n";
650
+ echo '</select>'."\n";
651
+ echo '</td>'."\n";
652
+ /**/
653
+ echo '</tr>'."\n";
654
+ echo '<tr>'."\n";
655
+ /**/
656
+ echo '<th>'."\n";
657
+ echo '<label for="ws-plugin--s2member-triggers-immediate-eot">'."\n";
658
+ echo 'Refunds/Reversals ( trigger immediate EOT )?'."\n";
659
+ echo '</label>'."\n";
660
+ echo '</th>'."\n";
661
+ /**/
662
+ echo '</tr>'."\n";
663
+ echo '<tr>'."\n";
664
+ /**/
665
+ echo '<td>'."\n";
666
+ echo '<select name="ws_plugin__s2member_triggers_immediate_eot" id="ws-plugin--s2member-triggers-immediate-eot">'."\n";
667
+ echo '<option value="none"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "none") ? ' selected="selected"' : '').'>Neither ( I\'ll review these two events manually )</option>'."\n";
668
+ echo '<option value="refunds"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds") ? ' selected="selected"' : '').'>Refunds ( refunds ALWAYS trigger an immediate EOT action )</option>'."\n";
669
+ echo '<option value="reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "reversals") ? ' selected="selected"' : '').'>Reversals ( chargebacks ALWAYS trigger an immediate EOT action )</option>'."\n";
670
+ echo '<option value="refunds,reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals") ? ' selected="selected"' : '').'>Refunds/Reversals ( ALWAYS trigger an immediate EOT action )</option>'."\n";
671
+ echo '</select><br />'."\n";
672
+ echo 'This setting will <a href="#" onclick="alert(\'A Refund/Reversal Notification will ALWAYS be processed internally by s2Member, even if no action is taken by s2Member. This way you\\\'ll have the full ability to listen for these two events on your own; if you prefer ( optional ). For more information, check your Dashboard under: `s2Member -> API Notifications -> Refunds/Reversals`.\'); return false;">NOT affect</a> s2Member\'s internal API Notifications for Refund/Reversal events.'."\n";
673
+ echo '</td>'."\n";
674
+ /**/
675
+ echo '</tr>'."\n";
676
+ echo '<tr>'."\n";
677
+ /**/
678
+ echo '<th>'."\n";
679
+ echo '<label for="ws-plugin--s2member-eot-time-ext-behavior">'."\n";
680
+ echo 'Fixed-Term Extensions ( auto-extend )?'."\n";
681
+ echo '</label>'."\n";
682
+ echo '</th>'."\n";
683
+ /**/
684
+ echo '</tr>'."\n";
685
+ echo '<tr>'."\n";
686
+ /**/
687
+ echo '<td>'."\n";
688
+ echo '<select name="ws_plugin__s2member_eot_time_ext_behavior" id="ws-plugin--s2member-eot-time-ext-behavior">'."\n";
689
+ echo '<option value="extend"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_time_ext_behavior"] === "extend") ? ' selected="selected"' : '').'>Yes ( default, automatically extend any existing EOT Time )</option>'."\n";
690
+ echo '<option value="reset"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_time_ext_behavior"] === "reset") ? ' selected="selected"' : '').'>No ( do NOT extend; s2Member should reset EOT Time completely )</option>'."\n";
691
+ echo '</select><br />'."\n";
692
+ echo 'This setting will only affect Buy Now transactions for fixed-term lengths. By default, s2Member will automatically extend any existing EOT Time that a Customer may have.'."\n";
693
+ echo '</td>'."\n";
694
+ /**/
695
+ echo '</tr>'."\n";
696
+ echo '</tbody>'."\n";
697
+ echo '</table>'."\n";
698
+ echo '</div>'."\n";
699
+ /**/
700
+ echo '</div>'."\n";
701
+ /**/
702
+ do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_after_eot_behavior", get_defined_vars());
703
  }
704
  /**/
705
+ do_action("ws_plugin__s2member_during_paypal_ops_page_after_left_sections", get_defined_vars());
706
  /**/
707
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
708
  /**/
709
+ echo '<p class="submit"><input type="submit" class="button-primary" value="Save All Changes" /></p>'."\n";
710
  /**/
711
+ echo '</form>'."\n";
712
  /**/
713
+ echo '</td>'."\n";
714
  /**/
715
+ echo '<td class="ws-menu-page-table-r">'."\n";
716
+ c_ws_plugin__s2member_menu_pages_rs::display();
717
+ echo '</td>'."\n";
718
  /**/
719
+ echo '</tr>'."\n";
720
+ echo '</tbody>'."\n";
721
+ echo '</table>'."\n";
722
  /**/
723
+ echo '</div>'."\n";
724
  }
725
  }
726
  }
727
  /**/
728
+ new c_ws_plugin__s2member_menu_page_paypal_ops();
729
  ?>
includes/syscon.inc.php CHANGED
@@ -160,8 +160,7 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
160
  $default_options["mms_auto_patch"] = "1";
161
  $default_options["mms_registration_file"] = "wp-login";
162
  $default_options["mms_registration_grants"] = "none";
163
- for($n = 0, $v = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++, $v = $v + 5)
164
- $default_options["mms_registration_blogs_level".$n] = (string)$v;
165
  /**/
166
  $default_options["login_welcome_page"] = "";
167
  $default_options["login_redirection_override"] = "";
@@ -208,6 +207,11 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
208
  $default_options["paypal_identity_token"] = "";
209
  $default_options["paypal_btn_encryption"] = "0";
210
  /**/
 
 
 
 
 
211
  $default_options["signup_tracking_codes"] = "";
212
  $default_options["modification_tracking_codes"] = "";
213
  $default_options["ccap_tracking_codes"] = "";
@@ -223,11 +227,9 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
223
  /**/
224
  $default_options["mailchimp_api_key"] = "";
225
  /**/
226
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
227
- $default_options["level".$n."_mailchimp_list_ids"] = "";
228
  /**/
229
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
230
- $default_options["level".$n."_aweber_list_ids"] = "";
231
  /**/
232
  $default_options["signup_notification_urls"] = "";
233
  $default_options["registration_notification_urls"] = "";
@@ -249,16 +251,13 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
249
  $default_options["sp_sale_notification_recipients"] = "";
250
  $default_options["sp_ref_rev_notification_recipients"] = "";
251
  /**/
252
- for($n = 0, $l = array(_x("Free Subscriber", "s2member-front", "s2member"), _x("Bronze Member", "s2member-front", "s2member"), _x("Silver Member", "s2member-front", "s2member"), _x("Gold Member", "s2member-front", "s2member"), _x("Platinum Member", "s2member-front", "s2member")); $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
253
- $default_options["level".$n."_label"] = (!empty($l[$n])) ? $l[$n] : sprintf(_x("Level %s Member", "s2member-front", "s2member"), $n);
254
  /**/
255
  $default_options["apply_label_translations"] = "0";
256
  /**/
257
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
258
- $default_options["level".$n."_file_downloads_allowed"] = "";
259
  /**/
260
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
261
- $default_options["level".$n."_file_downloads_allowed_days"] = "";
262
  /**/
263
  $default_options["file_download_limit_exceeded_page"] = "";
264
  $default_options["file_download_inline_extensions"] = "";
@@ -280,20 +279,15 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
280
  $default_options["amazon_cf_files_distro_streaming_dname"] = "";
281
  $default_options["amazon_cf_files_distros_auto_config_status"] = "";
282
  /**/
283
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
284
- $default_options["level".$n."_ruris"] = "";
285
  /**/
286
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
287
- $default_options["level".$n."_catgs"] = "";
288
  /**/
289
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
290
- $default_options["level".$n."_ptags"] = "";
291
  /**/
292
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
293
- $default_options["level".$n."_posts"] = "";
294
  /**/
295
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
296
- $default_options["level".$n."_pages"] = "";
297
  /**/
298
  $default_options["specific_ids"] = "";
299
  /**/
@@ -454,6 +448,9 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
454
  else if(preg_match("/^paypal_(?:business|api_username|api_password|api_signature|identity_token)$/", $key) && (!is_string($value) || !strlen($value)))
455
  $value = $default_options[$key];
456
  /**/
 
 
 
457
  else if($key === "paypal_btn_encryption" && (!is_string($value) || !is_numeric($value)))
458
  $value = $default_options[$key];
459
  /**/
160
  $default_options["mms_auto_patch"] = "1";
161
  $default_options["mms_registration_file"] = "wp-login";
162
  $default_options["mms_registration_grants"] = "none";
163
+ for($n = 0, $v = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++, $v = $v + 5)$default_options["mms_registration_blogs_level".$n] = (string)$v;
 
164
  /**/
165
  $default_options["login_welcome_page"] = "";
166
  $default_options["login_redirection_override"] = "";
207
  $default_options["paypal_identity_token"] = "";
208
  $default_options["paypal_btn_encryption"] = "0";
209
  /**/
210
+ $default_options["paypal_payflow_api_username"] = "";
211
+ $default_options["paypal_payflow_api_partner"] = "PayPal";
212
+ $default_options["paypal_payflow_api_vendor"] = "";
213
+ $default_options["paypal_payflow_api_password"] = "";
214
+ /**/
215
  $default_options["signup_tracking_codes"] = "";
216
  $default_options["modification_tracking_codes"] = "";
217
  $default_options["ccap_tracking_codes"] = "";
227
  /**/
228
  $default_options["mailchimp_api_key"] = "";
229
  /**/
230
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_mailchimp_list_ids"] = "";
 
231
  /**/
232
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_aweber_list_ids"] = "";
 
233
  /**/
234
  $default_options["signup_notification_urls"] = "";
235
  $default_options["registration_notification_urls"] = "";
251
  $default_options["sp_sale_notification_recipients"] = "";
252
  $default_options["sp_ref_rev_notification_recipients"] = "";
253
  /**/
254
+ for($n = 0, $l = array(_x("Free Subscriber", "s2member-front", "s2member"), _x("Bronze Member", "s2member-front", "s2member"), _x("Silver Member", "s2member-front", "s2member"), _x("Gold Member", "s2member-front", "s2member"), _x("Platinum Member", "s2member-front", "s2member")); $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_label"] = (!empty($l[$n])) ? $l[$n] : sprintf(_x("Level %s Member", "s2member-front", "s2member"), $n);
 
255
  /**/
256
  $default_options["apply_label_translations"] = "0";
257
  /**/
258
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_file_downloads_allowed"] = "";
 
259
  /**/
260
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_file_downloads_allowed_days"] = "";
 
261
  /**/
262
  $default_options["file_download_limit_exceeded_page"] = "";
263
  $default_options["file_download_inline_extensions"] = "";
279
  $default_options["amazon_cf_files_distro_streaming_dname"] = "";
280
  $default_options["amazon_cf_files_distros_auto_config_status"] = "";
281
  /**/
282
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_ruris"] = "";
 
283
  /**/
284
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_catgs"] = "";
 
285
  /**/
286
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_ptags"] = "";
 
287
  /**/
288
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_posts"] = "";
 
289
  /**/
290
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_pages"] = "";
 
291
  /**/
292
  $default_options["specific_ids"] = "";
293
  /**/
448
  else if(preg_match("/^paypal_(?:business|api_username|api_password|api_signature|identity_token)$/", $key) && (!is_string($value) || !strlen($value)))
449
  $value = $default_options[$key];
450
  /**/
451
+ else if(preg_match("/^paypal_payflow(?:api_username|api_partner|api_vendor|api_password)$/", $key) && (!is_string($value) || !strlen($value)))
452
+ $value = $default_options[$key];
453
+ /**/
454
  else if($key === "paypal_btn_encryption" && (!is_string($value) || !is_numeric($value)))
455
  $value = $default_options[$key];
456
  /**/
includes/translations/s2member.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the s2Member® Framework package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: s2Member® Framework 120308\n"
6
- "Report-Msgid-Bugs-To: http://wordpress.org/tag/__s2member\n"
7
- "POT-Creation-Date: 2012-03-09 18:44:50+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -666,6 +666,8 @@ msgid "Error #%1$s. %2$s. %3$s."
666
  msgstr ""
667
 
668
  #: s2member/includes/classes/paypal-utilities.inc.php:178
 
 
669
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:96
670
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:318
671
  msgctxt "s2member-front"
@@ -674,15 +676,41 @@ msgstr ""
674
 
675
  #: s2member/includes/classes/paypal-utilities.inc.php:219
676
  #: s2member/includes/classes/paypal-utilities.inc.php:225
 
 
677
  msgctxt "s2member-front"
678
  msgid "Error #%s. Transaction declined. Please use an alternate funding source."
679
  msgstr ""
680
 
681
  #: s2member/includes/classes/paypal-utilities.inc.php:222
 
682
  msgctxt "s2member-front"
683
  msgid "Error #%s. Transaction declined. Express Checkout was NOT confirmed."
684
  msgstr ""
685
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
686
  #: s2member/includes/classes/profile-in.inc.php:78
687
  #: s2member/includes/classes/sc-profile-in.inc.php:94
688
  #: s2member-pro/includes/classes/login-widget.inc.php:118
@@ -1420,12 +1448,12 @@ msgctxt "s2member-front"
1420
  msgid "Yes, I want to receive updates via email."
1421
  msgstr ""
1422
 
1423
- #: s2member/includes/syscon.inc.php:196
1424
  msgctxt "s2member-front"
1425
  msgid "[%s] Username/Password"
1426
  msgstr ""
1427
 
1428
- #: s2member/includes/syscon.inc.php:197
1429
  msgctxt "s2member-front"
1430
  msgid ""
1431
  "Your Username/Password for:\n"
@@ -1436,12 +1464,12 @@ msgid ""
1436
  "%%%%wp_login_url%%%%"
1437
  msgstr ""
1438
 
1439
- #: s2member/includes/syscon.inc.php:200
1440
  msgctxt "s2member-front"
1441
  msgid "[%s] New User Registration"
1442
  msgstr ""
1443
 
1444
- #: s2member/includes/syscon.inc.php:201
1445
  msgctxt "s2member-front"
1446
  msgid ""
1447
  "New User Registration on your site:\n"
@@ -1453,12 +1481,12 @@ msgid ""
1453
  "IP Address: %%%%user_ip%%%%"
1454
  msgstr ""
1455
 
1456
- #: s2member/includes/syscon.inc.php:217 s2member-pro/includes/syscon.inc.php:94
1457
  msgctxt "s2member-front"
1458
  msgid "Congratulations! ( your membership has been approved )"
1459
  msgstr ""
1460
 
1461
- #: s2member/includes/syscon.inc.php:218
1462
  msgctxt "s2member-front"
1463
  msgid ""
1464
  "Thanks %%%%first_name%%%%! Your membership has been approved.\n"
@@ -1474,12 +1502,12 @@ msgid ""
1474
  "%s"
1475
  msgstr ""
1476
 
1477
- #: s2member/includes/syscon.inc.php:221 s2member-pro/includes/syscon.inc.php:98
1478
  msgctxt "s2member-front"
1479
  msgid "Thank You! ( instructions for access )"
1480
  msgstr ""
1481
 
1482
- #: s2member/includes/syscon.inc.php:222
1483
  msgctxt "s2member-front"
1484
  msgid ""
1485
  "Thanks %%%%first_name%%%%!\n"
@@ -1496,32 +1524,32 @@ msgid ""
1496
  "%s"
1497
  msgstr ""
1498
 
1499
- #: s2member/includes/syscon.inc.php:252
1500
  msgctxt "s2member-front"
1501
  msgid "Free Subscriber"
1502
  msgstr ""
1503
 
1504
- #: s2member/includes/syscon.inc.php:252
1505
  msgctxt "s2member-front"
1506
  msgid "Bronze Member"
1507
  msgstr ""
1508
 
1509
- #: s2member/includes/syscon.inc.php:252
1510
  msgctxt "s2member-front"
1511
  msgid "Silver Member"
1512
  msgstr ""
1513
 
1514
- #: s2member/includes/syscon.inc.php:252
1515
  msgctxt "s2member-front"
1516
  msgid "Gold Member"
1517
  msgstr ""
1518
 
1519
- #: s2member/includes/syscon.inc.php:252
1520
  msgctxt "s2member-front"
1521
  msgid "Platinum Member"
1522
  msgstr ""
1523
 
1524
- #: s2member/includes/syscon.inc.php:253
1525
  msgctxt "s2member-front"
1526
  msgid "Level %s Member"
1527
  msgstr ""
@@ -2364,6 +2392,7 @@ msgstr ""
2364
 
2365
  #: s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:115
2366
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:114
 
2367
  msgctxt "s2member-front"
2368
  msgid "<strong>Billing termination confirmed.</strong> Your account has been cancelled."
2369
  msgstr ""
@@ -2374,6 +2403,9 @@ msgstr ""
2374
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:126
2375
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:138
2376
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:146
 
 
 
2377
  msgctxt "s2member-front"
2378
  msgid "<strong>Billing terminated.</strong> Your account has been cancelled."
2379
  msgstr ""
@@ -2381,7 +2413,9 @@ msgstr ""
2381
  #: s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:147
2382
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:133
2383
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:154
 
2384
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:150
 
2385
  msgctxt "s2member-front"
2386
  msgid "You're <strong>NOT</strong> logged in."
2387
  msgstr ""
@@ -2390,6 +2424,8 @@ msgstr ""
2390
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:580
2391
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:289
2392
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:612
 
 
2393
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:420
2394
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:848
2395
  msgctxt "s2member-front"
@@ -2400,6 +2436,8 @@ msgstr ""
2400
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:696
2401
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:451
2402
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:764
 
 
2403
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:682
2404
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1000
2405
  msgctxt "s2member-front"
@@ -2416,6 +2454,10 @@ msgstr ""
2416
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:481
2417
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:773
2418
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:794
 
 
 
 
2419
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:691
2420
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:712
2421
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1009
@@ -2430,6 +2472,8 @@ msgstr ""
2430
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:717
2431
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:472
2432
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:785
 
 
2433
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:703
2434
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1021
2435
  msgctxt "s2member-front"
@@ -2438,7 +2482,9 @@ msgstr ""
2438
 
2439
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:737
2440
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:805
 
2441
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1041
 
2442
  msgctxt "s2member-front"
2443
  msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
2444
  msgstr ""
@@ -2533,9 +2579,9 @@ msgid "Authorize.Net® configuration error. Your Authorize.Net® Secret MD5 Hash
2533
  msgstr ""
2534
 
2535
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:238
2536
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:521
2537
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:241
2538
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:593
2539
  msgctxt "s2member-front"
2540
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to cancel your account."
2541
  msgstr ""
@@ -2548,328 +2594,332 @@ msgstr ""
2548
 
2549
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:246
2550
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:249
2551
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:254
2552
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:261
 
 
2553
  msgctxt "s2member-front"
2554
  msgid "Nothing to cancel. You have NO recurring fees."
2555
  msgstr ""
2556
 
2557
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:256
2558
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:533
2559
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:268
2560
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:605
2561
  msgctxt "s2member-front"
2562
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to update your billing information."
2563
  msgstr ""
2564
 
2565
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:259
2566
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:271
2567
  msgctxt "s2member-front"
2568
  msgid "Nothing to update. You're NOT a paid Member."
2569
  msgstr ""
2570
 
2571
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:264
2572
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:267
2573
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:284
2574
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:291
 
 
2575
  msgctxt "s2member-front"
2576
  msgid "Nothing to update. You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance."
2577
  msgstr ""
2578
 
2579
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:274
2580
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:298
2581
  msgctxt "s2member-admin"
2582
  msgid "Invalid form configuration. Missing \"level\" attribute. Membership Level. Must be numeric [0-%s]."
2583
  msgstr ""
2584
 
2585
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:277
2586
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:301
2587
  msgctxt "s2member-admin"
2588
  msgid "Invalid form configuration. Invalid \"level\" attribute. Membership Level. Must be numeric [0-%s]."
2589
  msgstr ""
2590
 
2591
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:280
2592
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:370
2593
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:304
2594
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:412
2595
  msgctxt "s2member-admin"
2596
  msgid "Invalid form configuration. Invalid \"ccaps\" attribute. Custom Capabilities. When provided, must be all lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable."
2597
  msgstr ""
2598
 
2599
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:283
2600
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:394
2601
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:307
2602
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:454
2603
  msgctxt "s2member-admin"
2604
  msgid "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When provided, must be numeric."
2605
  msgstr ""
2606
 
2607
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:286
2608
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:397
2609
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:310
2610
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:457
2611
  msgctxt "s2member-admin"
2612
  msgid "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When provided, must be >= 1."
2613
  msgstr ""
2614
 
2615
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:289
2616
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:400
2617
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:313
2618
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:460
2619
  msgctxt "s2member-admin"
2620
  msgid "Invalid form configuration. Missing \"tt\" attribute. The Trial Term. When \"tp\" is provided, \"tt\" ( Trial Term ) must be one of D,W,M,Y."
2621
  msgstr ""
2622
 
2623
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:292
2624
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:403
2625
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:316
2626
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:463
2627
  msgctxt "s2member-admin"
2628
  msgid "Invalid form configuration. Invalid \"tt\" attribute. The Trial Term. When \"tp\" is provided, \"tt\" ( Trial Term ) must be one of D,W,M,Y."
2629
  msgstr ""
2630
 
2631
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:295
2632
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:319
2633
  msgctxt "s2member-admin"
2634
  msgid "Invalid form configuration. Invalid \"custom\" attribute. When provided, must start with your domain name."
2635
  msgstr ""
2636
 
2637
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:301
2638
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:325
2639
  msgctxt "s2member-admin"
2640
  msgid "Invalid form configuration. Missing \"ids\" attribute. Must contain comma-delimited Post/Page IDs."
2641
  msgstr ""
2642
 
2643
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:304
2644
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:328
2645
  msgctxt "s2member-admin"
2646
  msgid "Invalid form configuration. Invalid \"ids\" attribute. Must contain comma-delimited Post/Page IDs. Must contain [0-9,] only."
2647
  msgstr ""
2648
 
2649
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:307
2650
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:331
2651
  msgctxt "s2member-admin"
2652
  msgid "Invalid form configuration. Missing \"exp\" attribute. Specific Post/Page Expiration ( in hours ). Must be numeric."
2653
  msgstr ""
2654
 
2655
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:310
2656
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:334
2657
  msgctxt "s2member-admin"
2658
  msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration ( in hours ). Must be numeric."
2659
  msgstr ""
2660
 
2661
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:313
2662
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:337
2663
  msgctxt "s2member-admin"
2664
  msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration ( in hours ). Must be >= 1."
2665
  msgstr ""
2666
 
2667
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:316
2668
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:340
2669
  msgctxt "s2member-admin"
2670
  msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration ( in hours ). Must be <= 43800."
2671
  msgstr ""
2672
 
2673
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:319
2674
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:343
2675
  msgctxt "s2member-admin"
2676
  msgid "Invalid form configuration. Missing \"sp_ids_exp\" internal attribute. Please check Shortcode Attributes."
2677
  msgstr ""
2678
 
2679
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:322
2680
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:346
2681
  msgctxt "s2member-admin"
2682
  msgid "Invalid form configuration. Invalid \"sp_ids_exp\" internal attribute. Please check Shortcode Attributes."
2683
  msgstr ""
2684
 
2685
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:325
2686
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:376
2687
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:349
2688
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:418
2689
  msgctxt "s2member-admin"
2690
  msgid "Invalid form configuration. Missing \"desc\" attribute. Please provide a Description for this form."
2691
  msgstr ""
2692
 
2693
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:328
2694
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:379
2695
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:352
2696
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:421
2697
  msgctxt "s2member-admin"
2698
  msgid "Invalid form configuration. Your \"desc\" ( Description ) attribute must be <= 100 characters long."
2699
  msgstr ""
2700
 
2701
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:331
2702
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:382
2703
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:355
2704
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:424
2705
  msgctxt "s2member-admin"
2706
  msgid "Invalid form configuration. Missing \"custom\" attribute. Must start with your domain name."
2707
  msgstr ""
2708
 
2709
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:334
2710
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:358
2711
  msgctxt "s2member-admin"
2712
  msgid "Invalid form configuration. Invalid \"custom\" attribute. Must start with your domain name."
2713
  msgstr ""
2714
 
2715
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:337
2716
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:388
2717
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:361
2718
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:430
2719
  msgctxt "s2member-admin"
2720
  msgid "Invalid form configuration. Missing \"cc\" attribute. Must be a 3 character Currency Code."
2721
  msgstr ""
2722
 
2723
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:340
2724
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:391
2725
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:364
2726
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:433
2727
  msgctxt "s2member-admin"
2728
  msgid "Invalid form configuration. Invalid \"cc\" attribute. Must be a 3 character Currency Code."
2729
  msgstr ""
2730
 
2731
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:343
2732
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:475
2733
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:385
2734
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:532
2735
  msgctxt "s2member-admin"
2736
  msgid "Invalid form configuration. Missing \"ra\" attribute. The Regular Amount. Must be >= 0.01."
2737
  msgstr ""
2738
 
2739
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:346
2740
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:478
2741
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:388
2742
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:535
2743
  msgctxt "s2member-admin"
2744
  msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be numeric."
2745
  msgstr ""
2746
 
2747
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:349
2748
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:481
2749
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:391
2750
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:538
2751
  msgctxt "s2member-admin"
2752
  msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be >= 0.01."
2753
  msgstr ""
2754
 
2755
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:352
2756
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:484
2757
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:394
2758
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:541
2759
  msgctxt "s2member-admin"
2760
  msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be <= 10000.00."
2761
  msgstr ""
2762
 
2763
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:358
2764
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:400
2765
  msgctxt "s2member-front"
2766
  msgid "You must <a href=\"%s\" rel=\"nofollow\">login</a> to update your billing plan."
2767
  msgstr ""
2768
 
2769
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:361
2770
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:403
2771
  msgctxt "s2member-front"
2772
  msgid "You must <a href=\"%s\" rel=\"nofollow\">login</a> before making this purchase."
2773
  msgstr ""
2774
 
2775
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:364
2776
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:406
2777
  msgctxt "s2member-admin"
2778
  msgid "Invalid form configuration. Missing \"level\" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*)."
2779
  msgstr ""
2780
 
2781
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:367
2782
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:409
2783
  msgctxt "s2member-admin"
2784
  msgid "Invalid form configuration. Invalid \"level\" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*)."
2785
  msgstr ""
2786
 
2787
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:373
2788
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:415
2789
  msgctxt "s2member-admin"
2790
  msgid "Invalid form configuration. Missing or invalid \"ccaps\" attribute. When \"level\" is \"*\" for ( Independent Custom Capabilities ), \"ccaps\" is required. All lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable."
2791
  msgstr ""
2792
 
2793
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:385
2794
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:427
2795
  msgctxt "s2member-admin"
2796
  msgid "Invalid form configuration. Invalid \"custom\" attribute. Must start with matching domain."
2797
  msgstr ""
2798
 
2799
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:406
2800
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:466
2801
  msgctxt "s2member-admin"
2802
  msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" ( Trial Term ) attribute is \"D\", and \"tp\" ( Trial Period ) > 365."
2803
  msgstr ""
2804
 
2805
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:409
2806
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:469
2807
  msgctxt "s2member-admin"
2808
  msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" ( Trial Term ) attribute is \"W\", and \"tp\" ( Trial Period ) > 52."
2809
  msgstr ""
2810
 
2811
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:412
2812
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:472
2813
  msgctxt "s2member-admin"
2814
  msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" ( Trial Term ) attribute is \"M\", and \"tp\" ( Trial Period ) > 12."
2815
  msgstr ""
2816
 
2817
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:415
2818
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:475
2819
  msgctxt "s2member-admin"
2820
  msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" ( Trial Term ) attribute is \"Y\", and \"tp\" ( Trial Period ) > 1."
2821
  msgstr ""
2822
 
2823
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:418
2824
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:478
2825
  msgctxt "s2member-admin"
2826
  msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be numeric."
2827
  msgstr ""
2828
 
2829
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:421
2830
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:481
2831
  msgctxt "s2member-admin"
2832
  msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be >= 0.00."
2833
  msgstr ""
2834
 
2835
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:424
2836
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:484
2837
  msgctxt "s2member-admin"
2838
  msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be <= 10000.00."
2839
  msgstr ""
2840
 
2841
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:427
2842
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:487
2843
  msgctxt "s2member-admin"
2844
  msgid "Invalid form configuration. Missing \"rp\" attribute. The Regular Period. Must be >= 1."
2845
  msgstr ""
2846
 
2847
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:430
2848
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:490
2849
  msgctxt "s2member-admin"
2850
  msgid "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. Must be numeric."
2851
  msgstr ""
2852
 
2853
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:433
2854
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:493
2855
  msgctxt "s2member-admin"
2856
  msgid "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. Must be >= 1."
2857
  msgstr ""
2858
 
2859
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:436
2860
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:496
2861
  msgctxt "s2member-admin"
2862
  msgid "Invalid form configuration. Missing \"rt\" attribute. The Regular Term. Must be one of D,W,M,Y,L."
2863
  msgstr ""
2864
 
2865
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:439
2866
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:499
2867
  msgctxt "s2member-admin"
2868
  msgid "Invalid form configuration. Invalid \"rt\" attribute. The Regular Term. Must be one of D,W,M,Y,L."
2869
  msgstr ""
2870
 
2871
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:442
2872
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:502
2873
  msgctxt "s2member-admin"
2874
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"D\", \"rp\" ( Regular Period ) > 365, and \"rr\" is not \"BN\" ( Buy Now )."
2875
  msgstr ""
@@ -2880,341 +2930,359 @@ msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\"
2880
  msgstr ""
2881
 
2882
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:448
2883
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:505
2884
  msgctxt "s2member-admin"
2885
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"W\", \"rp\" ( Regular Period ) > 52, and \"rr\" is not \"BN\" ( Buy Now )."
2886
  msgstr ""
2887
 
2888
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:451
2889
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:508
2890
  msgctxt "s2member-admin"
2891
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"M\", \"rp\" ( Regular Period ) > 12, and \"rr\" is not \"BN\" ( Buy Now )."
2892
  msgstr ""
2893
 
2894
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:454
2895
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:511
2896
  msgctxt "s2member-admin"
2897
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"Y\", \"rp\" ( Regular Period ) > 5, and \"rr\" is not \"BN\" ( Buy Now )."
2898
  msgstr ""
2899
 
2900
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:457
2901
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:514
2902
  msgctxt "s2member-admin"
2903
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"Y\", \"rp\" ( Regular Period ) > 1, and \"rr\" is not \"BN\" ( Buy Now )."
2904
  msgstr ""
2905
 
2906
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:460
2907
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:517
2908
  msgctxt "s2member-admin"
2909
  msgid "Invalid form configuration. Invalid \"rp, rt\" attributes. The \"rt\" ( Regular Term ) attribute is \"L\" ( Lifetime ), and \"rp\" ( Regular Period ) > 1."
2910
  msgstr ""
2911
 
2912
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:463
2913
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:520
2914
  msgctxt "s2member-admin"
2915
  msgid "Invalid form configuration. Invalid \"rt, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"L\" ( Lifetime ), and \"rr\" is not \"BN\" ( Buy Now )."
2916
  msgstr ""
2917
 
2918
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:466
2919
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:523
2920
  msgctxt "s2member-admin"
2921
  msgid "Invalid form configuration. Missing \"level_ccaps_eotper\" attribute. Please check Shortcode Attributes."
2922
  msgstr ""
2923
 
2924
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:469
2925
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:472
2926
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:526
2927
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:529
2928
  msgctxt "s2member-admin"
2929
  msgid "Invalid form configuration. Invalid \"level_ccaps_eotper\" attribute. Please check Shortcode Attributes."
2930
  msgstr ""
2931
 
2932
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:487
2933
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:544
2934
  msgctxt "s2member-admin"
2935
  msgid "Invalid form configuration. Invalid \"rr\" attribute. Regular Recurring. When provided, must be 0, 1, or BN."
2936
  msgstr ""
2937
 
2938
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:490
2939
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:547
2940
  msgctxt "s2member-admin"
2941
  msgid "Invalid form configuration. Invalid \"rr, tp\" attributes. The \"rr\" ( Regular Recurring ) attribute is \"BN\" ( Buy Now ), and \"tp\" ( Trial Period ) is not \"0\"."
2942
  msgstr ""
2943
 
2944
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:493
2945
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:550
2946
  msgctxt "s2member-admin"
2947
  msgid "Invalid form configuration. Invalid \"level, rr\" attributes. The \"level\" ( Level ) attribute is \"*\" for ( Independent Custom Capabilities ), and \"rr\" is not \"BN\" ( Buy Now )."
2948
  msgstr ""
2949
 
2950
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:496
2951
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:553
2952
  msgctxt "s2member-admin"
2953
  msgid "Invalid form configuration. Invalid \"ta, tp, tt\" attributes. Trial Period. When provided, these cannot be exactly the same as your \"ra, rp, rt\" attributes."
2954
  msgstr ""
2955
 
2956
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:524
2957
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:575
2958
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:620
2959
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:674
2960
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:764
2961
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:596
2962
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:647
2963
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:692
2964
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:746
2965
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:836
2966
- msgctxt "s2member-front"
2967
- msgid "Missing or invalid Security Code. Please try again."
2968
  msgstr ""
2969
 
2970
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:527
2971
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:536
2972
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:686
2973
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:599
2974
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:608
2975
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:758
2976
  msgctxt "s2member-admin"
2977
- msgid "Unable to process. You are an Administrator. Stopping here for security. Otherwise, an Administrator could lose access."
2978
  msgstr ""
2979
 
2980
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:539
2981
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:638
2982
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:728
2983
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:611
2984
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:710
2985
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:800
2986
- msgctxt "s2member-front"
2987
- msgid "Missing Card Type ( Billing Method ). Please try again."
2988
  msgstr ""
2989
 
2990
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:542
2991
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:641
2992
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:731
2993
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:614
2994
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:713
2995
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:803
 
 
 
 
2996
  msgctxt "s2member-front"
2997
- msgid "Invalid Card Type ( Billing Method ). Please try again."
2998
  msgstr ""
2999
 
 
3000
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:545
3001
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:644
3002
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:734
3003
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:617
3004
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:716
3005
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:806
3006
- msgctxt "s2member-front"
3007
- msgid "Missing Card Number. Please try again."
3008
  msgstr ""
3009
 
3010
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:548
3011
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:647
3012
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:737
3013
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:620
3014
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:719
3015
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:809
3016
  msgctxt "s2member-front"
3017
- msgid "Missing Card Expiration Date ( mm/yyyy ). Please try again."
3018
  msgstr ""
3019
 
3020
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:551
3021
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:650
3022
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:740
3023
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:623
3024
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:722
3025
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:812
3026
  msgctxt "s2member-front"
3027
- msgid "Invalid Card Expiration Date. Must be in this format ( mm/yyyy ). Please try again."
3028
  msgstr ""
3029
 
3030
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:554
3031
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:653
3032
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:743
3033
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:626
3034
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:725
3035
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:815
3036
  msgctxt "s2member-front"
3037
- msgid "Missing Card Verification Code. It's on the back of your Card. 3-4 digits. Please try again."
3038
  msgstr ""
3039
 
3040
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:557
3041
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:656
3042
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:746
3043
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:629
3044
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:728
3045
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:818
3046
  msgctxt "s2member-front"
3047
- msgid "Missing Card Start Date, or Issue #. Required for Maestro/Solo. Please try again."
3048
  msgstr ""
3049
 
3050
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:560
3051
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:659
3052
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:749
3053
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:632
3054
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:731
3055
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:821
3056
  msgctxt "s2member-front"
3057
- msgid "Missing Street Address. Please try again."
3058
  msgstr ""
3059
 
3060
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:563
3061
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:662
3062
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:752
3063
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:635
3064
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:734
3065
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:824
3066
  msgctxt "s2member-front"
3067
- msgid "Missing City/Town. Please try again."
3068
  msgstr ""
3069
 
3070
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:566
3071
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:665
3072
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:755
3073
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:638
3074
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:737
3075
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:827
3076
  msgctxt "s2member-front"
3077
- msgid "Missing State/Province. Please try again."
3078
  msgstr ""
3079
 
3080
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:569
3081
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:668
3082
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:758
3083
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:641
3084
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:740
3085
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:830
3086
  msgctxt "s2member-front"
3087
- msgid "Missing Country. Please try again."
3088
  msgstr ""
3089
 
3090
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:572
3091
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:671
3092
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:761
3093
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:644
3094
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:743
3095
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:833
3096
  msgctxt "s2member-front"
3097
- msgid "Missing Postal/Zip Code. Please try again."
3098
  msgstr ""
3099
 
3100
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:581
3101
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:626
3102
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:689
3103
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:653
3104
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:698
3105
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:761
3106
  msgctxt "s2member-front"
3107
- msgid "Missing First Name. Please try again."
3108
  msgstr ""
3109
 
3110
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:584
3111
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:629
3112
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:692
3113
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:656
3114
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:701
3115
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:764
3116
  msgctxt "s2member-front"
3117
- msgid "Missing Last Name. Please try again."
3118
  msgstr ""
3119
 
3120
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:587
3121
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:632
3122
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:695
3123
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:659
3124
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:704
3125
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:767
3126
  msgctxt "s2member-front"
3127
- msgid "Missing or invalid Email Address. Please try again."
3128
  msgstr ""
3129
 
3130
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:590
3131
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:635
3132
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:698
3133
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:662
3134
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:707
3135
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:770
3136
  msgctxt "s2member-front"
3137
- msgid "Invalid Email Address. Please try again."
3138
  msgstr ""
3139
 
3140
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:593
 
3141
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:701
3142
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:665
3143
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:773
 
3144
  msgctxt "s2member-front"
3145
- msgid "That Email Address is already in use. Please try again."
3146
  msgstr ""
3147
 
3148
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:596
 
3149
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:704
3150
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:668
3151
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:776
 
3152
  msgctxt "s2member-front"
3153
- msgid "Missing or invalid Username. Please try again."
3154
  msgstr ""
3155
 
3156
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:599
 
3157
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:707
3158
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:671
3159
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:779
 
3160
  msgctxt "s2member-front"
3161
- msgid "Invalid Username. Please try again. Use ONLY lowercase alphanumerics."
3162
  msgstr ""
3163
 
3164
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:602
3165
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:710
3166
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:674
3167
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:782
3168
  msgctxt "s2member-front"
3169
- msgid "That Username is already in use. Please try again."
 
 
 
 
 
 
 
 
3170
  msgstr ""
3171
 
3172
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:608
3173
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:716
3174
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:680
3175
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:788
3176
  msgctxt "s2member-front"
3177
- msgid "Missing Password. Please try again."
3178
  msgstr ""
3179
 
3180
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:611
3181
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:719
3182
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:683
3183
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:791
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3184
  msgctxt "s2member-front"
3185
  msgid "Invalid Password. Must be at least 6 characters. Please try again."
3186
  msgstr ""
3187
 
3188
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:614
3189
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:722
3190
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:686
3191
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:794
3192
  msgctxt "s2member-front"
3193
  msgid "Invalid Password. Max length is 20 characters. Please try again."
3194
  msgstr ""
3195
 
3196
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:617
3197
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:725
3198
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:689
3199
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:797
3200
  msgctxt "s2member-front"
3201
  msgid "Password fields do NOT match. Please try again."
3202
  msgstr ""
3203
 
3204
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:680
3205
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:752
3206
  msgctxt "s2member-front"
3207
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to modify your billing plan."
3208
  msgstr ""
3209
 
3210
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:683
3211
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:755
3212
  msgctxt "s2member-front"
3213
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> before making this purchase."
3214
  msgstr ""
3215
 
3216
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:767
3217
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:839
3218
  msgctxt "s2member-front"
3219
  msgid "Unknown form submission type. Please contact Support."
3220
  msgstr ""
@@ -3233,12 +3301,14 @@ msgstr ""
3233
 
3234
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:107
3235
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:112
 
3236
  msgctxt "s2member-front"
3237
  msgid "<strong>Confirmed.</strong> Your billing information has been updated."
3238
  msgstr ""
3239
 
3240
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:119
3241
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:128
 
3242
  msgctxt "s2member-front"
3243
  msgid "<strong>Unable to update.</strong> You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance."
3244
  msgstr ""
@@ -3249,67 +3319,66 @@ msgctxt "s2member-front"
3249
  msgid "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
3250
  msgstr ""
3251
 
3252
- #. translators: Exclude `%2$s`. This is an English error returned by
3253
- #. Authorize.Net®. Please replace `%2$s` with: `Unable to process, please try
3254
- #. again`, or something to that affect. Or, if you prefer, you could Filter
3255
- #. ``$response["__error"]`` with
3256
- #. `ws_plugin__s2member_pro_authnet_aim_response`.
3257
- #. translators: Exclude `%2$s`. This is an English error returned by
3258
- #. Authorize.Net®. Please replace `%2$s` with: `Unable to process, please try
3259
- #. again`, or something to that affect. Or, if you prefer, you could Filter
3260
- #. ``$response["__error"]`` with
3261
- #. `ws_plugin__s2member_pro_authnet_arb_response`.
3262
-
3263
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:93
3264
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:315
3265
- msgctxt "s2member-front"
3266
- msgid "Error #%1$s. %2$s."
3267
- msgstr ""
3268
-
3269
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:651
3270
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:794
3271
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:221
3272
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:364
3273
  msgctxt "s2member-front percentage-symbol"
3274
  msgid "%"
3275
  msgstr ""
3276
 
3277
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:793
3278
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:363
3279
  msgctxt "s2member-front"
3280
  msgid " + tax"
3281
  msgstr ""
3282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3283
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:838
3284
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:890
3285
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:903
3286
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:925
3287
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:985
3288
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1000
3289
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:408
3290
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:460
3291
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:473
3292
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:495
3293
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:555
3294
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:570
3295
  msgctxt "s2member-front"
3296
- msgid "COUPON %s off. ( Now: %s )"
3297
  msgstr ""
3298
 
3299
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:839
3300
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:891
3301
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:904
3302
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:926
3303
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:986
3304
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1001
3305
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:409
3306
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:461
3307
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:474
3308
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:496
3309
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:556
3310
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:571
3311
  msgctxt "s2member-front"
3312
- msgid "<div>Coupon: <strong>%s off</strong>. ( Now: <strong>%s</strong> )</div>"
3313
  msgstr ""
3314
 
3315
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:851
@@ -3318,54 +3387,38 @@ msgstr ""
3318
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:940
3319
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:955
3320
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:970
3321
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:421
3322
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:434
3323
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:447
3324
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:510
3325
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:525
3326
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:540
3327
- msgctxt "s2member-front"
3328
- msgid "COUPON %s off. ( Now: %s, then %s )"
3329
- msgstr ""
3330
-
3331
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:852
3332
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:865
3333
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:878
3334
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:941
3335
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:956
3336
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:971
3337
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:422
3338
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:435
3339
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:448
3340
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:511
3341
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:526
3342
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:541
3343
  msgctxt "s2member-front"
3344
  msgid "<div>Coupon: <strong>%s off</strong>. ( Now: <strong>%s, then %s</strong> )</div>"
3345
  msgstr ""
3346
 
3347
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:908
3348
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1005
3349
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:478
3350
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:575
3351
  msgctxt "s2member-front"
3352
  msgid "<div>Sorry, your Coupon is not applicable.</div>"
3353
  msgstr ""
3354
 
3355
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1009
3356
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:579
3357
  msgctxt "s2member-front"
3358
  msgid "<div>Coupon: <strong>%s0.00 off</strong>.</div>"
3359
  msgstr ""
3360
 
3361
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1013
3362
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:583
3363
  msgctxt "s2member-front"
3364
  msgid "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
3365
  msgstr ""
3366
 
3367
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1017
3368
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:587
3369
  msgctxt "s2member-front"
3370
  msgid "<div>Sorry, your Coupon <strong>expired</strong>: <em>%s</em>.</div>"
3371
  msgstr ""
@@ -3373,16 +3426,16 @@ msgstr ""
3373
  #. translators: `%1$s` is new price/description, after coupon applied. `%2$s`
3374
  #. is original description.
3375
 
3376
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1023
3377
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:593
3378
  msgctxt "s2member-front"
3379
  msgid "%1$s ~ ORIGINALLY: %2$s"
3380
  msgstr ""
3381
 
3382
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1051
3383
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1055
3384
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:621
3385
- #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:625
3386
  msgctxt "s2member-front"
3387
  msgid "<div>Sorry, your Coupon is N/A, invalid or expired.</div>"
3388
  msgstr ""
@@ -3488,19 +3541,24 @@ msgid "Cancel at any time to avoid charges."
3488
  msgstr ""
3489
 
3490
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:122
3491
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:258
 
 
3492
  msgctxt "s2member-front"
3493
  msgid "<strong>Unable to cancel at this time.</strong> Your account is pending other changes. Please try again in 15 minutes."
3494
  msgstr ""
3495
 
3496
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:134
3497
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:251
 
3498
  msgctxt "s2member-front"
3499
  msgid "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal®</a> to cancel your Subscription."
3500
  msgstr ""
3501
 
3502
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:301
3503
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:624
 
 
3504
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:437
3505
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:860
3506
  msgctxt "s2member-front"
@@ -3547,82 +3605,82 @@ msgctxt "s2member-admin"
3547
  msgid "PayPal® configuration error. Your PayPal® API Signature is not yet configured."
3548
  msgstr ""
3549
 
3550
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:278
3551
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:281
 
3552
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:76
3553
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:132
3554
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:136
 
 
3555
  msgctxt "s2member-front"
3556
  msgid "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal®</a> to update your billing information."
3557
  msgstr ""
3558
 
3559
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:288
 
3560
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:124
 
3561
  msgctxt "s2member-front"
3562
  msgid "<strong>Unable to update at this time.</strong> Your account is pending other changes. Please try again in 15 minutes."
3563
  msgstr ""
3564
 
3565
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:367
3566
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:436
3567
  msgctxt "s2member-admin"
3568
  msgid "Invalid form configuration. Missing \"dg\" attribute. Digital indicator. Must be numeric [0-1]."
3569
  msgstr ""
3570
 
3571
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:370
3572
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:439
3573
  msgctxt "s2member-admin"
3574
  msgid "Invalid form configuration. Invalid \"dg\" attribute. Digital indicator. Must be numeric [0-1]."
3575
  msgstr ""
3576
 
3577
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:373
3578
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:442
3579
  msgctxt "s2member-admin"
3580
  msgid "Invalid form configuration. Missing \"ns\" attribute. Shipping configuration. Must be numeric [0-2]."
3581
  msgstr ""
3582
 
3583
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:376
3584
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:445
3585
  msgctxt "s2member-admin"
3586
  msgid "Invalid form configuration. Invalid \"ns\" attribute. Shipping configuration. Must be numeric [0-2]."
3587
  msgstr ""
3588
 
3589
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:379
3590
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:448
3591
  msgctxt "s2member-admin"
3592
  msgid "Invalid form configuration. Invalid \"ns\" attribute. Shipping configuration. Must be 1 with \"dg\" ( digital ) items."
3593
  msgstr ""
3594
 
3595
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:382
3596
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:451
3597
  msgctxt "s2member-admin"
3598
  msgid "Invalid form configuration. Invalid \"lc\" attribute. Locale Code. When provided, must be a 2 character country code."
3599
  msgstr ""
3600
 
3601
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:556
3602
- msgctxt "s2member-admin"
3603
- msgid "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times ( fixed ). When provided, must be numeric."
3604
- msgstr ""
3605
-
3606
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:559
3607
- msgctxt "s2member-admin"
3608
- msgid "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times ( fixed ). When provided, must be >= 1."
3609
- msgstr ""
3610
-
3611
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:562
3612
  msgctxt "s2member-admin"
3613
- msgid "Invalid form configuration. Invalid \"rr, rrt\" attributes. When \"rrt\" ( Recurring Times ) is provided, \"rr\" ( Regular Recurring ) must be 1."
3614
  msgstr ""
3615
 
3616
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:565
3617
  msgctxt "s2member-admin"
3618
  msgid "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr\" ( Regular Recurring ) is 0 or 1, \"rra\" ( Recurring Retry Attempts ) must be numeric."
3619
  msgstr ""
3620
 
3621
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:568
3622
  msgctxt "s2member-admin"
3623
  msgid "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr\" ( Regular Recurring ) is 0 or 1, \"rra\" ( Recurring Retry Attempts ) must be >= 0."
3624
  msgstr ""
3625
 
 
 
 
 
 
3626
  #: s2member-pro/includes/classes/login-widget.inc.php:123
3627
  msgctxt "s2member-front"
3628
  msgid "Password"
2
  # This file is distributed under the same license as the s2Member® Framework package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: s2Member® Framework 120514\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/___s2member\n"
7
+ "POT-Creation-Date: 2012-05-15 10:48:05+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
666
  msgstr ""
667
 
668
  #: s2member/includes/classes/paypal-utilities.inc.php:178
669
+ #: s2member/includes/classes/paypal-utilities.inc.php:273
670
+ #: s2member/includes/classes/paypal-utilities.inc.php:281
671
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:96
672
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:318
673
  msgctxt "s2member-front"
676
 
677
  #: s2member/includes/classes/paypal-utilities.inc.php:219
678
  #: s2member/includes/classes/paypal-utilities.inc.php:225
679
+ #: s2member/includes/classes/paypal-utilities.inc.php:322
680
+ #: s2member/includes/classes/paypal-utilities.inc.php:328
681
  msgctxt "s2member-front"
682
  msgid "Error #%s. Transaction declined. Please use an alternate funding source."
683
  msgstr ""
684
 
685
  #: s2member/includes/classes/paypal-utilities.inc.php:222
686
+ #: s2member/includes/classes/paypal-utilities.inc.php:325
687
  msgctxt "s2member-front"
688
  msgid "Error #%s. Transaction declined. Express Checkout was NOT confirmed."
689
  msgstr ""
690
 
691
+ #. translators: Exclude `%2$s`. These are English details returned by PayPal®.
692
+ #. Replace `%2$s` with: `Unable to process, please try again`, or something to
693
+ #. that affect. Or, if you prefer, you could Filter ``$response["__error"]``
694
+ #. with `ws_plugin__s2member_paypal_payflow_api_response`.
695
+ #. translators: Exclude `%2$s`. This is an English error returned by
696
+ #. Authorize.Net®. Please replace `%2$s` with: `Unable to process, please try
697
+ #. again`, or something to that affect. Or, if you prefer, you could Filter
698
+ #. ``$response["__error"]`` with
699
+ #. `ws_plugin__s2member_pro_authnet_aim_response`.
700
+ #. translators: Exclude `%2$s`. This is an English error returned by
701
+ #. Authorize.Net®. Please replace `%2$s` with: `Unable to process, please try
702
+ #. again`, or something to that affect. Or, if you prefer, you could Filter
703
+ #. ``$response["__error"]`` with
704
+ #. `ws_plugin__s2member_pro_authnet_arb_response`.
705
+
706
+ #: s2member/includes/classes/paypal-utilities.inc.php:271
707
+ #: s2member/includes/classes/paypal-utilities.inc.php:279
708
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:93
709
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:315
710
+ msgctxt "s2member-front"
711
+ msgid "Error #%1$s. %2$s."
712
+ msgstr ""
713
+
714
  #: s2member/includes/classes/profile-in.inc.php:78
715
  #: s2member/includes/classes/sc-profile-in.inc.php:94
716
  #: s2member-pro/includes/classes/login-widget.inc.php:118
1448
  msgid "Yes, I want to receive updates via email."
1449
  msgstr ""
1450
 
1451
+ #: s2member/includes/syscon.inc.php:195
1452
  msgctxt "s2member-front"
1453
  msgid "[%s] Username/Password"
1454
  msgstr ""
1455
 
1456
+ #: s2member/includes/syscon.inc.php:196
1457
  msgctxt "s2member-front"
1458
  msgid ""
1459
  "Your Username/Password for:\n"
1464
  "%%%%wp_login_url%%%%"
1465
  msgstr ""
1466
 
1467
+ #: s2member/includes/syscon.inc.php:199
1468
  msgctxt "s2member-front"
1469
  msgid "[%s] New User Registration"
1470
  msgstr ""
1471
 
1472
+ #: s2member/includes/syscon.inc.php:200
1473
  msgctxt "s2member-front"
1474
  msgid ""
1475
  "New User Registration on your site:\n"
1481
  "IP Address: %%%%user_ip%%%%"
1482
  msgstr ""
1483
 
1484
+ #: s2member/includes/syscon.inc.php:221 s2member-pro/includes/syscon.inc.php:94
1485
  msgctxt "s2member-front"
1486
  msgid "Congratulations! ( your membership has been approved )"
1487
  msgstr ""
1488
 
1489
+ #: s2member/includes/syscon.inc.php:222
1490
  msgctxt "s2member-front"
1491
  msgid ""
1492
  "Thanks %%%%first_name%%%%! Your membership has been approved.\n"
1502
  "%s"
1503
  msgstr ""
1504
 
1505
+ #: s2member/includes/syscon.inc.php:225 s2member-pro/includes/syscon.inc.php:98
1506
  msgctxt "s2member-front"
1507
  msgid "Thank You! ( instructions for access )"
1508
  msgstr ""
1509
 
1510
+ #: s2member/includes/syscon.inc.php:226
1511
  msgctxt "s2member-front"
1512
  msgid ""
1513
  "Thanks %%%%first_name%%%%!\n"
1524
  "%s"
1525
  msgstr ""
1526
 
1527
+ #: s2member/includes/syscon.inc.php:254
1528
  msgctxt "s2member-front"
1529
  msgid "Free Subscriber"
1530
  msgstr ""
1531
 
1532
+ #: s2member/includes/syscon.inc.php:254
1533
  msgctxt "s2member-front"
1534
  msgid "Bronze Member"
1535
  msgstr ""
1536
 
1537
+ #: s2member/includes/syscon.inc.php:254
1538
  msgctxt "s2member-front"
1539
  msgid "Silver Member"
1540
  msgstr ""
1541
 
1542
+ #: s2member/includes/syscon.inc.php:254
1543
  msgctxt "s2member-front"
1544
  msgid "Gold Member"
1545
  msgstr ""
1546
 
1547
+ #: s2member/includes/syscon.inc.php:254
1548
  msgctxt "s2member-front"
1549
  msgid "Platinum Member"
1550
  msgstr ""
1551
 
1552
+ #: s2member/includes/syscon.inc.php:254
1553
  msgctxt "s2member-front"
1554
  msgid "Level %s Member"
1555
  msgstr ""
2392
 
2393
  #: s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:115
2394
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:114
2395
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:112
2396
  msgctxt "s2member-front"
2397
  msgid "<strong>Billing termination confirmed.</strong> Your account has been cancelled."
2398
  msgstr ""
2403
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:126
2404
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:138
2405
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:146
2406
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:123
2407
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:135
2408
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:143
2409
  msgctxt "s2member-front"
2410
  msgid "<strong>Billing terminated.</strong> Your account has been cancelled."
2411
  msgstr ""
2413
  #: s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:147
2414
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:133
2415
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:154
2416
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:151
2417
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:150
2418
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:146
2419
  msgctxt "s2member-front"
2420
  msgid "You're <strong>NOT</strong> logged in."
2421
  msgstr ""
2424
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:580
2425
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:289
2426
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:612
2427
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:332
2428
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:662
2429
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:420
2430
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:848
2431
  msgctxt "s2member-front"
2436
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:696
2437
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:451
2438
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:764
2439
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:501
2440
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:814
2441
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:682
2442
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1000
2443
  msgctxt "s2member-front"
2454
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:481
2455
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:773
2456
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:794
2457
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:510
2458
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:531
2459
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:823
2460
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:844
2461
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:691
2462
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:712
2463
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1009
2472
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:717
2473
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:472
2474
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:785
2475
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:522
2476
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:835
2477
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:703
2478
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1021
2479
  msgctxt "s2member-front"
2482
 
2483
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:737
2484
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:805
2485
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:855
2486
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1041
2487
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:137
2488
  msgctxt "s2member-front"
2489
  msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
2490
  msgstr ""
2579
  msgstr ""
2580
 
2581
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:238
2582
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:530
2583
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:241
2584
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:623
2585
  msgctxt "s2member-front"
2586
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to cancel your account."
2587
  msgstr ""
2594
 
2595
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:246
2596
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:249
2597
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:249
2598
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:255
2599
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:266
2600
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:273
2601
  msgctxt "s2member-front"
2602
  msgid "Nothing to cancel. You have NO recurring fees."
2603
  msgstr ""
2604
 
2605
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:256
2606
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:542
2607
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:280
2608
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:635
2609
  msgctxt "s2member-front"
2610
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to update your billing information."
2611
  msgstr ""
2612
 
2613
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:259
2614
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:283
2615
  msgctxt "s2member-front"
2616
  msgid "Nothing to update. You're NOT a paid Member."
2617
  msgstr ""
2618
 
2619
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:264
2620
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:267
2621
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:288
2622
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:297
2623
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:311
2624
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:318
2625
  msgctxt "s2member-front"
2626
  msgid "Nothing to update. You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance."
2627
  msgstr ""
2628
 
2629
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:274
2630
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:325
2631
  msgctxt "s2member-admin"
2632
  msgid "Invalid form configuration. Missing \"level\" attribute. Membership Level. Must be numeric [0-%s]."
2633
  msgstr ""
2634
 
2635
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:277
2636
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:328
2637
  msgctxt "s2member-admin"
2638
  msgid "Invalid form configuration. Invalid \"level\" attribute. Membership Level. Must be numeric [0-%s]."
2639
  msgstr ""
2640
 
2641
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:280
2642
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:370
2643
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:331
2644
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:439
2645
  msgctxt "s2member-admin"
2646
  msgid "Invalid form configuration. Invalid \"ccaps\" attribute. Custom Capabilities. When provided, must be all lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable."
2647
  msgstr ""
2648
 
2649
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:283
2650
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:394
2651
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:334
2652
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:481
2653
  msgctxt "s2member-admin"
2654
  msgid "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When provided, must be numeric."
2655
  msgstr ""
2656
 
2657
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:286
2658
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:397
2659
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:337
2660
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:484
2661
  msgctxt "s2member-admin"
2662
  msgid "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When provided, must be >= 1."
2663
  msgstr ""
2664
 
2665
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:289
2666
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:400
2667
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:340
2668
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:487
2669
  msgctxt "s2member-admin"
2670
  msgid "Invalid form configuration. Missing \"tt\" attribute. The Trial Term. When \"tp\" is provided, \"tt\" ( Trial Term ) must be one of D,W,M,Y."
2671
  msgstr ""
2672
 
2673
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:292
2674
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:403
2675
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:343
2676
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:490
2677
  msgctxt "s2member-admin"
2678
  msgid "Invalid form configuration. Invalid \"tt\" attribute. The Trial Term. When \"tp\" is provided, \"tt\" ( Trial Term ) must be one of D,W,M,Y."
2679
  msgstr ""
2680
 
2681
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:295
2682
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:346
2683
  msgctxt "s2member-admin"
2684
  msgid "Invalid form configuration. Invalid \"custom\" attribute. When provided, must start with your domain name."
2685
  msgstr ""
2686
 
2687
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:301
2688
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:352
2689
  msgctxt "s2member-admin"
2690
  msgid "Invalid form configuration. Missing \"ids\" attribute. Must contain comma-delimited Post/Page IDs."
2691
  msgstr ""
2692
 
2693
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:304
2694
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:355
2695
  msgctxt "s2member-admin"
2696
  msgid "Invalid form configuration. Invalid \"ids\" attribute. Must contain comma-delimited Post/Page IDs. Must contain [0-9,] only."
2697
  msgstr ""
2698
 
2699
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:307
2700
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:358
2701
  msgctxt "s2member-admin"
2702
  msgid "Invalid form configuration. Missing \"exp\" attribute. Specific Post/Page Expiration ( in hours ). Must be numeric."
2703
  msgstr ""
2704
 
2705
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:310
2706
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:361
2707
  msgctxt "s2member-admin"
2708
  msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration ( in hours ). Must be numeric."
2709
  msgstr ""
2710
 
2711
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:313
2712
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:364
2713
  msgctxt "s2member-admin"
2714
  msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration ( in hours ). Must be >= 1."
2715
  msgstr ""
2716
 
2717
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:316
2718
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:367
2719
  msgctxt "s2member-admin"
2720
  msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration ( in hours ). Must be <= 43800."
2721
  msgstr ""
2722
 
2723
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:319
2724
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:370
2725
  msgctxt "s2member-admin"
2726
  msgid "Invalid form configuration. Missing \"sp_ids_exp\" internal attribute. Please check Shortcode Attributes."
2727
  msgstr ""
2728
 
2729
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:322
2730
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:373
2731
  msgctxt "s2member-admin"
2732
  msgid "Invalid form configuration. Invalid \"sp_ids_exp\" internal attribute. Please check Shortcode Attributes."
2733
  msgstr ""
2734
 
2735
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:325
2736
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:376
2737
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:376
2738
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:445
2739
  msgctxt "s2member-admin"
2740
  msgid "Invalid form configuration. Missing \"desc\" attribute. Please provide a Description for this form."
2741
  msgstr ""
2742
 
2743
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:328
2744
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:379
2745
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:379
2746
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:448
2747
  msgctxt "s2member-admin"
2748
  msgid "Invalid form configuration. Your \"desc\" ( Description ) attribute must be <= 100 characters long."
2749
  msgstr ""
2750
 
2751
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:331
2752
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:382
2753
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:382
2754
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:451
2755
  msgctxt "s2member-admin"
2756
  msgid "Invalid form configuration. Missing \"custom\" attribute. Must start with your domain name."
2757
  msgstr ""
2758
 
2759
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:334
2760
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:385
2761
  msgctxt "s2member-admin"
2762
  msgid "Invalid form configuration. Invalid \"custom\" attribute. Must start with your domain name."
2763
  msgstr ""
2764
 
2765
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:337
2766
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:388
2767
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:388
2768
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:457
2769
  msgctxt "s2member-admin"
2770
  msgid "Invalid form configuration. Missing \"cc\" attribute. Must be a 3 character Currency Code."
2771
  msgstr ""
2772
 
2773
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:340
2774
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:391
2775
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:391
2776
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:460
2777
  msgctxt "s2member-admin"
2778
  msgid "Invalid form configuration. Invalid \"cc\" attribute. Must be a 3 character Currency Code."
2779
  msgstr ""
2780
 
2781
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:343
2782
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:475
2783
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:412
2784
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:562
2785
  msgctxt "s2member-admin"
2786
  msgid "Invalid form configuration. Missing \"ra\" attribute. The Regular Amount. Must be >= 0.01."
2787
  msgstr ""
2788
 
2789
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:346
2790
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:478
2791
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:415
2792
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:565
2793
  msgctxt "s2member-admin"
2794
  msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be numeric."
2795
  msgstr ""
2796
 
2797
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:349
2798
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:481
2799
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:418
2800
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:568
2801
  msgctxt "s2member-admin"
2802
  msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be >= 0.01."
2803
  msgstr ""
2804
 
2805
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:352
2806
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:484
2807
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:421
2808
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:571
2809
  msgctxt "s2member-admin"
2810
  msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be <= 10000.00."
2811
  msgstr ""
2812
 
2813
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:358
2814
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:427
2815
  msgctxt "s2member-front"
2816
  msgid "You must <a href=\"%s\" rel=\"nofollow\">login</a> to update your billing plan."
2817
  msgstr ""
2818
 
2819
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:361
2820
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:430
2821
  msgctxt "s2member-front"
2822
  msgid "You must <a href=\"%s\" rel=\"nofollow\">login</a> before making this purchase."
2823
  msgstr ""
2824
 
2825
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:364
2826
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:433
2827
  msgctxt "s2member-admin"
2828
  msgid "Invalid form configuration. Missing \"level\" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*)."
2829
  msgstr ""
2830
 
2831
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:367
2832
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:436
2833
  msgctxt "s2member-admin"
2834
  msgid "Invalid form configuration. Invalid \"level\" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*)."
2835
  msgstr ""
2836
 
2837
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:373
2838
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:442
2839
  msgctxt "s2member-admin"
2840
  msgid "Invalid form configuration. Missing or invalid \"ccaps\" attribute. When \"level\" is \"*\" for ( Independent Custom Capabilities ), \"ccaps\" is required. All lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable."
2841
  msgstr ""
2842
 
2843
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:385
2844
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:454
2845
  msgctxt "s2member-admin"
2846
  msgid "Invalid form configuration. Invalid \"custom\" attribute. Must start with matching domain."
2847
  msgstr ""
2848
 
2849
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:406
2850
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:493
2851
  msgctxt "s2member-admin"
2852
  msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" ( Trial Term ) attribute is \"D\", and \"tp\" ( Trial Period ) > 365."
2853
  msgstr ""
2854
 
2855
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:409
2856
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:496
2857
  msgctxt "s2member-admin"
2858
  msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" ( Trial Term ) attribute is \"W\", and \"tp\" ( Trial Period ) > 52."
2859
  msgstr ""
2860
 
2861
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:412
2862
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:499
2863
  msgctxt "s2member-admin"
2864
  msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" ( Trial Term ) attribute is \"M\", and \"tp\" ( Trial Period ) > 12."
2865
  msgstr ""
2866
 
2867
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:415
2868
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:502
2869
  msgctxt "s2member-admin"
2870
  msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" ( Trial Term ) attribute is \"Y\", and \"tp\" ( Trial Period ) > 1."
2871
  msgstr ""
2872
 
2873
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:418
2874
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:505
2875
  msgctxt "s2member-admin"
2876
  msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be numeric."
2877
  msgstr ""
2878
 
2879
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:421
2880
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:508
2881
  msgctxt "s2member-admin"
2882
  msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be >= 0.00."
2883
  msgstr ""
2884
 
2885
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:424
2886
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:511
2887
  msgctxt "s2member-admin"
2888
  msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be <= 10000.00."
2889
  msgstr ""
2890
 
2891
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:427
2892
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:514
2893
  msgctxt "s2member-admin"
2894
  msgid "Invalid form configuration. Missing \"rp\" attribute. The Regular Period. Must be >= 1."
2895
  msgstr ""
2896
 
2897
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:430
2898
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:517
2899
  msgctxt "s2member-admin"
2900
  msgid "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. Must be numeric."
2901
  msgstr ""
2902
 
2903
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:433
2904
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:520
2905
  msgctxt "s2member-admin"
2906
  msgid "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. Must be >= 1."
2907
  msgstr ""
2908
 
2909
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:436
2910
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:523
2911
  msgctxt "s2member-admin"
2912
  msgid "Invalid form configuration. Missing \"rt\" attribute. The Regular Term. Must be one of D,W,M,Y,L."
2913
  msgstr ""
2914
 
2915
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:439
2916
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:526
2917
  msgctxt "s2member-admin"
2918
  msgid "Invalid form configuration. Invalid \"rt\" attribute. The Regular Term. Must be one of D,W,M,Y,L."
2919
  msgstr ""
2920
 
2921
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:442
2922
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:529
2923
  msgctxt "s2member-admin"
2924
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"D\", \"rp\" ( Regular Period ) > 365, and \"rr\" is not \"BN\" ( Buy Now )."
2925
  msgstr ""
2930
  msgstr ""
2931
 
2932
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:448
2933
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:532
2934
  msgctxt "s2member-admin"
2935
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"W\", \"rp\" ( Regular Period ) > 52, and \"rr\" is not \"BN\" ( Buy Now )."
2936
  msgstr ""
2937
 
2938
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:451
2939
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:535
2940
  msgctxt "s2member-admin"
2941
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"M\", \"rp\" ( Regular Period ) > 12, and \"rr\" is not \"BN\" ( Buy Now )."
2942
  msgstr ""
2943
 
2944
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:454
2945
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:541
2946
  msgctxt "s2member-admin"
2947
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"Y\", \"rp\" ( Regular Period ) > 5, and \"rr\" is not \"BN\" ( Buy Now )."
2948
  msgstr ""
2949
 
2950
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:457
2951
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:544
2952
  msgctxt "s2member-admin"
2953
  msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"Y\", \"rp\" ( Regular Period ) > 1, and \"rr\" is not \"BN\" ( Buy Now )."
2954
  msgstr ""
2955
 
2956
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:460
2957
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:547
2958
  msgctxt "s2member-admin"
2959
  msgid "Invalid form configuration. Invalid \"rp, rt\" attributes. The \"rt\" ( Regular Term ) attribute is \"L\" ( Lifetime ), and \"rp\" ( Regular Period ) > 1."
2960
  msgstr ""
2961
 
2962
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:463
2963
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:550
2964
  msgctxt "s2member-admin"
2965
  msgid "Invalid form configuration. Invalid \"rt, rr\" attributes. The \"rt\" ( Regular Term ) attribute is \"L\" ( Lifetime ), and \"rr\" is not \"BN\" ( Buy Now )."
2966
  msgstr ""
2967
 
2968
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:466
2969
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:553
2970
  msgctxt "s2member-admin"
2971
  msgid "Invalid form configuration. Missing \"level_ccaps_eotper\" attribute. Please check Shortcode Attributes."
2972
  msgstr ""
2973
 
2974
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:469
2975
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:472
2976
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:556
2977
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:559
2978
  msgctxt "s2member-admin"
2979
  msgid "Invalid form configuration. Invalid \"level_ccaps_eotper\" attribute. Please check Shortcode Attributes."
2980
  msgstr ""
2981
 
2982
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:487
2983
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:574
2984
  msgctxt "s2member-admin"
2985
  msgid "Invalid form configuration. Invalid \"rr\" attribute. Regular Recurring. When provided, must be 0, 1, or BN."
2986
  msgstr ""
2987
 
2988
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:490
2989
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:577
2990
  msgctxt "s2member-admin"
2991
  msgid "Invalid form configuration. Invalid \"rr, tp\" attributes. The \"rr\" ( Regular Recurring ) attribute is \"BN\" ( Buy Now ), and \"tp\" ( Trial Period ) is not \"0\"."
2992
  msgstr ""
2993
 
2994
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:493
2995
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:580
2996
  msgctxt "s2member-admin"
2997
  msgid "Invalid form configuration. Invalid \"level, rr\" attributes. The \"level\" ( Level ) attribute is \"*\" for ( Independent Custom Capabilities ), and \"rr\" is not \"BN\" ( Buy Now )."
2998
  msgstr ""
2999
 
3000
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:496
3001
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:583
3002
  msgctxt "s2member-admin"
3003
  msgid "Invalid form configuration. Invalid \"ta, tp, tt\" attributes. Trial Period. When provided, these cannot be exactly the same as your \"ra, rp, rt\" attributes."
3004
  msgstr ""
3005
 
3006
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:499
3007
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:586
3008
+ msgctxt "s2member-admin"
3009
+ msgid "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times ( fixed ). When provided, must be numeric."
 
 
 
 
 
 
 
 
3010
  msgstr ""
3011
 
3012
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:502
3013
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:589
 
 
 
 
3014
  msgctxt "s2member-admin"
3015
+ msgid "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times ( fixed ). When provided, must be >= 1."
3016
  msgstr ""
3017
 
3018
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:505
3019
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:592
3020
+ msgctxt "s2member-admin"
3021
+ msgid "Invalid form configuration. Invalid \"rr, rrt\" attributes. When \"rrt\" ( Recurring Times ) is provided, \"rr\" ( Regular Recurring ) must be 1."
 
 
 
 
3022
  msgstr ""
3023
 
3024
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:533
3025
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:584
3026
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:629
3027
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:683
3028
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:773
3029
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:626
3030
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:677
3031
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:722
3032
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:776
3033
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:866
3034
  msgctxt "s2member-front"
3035
+ msgid "Missing or invalid Security Code. Please try again."
3036
  msgstr ""
3037
 
3038
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:536
3039
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:545
3040
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:695
3041
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:629
3042
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:638
3043
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:788
3044
+ msgctxt "s2member-admin"
3045
+ msgid "Unable to process. You are an Administrator. Stopping here for security. Otherwise, an Administrator could lose access."
 
3046
  msgstr ""
3047
 
3048
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:548
3049
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:647
3050
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:737
3051
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:641
3052
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:740
3053
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:830
3054
  msgctxt "s2member-front"
3055
+ msgid "Missing Card Type ( Billing Method ). Please try again."
3056
  msgstr ""
3057
 
3058
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:551
3059
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:650
3060
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:740
3061
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:644
3062
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:743
3063
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:833
3064
  msgctxt "s2member-front"
3065
+ msgid "Invalid Card Type ( Billing Method ). Please try again."
3066
  msgstr ""
3067
 
3068
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:554
3069
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:653
3070
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:743
3071
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:647
3072
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:746
3073
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:836
3074
  msgctxt "s2member-front"
3075
+ msgid "Missing Card Number. Please try again."
3076
  msgstr ""
3077
 
3078
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:557
3079
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:656
3080
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:746
3081
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:650
3082
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:749
3083
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:839
3084
  msgctxt "s2member-front"
3085
+ msgid "Missing Card Expiration Date ( mm/yyyy ). Please try again."
3086
  msgstr ""
3087
 
3088
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:560
3089
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:659
3090
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:749
3091
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:653
3092
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:752
3093
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:842
3094
  msgctxt "s2member-front"
3095
+ msgid "Invalid Card Expiration Date. Must be in this format ( mm/yyyy ). Please try again."
3096
  msgstr ""
3097
 
3098
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:563
3099
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:662
3100
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:752
3101
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:656
3102
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:755
3103
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:845
3104
  msgctxt "s2member-front"
3105
+ msgid "Missing Card Verification Code. It's on the back of your Card. 3-4 digits. Please try again."
3106
  msgstr ""
3107
 
3108
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:566
3109
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:665
3110
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:755
3111
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:659
3112
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:758
3113
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:848
3114
  msgctxt "s2member-front"
3115
+ msgid "Missing Card Start Date, or Issue #. Required for Maestro/Solo. Please try again."
3116
  msgstr ""
3117
 
3118
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:569
3119
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:668
3120
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:758
3121
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:662
3122
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:761
3123
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:851
3124
  msgctxt "s2member-front"
3125
+ msgid "Missing Street Address. Please try again."
3126
  msgstr ""
3127
 
3128
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:572
3129
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:671
3130
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:761
3131
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:665
3132
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:764
3133
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:854
3134
  msgctxt "s2member-front"
3135
+ msgid "Missing City/Town. Please try again."
3136
  msgstr ""
3137
 
3138
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:575
3139
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:674
3140
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:764
3141
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:668
3142
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:767
3143
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:857
3144
  msgctxt "s2member-front"
3145
+ msgid "Missing State/Province. Please try again."
3146
  msgstr ""
3147
 
3148
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:578
3149
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:677
3150
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:767
3151
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:671
3152
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:770
3153
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:860
3154
  msgctxt "s2member-front"
3155
+ msgid "Missing Country. Please try again."
3156
  msgstr ""
3157
 
3158
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:581
3159
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:680
3160
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:770
3161
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:674
3162
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:773
3163
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:863
3164
  msgctxt "s2member-front"
3165
+ msgid "Missing Postal/Zip Code. Please try again."
3166
  msgstr ""
3167
 
3168
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:590
3169
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:635
3170
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:698
3171
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:683
3172
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:728
3173
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:791
3174
  msgctxt "s2member-front"
3175
+ msgid "Missing First Name. Please try again."
3176
  msgstr ""
3177
 
3178
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:593
3179
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:638
3180
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:701
3181
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:686
3182
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:731
3183
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:794
3184
  msgctxt "s2member-front"
3185
+ msgid "Missing Last Name. Please try again."
3186
  msgstr ""
3187
 
3188
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:596
3189
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:641
3190
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:704
3191
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:689
3192
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:734
3193
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:797
3194
  msgctxt "s2member-front"
3195
+ msgid "Missing or invalid Email Address. Please try again."
3196
  msgstr ""
3197
 
3198
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:599
3199
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:644
3200
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:707
3201
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:692
3202
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:737
3203
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:800
3204
  msgctxt "s2member-front"
3205
+ msgid "Invalid Email Address. Please try again."
3206
  msgstr ""
3207
 
3208
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:602
3209
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:710
3210
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:695
3211
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:803
3212
  msgctxt "s2member-front"
3213
+ msgid "That Email Address is already in use. Please try again."
3214
+ msgstr ""
3215
+
3216
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:605
3217
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:713
3218
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:698
3219
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:806
3220
+ msgctxt "s2member-front"
3221
+ msgid "Missing or invalid Username. Please try again."
3222
  msgstr ""
3223
 
3224
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:608
3225
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:716
3226
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:701
3227
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:809
3228
  msgctxt "s2member-front"
3229
+ msgid "Invalid Username. Please try again. Use ONLY lowercase alphanumerics."
3230
  msgstr ""
3231
 
3232
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:611
3233
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:719
3234
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:704
3235
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:812
3236
+ msgctxt "s2member-front"
3237
+ msgid "That Username is already in use. Please try again."
3238
+ msgstr ""
3239
+
3240
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:617
3241
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:725
3242
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:710
3243
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:818
3244
+ msgctxt "s2member-front"
3245
+ msgid "Missing Password. Please try again."
3246
+ msgstr ""
3247
+
3248
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:620
3249
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:728
3250
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:713
3251
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:821
3252
  msgctxt "s2member-front"
3253
  msgid "Invalid Password. Must be at least 6 characters. Please try again."
3254
  msgstr ""
3255
 
3256
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:623
3257
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:731
3258
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:716
3259
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:824
3260
  msgctxt "s2member-front"
3261
  msgid "Invalid Password. Max length is 20 characters. Please try again."
3262
  msgstr ""
3263
 
3264
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:626
3265
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:734
3266
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:719
3267
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:827
3268
  msgctxt "s2member-front"
3269
  msgid "Password fields do NOT match. Please try again."
3270
  msgstr ""
3271
 
3272
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:689
3273
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:782
3274
  msgctxt "s2member-front"
3275
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to modify your billing plan."
3276
  msgstr ""
3277
 
3278
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:692
3279
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:785
3280
  msgctxt "s2member-front"
3281
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> before making this purchase."
3282
  msgstr ""
3283
 
3284
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:776
3285
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:869
3286
  msgctxt "s2member-front"
3287
  msgid "Unknown form submission type. Please contact Support."
3288
  msgstr ""
3301
 
3302
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:107
3303
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:112
3304
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:115
3305
  msgctxt "s2member-front"
3306
  msgid "<strong>Confirmed.</strong> Your billing information has been updated."
3307
  msgstr ""
3308
 
3309
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:119
3310
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:128
3311
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:131
3312
  msgctxt "s2member-front"
3313
  msgid "<strong>Unable to update.</strong> You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance."
3314
  msgstr ""
3319
  msgid "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
3320
  msgstr ""
3321
 
3322
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:650
3323
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:793
3324
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:271
3325
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:414
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3326
  msgctxt "s2member-front percentage-symbol"
3327
  msgid "%"
3328
  msgstr ""
3329
 
3330
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:792
3331
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:413
3332
  msgctxt "s2member-front"
3333
  msgid " + tax"
3334
  msgstr ""
3335
 
3336
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:837
3337
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:889
3338
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:902
3339
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:924
3340
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:984
3341
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:999
3342
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:458
3343
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:510
3344
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:523
3345
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:545
3346
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:605
3347
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:620
3348
+ msgctxt "s2member-front"
3349
+ msgid "COUPON %s off. ( Now: %s )"
3350
+ msgstr ""
3351
+
3352
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:838
3353
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:890
3354
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:903
3355
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:925
3356
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:985
3357
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1000
3358
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:459
3359
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:511
3360
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:524
3361
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:546
3362
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:606
3363
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:621
3364
  msgctxt "s2member-front"
3365
+ msgid "<div>Coupon: <strong>%s off</strong>. ( Now: <strong>%s</strong> )</div>"
3366
  msgstr ""
3367
 
3368
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:850
3369
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:863
3370
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:876
3371
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:939
3372
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:954
3373
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:969
3374
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:471
3375
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:484
3376
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:497
3377
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:560
3378
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:575
3379
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:590
3380
  msgctxt "s2member-front"
3381
+ msgid "COUPON %s off. ( Now: %s, then %s )"
3382
  msgstr ""
3383
 
3384
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:851
3387
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:940
3388
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:955
3389
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:970
3390
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:472
3391
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:485
3392
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:498
3393
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:561
3394
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:576
3395
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:591
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3396
  msgctxt "s2member-front"
3397
  msgid "<div>Coupon: <strong>%s off</strong>. ( Now: <strong>%s, then %s</strong> )</div>"
3398
  msgstr ""
3399
 
3400
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:907
3401
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1004
3402
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:528
3403
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:625
3404
  msgctxt "s2member-front"
3405
  msgid "<div>Sorry, your Coupon is not applicable.</div>"
3406
  msgstr ""
3407
 
3408
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1008
3409
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:629
3410
  msgctxt "s2member-front"
3411
  msgid "<div>Coupon: <strong>%s0.00 off</strong>.</div>"
3412
  msgstr ""
3413
 
3414
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1012
3415
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:633
3416
  msgctxt "s2member-front"
3417
  msgid "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
3418
  msgstr ""
3419
 
3420
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1016
3421
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:637
3422
  msgctxt "s2member-front"
3423
  msgid "<div>Sorry, your Coupon <strong>expired</strong>: <em>%s</em>.</div>"
3424
  msgstr ""
3426
  #. translators: `%1$s` is new price/description, after coupon applied. `%2$s`
3427
  #. is original description.
3428
 
3429
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1022
3430
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:643
3431
  msgctxt "s2member-front"
3432
  msgid "%1$s ~ ORIGINALLY: %2$s"
3433
  msgstr ""
3434
 
3435
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1050
3436
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1054
3437
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:671
3438
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:675
3439
  msgctxt "s2member-front"
3440
  msgid "<div>Sorry, your Coupon is N/A, invalid or expired.</div>"
3441
  msgstr ""
3541
  msgstr ""
3542
 
3543
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:122
3544
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:119
3545
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:252
3546
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:270
3547
  msgctxt "s2member-front"
3548
  msgid "<strong>Unable to cancel at this time.</strong> Your account is pending other changes. Please try again in 15 minutes."
3549
  msgstr ""
3550
 
3551
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:134
3552
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:131
3553
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:263
3554
  msgctxt "s2member-front"
3555
  msgid "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal®</a> to cancel your Subscription."
3556
  msgstr ""
3557
 
3558
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:301
3559
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:624
3560
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:344
3561
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:674
3562
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:437
3563
  #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:860
3564
  msgctxt "s2member-front"
3605
  msgid "PayPal® configuration error. Your PayPal® API Signature is not yet configured."
3606
  msgstr ""
3607
 
3608
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:291
3609
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:305
3610
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:308
3611
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:76
3612
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:132
3613
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:136
3614
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:76
3615
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:135
3616
  msgctxt "s2member-front"
3617
  msgid "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal®</a> to update your billing information."
3618
  msgstr ""
3619
 
3620
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:294
3621
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:315
3622
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:124
3623
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:127
3624
  msgctxt "s2member-front"
3625
  msgid "<strong>Unable to update at this time.</strong> Your account is pending other changes. Please try again in 15 minutes."
3626
  msgstr ""
3627
 
3628
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:394
3629
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:463
3630
  msgctxt "s2member-admin"
3631
  msgid "Invalid form configuration. Missing \"dg\" attribute. Digital indicator. Must be numeric [0-1]."
3632
  msgstr ""
3633
 
3634
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:397
3635
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:466
3636
  msgctxt "s2member-admin"
3637
  msgid "Invalid form configuration. Invalid \"dg\" attribute. Digital indicator. Must be numeric [0-1]."
3638
  msgstr ""
3639
 
3640
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:400
3641
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:469
3642
  msgctxt "s2member-admin"
3643
  msgid "Invalid form configuration. Missing \"ns\" attribute. Shipping configuration. Must be numeric [0-2]."
3644
  msgstr ""
3645
 
3646
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:403
3647
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:472
3648
  msgctxt "s2member-admin"
3649
  msgid "Invalid form configuration. Invalid \"ns\" attribute. Shipping configuration. Must be numeric [0-2]."
3650
  msgstr ""
3651
 
3652
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:406
3653
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:475
3654
  msgctxt "s2member-admin"
3655
  msgid "Invalid form configuration. Invalid \"ns\" attribute. Shipping configuration. Must be 1 with \"dg\" ( digital ) items."
3656
  msgstr ""
3657
 
3658
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:409
3659
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:478
3660
  msgctxt "s2member-admin"
3661
  msgid "Invalid form configuration. Invalid \"lc\" attribute. Locale Code. When provided, must be a 2 character country code."
3662
  msgstr ""
3663
 
3664
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:538
 
 
 
 
 
 
 
 
 
 
3665
  msgctxt "s2member-admin"
3666
+ msgid "Invalid Payflow® form configuration. Invalid \"rt, rp, rr\" attributes. Payflow® supports a specific set of recurring intervals. Pro Forms can be configured to charge: daily, weekly, bi-weekly, monthly, quarterly, or yearly. Any other combination results in this error. This is a Payflow® limitation. Note that Payflow® does NOT support bi-monthly billing."
3667
  msgstr ""
3668
 
3669
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:595
3670
  msgctxt "s2member-admin"
3671
  msgid "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr\" ( Regular Recurring ) is 0 or 1, \"rra\" ( Recurring Retry Attempts ) must be numeric."
3672
  msgstr ""
3673
 
3674
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:598
3675
  msgctxt "s2member-admin"
3676
  msgid "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr\" ( Regular Recurring ) is 0 or 1, \"rra\" ( Recurring Retry Attempts ) must be >= 0."
3677
  msgstr ""
3678
 
3679
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:141
3680
+ msgctxt "s2member-front"
3681
+ msgid "<strong>No Subscr. ID.</strong> Please contact Support for assistance."
3682
+ msgstr ""
3683
+
3684
  #: s2member-pro/includes/classes/login-widget.inc.php:123
3685
  msgctxt "s2member-front"
3686
  msgid "Password"
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 120309
4
- Stable tag: 120309
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.3.1
20
  Requires at least: 3.2
21
 
22
  Copyright: © 2009 WebSharks, Inc.
@@ -85,11 +85,20 @@ Please see [this FAQ entry](http://www.s2member.com/faqs/#s2-faqs-translations)
85
 
86
  == Upgrade Notice ==
87
 
88
- = v120309 =
89
- Upgrade immediately.
90
 
91
  == Changelog ==
92
 
 
 
 
 
 
 
 
 
 
93
  = v120309 =
94
  * (s2Member Pro) **ccBill® Cancellations**. It's now possible for s2Member to pull ccBill® "cancellation" events, from the ccBill® DataLink Service Suite. For further details and configuration options, please check this section of your Dashboard: `s2Member -> ccBill Options -> DataLink Integration`.
95
  * (s2Member/s2Member Pro) **Bug fix**. Some PHP installations running in safe mode were experiencing `400 Bad Request` errors whenever s2Member's Amazon® CloudFront configuration routines for file downloads were processed. Fixed in this release.
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 120514
4
+ Stable tag: 120514
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.3.2
20
  Requires at least: 3.2
21
 
22
  Copyright: © 2009 WebSharks, Inc.
85
 
86
  == Upgrade Notice ==
87
 
88
+ = v120514 =
89
+ Maintenance release. Upgrade immediately.
90
 
91
  == Changelog ==
92
 
93
+ = v120514 =
94
+ * **(Maintenance Release) Upgrade immediately.**
95
+ * (s2Member Pro) **Payflow® API Support**. s2Member® Pro now supports PayPal® Pro accounts operating with the Payflow® edition. It is now possible to process recurring payments through newer PayPal® Pro accounts (e.g. those which may use the new Payflow® API for recurring billing). Please note, this feature should ONLY be used by site owners with a brand new PayPal® Pro account, which has Recurring Billing service enabled under the Payflow® edition. Site owners with existing PayPal® Pro accounts are NOT impacted by this feature, nor should they attempt to use this feature. For further details, please check your Dashboard under: `s2Member® -> PayPal® Options -> Payflow® Account Details`.
96
+ * (s2Member Pro) **Authorize.Net® Shortcode Attribute**. A new Shortcode Attribute `rrt=""`, is available for Authorize.Net® Pro Forms. For further details, please check your Dashboard under: `s2Member® -> Authorize.Net® Forms -> Shortcode Attributes (Explained)`.
97
+ * (s2Member Pro) **Authorize.Net® Bug Fix**. Transactions were sometimes failing due to character length restrictions imposed by the Authorize.Net® API. Fixed in this release. Please see [this thread](http://www.s2member.com/forums/topic/customer-charged-but-not-given-access/#post-13454) for further details.
98
+ * (s2Member/s2Member Pro) **Remote Request Hook**. A few developers requested this. A new WordPress® Hook was added to s2Member's remote connection routine. Search s2Member's source code for Hook name: `ws_plugin__s2member_before_wp_remote_request`.
99
+ * (s2Member Framework) **PayPal® Buttons**. Restrictions limiting the number of days/weeks/months/years allowed in recurring periods for a PayPal® Button have been increased. Max days was increased from `7` to `90`, weeks remains at `52` max, months is up from `12` to `24` max; years increased from `1`, up to `5` years max. This change impacts PayPal® Standard Buttons only, and does NOT affect Pro Forms, which operate on restrictions imposed by the PayPal® Pro API (and these are slightly different).
100
+ * (s2Member/s2Member Pro) **JW Player® Code Samples**. Updated code samples for JW Player®. For further details, please check your Dashboard under: `s2Member® -> Download Options -> JW Player® Code Samples`.
101
+
102
  = v120309 =
103
  * (s2Member Pro) **ccBill® Cancellations**. It's now possible for s2Member to pull ccBill® "cancellation" events, from the ccBill® DataLink Service Suite. For further details and configuration options, please check this section of your Dashboard: `s2Member -> ccBill Options -> DataLink Integration`.
104
  * (s2Member/s2Member Pro) **Bug fix**. Some PHP installations running in safe mode were experiencing `400 Bad Request` errors whenever s2Member's Amazon® CloudFront configuration routines for file downloads were processed. Fixed in this release.
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 120309
23
- Stable tag: 120309
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.3.1
39
  Requires at least: 3.2
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", "120309" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
@@ -85,7 +85,7 @@ if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
85
  * @var str
86
  */
87
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION"))
88
- define("WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION", "5.2.3" /* !#php-requires-at-least-version#! */);
89
  /**
90
  * Minimum WordPress® version required to run s2Member.
91
  *
@@ -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", "120309" /* !#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: 120514
23
+ Stable tag: 120514
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.3.2
39
  Requires at least: 3.2
40
 
41
  Copyright: © 2009 WebSharks, Inc.
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
+ define("WS_PLUGIN__S2MEMBER_VERSION", "120514" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
85
  * @var str
86
  */
87
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION"))
88
+ define("WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION", "5.2" /* !#php-requires-at-least-version#! */);
89
  /**
90
  * Minimum WordPress® version required to run s2Member.
91
  *
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
+ define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "120514" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.