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

Version Description

= v140520 =

(Maintenance Release) Upgrade immediately!

Download this release

Release Info

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

Code changes from version 140423 to 140520

checksum.txt CHANGED
@@ -1 +1 @@
1
- 2901368de4b8eaf96fc4f5d0dcd5451c
1
+ 8ff3c403b6da2ebb6c3e93dafb2f9314
includes/classes/access-cap-times.inc.php ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Access CAP Times.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\CCAPS
15
+ * @since 140514
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_access_cap_times'))
21
+ {
22
+ /**
23
+ * Access CAP Times.
24
+ *
25
+ * @package s2Member\CCAPS
26
+ * @since 140514
27
+ */
28
+ class c_ws_plugin__s2member_access_cap_times
29
+ {
30
+
31
+ /**
32
+ * @var array Previous array of user CAPS.
33
+ * For internal use only.
34
+ */
35
+ protected static $prev_caps_by_user = array();
36
+
37
+ /**
38
+ * Get user caps before udpate.
39
+ *
40
+ * @package s2Member\CCAPS
41
+ * @since 140514
42
+ *
43
+ * @attaches-to ``add_action('add_user_meta')`` (indirectly)
44
+ * @attaches-to ``add_action('update_user_meta')``
45
+ *
46
+ * @param integer $meta_id Meta row ID in database.
47
+ * @param integer $object_id User ID.
48
+ * @param string $meta_key Meta key.
49
+ * @param mixed $meta_value Meta value.
50
+ */
51
+ public static function get_user_caps_before_update($meta_id, $object_id, $meta_key, $meta_value)
52
+ {
53
+ $wpdb = $GLOBALS['wpdb'];
54
+ /** @var $wpdb \wpdb For IDEs. */
55
+
56
+ if(strpos($meta_key, 'capabilities') === FALSE || $meta_key !== $wpdb->get_blog_prefix().'capabilities')
57
+ return; // Not updating caps.
58
+
59
+ $user_id = (integer)$object_id;
60
+ $user = new WP_User($user_id);
61
+ if(!$user->ID || !$user->exists())
62
+ return; // Not a valid user.
63
+
64
+ self::$prev_caps_by_user[$user_id] = $user->caps;
65
+ }
66
+
67
+ /**
68
+ * Get user caps before udpate.
69
+ *
70
+ * @package s2Member\CCAPS
71
+ * @since 140514
72
+ *
73
+ * @attaches-to ``add_action('add_user_meta')``
74
+ *
75
+ * @param integer $object_id User ID.
76
+ * @param string $meta_key Meta key.
77
+ * @param mixed $meta_value Meta value.
78
+ */
79
+ public static function get_user_caps_before_update_on_add($object_id, $meta_key, $meta_value)
80
+ {
81
+ self::get_user_caps_before_update(0, $object_id, $meta_key, $meta_value);
82
+ }
83
+
84
+ /**
85
+ * Logs access capability times.
86
+ *
87
+ * @package s2Member\CCAPS
88
+ * @since 140514
89
+ *
90
+ * @attaches-to ``add_action('added_user_meta')``
91
+ * @attaches-to ``add_action('updated_user_meta')``
92
+ * @attaches-to ``add_action('deleted_user_meta')`` (indirectly)
93
+ *
94
+ * @param integer $meta_id Meta row ID in database.
95
+ * @param integer $object_id User ID.
96
+ * @param string $meta_key Meta key.
97
+ * @param mixed $meta_value Meta value.
98
+ */
99
+ public static function log_access_cap_times($meta_id, $object_id, $meta_key, $meta_value)
100
+ {
101
+ $wpdb = $GLOBALS['wpdb'];
102
+ /** @var $wpdb \wpdb For IDEs. */
103
+
104
+ if(strpos($meta_key, 'capabilities') === FALSE || $meta_key !== $wpdb->get_blog_prefix().'capabilities')
105
+ return; // Not updating caps.
106
+
107
+ $user_id = (integer)$object_id;
108
+ $user = new WP_User($user_id);
109
+ if(!$user->ID || !$user->exists())
110
+ return; // Not a valid user.
111
+
112
+ $caps['prev'] = !empty(self::$prev_caps_by_user[$user_id]) ? self::$prev_caps_by_user[$user_id] : array();
113
+ self::$prev_caps_by_user = array(); // Reset this in case `get_user_caps_before_update()` doesn't run somehow.
114
+ $caps['now'] = is_array($meta_value) ? $meta_value : array();
115
+ $role_objects = $GLOBALS['wp_roles']->role_objects;
116
+
117
+ foreach($caps as &$_caps_prev_now)
118
+ {
119
+ foreach(array_intersect(array_keys($_caps_prev_now), array_keys($role_objects)) as $_role)
120
+ if($_caps_prev_now[$_role]) // If the cap (i.e. the role) is enabled; merge its caps.
121
+ $_caps_prev_now = array_merge($_caps_prev_now, $role_objects[$_role]->capabilities);
122
+
123
+ $_s2_caps_prev_now = array();
124
+ foreach($_caps_prev_now as $_cap => $_enabled)
125
+ if(strpos($_cap, 'access_s2member_') === 0)
126
+ $_s2_caps_prev_now[substr($_cap, 16)] = $_enabled;
127
+ $_caps_prev_now = $_s2_caps_prev_now;
128
+ }
129
+ unset($_s2_caps_prev_now, $_caps_prev_now, $_role, $_cap, $_enabled);
130
+
131
+ $ac_times = get_user_option('s2member_access_cap_times', $user_id);
132
+ if(!is_array($ac_times)) $ac_times = array();
133
+ $time = (float)time();
134
+
135
+ foreach($caps['prev'] as $_cap => $_was_enabled)
136
+ if($_was_enabled && empty($caps['now'][$_cap]))
137
+ $ac_times[number_format(($time += .0001), 4, '.', '')] = '-'.$_cap;
138
+ unset($_cap, $_was_enabled);
139
+
140
+ foreach($caps['now'] as $_cap => $_now_enabled)
141
+ if($_now_enabled && empty($caps['prev'][$_cap]))
142
+ $ac_times[number_format(($time += .0001), 4, '.', '')] = $_cap;
143
+ unset($_cap, $_now_enabled);
144
+
145
+ update_user_option($user_id, 's2member_access_cap_times', $ac_times);
146
+ }
147
+
148
+ /**
149
+ * Logs access capability times.
150
+ *
151
+ * @package s2Member\CCAPS
152
+ * @since 140514
153
+ *
154
+ * @attaches-to ``add_action('deleted_user_meta')``
155
+ *
156
+ * @param array $meta_ids Meta row ID in database.
157
+ * @param integer $object_id User ID.
158
+ * @param string $meta_key Meta key.
159
+ */
160
+ public static function log_access_cap_times_on_delete($meta_ids, $object_id, $meta_key)
161
+ {
162
+ $wpdb = $GLOBALS['wpdb'];
163
+ /** @var $wpdb \wpdb For IDEs. */
164
+
165
+ if(strpos($meta_key, 'capabilities') === FALSE || $meta_key !== $wpdb->get_blog_prefix().'capabilities')
166
+ return; // Not updating caps.
167
+
168
+ if(!is_array($meta_ids) || !$meta_ids)
169
+ return; // Nothing to do.
170
+
171
+ if(count($meta_ids) > 50)
172
+ if(function_exists('set_time_limit'))
173
+ @set_time_limit(900);
174
+
175
+ $user_ids = $wpdb->get_col("SELECT DISTINCT `user_id` FROM `".$wpdb->usermeta."` WHERE `umeta_id` IN('".implode("','", $meta_ids)."')");
176
+
177
+ if(count($user_ids) > 50)
178
+ if(function_exists('set_time_limit'))
179
+ @set_time_limit(900);
180
+
181
+ foreach($user_ids as $_user_id)
182
+ self::log_access_cap_times(0, $_user_id, $meta_key, array());
183
+ unset($_user_id);
184
+ }
185
+
186
+ /**
187
+ * Gets access capability times.
188
+ *
189
+ * @package s2Member\CCAPS
190
+ * @since 140514
191
+ *
192
+ * @param integer $user_id WP User ID.
193
+ * @param array $access_caps Optional. If not passed, this returns all times for all caps.
194
+ * If passed, please pass an array of specific access capabilities to get the times for.
195
+ * If removal times are desired, you should add a `-` prefix.
196
+ * e.g. `array('ccap_music','level2','-ccap_video')`
197
+ *
198
+ * @return array An array of all access capability times.
199
+ * Keys are UTC timestamps (w/ microtime precision), values are the capabilities (including `-` prefixed removals).
200
+ * e.g. `array('1234567890.0001' => 'ccap_music', '1234567890.0002' => 'level2', '1234567890.0003' => '-ccap_video')`
201
+ */
202
+ public static function get_access_cap_times($user_id, $access_caps = array())
203
+ {
204
+ $ac_times = array();
205
+ if(($user_id = (integer)$user_id))
206
+ {
207
+ $ac_times = get_user_option('s2member_access_cap_times', $user_id);
208
+ if(!is_array($ac_times)) $ac_times = array();
209
+
210
+ /* ------- Begin back compat. with `s2member_paid_registration_times`. */
211
+
212
+ // $update_ac_times = empty($ac_times) ? FALSE : TRUE;
213
+ $ac_times_min = !empty($ac_times) ? min(array_keys($ac_times)) : 0;
214
+ if(($r_time = c_ws_plugin__s2member_registration_times::registration_time()) && (empty($ac_times_min) || $r_time < $ac_times_min))
215
+ $ac_times[number_format(($r_time += .0001), 4, '.', '')] = 'level0';
216
+
217
+ if(is_array($pr_times = get_user_option('s2member_paid_registration_times', $user_id)))
218
+ {
219
+ $role_objects = $GLOBALS['wp_roles']->role_objects;
220
+ foreach($pr_times as $_level => $_time)
221
+ if(isset($role_objects['s2member_'.$_level]) && (empty($ac_times_min) || $_time < $ac_times_min))
222
+ foreach(array_keys($role_objects['s2member_'.$_level]->capabilities) as $_cap)
223
+ if(strpos($_cap, 'access_s2member_') === 0)
224
+ $ac_times[number_format(($_time += .0001), 4, '.', '')] = substr($_cap, 16);
225
+ unset($_level, $_time, $_cap);
226
+ }
227
+ /* ------- End back compat. with `s2member_paid_registration_times`. */
228
+
229
+ if($access_caps)
230
+ $ac_times = array_intersect($ac_times, (array)$access_caps);
231
+
232
+ ksort($ac_times, SORT_NUMERIC);
233
+
234
+ //if($update_ac_times)
235
+ // update_user_option($user_id, 's2member_access_cap_times', $ac_times);
236
+ }
237
+ return apply_filters('ws_plugin__s2member_get_access_cap_times', $ac_times, get_defined_vars());
238
+ }
239
+ }
240
+ }
includes/classes/custom-reg-fields.inc.php CHANGED
@@ -274,12 +274,13 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
274
  * @package s2Member\Custom_Reg_Fields
275
  * @since 3.5
276
  *
277
- * @param str|int $_level Optional. Defaults to the current User's Access Level number.
278
  * You can either pass in a numeric Level number, or the string `auto-detection`.
279
- * @param str $_editable_context Optional. One of `profile|profile-view|registration`.
 
280
  * @return array Array of Custom Field IDs applicable.
281
  */
282
- public static function custom_fields_configured_at_level($_level = "auto-detection", $_editable_context = FALSE)
283
  {
284
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
285
  do_action("ws_plugin__s2member_before_custom_fields_configured_at_level", get_defined_vars());
@@ -296,7 +297,7 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
296
  foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
297
  if($level === "any" || $field["levels"] === "all" || in_array($level, preg_split("/[;,]+/", preg_replace("/[^0-9;,]/", "", $field["levels"]))))
298
  if(empty($_editable_context) || $_editable_context === "administrative" || ($_editable_context === "registration" && $field["editable"] !== "no-always-invisible" && $field["editable"] !== "yes-invisible") || (($_editable_context === "profile" || $_editable_context === "profile-view") && $field["editable"] !== "no-invisible" && $field["editable"] !== "no-always-invisible"))
299
- $configured[] = /* Add this to the array. */ $field["id"];
300
  }
301
  return apply_filters("ws_plugin__s2member_custom_fields_configured_at_level", ((!empty($configured)) ? $configured : array()), get_defined_vars());
302
  }
@@ -558,6 +559,244 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
558
 
559
  return /* Return for uniformity. */;
560
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
561
  }
562
- }
563
- ?>
274
  * @package s2Member\Custom_Reg_Fields
275
  * @since 3.5
276
  *
277
+ * @param string|int $_level Optional. Defaults to the current User's Access Level number.
278
  * You can either pass in a numeric Level number, or the string `auto-detection`.
279
+ * @param string $_editable_context Optional. One of `profile|profile-view|registration`.
280
+ * @param boolean $full_config Optional. Defaults to a `FALSE` value. `TRUE` to get a full array for each field configuration.
281
  * @return array Array of Custom Field IDs applicable.
282
  */
283
+ public static function custom_fields_configured_at_level($_level = "auto-detection", $_editable_context = FALSE, $full_config = FALSE)
284
  {
285
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
286
  do_action("ws_plugin__s2member_before_custom_fields_configured_at_level", get_defined_vars());
297
  foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
298
  if($level === "any" || $field["levels"] === "all" || in_array($level, preg_split("/[;,]+/", preg_replace("/[^0-9;,]/", "", $field["levels"]))))
299
  if(empty($_editable_context) || $_editable_context === "administrative" || ($_editable_context === "registration" && $field["editable"] !== "no-always-invisible" && $field["editable"] !== "yes-invisible") || (($_editable_context === "profile" || $_editable_context === "profile-view") && $field["editable"] !== "no-invisible" && $field["editable"] !== "no-always-invisible"))
300
+ $configured[] = /* Add this to the array. */ $full_config ? $field : $field["id"];
301
  }
302
  return apply_filters("ws_plugin__s2member_custom_fields_configured_at_level", ((!empty($configured)) ? $configured : array()), get_defined_vars());
303
  }
559
 
560
  return /* Return for uniformity. */;
561
  }
562
+
563
+ /**
564
+ * Validates custom registration/profile fields.
565
+ *
566
+ * @param array $input Array of data input by a user.
567
+ * Array keys should match custom registration field variable names.
568
+ *
569
+ * @param array $fields_to_validate An array of custom registration/profile field configurations.
570
+ * Only include the configurations for those fields that need to be validated against the `$input`.
571
+ *
572
+ * @return array An array of errors; else an empty array.
573
+ * If there are errors, the array keys are the custom registration field variable names.
574
+ * Each array value is an error message with basic HTML markup.
575
+ */
576
+ public static function validation_errors($input, $fields_to_validate)
577
+ {
578
+ $input = (array)$input;
579
+ $fields_to_validate = (array)$fields_to_validate;
580
+
581
+ $errors = array(); // Initialize the array of errors.
582
+ $force_personal_emails = isset($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_force_personal_emails'][0]) ? TRUE : FALSE;
583
+ $non_personal_email_users = '/^(?:'.implode('|', preg_split('/[\s;,]+/', preg_quote($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_force_personal_emails'], '/'))).'@/i';
584
+
585
+ foreach($fields_to_validate as $_field)
586
+ {
587
+ if(empty($_field['id'])) continue; // Not applicable.
588
+ $_field_type = !empty($_field['type']) ? $_field['type'] : '';
589
+ $_field_var = preg_replace('/[^a-z0-9]/i', '_', strtolower($_field['id']));
590
+ $_field_id_class = preg_replace('/_/', '-', $_field_var);
591
+
592
+ $_field_required = !empty($_field['required']) && $_field['required'] === 'yes';
593
+ $_field_expects = !empty($_field['expected']) ? $_field['expected'] : '';
594
+ $_field_label = !empty($_field['label']) ? $_field['label'] : ucwords(str_replace('_', ' ', $_field_var));
595
+
596
+ switch($_field_type)
597
+ {
598
+ case 'text':
599
+ case 'textarea':
600
+ case 'checkbox':
601
+ case 'pre_checkbox':
602
+ case 'radios':
603
+ case 'select':
604
+ if(isset($input[$_field_var]) && !is_string($input[$_field_var]))
605
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Invalid data type. Expecting a string.', 's2member-front', 's2member').'</em>';
606
+ break;
607
+
608
+ case 'checkboxes':
609
+ case 'selects':
610
+ if(isset($input[$_field_var]) && !is_array($input[$_field_var]))
611
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Invalid data type. Expecting an array.', 's2member-front', 's2member').'</em>';
612
+ break;
613
+
614
+ default: // Default case handler for best security.
615
+ if(isset($input[$_field_var]) && !is_string($input[$_field_var]))
616
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Invalid data type. Expecting a string.', 's2member-front', 's2member').'</em>';
617
+ break;
618
+ }
619
+ if(empty($errors[$_field_var]) && $_field_required) switch($_field_type)
620
+ {
621
+ case 'text':
622
+ case 'textarea':
623
+ if(!isset($input[$_field_var]) || !is_string($input[$_field_var]) || !isset($input[$_field_var][0]))
624
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('This is a required field, please try again.', 's2member-front', 's2member').'</em>';
625
+ break;
626
+
627
+ case 'checkbox':
628
+ case 'pre_checkbox':
629
+ if(!isset($input[$_field_var]) || !is_string($input[$_field_var]) || !isset($input[$_field_var][0]))
630
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Required. This box must be checked.', 's2member-front', 's2member').'</em>';
631
+ break;
632
+
633
+ case 'checkboxes':
634
+ if(!isset($input[$_field_var]) || !is_array($input[$_field_var]) || empty($input[$_field_var]))
635
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please check at least one of the boxes.', 's2member-front', 's2member').'</em>';
636
+ break;
637
+
638
+ case 'radios':
639
+ if(!isset($input[$_field_var]) || !is_string($input[$_field_var]))
640
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please select one of the options.', 's2member-front', 's2member').'</em>';
641
+ break;
642
+
643
+ case 'select':
644
+ if(!isset($input[$_field_var]) || !is_string($input[$_field_var]) || !isset($input[$_field_var][0]))
645
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please select one of the options.', 's2member-front', 's2member').'</em>';
646
+ break;
647
+
648
+ case 'selects':
649
+ if(!isset($input[$_field_var]) || !is_array($input[$_field_var]) || empty($input[$_field_var]))
650
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please select at least one of the options.', 's2member-front', 's2member').'</em>';
651
+ break;
652
+
653
+ default: // Default case handler for best security.
654
+ if(!isset($input[$_field_var]) || !is_string($input[$_field_var]) || !isset($input[$_field_var][0]))
655
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('This is a required field, please try again.', 's2member-front', 's2member').'</em>';
656
+ break;
657
+ }
658
+ if(empty($errors[$_field_var]) && $_field_expects) switch($_field_type)
659
+ {
660
+ case 'text':
661
+ case 'textarea':
662
+ if(isset($input[$_field_var]) && is_string($input[$_field_var]) && isset($input[$_field_var][0])) switch($_field_expects)
663
+ {
664
+ case 'numeric-wp-commas':
665
+ if(!preg_match('/^[0-9][0-9\.,]*$/', $input[$_field_var]))
666
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be numeric (with or without decimals, commas allowed).', 's2member-front', 's2member').'</em>';
667
+ break;
668
+
669
+ case 'numeric':
670
+ if(!preg_match('/^[0-9][0-9\.]*$/', $input[$_field_var]))
671
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be numeric (with or without decimals, no commas).', 's2member-front', 's2member').'</em>';
672
+ break;
673
+
674
+ case 'integer':
675
+ if(!preg_match('/^[0-9]+$/', $input[$_field_var]))
676
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be an integer (a whole number, without any decimals).', 's2member-front', 's2member').'</em>';
677
+ break;
678
+
679
+ case 'integer-gt-0':
680
+ if(!preg_match('/^[0-9]+$/', $input[$_field_var]) || $input[$_field_var] <= 0)
681
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be an integer &gt; 0 (whole number, no decimals, greater than 0).', 's2member-front', 's2member').'</em>';
682
+ break;
683
+
684
+ case 'float':
685
+ if(!preg_match('/^[0-9\.]+$/', $input[$_field_var]) || !preg_match('/[0-9]/', $input[$_field_var]) || !preg_match('/\./', $input[$_field_var]))
686
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a float (floating point number, decimals required).', 's2member-front', 's2member').'</em>';
687
+ break;
688
+
689
+ case 'float-gt-0':
690
+ if(!preg_match('/^[0-9\.]+$/', $input[$_field_var]) || !preg_match('/[0-9]/', $input[$_field_var]) || !preg_match('/\./', $input[$_field_var]) || $input[$_field_var] <= 0)
691
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a float &gt; 0 (floating point number, decimals required, greater than 0).', 's2member-front', 's2member').'</em>';
692
+ break;
693
+
694
+ case 'date':
695
+ if(!preg_match('/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/', $input[$_field_var]))
696
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a date (required date format: dd/mm/yyyy).', 's2member-front', 's2member').'</em>';
697
+ break;
698
+
699
+ case 'email':
700
+ if(!is_email($input[$_field_var]))
701
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a valid email address.', 's2member-front', 's2member').'</em>';
702
+
703
+ else if($force_personal_emails && $non_personal_email_users && preg_match($non_personal_email_users, $input[$_field_var]))
704
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'.sprintf(_x('Please use a personal email address. Addresses like &lt;%s@&gt; are problematic.', 's2member-front', 's2member'), substr($input[$_field_var], 0, strpos($input[$_field_var], '@'))).'</em>';
705
+ break;
706
+
707
+ case 'url':
708
+ if(!preg_match('/^https?\:\/\/.+$/i', $input[$_field_var]))
709
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a full URL (starting with http or https).', 's2member-front', 's2member').'</em>';
710
+ break;
711
+
712
+ case 'domain':
713
+ if(!preg_match('/^[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/', $input[$_field_var]))
714
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a domain name (domain name only, without http).', 's2member-front', 's2member').'</em>';
715
+ break;
716
+
717
+ case 'phone':
718
+ if(!preg_match('/^[0-9 ()\-]+$/', $input[$_field_var]) || strlen(preg_replace('/[^0-9]+/', '', $input[$_field_var])) !== 10)
719
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a phone # (10 digits w/possible hyphens, spaces, brackets).', 's2member-front', 's2member').'</em>';
720
+ break;
721
+
722
+ case 'uszip':
723
+ if(!preg_match('/^[0-9]{5}(?:\-[0-9]{4})?$/', $input[$_field_var]))
724
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a US zipcode (5-9 digits w/ possible hyphen).', 's2member-front', 's2member').'</em>';
725
+ break;
726
+
727
+ case 'cazip':
728
+ if(!preg_match('/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i', $input[$_field_var]))
729
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a Canadian zipcode (6 alpha-numerics w/ possible space).', 's2member-front', 's2member').'</em>';
730
+ break;
731
+
732
+ case 'uczip':
733
+ if(!preg_match('/^[0-9]{5}(?:\-[0-9]{4})?$/', $input[$_field_var]) && !preg_match('/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i', $input[$_field_var]))
734
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Must be a zipcode (either a US or Canadian zipcode).', 's2member-front', 's2member').'</em>';
735
+ break;
736
+
737
+ default: // Handle others dynamically here.
738
+
739
+ if(preg_match('/^alphanumerics\-spaces\-punctuation\-[0-9]+(?:\-e)?$/', $_field_expects) && !preg_match('/^[a-z 0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i', $input[$_field_var]))
740
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please use alphanumerics, spaces &amp; punctuation only.', 's2member-front', 's2member').'</em>';
741
+
742
+ else if(preg_match('/^alphanumerics\-spaces\-[0-9]+(?:\-e)?$/', $_field_expects) && !preg_match('/^[a-z 0-9]+$/i', $input[$_field_var]))
743
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please use alphanumerics &amp; spaces only.', 's2member-front', 's2member').'</em>';
744
+
745
+ else if(preg_match('/^alphanumerics\-punctuation\-[0-9]+(?:\-e)?$/', $_field_expects) && !preg_match('/^[a-z0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i', $input[$_field_var]))
746
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please use alphanumerics &amp; punctuation only (no spaces).', 's2member-front', 's2member').'</em>';
747
+
748
+ else if(preg_match('/^alphanumerics\-[0-9]+(?:\-e)?$/', $_field_expects) && !preg_match('/^[a-z0-9]+$/i', $input[$_field_var]))
749
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please use alphanumerics only (no spaces/punctuation).', 's2member-front', 's2member').'</em>';
750
+
751
+ else if(preg_match('/^alphabetics\-[0-9]+(?:\-e)?$/', $_field_expects) && !preg_match('/^[a-z]+$/i', $input[$_field_var]))
752
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please use alphabetics only (no digits/spaces/punctuation).', 's2member-front', 's2member').'</em>';
753
+
754
+ else if(preg_match('/^numerics\-[0-9]+(?:\-e)?$/', $_field_expects) && !preg_match('/^[0-9]+$/i', $input[$_field_var]))
755
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'._x('Please use numeric digits only.', 's2member-front', 's2member').'</em>';
756
+
757
+ else if(preg_match('/^(?:any|alphanumerics\-spaces\-punctuation|alphanumerics\-spaces|alphanumerics\-punctuation|alphanumerics|alphabetics|numerics)\-[0-9]+(?:\-e)?$/', $_field_expects))
758
+ {
759
+ $_field_expects_split = explode('-', $_field_expects);
760
+ $_field_expects_length = (integer)$_field_expects_split[1];
761
+ $_field_expects_exact_length = !empty($_field_expects_split[2]) && $_field_expects_split[2] === 'e';
762
+
763
+ if($_field_expects_exact_length && strlen($input[$_field_var]) !== $_field_expects_length)
764
+ {
765
+ if($_field_expects_split[0] === 'numerics')
766
+ {
767
+ if($_field_expects_length === 1)
768
+ $_field_expects_digits_chars = _x('digit', 's2member-front', 's2member');
769
+ else $_field_expects_digits_chars = _x('digits', 's2member-front', 's2member');
770
+ }
771
+ else if($_field_expects_length === 1)
772
+ $_field_expects_digits_chars = _x('character', 's2member-front', 's2member');
773
+ else $_field_expects_digits_chars = _x('characters', 's2member-front', 's2member');
774
+
775
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'.sprintf(_x('Must be exactly %s %s.', 's2member-front', 's2member'), $_field_expects_length, $_field_expects_digits_chars).'</em>';
776
+ }
777
+ else if(strlen($input[$_field_var]) < $_field_expects_length)
778
+ {
779
+ if($_field_expects_split[0] === 'numerics')
780
+ {
781
+ if($_field_expects_length === 1)
782
+ $_field_expects_digits_chars = _x('digit', 's2member-front', 's2member');
783
+ else $_field_expects_digits_chars = _x('digits', 's2member-front', 's2member');
784
+ }
785
+ else if($_field_expects_length === 1)
786
+ $_field_expects_digits_chars = _x('character', 's2member-front', 's2member');
787
+ else $_field_expects_digits_chars = _x('characters', 's2member-front', 's2member');
788
+
789
+ $errors[$_field_var] = '<strong>'.$_field_label.'</strong><br />&nbsp;&nbsp;<em>'.sprintf(_x('Must be at least %s %s.', 's2member-front', 's2member'), $_field_expects_length, $_field_expects_digits_chars).'</em>';
790
+ }
791
+ }
792
+ break;
793
+ }
794
+ break;
795
+ }
796
+ }
797
+ unset($_field, $_field_type, $_field_var, $_field_id_class, $_field_required, $_field_label, $_field_expects, $_field_expects_split, $_field_expects_length, $_field_expects_exact_length, $_field_expects_digits_chars);
798
+
799
+ return apply_filters('c_ws_plugin__s2member_custom_reg_field_validation_errors', $errors, get_defined_vars());
800
+ }
801
  }
802
+ }
 
includes/classes/profile-mods-4bp-in.inc.php CHANGED
@@ -56,6 +56,7 @@ if (!class_exists ("c_ws_plugin__s2member_profile_mods_4bp_in"))
56
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
57
  if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level ("auto-detection", "profile"))
58
  {
 
59
  $_existing_fields = get_user_option ("s2member_custom_fields", $user_id);
60
 
61
  foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
@@ -70,7 +71,13 @@ if (!class_exists ("c_ws_plugin__s2member_profile_mods_4bp_in"))
70
  else // Else ``unset()``.
71
  unset($fields[$field_var]);
72
  }
73
- else if ($field["required"] === "yes" && (!isset ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) || (!is_array ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && !is_string ($_p["ws_plugin__s2member_profile_4bp_" . $field_var])) || (is_array ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && empty ($_p["ws_plugin__s2member_profile_4bp_" . $field_var])) || (is_string ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && !strlen ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]))))
 
 
 
 
 
 
74
  {
75
  if (isset ($_existing_fields[$field_var]) && ((is_array ($_existing_fields[$field_var]) && !empty ($_existing_fields[$field_var])) || (is_string ($_existing_fields[$field_var]) && strlen ($_existing_fields[$field_var]))))
76
  $fields[$field_var] = $_existing_fields[$field_var];
@@ -79,7 +86,9 @@ if (!class_exists ("c_ws_plugin__s2member_profile_mods_4bp_in"))
79
  }
80
  else if (isset ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]))
81
  {
82
- if ((is_array ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && !empty ($_p["ws_plugin__s2member_profile_4bp_" . $field_var])) || (is_string ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && strlen ($_p["ws_plugin__s2member_profile_4bp_" . $field_var])))
 
 
83
  $fields[$field_var] = $_p["ws_plugin__s2member_profile_4bp_" . $field_var];
84
  else // Else ``unset()``.
85
  unset($fields[$field_var]);
56
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
57
  if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level ("auto-detection", "profile"))
58
  {
59
+ $fields = array(); // Initialize the array of fields.
60
  $_existing_fields = get_user_option ("s2member_custom_fields", $user_id);
61
 
62
  foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
71
  else // Else ``unset()``.
72
  unset($fields[$field_var]);
73
  }
74
+ else if ( // If the field is required but missing; or it was provided but invalid...
75
+ ($field["required"] === "yes" && (!isset ($_p["ws_plugin__s2member_profile_4bp_" . $field_var])
76
+ || (!is_array ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && !is_string ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]))
77
+ || (is_array ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && empty ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]))
78
+ || (is_string ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && !strlen ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]))))
79
+ || (isset ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && c_ws_plugin__s2member_custom_reg_fields::validation_errors(array($field_var => $_p["ws_plugin__s2member_profile_4bp_" . $field_var]), array($field)))
80
+ )
81
  {
82
  if (isset ($_existing_fields[$field_var]) && ((is_array ($_existing_fields[$field_var]) && !empty ($_existing_fields[$field_var])) || (is_string ($_existing_fields[$field_var]) && strlen ($_existing_fields[$field_var]))))
83
  $fields[$field_var] = $_existing_fields[$field_var];
86
  }
87
  else if (isset ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]))
88
  {
89
+ if (((is_array ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && !empty ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]))
90
+ || (is_string ($_p["ws_plugin__s2member_profile_4bp_" . $field_var]) && strlen ($_p["ws_plugin__s2member_profile_4bp_" . $field_var])))
91
+ && !c_ws_plugin__s2member_custom_reg_fields::validation_errors(array($field_var => $_p["ws_plugin__s2member_profile_4bp_" . $field_var]), array($field)))
92
  $fields[$field_var] = $_p["ws_plugin__s2member_profile_4bp_" . $field_var];
93
  else // Else ``unset()``.
94
  unset($fields[$field_var]);
includes/classes/profile-mods-in.inc.php CHANGED
@@ -78,6 +78,7 @@ if (!class_exists ("c_ws_plugin__s2member_profile_mods_in"))
78
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
79
  if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level ("auto-detection", "profile"))
80
  {
 
81
  $_existing_fields = get_user_option ("s2member_custom_fields", $user_id);
82
 
83
  foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
@@ -92,7 +93,13 @@ if (!class_exists ("c_ws_plugin__s2member_profile_mods_in"))
92
  else // Else ``unset()``.
93
  unset($fields[$field_var]);
94
  }
95
- else if ($field["required"] === "yes" && (!isset ($_p["ws_plugin__s2member_profile_" . $field_var]) || (!is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && !is_string ($_p["ws_plugin__s2member_profile_" . $field_var])) || (is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && empty ($_p["ws_plugin__s2member_profile_" . $field_var])) || (is_string ($_p["ws_plugin__s2member_profile_" . $field_var]) && !strlen ($_p["ws_plugin__s2member_profile_" . $field_var]))))
 
 
 
 
 
 
96
  {
97
  if (isset ($_existing_fields[$field_var]) && ((is_array ($_existing_fields[$field_var]) && !empty ($_existing_fields[$field_var])) || (is_string ($_existing_fields[$field_var]) && strlen ($_existing_fields[$field_var]))))
98
  $fields[$field_var] = $_existing_fields[$field_var];
@@ -101,7 +108,9 @@ if (!class_exists ("c_ws_plugin__s2member_profile_mods_in"))
101
  }
102
  else if (isset ($_p["ws_plugin__s2member_profile_" . $field_var]))
103
  {
104
- if ((is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && !empty ($_p["ws_plugin__s2member_profile_" . $field_var])) || (is_string ($_p["ws_plugin__s2member_profile_" . $field_var]) && strlen ($_p["ws_plugin__s2member_profile_" . $field_var])))
 
 
105
  $fields[$field_var] = $_p["ws_plugin__s2member_profile_" . $field_var];
106
  else // Else ``unset()``.
107
  unset($fields[$field_var]);
78
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
79
  if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level ("auto-detection", "profile"))
80
  {
81
+ $fields = array(); // Initialize the array of fields.
82
  $_existing_fields = get_user_option ("s2member_custom_fields", $user_id);
83
 
84
  foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
93
  else // Else ``unset()``.
94
  unset($fields[$field_var]);
95
  }
96
+ else if ( // If the field is required but missing; or it was provided but invalid...
97
+ ($field["required"] === "yes" && (!isset ($_p["ws_plugin__s2member_profile_" . $field_var])
98
+ || (!is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && !is_string ($_p["ws_plugin__s2member_profile_" . $field_var]))
99
+ || (is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && empty ($_p["ws_plugin__s2member_profile_" . $field_var]))
100
+ || (is_string ($_p["ws_plugin__s2member_profile_" . $field_var]) && !strlen ($_p["ws_plugin__s2member_profile_" . $field_var]))))
101
+ || (isset ($_p["ws_plugin__s2member_profile_" . $field_var]) && c_ws_plugin__s2member_custom_reg_fields::validation_errors(array($field_var => $_p["ws_plugin__s2member_profile_" . $field_var]), array($field)))
102
+ )
103
  {
104
  if (isset ($_existing_fields[$field_var]) && ((is_array ($_existing_fields[$field_var]) && !empty ($_existing_fields[$field_var])) || (is_string ($_existing_fields[$field_var]) && strlen ($_existing_fields[$field_var]))))
105
  $fields[$field_var] = $_existing_fields[$field_var];
108
  }
109
  else if (isset ($_p["ws_plugin__s2member_profile_" . $field_var]))
110
  {
111
+ if (((is_array ($_p["ws_plugin__s2member_profile_" . $field_var]) && !empty ($_p["ws_plugin__s2member_profile_" . $field_var]))
112
+ || (is_string ($_p["ws_plugin__s2member_profile_" . $field_var]) && strlen ($_p["ws_plugin__s2member_profile_" . $field_var])))
113
+ && !c_ws_plugin__s2member_custom_reg_fields::validation_errors(array($field_var => $_p["ws_plugin__s2member_profile_" . $field_var]), array($field)))
114
  $fields[$field_var] = $_p["ws_plugin__s2member_profile_" . $field_var];
115
  else // Else ``unset()``.
116
  unset($fields[$field_var]);
includes/classes/registration-times.inc.php CHANGED
@@ -18,228 +18,95 @@ if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_registration_times"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * Registration Times.
24
  *
25
  * @package s2Member\Registrations
26
  * @since 3.5
 
 
 
 
 
 
 
27
  */
28
- class c_ws_plugin__s2member_registration_times
29
  {
30
- /**
31
- * Synchronizes Paid Registration Times with Role assignments.
32
- *
33
- * @package s2Member\Registrations
34
- * @since 3.5
35
- *
36
- * @attaches-to ``add_action("set_user_role");``
37
- *
38
- * @param int|str $user_id A numeric WordPress User ID should be passed in by the Action Hook.
39
- * @param str $role A WordPress Role ID/Name should be passed in by the Action Hook.
40
- *
41
- * @return null
42
- */
43
- public static function synchronize_paid_reg_times($user_id = FALSE, $role = FALSE)
44
- {
45
- foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
46
- do_action("ws_plugin__s2member_before_synchronize_paid_reg_times", get_defined_vars());
47
- unset($__refs, $__v);
48
-
49
- if($user_id && is_object($user = new WP_User ($user_id)) && !empty ($user->ID) && ($level = c_ws_plugin__s2member_user_access::user_access_level($user)) > 0)
50
- {
51
- $pr_times = get_user_option("s2member_paid_registration_times", $user_id);
52
- $pr_times["level"] = (empty ($pr_times["level"])) ? time() : $pr_times["level"];
53
- $pr_times["level".$level] = (empty ($pr_times["level".$level])) ? time() : $pr_times["level".$level];
54
- update_user_option($user_id, "s2member_paid_registration_times", $pr_times); // Update now.
55
- }
56
- }
57
-
58
- /**
59
- * Retrieves a Registration Time.
60
- *
61
- * @package s2Member\Registrations
62
- * @since 3.5
63
- *
64
- * @param int|str $user_id Optional. A numeric WordPress User ID. Defaults to the current User, if logged-in.
65
- *
66
- * @return int A Unix timestamp, indicating Registration Time, else `0` on failure.
67
- */
68
- public static function registration_time($user_id = FALSE)
69
- {
70
- foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
71
- do_action("ws_plugin__s2member_before_registration_time", get_defined_vars());
72
- unset($__refs, $__v);
73
-
74
- $user = ($user_id) ? new WP_User ($user_id) : ((is_user_logged_in()) ? wp_get_current_user() : FALSE);
75
-
76
- if(is_object($user) && !empty ($user->ID) && ($user_id = $user->ID) && $user->user_registered)
77
- {
78
- return apply_filters("ws_plugin__s2member_registration_time", strtotime($user->user_registered), get_defined_vars());
79
- }
80
- else // Else we return a default value of 0, because there is insufficient data.
81
- return apply_filters("ws_plugin__s2member_registration_time", 0, get_defined_vars());
82
- }
83
-
84
- /**
85
- * Retrieves a Paid Registration Time.
86
- *
87
- * @package s2Member\Registrations
88
- * @since 3.5
89
- *
90
- * @param int|str $level Optional. Defaults to the first/initial Paid Registration Time, regardless of Level#.
91
- * @param int|str $user_id Optional. A numeric WordPress User ID. Defaults to the current User, if logged-in.
92
- *
93
- * @return int A Unix timestamp, indicating Paid Registration Time, else `0` on failure.
94
- */
95
- public static function paid_registration_time($level = FALSE, $user_id = FALSE)
96
- {
97
- foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
98
- do_action("ws_plugin__s2member_before_paid_registration_time", get_defined_vars());
99
- unset($__refs, $__v);
100
-
101
- $level = (!is_numeric($level)) ? "level" : "level".preg_replace("/[^0-9]/", "", (string)$level);
102
- $user = ($user_id) ? new WP_User ($user_id) : ((is_user_logged_in()) ? wp_get_current_user() : FALSE);
103
-
104
- if($level && is_object($user) && !empty ($user->ID) && ($user_id = $user->ID) && is_array($pr_times = get_user_option("s2member_paid_registration_times", $user_id)))
105
- {
106
- return apply_filters("ws_plugin__s2member_paid_registration_time", ((isset ($pr_times[$level])) ? (int)$pr_times[$level] : 0), get_defined_vars());
107
- }
108
- else // Else we return a default value of `0`, because there is insufficient data.
109
- return apply_filters("ws_plugin__s2member_paid_registration_time", 0, get_defined_vars());
110
- }
111
-
112
- /**
113
- * Logs capability times.
114
- *
115
- * @package s2Member\Registrations
116
- * @since 140418
117
- *
118
- * @attaches-to ``add_action("update_user_meta")``
119
- *
120
- * @param integer $meta_id Meta row ID in database.
121
- * @param integer $object_id User ID.
122
- * @param string $meta_key Meta key.
123
- * @param mixed $meta_value Meta value.
124
- */
125
- public static function log_capability_time($meta_id, $object_id, $meta_key, $meta_value)
126
- {
127
- $wpdb = $GLOBALS["wpdb"];
128
- /** @var $wpdb \wpdb For IDEs. */
129
-
130
- if(strpos($meta_key, "capabilities") === FALSE
131
- || $meta_key !== $wpdb->get_blog_prefix()."capabilities"
132
- ) return; // Not updating caps.
133
-
134
- /*
135
- * NOTE: $prev_caps (and $new_caps) both include individual non-role caps (e.g. `access_s2member_ccap_x`).
136
- * These arrays ALSO include role names (minus role-specific caps); e.g. `administrator` or `s2member_level1`;
137
- * but NOT `delete_users` or `access_s2member_leveln`.
138
- */
139
-
140
- $user_id = $object_id;
141
- if(!is_array($new_caps = $meta_value))
142
- $new_caps = array(); // All caps removed.
143
-
144
- $user = new WP_User($user_id);
145
- if(!$user->ID || !$user->exists())
146
- return; // Not a valid user.
147
- $prev_caps = $user->caps;
148
-
149
- /*
150
- * NOTE: we iterate these arrays so that it's possible to properly analzye boolean flags.
151
- * WordPress can enable/disable a cap by adding/removing it; or by flagging it as TRUE|FALSE.
152
- */
153
- $caps_added = $caps_removed = array();
154
-
155
- foreach($new_caps as $_new_cap => $_is_enabled)
156
- if($_is_enabled && (!array_key_exists($_new_cap, $prev_caps) || !$prev_caps[$_new_cap]))
157
- $caps_added[] = $_new_cap;
158
-
159
- foreach($prev_caps as $_prev_cap => $_was_enabled)
160
- if(!array_key_exists($_prev_cap, $new_caps) || (!$new_caps[$_prev_cap] && $_was_enabled))
161
- $caps_removed[] = $_prev_cap;
162
-
163
- unset($_new_cap, $_is_enabled, $_prev_cap, $_was_enabled);
164
-
165
- /*
166
- * Below, we log CAPS that begin with:
167
- *
168
- * `s2member_level`
169
- * or `access_s2member_ccap_`
170
- *
171
- * This makes it possible for us to get access times for all s2Member Levels, and for CCAPS too.
172
- */
173
- foreach(array_unique($caps_added) as $_cap)
174
- if(strpos($_cap, "s2member_level") === 0 || strpos($_cap, "access_s2member_ccap_") === 0)
175
- c_ws_plugin__s2member_registration_times::_log_capability_time($user_id, $_cap);
176
-
177
- foreach(array_unique($caps_removed) as $_cap)
178
- if(strpos($_cap, "s2member_level") === 0 || strpos($_cap, "access_s2member_ccap_") === 0)
179
- c_ws_plugin__s2member_registration_times::_log_capability_time($user_id, $_cap, TRUE);
180
-
181
- unset($_cap); // Housekeeping.
182
- }
183
-
184
- /**
185
- * Records access times.
186
- *
187
- * @package s2Member\Registrations
188
- * @since 140418
189
- *
190
- * @param integer $user_id WP user ID.
191
- * @param integer $access_cap s2Member-related capability.
192
- * @param boolean $removed Defaults to a FALSE value. Flag as TRUE if `$access_cap` is being removed instead of being added.
193
- */
194
- public static function _log_capability_time($user_id, $access_cap, $removed = FALSE)
195
- {
196
- foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
197
- do_action("ws_plugin__s2member_before_log_capability_time", get_defined_vars());
198
- unset($__refs, $__v);
199
-
200
- if($user_id && $access_cap)
201
- {
202
- $user_id = (integer)$user_id;
203
- $ac_times = get_user_option("s2member_capability_times", $user_id);
204
- $ac_times[time()] = ($removed ? "-" : "").$access_cap;
205
- update_user_option($user_id, "s2member_capability_times", $ac_times);
206
-
207
- do_action("ws_plugin__s2member_during_log_capability_time", get_defined_vars());
208
- }
209
- do_action("ws_plugin__s2member_after_log_capability_time", get_defined_vars());
210
- }
211
-
212
- /**
213
- * Gets access capability times.
214
- *
215
- * @package s2Member\Registrations
216
- * @since 140418
217
- *
218
- * @param integer $user_id WP User ID.
219
- * @param boolean $access_caps Optional. An array of access capabilities to get the times for.
220
- * If removal times are desired, you should add a `-` prefix.
221
- *
222
- * @return array An array of all access capability times.
223
- * Keys are UTC timestamps, values are the capabilities (including `-` prefixed removals).
224
- */
225
- public static function get_capability_times($user_id, $access_caps = FALSE)
226
- {
227
- if(($user_id = (integer)$user_id))
228
- {
229
- $ac_times = get_user_option("s2member_capability_times", $user_id);
230
-
231
- if(!is_array($ac_times))
232
- $ac_times = array();
233
-
234
- else if($access_caps)
235
- $ac_times = array_intersect($ac_times, (array)$access_caps);
236
 
237
- ksort($ac_times);
238
- }
239
- else $ac_times = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
 
241
- return apply_filters("ws_plugin__s2member_get_capability_times", $ac_times, get_defined_vars());
242
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  }
244
  }
245
- ?>
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_registration_times"))
21
+ {
22
+ /**
23
+ * Registration Times.
24
+ *
25
+ * @package s2Member\Registrations
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_registration_times
29
  {
30
  /**
31
+ * Synchronizes Paid Registration Times with Role assignments.
32
  *
33
  * @package s2Member\Registrations
34
  * @since 3.5
35
+ *
36
+ * @attaches-to ``add_action("set_user_role");``
37
+ *
38
+ * @param integer|string $user_id A numeric WordPress User ID should be passed in by the Action Hook.
39
+ * @param string $role A WordPress Role ID/Name should be passed in by the Action Hook.
40
+ *
41
+ * @return null
42
  */
43
+ public static function synchronize_paid_reg_times($user_id = FALSE, $role = FALSE)
44
  {
45
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
46
+ do_action("ws_plugin__s2member_before_synchronize_paid_reg_times", get_defined_vars());
47
+ unset($__refs, $__v);
48
+
49
+ if($user_id && is_object($user = new WP_User ($user_id)) && !empty ($user->ID) && ($level = c_ws_plugin__s2member_user_access::user_access_level($user)) > 0)
50
+ {
51
+ $pr_times = get_user_option("s2member_paid_registration_times", $user_id);
52
+ $pr_times["level"] = (empty ($pr_times["level"])) ? time() : $pr_times["level"];
53
+ $pr_times["level".$level] = (empty ($pr_times["level".$level])) ? time() : $pr_times["level".$level];
54
+ update_user_option($user_id, "s2member_paid_registration_times", $pr_times); // Update now.
55
+ }
56
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
+ /**
59
+ * Retrieves a Registration Time.
60
+ *
61
+ * @package s2Member\Registrations
62
+ * @since 3.5
63
+ *
64
+ * @param integer|string $user_id Optional. A numeric WordPress User ID. Defaults to the current User, if logged-in.
65
+ *
66
+ * @return int A Unix timestamp, indicating Registration Time, else `0` on failure.
67
+ */
68
+ public static function registration_time($user_id = FALSE)
69
+ {
70
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
71
+ do_action("ws_plugin__s2member_before_registration_time", get_defined_vars());
72
+ unset($__refs, $__v);
73
+
74
+ $user = ($user_id) ? new WP_User ($user_id) : ((is_user_logged_in()) ? wp_get_current_user() : FALSE);
75
+
76
+ if(is_object($user) && !empty ($user->ID) && ($user_id = $user->ID) && $user->user_registered)
77
+ {
78
+ return apply_filters("ws_plugin__s2member_registration_time", strtotime($user->user_registered), get_defined_vars());
79
+ }
80
+ else // Else we return a default value of 0, because there is insufficient data.
81
+ return apply_filters("ws_plugin__s2member_registration_time", 0, get_defined_vars());
82
+ }
83
 
84
+ /**
85
+ * Retrieves a Paid Registration Time.
86
+ *
87
+ * @package s2Member\Registrations
88
+ * @since 3.5
89
+ *
90
+ * @param int|string $level Optional. Defaults to the first/initial Paid Registration Time, regardless of Level#.
91
+ * @param int|string $user_id Optional. A numeric WordPress User ID. Defaults to the current User, if logged-in.
92
+ *
93
+ * @return int A Unix timestamp, indicating Paid Registration Time, else `0` on failure.
94
+ */
95
+ public static function paid_registration_time($level = FALSE, $user_id = FALSE)
96
+ {
97
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
98
+ do_action("ws_plugin__s2member_before_paid_registration_time", get_defined_vars());
99
+ unset($__refs, $__v);
100
+
101
+ $level = (!is_numeric($level)) ? "level" : "level".preg_replace("/[^0-9]/", "", (string)$level);
102
+ $user = ($user_id) ? new WP_User ($user_id) : ((is_user_logged_in()) ? wp_get_current_user() : FALSE);
103
+
104
+ if($level && is_object($user) && !empty ($user->ID) && ($user_id = $user->ID) && is_array($pr_times = get_user_option("s2member_paid_registration_times", $user_id)))
105
+ {
106
+ return apply_filters("ws_plugin__s2member_paid_registration_time", ((isset ($pr_times[$level])) ? (int)$pr_times[$level] : 0), get_defined_vars());
107
+ }
108
+ else // Else we return a default value of `0`, because there is insufficient data.
109
+ return apply_filters("ws_plugin__s2member_paid_registration_time", 0, get_defined_vars());
110
  }
111
  }
112
+ }
includes/classes/registrations.inc.php CHANGED
@@ -38,8 +38,8 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
38
  *
39
  * @attaches-to ``add_filter("random_password");``
40
  *
41
- * @param str $password Expects a plain text Password passed through by the Filter.
42
- * @return str Password, possibly assigned through s2Member Custom Registration/Profile Field input.
43
  */
44
  public static function generate_password ($password = FALSE)
45
  {
@@ -60,9 +60,83 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
60
  $password = $custom; // Yes, use s2Member custom Password supplied by Remote Op.
61
  }
62
  }
63
-
64
  return apply_filters ("ws_plugin__s2member_generate_password", ($GLOBALS["ws_plugin__s2member_generate_password_return"] = $password), get_defined_vars ());
65
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  /**
67
  * Filters Multisite User validation.
68
  *
@@ -86,15 +160,17 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
86
  if (is_multisite ()) // This event should ONLY be processed with Multisite Networking.
87
  if (!is_admin () && isset ($result["user_name"], $result["user_email"], $result["errors"]) && ((preg_match ("/\/wp-signup\.php/", $_SERVER["REQUEST_URI"]) && !empty ($_POST["stage"]) && preg_match ("/^validate-(user|blog)-signup$/", (string)$_POST["stage"])) || (c_ws_plugin__s2member_utils_conds::bp_is_installed () && bp_is_register_page ())))
88
  {
89
- if (in_array ($result["errors"]->get_error_code (), array ("user_name", "user_email", "user_email_used")))
 
90
  if (c_ws_plugin__s2member_utils_users::ms_user_login_email_exists_but_not_on_blog ($result["user_name"], $result["user_email"]))
91
- $result["errors"] = new WP_Error ();
92
-
 
 
93
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
94
  do_action ("ws_plugin__s2member_during_ms_validate_user_signup", get_defined_vars ());
95
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
96
  }
97
-
98
  return apply_filters ("ws_plugin__s2member_ms_validate_user_signup", $result, get_defined_vars ());
99
  }
100
  /**
@@ -107,8 +183,6 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
107
  * @since 3.5
108
  *
109
  * @attaches-to ``add_filter("signup_hidden_fields");``
110
- *
111
- * @return null
112
  */
113
  public static function ms_process_signup_hidden_fields ()
114
  {
@@ -124,10 +198,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
124
 
125
  do_action ("ws_plugin__s2member_during_ms_process_signup_hidden_fields", get_defined_vars ());
126
  }
127
-
128
  do_action ("ws_plugin__s2member_after_ms_process_signup_hidden_fields", get_defined_vars ());
129
-
130
- return /* Return for uniformity. */;
131
  }
132
  /**
133
  * Adds Customs Fields to ``$meta`` on signup.
@@ -167,7 +238,6 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
167
  if ($key = preg_replace ("/_user_new_/", "_custom_reg_field_", $key))
168
  $meta["s2member_ms_signup_meta"][$key] = maybe_unserialize ($value);
169
  }
170
-
171
  return apply_filters ("ws_plugin__s2member_ms_process_signup_meta", $meta, get_defined_vars ());
172
  }
173
  /**
@@ -184,9 +254,9 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
184
  *
185
  * @attaches-to ``add_filter("_wpmu_activate_existing_error_");``
186
  *
187
- * @param obj $_error Expects a `WP_Error` object to be passed through by the Filter.
188
  * @param array $vars Expects the defined variables from the scope of the calling Filter.
189
- * @return obj|array If unable to add an existing User, the original ``$_error`` obj is returned.
190
  * Otherwise we return an array of User details for continued processing by the caller.
191
  */
192
  public static function ms_activate_existing_user ($_error = FALSE, $vars = FALSE)
@@ -212,7 +282,6 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
212
  return apply_filters ("ws_plugin__s2member_ms_activate_existing_user", array ("user_id" => $user_id, "password" => $password, "meta" => $meta), get_defined_vars ());
213
  }
214
  }
215
-
216
  return apply_filters ("ws_plugin__s2member_ms_activate_existing_user", $_error, get_defined_vars ()); // Else, return the standardized error.
217
  }
218
  /**
@@ -227,14 +296,13 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
227
  *
228
  * @attaches-to ``add_action("wpmu_activate_user");``
229
  *
230
- * @param int|str $user_id A numeric WordPress User ID.
231
- * @param str $password Plain text Password should be passed through by the Action Hook.
232
  * @param array $meta Expects an array of ``$meta`` details, passed through by the Action Hook.
233
- * @return null
234
  */
235
  public static function configure_user_on_ms_user_activation ($user_id = FALSE, $password = FALSE, $meta = FALSE)
236
  {
237
- global $pagenow; // Need this to detect the current admin page.
238
 
239
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
240
  do_action ("ws_plugin__s2member_before_configure_user_on_ms_user_activation", get_defined_vars ());
@@ -248,8 +316,6 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
248
  }
249
 
250
  do_action ("ws_plugin__s2member_after_configure_user_on_ms_user_activation", get_defined_vars ());
251
-
252
- return /* Return for uniformity. */;
253
  }
254
  /**
255
  * Configures new Users on a Multisite Network installation.
@@ -266,12 +332,11 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
266
  *
267
  * @attaches-to ``add_action("wpmu_activate_blog");``
268
  *
269
- * @param int|str $blog_id A numeric WordPress Blog ID.
270
- * @param int|str $user_id A numeric WordPress User ID.
271
- * @param str $password Plain text Password should be passed through by the Action Hook.
272
- * @param str $title The title that a User chose during signup; for their new Blog on the Network.
273
  * @param array $meta Expects an array of ``$meta`` details, passed through by the Action Hook.
274
- * @return null
275
  */
276
  public static function configure_user_on_ms_blog_activation ($blog_id = FALSE, $user_id = FALSE, $password = FALSE, $title = FALSE, $meta = FALSE)
277
  {
@@ -285,10 +350,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
285
  c_ws_plugin__s2member_registrations::configure_user_registration ($user_id, $password, ((isset ($meta["s2member_ms_signup_meta"]) && is_array ($meta["s2member_ms_signup_meta"])) ? $meta["s2member_ms_signup_meta"] : array ()));
286
  delete_user_meta ($user_id, "s2member_ms_signup_meta");
287
  }
288
-
289
  do_action ("ws_plugin__s2member_after_configure_user_on_ms_blog_activation", get_defined_vars ());
290
-
291
- return /* Return for uniformity. */;
292
  }
293
  /**
294
  * Intersects with ``register_new_user()`` through s2Member's Multisite Networking patch.
@@ -303,10 +365,10 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
303
  *
304
  * @attaches-to ``add_filter("registration_errors");``
305
  *
306
- * @param obj $errors Expects a `WP_Error` object passed in by the Filter.
307
- * @param str $user_login Expects the User's Username, passed in by the Filter.
308
- * @param str $user_email Expects the User's Email Address, passed in by the Filter.
309
- * @return obj A `WP_Error` object, or exits script execution after handling registration redirection.
310
  */
311
  public static function ms_register_existing_user ($errors = FALSE, $user_login = FALSE, $user_email = FALSE)
312
  {
@@ -354,10 +416,10 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
354
  * @package s2Member\Registrations
355
  * @since 3.5
356
  *
357
- * @param str $user_login Expects the User's Username.
358
- * @param str $user_email Expects the User's Email Address.
359
- * @param str $user_pass Expects the User's plain text Password.
360
- * @param int|str $user_id Optional. A numeric WordPress User ID.
361
  * If unspecified, a lookup is performed with ``$user_login`` and ``$user_email``.
362
  * @return int|false Returns numeric ``$user_id`` on success, else false on failure.
363
  */
@@ -381,7 +443,6 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
381
  return apply_filters ("ws_plugin__s2member_ms_create_existing_user", $user_id, get_defined_vars ());
382
  }
383
  }
384
-
385
  return apply_filters ("ws_plugin__s2member_ms_create_existing_user", false, get_defined_vars ());
386
  }
387
  /**
@@ -398,12 +459,11 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
398
  *
399
  * @attaches-to ``add_action("user_register");``
400
  *
401
- * @param int|str $user_id A numeric WordPress User ID.
402
- * @param str $password Optional in most cases. A User's plain text Password. If unspecified, attempts are made to collect the plain text Password from other sources.
403
  * @param array $meta Optional in most cases. Defaults to false. An array of meta data for a User/Member.
404
- * @return null No return value. Returns `null` in possible every scenario.
405
  *
406
- * @todo Impossible to delete cookies when fired inside: `/wp-activate.php`?
407
  */
408
  public static function configure_user_registration ($user_id = FALSE, $password = FALSE, $meta = FALSE)
409
  {
@@ -1043,9 +1103,6 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
1043
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
1044
  do_action ("ws_plugin__s2member_after_configure_user_registration", get_defined_vars ());
1045
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
1046
-
1047
- return /* Return for uniformity. */;
1048
  }
1049
  }
1050
- }
1051
- ?>
38
  *
39
  * @attaches-to ``add_filter("random_password");``
40
  *
41
+ * @param string $password Expects a plain text Password passed through by the Filter.
42
+ * @return string Password, possibly assigned through s2Member Custom Registration/Profile Field input.
43
  */
44
  public static function generate_password ($password = FALSE)
45
  {
60
  $password = $custom; // Yes, use s2Member custom Password supplied by Remote Op.
61
  }
62
  }
 
63
  return apply_filters ("ws_plugin__s2member_generate_password", ($GLOBALS["ws_plugin__s2member_generate_password_return"] = $password), get_defined_vars ());
64
  }
65
+
66
+ /**
67
+ * Intersects with ``register_new_user()`` in the WordPress core.
68
+ *
69
+ * This function Filters registration errors inside `/wp-login.php` via ``register_new_user()``.
70
+ *
71
+ * This can ONLY be fired through `/wp-login.php` on the front-side.
72
+ *
73
+ * @package s2Member\Registrations
74
+ * @since 140518
75
+ *
76
+ * @attaches-to ``add_filter("registration_errors");``
77
+ *
78
+ * @param WP_Error $errors Expects a `WP_Error` object passed in by the Filter.
79
+ * @param string $user_login Expects the User's Username, passed in by the Filter.
80
+ * @param string $user_email Expects the User's Email Address, passed in by the Filter.
81
+ * @return WP_Error A `WP_Error` object instance.
82
+ */
83
+ public static function custom_registration_field_errors($errors = FALSE, $user_login = FALSE, $user_email = FALSE)
84
+ {
85
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
86
+ do_action("ws_plugin__s2member_before_custom_registration_field_errors", get_defined_vars());
87
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
88
+
89
+ if (!is_admin () && preg_match ("/\/wp-login\.php/", $_SERVER["REQUEST_URI"]))
90
+ if (is_wp_error ($errors) && !empty ($_POST) && is_array ($_POST))
91
+ {
92
+ foreach(c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST)) as $_key => $_value)
93
+ if(strpos($_key, "ws_plugin__s2member_custom_reg_field_") === 0)
94
+ $input[str_replace("ws_plugin__s2member_custom_reg_field_", "", $_key)] = $_value;
95
+
96
+ $fields_to_validate = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level("auto-detection", "registration", TRUE);
97
+ $validation_errors = c_ws_plugin__s2member_custom_reg_fields::validation_errors(!empty($input) ? $input : array(), $fields_to_validate);
98
+
99
+ if($validation_errors) foreach($validation_errors as $_field_var => $_error)
100
+ $errors->add("custom_reg_field_".$_field_var, $_error);
101
+ unset($_field_var, $_error);
102
+ }
103
+ return apply_filters ("ws_plugin__s2member_custom_registration_field_errors", $errors, get_defined_vars ());
104
+ }
105
+
106
+ /**
107
+ * Intersects with ``bp_core_screen_signup()`` in the BuddyPress core.
108
+ *
109
+ * This can ONLY be fired through `/register` via BuddyPress.
110
+ *
111
+ * @package s2Member\Registrations
112
+ * @since 140518
113
+ *
114
+ * @attaches-to ``add_action("bp_signup_validate");``
115
+ */
116
+ public static function custom_registration_field_errors_4bp()
117
+ {
118
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
119
+ do_action("ws_plugin__s2member_before_custom_registration_field_errors_4bp", get_defined_vars());
120
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
121
+
122
+ if (!is_admin () && c_ws_plugin__s2member_utils_conds::bp_is_installed () && bp_is_register_page ())
123
+ if(in_array ("registration", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields_4bp"]))
124
+ if(apply_filters ("ws_plugin__s2member_custom_registration_fields_4bp_display", true, get_defined_vars ()))
125
+ if (!empty($GLOBALS["bp"]->signup) && is_object($GLOBALS["bp"]->signup) && !empty ($_POST) && is_array ($_POST))
126
+ {
127
+ foreach(c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST)) as $_key => $_value)
128
+ if(strpos($_key, "ws_plugin__s2member_custom_reg_field_") === 0)
129
+ $input[str_replace("ws_plugin__s2member_custom_reg_field_", "", $_key)] = $_value;
130
+
131
+ $fields_to_validate = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level("auto-detection", "registration", TRUE);
132
+ $validation_errors = c_ws_plugin__s2member_custom_reg_fields::validation_errors(!empty($input) ? $input : array(), $fields_to_validate);
133
+
134
+ if($validation_errors) foreach($validation_errors as $_field_var => $_error)
135
+ $GLOBALS["bp"]->signup->errors["custom_reg_field_".$_field_var] = $_error;
136
+ unset($_field_var, $_error);
137
+ }
138
+ }
139
+
140
  /**
141
  * Filters Multisite User validation.
142
  *
160
  if (is_multisite ()) // This event should ONLY be processed with Multisite Networking.
161
  if (!is_admin () && isset ($result["user_name"], $result["user_email"], $result["errors"]) && ((preg_match ("/\/wp-signup\.php/", $_SERVER["REQUEST_URI"]) && !empty ($_POST["stage"]) && preg_match ("/^validate-(user|blog)-signup$/", (string)$_POST["stage"])) || (c_ws_plugin__s2member_utils_conds::bp_is_installed () && bp_is_register_page ())))
162
  {
163
+ $errors =& $result["errors"]; /** @var $errors WP_Error */
164
+ if (in_array ($errors->get_error_code (), array ("user_name", "user_email", "user_email_used")))
165
  if (c_ws_plugin__s2member_utils_users::ms_user_login_email_exists_but_not_on_blog ($result["user_name"], $result["user_email"]))
166
+ {
167
+ unset($errors->errors["user_name"], $errors->errors["user_email"], $errors->errors["user_email_used"]);
168
+ unset($errors->error_data["user_name"], $errors->error_data["user_email"], $errors->error_data["user_email_used"]);
169
+ }
170
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
171
  do_action ("ws_plugin__s2member_during_ms_validate_user_signup", get_defined_vars ());
172
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
173
  }
 
174
  return apply_filters ("ws_plugin__s2member_ms_validate_user_signup", $result, get_defined_vars ());
175
  }
176
  /**
183
  * @since 3.5
184
  *
185
  * @attaches-to ``add_filter("signup_hidden_fields");``
 
 
186
  */
187
  public static function ms_process_signup_hidden_fields ()
188
  {
198
 
199
  do_action ("ws_plugin__s2member_during_ms_process_signup_hidden_fields", get_defined_vars ());
200
  }
 
201
  do_action ("ws_plugin__s2member_after_ms_process_signup_hidden_fields", get_defined_vars ());
 
 
202
  }
203
  /**
204
  * Adds Customs Fields to ``$meta`` on signup.
238
  if ($key = preg_replace ("/_user_new_/", "_custom_reg_field_", $key))
239
  $meta["s2member_ms_signup_meta"][$key] = maybe_unserialize ($value);
240
  }
 
241
  return apply_filters ("ws_plugin__s2member_ms_process_signup_meta", $meta, get_defined_vars ());
242
  }
243
  /**
254
  *
255
  * @attaches-to ``add_filter("_wpmu_activate_existing_error_");``
256
  *
257
+ * @param WP_Error $_error Expects a `WP_Error` object to be passed through by the Filter.
258
  * @param array $vars Expects the defined variables from the scope of the calling Filter.
259
+ * @return WP_Error|array If unable to add an existing User, the original ``$_error`` obj is returned.
260
  * Otherwise we return an array of User details for continued processing by the caller.
261
  */
262
  public static function ms_activate_existing_user ($_error = FALSE, $vars = FALSE)
282
  return apply_filters ("ws_plugin__s2member_ms_activate_existing_user", array ("user_id" => $user_id, "password" => $password, "meta" => $meta), get_defined_vars ());
283
  }
284
  }
 
285
  return apply_filters ("ws_plugin__s2member_ms_activate_existing_user", $_error, get_defined_vars ()); // Else, return the standardized error.
286
  }
287
  /**
296
  *
297
  * @attaches-to ``add_action("wpmu_activate_user");``
298
  *
299
+ * @param int|string $user_id A numeric WordPress User ID.
300
+ * @param string $password Plain text Password should be passed through by the Action Hook.
301
  * @param array $meta Expects an array of ``$meta`` details, passed through by the Action Hook.
 
302
  */
303
  public static function configure_user_on_ms_user_activation ($user_id = FALSE, $password = FALSE, $meta = FALSE)
304
  {
305
+ global $pagenow; // Detect the current admin page.
306
 
307
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
308
  do_action ("ws_plugin__s2member_before_configure_user_on_ms_user_activation", get_defined_vars ());
316
  }
317
 
318
  do_action ("ws_plugin__s2member_after_configure_user_on_ms_user_activation", get_defined_vars ());
 
 
319
  }
320
  /**
321
  * Configures new Users on a Multisite Network installation.
332
  *
333
  * @attaches-to ``add_action("wpmu_activate_blog");``
334
  *
335
+ * @param int|string $blog_id A numeric WordPress Blog ID.
336
+ * @param int|string $user_id A numeric WordPress User ID.
337
+ * @param string $password Plain text Password should be passed through by the Action Hook.
338
+ * @param string $title The title that a User chose during signup; for their new Blog on the Network.
339
  * @param array $meta Expects an array of ``$meta`` details, passed through by the Action Hook.
 
340
  */
341
  public static function configure_user_on_ms_blog_activation ($blog_id = FALSE, $user_id = FALSE, $password = FALSE, $title = FALSE, $meta = FALSE)
342
  {
350
  c_ws_plugin__s2member_registrations::configure_user_registration ($user_id, $password, ((isset ($meta["s2member_ms_signup_meta"]) && is_array ($meta["s2member_ms_signup_meta"])) ? $meta["s2member_ms_signup_meta"] : array ()));
351
  delete_user_meta ($user_id, "s2member_ms_signup_meta");
352
  }
 
353
  do_action ("ws_plugin__s2member_after_configure_user_on_ms_blog_activation", get_defined_vars ());
 
 
354
  }
355
  /**
356
  * Intersects with ``register_new_user()`` through s2Member's Multisite Networking patch.
365
  *
366
  * @attaches-to ``add_filter("registration_errors");``
367
  *
368
+ * @param WP_Error $errors Expects a `WP_Error` object passed in by the Filter.
369
+ * @param string $user_login Expects the User's Username, passed in by the Filter.
370
+ * @param string $user_email Expects the User's Email Address, passed in by the Filter.
371
+ * @return WP_Error A `WP_Error` object, or exits script execution after handling registration redirection.
372
  */
373
  public static function ms_register_existing_user ($errors = FALSE, $user_login = FALSE, $user_email = FALSE)
374
  {
416
  * @package s2Member\Registrations
417
  * @since 3.5
418
  *
419
+ * @param string $user_login Expects the User's Username.
420
+ * @param string $user_email Expects the User's Email Address.
421
+ * @param string $user_pass Expects the User's plain text Password.
422
+ * @param int|string $user_id Optional. A numeric WordPress User ID.
423
  * If unspecified, a lookup is performed with ``$user_login`` and ``$user_email``.
424
  * @return int|false Returns numeric ``$user_id`` on success, else false on failure.
425
  */
443
  return apply_filters ("ws_plugin__s2member_ms_create_existing_user", $user_id, get_defined_vars ());
444
  }
445
  }
 
446
  return apply_filters ("ws_plugin__s2member_ms_create_existing_user", false, get_defined_vars ());
447
  }
448
  /**
459
  *
460
  * @attaches-to ``add_action("user_register");``
461
  *
462
+ * @param int|string $user_id A numeric WordPress User ID.
463
+ * @param string $password Optional in most cases. A User's plain text Password. If unspecified, attempts are made to collect the plain text Password from other sources.
464
  * @param array $meta Optional in most cases. Defaults to false. An array of meta data for a User/Member.
 
465
  *
466
+ * @TODO Impossible to delete cookies when fired inside: `/wp-activate.php`?
467
  */
468
  public static function configure_user_registration ($user_id = FALSE, $password = FALSE, $meta = FALSE)
469
  {
1103
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
1104
  do_action ("ws_plugin__s2member_after_configure_user_registration", get_defined_vars ());
1105
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
 
 
1106
  }
1107
  }
1108
+ }
 
includes/classes/return-templates.inc.php CHANGED
@@ -36,7 +36,7 @@ if (!class_exists ("c_ws_plugin__s2member_return_templates"))
36
  * @param str $template Optional A Subscr. Gateway code should be used as the template name, or `default` is a multipurpose template. Defaults to `default`. Used in template selection.
37
  * @param str $response Optional. Response message to fill template with, using the Replacement Code `%%response%%` inside the template file. Defaults to: `Thank you. Please click the link below.`.
38
  * @param str $continue_html Optional. The HTML value of the continuation link presented within the template using Replacement Code `%%continue%%`. Defaults to: `Continue`.
39
- * @param str $continue_link Optional. The HREF value for the continuation link presented within the template using Replacement Code `%%continue%%`. Defaults to: ``home_url ("/")``.
40
  * @return str The full HTML code of the template. All Replacement Codes inside the template file will have already been filled by this routine.
41
  */
42
  public static function return_template ($template = FALSE, $response = FALSE, $continue_html = FALSE, $continue_link = FALSE)
@@ -46,7 +46,7 @@ if (!class_exists ("c_ws_plugin__s2member_return_templates"))
46
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
47
 
48
  $template = ($template) ? $template : "default";
49
- $continue_link = ($continue_link) ? $continue_link : home_url ("/");
50
  $continue_html = ($continue_html) ? $continue_html : _x ("Continue", "s2member-front", "s2member");
51
  $response = ($response) ? $response : _x ("Thank you. Please click the link below.", "s2member-front", "s2member");
52
 
36
  * @param str $template Optional A Subscr. Gateway code should be used as the template name, or `default` is a multipurpose template. Defaults to `default`. Used in template selection.
37
  * @param str $response Optional. Response message to fill template with, using the Replacement Code `%%response%%` inside the template file. Defaults to: `Thank you. Please click the link below.`.
38
  * @param str $continue_html Optional. The HTML value of the continuation link presented within the template using Replacement Code `%%continue%%`. Defaults to: `Continue`.
39
+ * @param str $continue_link Optional. The HREF value for the continuation link presented within the template using Replacement Code `%%continue%%`. Defaults to: ``home_url ("/", "http")``.
40
  * @return str The full HTML code of the template. All Replacement Codes inside the template file will have already been filled by this routine.
41
  */
42
  public static function return_template ($template = FALSE, $response = FALSE, $continue_html = FALSE, $continue_link = FALSE)
46
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
47
 
48
  $template = ($template) ? $template : "default";
49
+ $continue_link = ($continue_link) ? $continue_link : home_url ("/", "http");
50
  $continue_html = ($continue_html) ? $continue_html : _x ("Continue", "s2member-front", "s2member");
51
  $response = ($response) ? $response : _x ("Thank you. Please click the link below.", "s2member-front", "s2member");
52
 
includes/classes/user-deletions.inc.php CHANGED
@@ -118,7 +118,7 @@ if (!class_exists ("c_ws_plugin__s2member_user_deletions"))
118
 
119
  delete_user_option ($user_id, "s2member_ipn_signup_vars");
120
  delete_user_option ($user_id, "s2member_paid_registration_times");
121
- delete_user_option ($user_id, "s2member_capability_times");
122
  delete_user_option ($user_id, "s2member_sp_references");
123
 
124
  delete_user_option ($user_id, "s2member_last_status_scan");
118
 
119
  delete_user_option ($user_id, "s2member_ipn_signup_vars");
120
  delete_user_option ($user_id, "s2member_paid_registration_times");
121
+ delete_user_option ($user_id, "s2member_access_cap_times");
122
  delete_user_option ($user_id, "s2member_sp_references");
123
 
124
  delete_user_option ($user_id, "s2member_last_status_scan");
includes/classes/user-drip-access.inc.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * User drip access routines.
4
+ *
5
+ * Copyright: © 2009-2014 (coded in the USA)
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ *
8
+ * Released under the terms of the GNU General Public License.
9
+ * You should have received a copy of the GNU General Public License,
10
+ * along with this software. In the main directory, see: /licensing/
11
+ * If not, see: {@link http://www.gnu.org/licenses/}.
12
+ *
13
+ * @package s2Member\User_Drip_Access
14
+ * @since 140514
15
+ */
16
+ if(realpath(__FILE__) === realpath($_SERVER['SCRIPT_FILENAME']))
17
+ exit ('Do not access this file directly.');
18
+
19
+ if(!class_exists('c_ws_plugin__s2member_user_drip_access'))
20
+ {
21
+ /**
22
+ * User drip access routines.
23
+ *
24
+ * @package s2Member\User_Drip_Access
25
+ * @since 140514
26
+ *
27
+ * @note MUST use `self::` instead of `static::` for PHP v5.2 compat.
28
+ */
29
+ class c_ws_plugin__s2member_user_drip_access
30
+ {
31
+ /**
32
+ * @since 140514 Enhancing `[s2Drip]` shortcode.
33
+ * @var integer Current `$from_day`; used by callback.
34
+ */
35
+ protected static $from_day = 0;
36
+
37
+ /**
38
+ * @since 140514 Enhancing `[s2Drip]` shortcode.
39
+ * @var integer Current `$to_day`; used by callback.
40
+ */
41
+ protected static $to_day = 0;
42
+
43
+ /**
44
+ * @since 140514 Enhancing `[s2Drip]` shortcode.
45
+ * @var integer Current `$user_id`; used by callback.
46
+ */
47
+ protected static $user_id = 0;
48
+
49
+ /**
50
+ * @since 140514 Enhancing `[s2Drip]` shortcode.
51
+ * @var array Current array of paid times for {@link $user_id}.
52
+ */
53
+ protected static $all_paid_reg_times = array();
54
+
55
+ /**
56
+ * @since 140514 Enhancing `[s2Drip]` shortcode.
57
+ * @var array Current array of access capability times for {@link $user_id}.
58
+ */
59
+ protected static $all_access_cap_times = array();
60
+
61
+ /**
62
+ * Conditional check for drip access.
63
+ *
64
+ * @since 140514 Enhancing `[s2Drip]` shortcode.
65
+ *
66
+ * @param string $access Required; conditional expression with access_s2member_ capabilities
67
+ * (i.e. leveln, ccap_name), e.g. `level2` or `level3 and (ccap_music or ccap_videos)`.
68
+ * Note that `and`, `or` MUST be used in place of `&&`, `||` due to sanitation routines.
69
+ * The `$access` string may contain only `[A-Za-z0-9 _()]`.
70
+ *
71
+ * @param integer $from_day Optional. Defaults to `0`. Any value greater than or equal to `0`.
72
+ * @param integer $to_day Optional. Defaults to `0`. Any value greater than or equal to `0`.
73
+ *
74
+ * @param null|integer $user_id Optional. A `NULL` value indicates the current user.
75
+ *
76
+ * @return boolean `TRUE` if user can `$access`; and dripping should occur; based on `$from_day` & `$to_day`.
77
+ *
78
+ * @triggers `E_USER_ERROR` if an invalid `$access` syntax is detected; with invalid chars.
79
+ * @triggers `E_USER_ERROR` if an invalid `$access` syntax is detected; without any word chars.
80
+ */
81
+ public static function user_can_access_drip($access, $from_day = 0, $to_day = 0, $user_id = NULL)
82
+ {
83
+ $drip = FALSE;
84
+ $access = trim((string)$access);
85
+ $from_day = self::$from_day = (integer)$from_day;
86
+ $to_day = self::$to_day = (integer)$to_day;
87
+
88
+ if(!isset($user_id))
89
+ $user_id = get_current_user_id();
90
+ $user_id = self::$user_id = (integer)$user_id;
91
+
92
+ if(user_can($user_id, 'administrator'))
93
+ $drip = TRUE;
94
+
95
+ else if($access && $user_id)
96
+ {
97
+ if(!is_array($all_access_cap_times = self::$all_access_cap_times = c_ws_plugin__s2member_access_cap_times::get_access_cap_times($user_id)))
98
+ $all_access_cap_times = self::$all_access_cap_times = array();
99
+
100
+ $access_expression = strtolower($access); // e.g. 'level1 and ccap_music'
101
+ $access_expression = trim(preg_replace('/[^a-z0-9 _()]/', '', $access_expression, -1, $invalid_chars));
102
+ $access_expression = str_replace(array(' and ', ' or '), array(' && ', ' || '), $access_expression);
103
+
104
+ if($invalid_chars)
105
+ trigger_error('Syntax error: invalid chars. Please use only `A-Za-z0-9 _()` in the `access` parameter of s2Drip.', E_USER_ERROR);
106
+
107
+ if(!$access_expression || !preg_match('/\w+/', $access_expression))
108
+ trigger_error('Syntax error: no word chars in `access` parameter of s2Drip. Valid example: `level1 and ccap_music`.', E_USER_ERROR);
109
+
110
+ $access_expression = preg_replace_callback('/\w+/', 'self::_user_can_access_drip_cb', $access_expression);
111
+ $drip = eval('return ('.$access_expression.');');
112
+ }
113
+ return apply_filters('ws_plugin__s2member_user_can_access_drip', $drip, get_defined_vars());
114
+ }
115
+
116
+ /**
117
+ * Conditional check for drip access (callback).
118
+ *
119
+ * @since 140514 Enhancing `[s2Drip]` shortcode.
120
+ *
121
+ * @param array $cap Regex matches passed via {@link \preg_replace_callback()}.
122
+ *
123
+ * @return string One of `TRUE` or `FALSE`; as a string value.
124
+ */
125
+ protected static function _user_can_access_drip_cb($cap)
126
+ {
127
+ $drip = 'FALSE';
128
+ $cap = (string)$cap[0];
129
+
130
+ if($cap && user_can(self::$user_id, 'access_s2member_'.$cap))
131
+ {
132
+ $time = time();
133
+ $cap_times = array_keys(self::$all_access_cap_times, $cap, TRUE);
134
+ $cap_time_latest = $cap_times ? max($cap_times) : 0;
135
+
136
+ if($cap_time_latest && $time > ($cap_time_latest + (max(0, (self::$from_day - 1)) * 86400)))
137
+ {
138
+ $drip = 'TRUE'; // At/after $from_day.
139
+ if(self::$to_day > 0 && $time > ($cap_time_latest + (self::$to_day * 86400)))
140
+ $drip = 'FALSE'; // After $to_day.
141
+ }
142
+ }
143
+
144
+ return apply_filters('ws_plugin__s2member_user_can_access_drip_cb', $drip, get_defined_vars());
145
+ }
146
+ }
147
+ }
includes/classes/users-list.inc.php CHANGED
@@ -36,7 +36,7 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
36
  * @attaches-to ``add_action("edit_user_profile");``
37
  * @attaches-to ``add_action("show_user_profile");``
38
  *
39
- * @param obj $user Expects a `WP_User` object passed in by the Action Hook.
40
  * @return inner Return-value of inner routine.
41
  */
42
  public static function users_list_edit_cols ($user = FALSE)
@@ -52,7 +52,7 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
52
  * @attaches-to ``add_action("edit_user_profile_update");``
53
  * @attaches-to ``add_action("personal_options_update");``
54
  *
55
- * @param int|str $user_id Expects a numeric WordPress User ID passed in by the Action Hook.
56
  * @return inner Return-value of inner routine.
57
  */
58
  public static function users_list_update_cols ($user_id = FALSE)
@@ -69,12 +69,11 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
69
  *
70
  * @attaches-to ``add_action("pre_user_query");``
71
  *
72
- * @param obj $query Expects a `WP_User_Query` object, by reference.
73
- * @return null After possibly modifying the ``$query`` object.
74
  */
75
  public static function users_list_query (&$query = FALSE)
76
  {
77
- global $wpdb; // Need this global object reference.
78
 
79
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
80
  do_action ("ws_plugin__s2member_before_users_list_search", get_defined_vars ());
@@ -106,8 +105,6 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
106
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
107
  do_action ("ws_plugin__s2member_after_users_list_search", get_defined_vars ());
108
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
109
-
110
- return /* Return for uniformity. */;
111
  }
112
  /**
113
  * Adds columns to the list of Users.
@@ -165,10 +162,10 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
165
  *
166
  * @attaches-to ``add_filter ("manage_users_custom_column");``
167
  *
168
- * @param str $val A value for this column, passed through by the Filter.
169
- * @param str $col The name of the column for which we might need to supply data for.
170
- * @param int|str $user_id Expects a WordPress User ID, passed through by the Filter.
171
- * @return str A column value introduced by this routine, or existing value, or, if empty, a dash.
172
  */
173
  public static function users_list_display_cols ($val = FALSE, $col = FALSE, $user_id = FALSE)
174
  {
@@ -198,7 +195,6 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
198
  $val .= (($val) ? "<br />" : "") . '<small><em>@Level ' . esc_html ($level) . ': <span title="' . esc_attr (date ("D M jS, Y", $time)) . ' @ precisely ' . esc_attr (date ("g:i a", $time)) . '">' . esc_html (date ("D M jS, Y", $time)) . '</span></em></small>';
199
  }
200
  }
201
-
202
  else if ($col === "s2member_subscr_id")
203
  $val = ($v = get_user_option ("s2member_subscr_id", $user_id)) ? esc_html ($v) : "—";
204
 
@@ -231,7 +227,6 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
231
 
232
  $last_fields_id = $user_id; // Record this.
233
  }
234
-
235
  else if ($col === "s2member_login_counter")
236
  $val = ($v = get_user_option ("s2member_login_counter", $user_id)) ? esc_html ($v) : "—";
237
 
@@ -248,6 +243,61 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
248
 
249
  return apply_filters ("ws_plugin__s2member_users_list_display_cols", ((strlen ($val)) ? $val : "—"), get_defined_vars ());
250
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  }
252
- }
253
- ?>
36
  * @attaches-to ``add_action("edit_user_profile");``
37
  * @attaches-to ``add_action("show_user_profile");``
38
  *
39
+ * @param WP_User $user Expects a `WP_User` object passed in by the Action Hook.
40
  * @return inner Return-value of inner routine.
41
  */
42
  public static function users_list_edit_cols ($user = FALSE)
52
  * @attaches-to ``add_action("edit_user_profile_update");``
53
  * @attaches-to ``add_action("personal_options_update");``
54
  *
55
+ * @param int|string $user_id Expects a numeric WordPress User ID passed in by the Action Hook.
56
  * @return inner Return-value of inner routine.
57
  */
58
  public static function users_list_update_cols ($user_id = FALSE)
69
  *
70
  * @attaches-to ``add_action("pre_user_query");``
71
  *
72
+ * @param WP_User_Query $query Expects a `WP_User_Query` object, by reference.
 
73
  */
74
  public static function users_list_query (&$query = FALSE)
75
  {
76
+ global $wpdb; /** @var $wpdb wpdb */
77
 
78
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
79
  do_action ("ws_plugin__s2member_before_users_list_search", get_defined_vars ());
105
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
106
  do_action ("ws_plugin__s2member_after_users_list_search", get_defined_vars ());
107
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
 
 
108
  }
109
  /**
110
  * Adds columns to the list of Users.
162
  *
163
  * @attaches-to ``add_filter ("manage_users_custom_column");``
164
  *
165
+ * @param string $val A value for this column, passed through by the Filter.
166
+ * @param string $col The name of the column for which we might need to supply data for.
167
+ * @param int|string $user_id Expects a WordPress User ID, passed through by the Filter.
168
+ * @return string A column value introduced by this routine, or existing value, or, if empty, a dash.
169
  */
170
  public static function users_list_display_cols ($val = FALSE, $col = FALSE, $user_id = FALSE)
171
  {
195
  $val .= (($val) ? "<br />" : "") . '<small><em>@Level ' . esc_html ($level) . ': <span title="' . esc_attr (date ("D M jS, Y", $time)) . ' @ precisely ' . esc_attr (date ("g:i a", $time)) . '">' . esc_html (date ("D M jS, Y", $time)) . '</span></em></small>';
196
  }
197
  }
 
198
  else if ($col === "s2member_subscr_id")
199
  $val = ($v = get_user_option ("s2member_subscr_id", $user_id)) ? esc_html ($v) : "—";
200
 
227
 
228
  $last_fields_id = $user_id; // Record this.
229
  }
 
230
  else if ($col === "s2member_login_counter")
231
  $val = ($v = get_user_option ("s2member_login_counter", $user_id)) ? esc_html ($v) : "—";
232
 
243
 
244
  return apply_filters ("ws_plugin__s2member_users_list_display_cols", ((strlen ($val)) ? $val : "—"), get_defined_vars ());
245
  }
246
+
247
+ /**
248
+ * Tells WordPress certain fields s2Member adds are sortable
249
+ *
250
+ * @package s2Member\Users_List
251
+ * @since 140518
252
+ *
253
+ * @attaches-to ``add_filter ("manage_users_sortable_columns");``
254
+ *
255
+ * @param array $columns An Array of sortable User List Columns
256
+ */
257
+ public static function users_list_add_sortable($columns)
258
+ {
259
+ $columns['s2member_registration_time'] = 's2member_registration_time';
260
+ $columns['s2member_subscr_id'] = 's2member_subscr_id';
261
+ $columns['s2member_auto_eot_time'] = 's2member_auto_eot_time';
262
+ $columns['s2member_login_counter'] = 's2member_login_counter';
263
+ $columns['s2member_last_login_time'] = 's2member_last_login_time';
264
+ return $columns;
265
+ }
266
+
267
+ /**
268
+ * Alters WP_Query object to make custom columns sortable
269
+ *
270
+ * @package s2Member\Users_List
271
+ * @since 140518
272
+ *
273
+ * @attaches-to ``add_filter ("pre_user_query");``
274
+ *
275
+ * @param WP_User_Query $query `WP_Query` Object passed from WordPress
276
+ */
277
+ public static function users_list_make_sortable($query)
278
+ {
279
+ if (!is_admin()
280
+ || empty($GLOBALS['pagenow']) || $GLOBALS['pagenow'] !== 'users.php'
281
+ || !isset ($query->query_vars))
282
+ return;
283
+
284
+ global $wpdb; /** @var $wpdb wpdb */
285
+ $vars = $query->query_vars;
286
+
287
+ switch($vars['orderby'])
288
+ {
289
+ case 's2member_registration_time':
290
+ $query->query_orderby = "ORDER BY `user_registered` " . $vars['order'];
291
+ break;
292
+
293
+ case 's2member_subscr_id':
294
+ case 's2member_auto_eot_time':
295
+ case 's2member_login_counter':
296
+ case 's2member_last_login_time':
297
+ $query->query_from .= " LEFT JOIN `" . $wpdb->usermeta . "` `m` ON (" . $wpdb->users . ".`ID` = `m`.`user_id` AND `m`.`meta_key` = '" . esc_sql($wpdb->prefix . $vars['orderby']) . "')";
298
+ $query->query_orderby = "ORDER BY `m`.`meta_value` " . $vars['order'];
299
+ break;
300
+ }
301
+ }
302
  }
303
+ }
 
includes/classes/utils-users.inc.php CHANGED
@@ -37,7 +37,7 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
37
  */
38
  public static function users_in_database ()
39
  {
40
- global /* Global database object reference. */ $wpdb;
41
 
42
  $q1 = mysql_query ("SELECT SQL_CALC_FOUND_ROWS `" . $wpdb->users . "`.`ID` FROM `" . $wpdb->users . "`, `" . $wpdb->usermeta . "` WHERE `" . $wpdb->users . "`.`ID` = `" . $wpdb->usermeta . "`.`user_id` AND `" . $wpdb->usermeta . "`.`meta_key` = '" . esc_sql ($wpdb->prefix . "capabilities") . "' LIMIT 1", $wpdb->dbh);
43
  $q2 = mysql_query ("SELECT FOUND_ROWS()", $wpdb->dbh);
@@ -63,7 +63,7 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
63
  */
64
  public static function get_user_custom_with ($subscr_or_txn_id = FALSE, $os0 = FALSE)
65
  {
66
- global /* Need global DB obj. */ $wpdb;
67
 
68
  if /* This case includes some additional routines that can use the ``$os0`` value. */ ($subscr_or_txn_id && $os0)
69
  {
@@ -94,7 +94,7 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
94
  */
95
  public static function get_user_id_with ($subscr_or_txn_id = FALSE, $os0 = FALSE)
96
  {
97
- global /* Need global DB obj. */ $wpdb;
98
 
99
  if /* This case includes some additional routines that can use the ``$os0`` value. */($subscr_or_txn_id && $os0)
100
  {
@@ -123,7 +123,7 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
123
  */
124
  public static function get_user_email_with ($subscr_or_txn_id = FALSE, $os0 = FALSE)
125
  {
126
- global /* Need global DB obj. */ $wpdb;
127
 
128
  if /* This case includes some additional routines that can use the ``$os0`` value. */($subscr_or_txn_id && $os0)
129
  {
@@ -228,7 +228,7 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
228
  */
229
  public static function user_login_email_exists ($user_login = FALSE, $user_email = FALSE)
230
  {
231
- global /* Global database object reference. */ $wpdb;
232
 
233
  if /* Only if we have both of these. */ ($user_login && $user_email)
234
  if (($user_id = $wpdb->get_var ("SELECT `ID` FROM `" . $wpdb->users . "` WHERE `user_login` LIKE '" . esc_sql (like_escape ($user_login)) . "' AND `user_email` LIKE '" . esc_sql (like_escape ($user_email)) . "' LIMIT 1")))
@@ -295,7 +295,7 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
295
  */
296
  public static function get_user_field ($field_id = FALSE, $user_id = FALSE) // Very powerful function here.
297
  {
298
- global /* Global database object reference. */ $wpdb;
299
 
300
  $current_user = /* Current User's object (used when/if `$user_id` is empty). */ wp_get_current_user ();
301
 
37
  */
38
  public static function users_in_database ()
39
  {
40
+ global $wpdb; /** @var $wpdb \wpdb */
41
 
42
  $q1 = mysql_query ("SELECT SQL_CALC_FOUND_ROWS `" . $wpdb->users . "`.`ID` FROM `" . $wpdb->users . "`, `" . $wpdb->usermeta . "` WHERE `" . $wpdb->users . "`.`ID` = `" . $wpdb->usermeta . "`.`user_id` AND `" . $wpdb->usermeta . "`.`meta_key` = '" . esc_sql ($wpdb->prefix . "capabilities") . "' LIMIT 1", $wpdb->dbh);
43
  $q2 = mysql_query ("SELECT FOUND_ROWS()", $wpdb->dbh);
63
  */
64
  public static function get_user_custom_with ($subscr_or_txn_id = FALSE, $os0 = FALSE)
65
  {
66
+ global $wpdb; /** @var $wpdb \wpdb */
67
 
68
  if /* This case includes some additional routines that can use the ``$os0`` value. */ ($subscr_or_txn_id && $os0)
69
  {
94
  */
95
  public static function get_user_id_with ($subscr_or_txn_id = FALSE, $os0 = FALSE)
96
  {
97
+ global $wpdb; /** @var $wpdb \wpdb */
98
 
99
  if /* This case includes some additional routines that can use the ``$os0`` value. */($subscr_or_txn_id && $os0)
100
  {
123
  */
124
  public static function get_user_email_with ($subscr_or_txn_id = FALSE, $os0 = FALSE)
125
  {
126
+ global $wpdb; /** @var $wpdb \wpdb */
127
 
128
  if /* This case includes some additional routines that can use the ``$os0`` value. */($subscr_or_txn_id && $os0)
129
  {
228
  */
229
  public static function user_login_email_exists ($user_login = FALSE, $user_email = FALSE)
230
  {
231
+ global $wpdb; /** @var $wpdb \wpdb */
232
 
233
  if /* Only if we have both of these. */ ($user_login && $user_email)
234
  if (($user_id = $wpdb->get_var ("SELECT `ID` FROM `" . $wpdb->users . "` WHERE `user_login` LIKE '" . esc_sql (like_escape ($user_login)) . "' AND `user_email` LIKE '" . esc_sql (like_escape ($user_email)) . "' LIMIT 1")))
295
  */
296
  public static function get_user_field ($field_id = FALSE, $user_id = FALSE) // Very powerful function here.
297
  {
298
+ global $wpdb; /** @var $wpdb \wpdb */
299
 
300
  $current_user = /* Current User's object (used when/if `$user_id` is empty). */ wp_get_current_user ();
301
 
includes/functions/api-functions.inc.php CHANGED
@@ -2245,13 +2245,36 @@ if(!function_exists("s2member_paid_registration_time"))
2245
  return c_ws_plugin__s2member_registration_times::paid_registration_time($level, $user_id);
2246
  }
2247
  }
2248
- if(!function_exists("s2member_capability_times"))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2249
  {
2250
- function s2member_capability_times($user_id = false, $levels_and_or_caps = false)
 
 
 
 
 
 
 
2251
  {
2252
  if(!$user_id) $user_id = get_current_user_id();
2253
 
2254
- return c_ws_plugin__s2member_registration_times::get_capability_times($user_id, $levels_and_or_caps);
2255
  }
2256
  }
2257
  /**
2245
  return c_ws_plugin__s2member_registration_times::paid_registration_time($level, $user_id);
2246
  }
2247
  }
2248
+ /**
2249
+ * Gets access capability times.
2250
+ *
2251
+ * @package s2Member\API_Functions
2252
+ * @since 140514
2253
+ *
2254
+ * @param integer $user_id WP User ID.
2255
+ * @param array $access_caps Optional. If not passed, this returns all times for all caps.
2256
+ * If passed, please pass an array of specific access capabilities to get the times for.
2257
+ * If removal times are desired, you should add a `-` prefix.
2258
+ * e.g. `array('ccap_music','level2','-ccap_video')`
2259
+ *
2260
+ * @return array An array of all access capability times.
2261
+ * Keys are UTC timestamps (w/ microtime precision), values are the capabilities (including `-` prefixed removals).
2262
+ * e.g. `array('1234567890.0001' => 'ccap_music', '1234567890.0002' => 'level2', '1234567890.0003' => '-ccap_video')`
2263
+ */
2264
+ if(!function_exists("s2member_access_cap_times") && !function_exists("s2member_capability_times"))
2265
  {
2266
+ function s2member_access_cap_times($user_id = NULL, $access_caps = array())
2267
+ {
2268
+ if(!$user_id) $user_id = get_current_user_id();
2269
+
2270
+ return c_ws_plugin__s2member_access_cap_times::get_access_cap_times($user_id, $access_caps);
2271
+ }
2272
+ /* Deprecated in favor of `s2member_access_cap_times()`. */
2273
+ function s2member_capability_times($user_id = NULL, $access_caps = array())
2274
  {
2275
  if(!$user_id) $user_id = get_current_user_id();
2276
 
2277
+ return c_ws_plugin__s2member_access_cap_times::get_access_cap_times($user_id, $access_caps);
2278
  }
2279
  }
2280
  /**
includes/hooks.inc.php CHANGED
@@ -94,6 +94,7 @@ add_filter("bp_core_get_site_options", "c_ws_plugin__s2member_option_forces::che
94
  add_filter("random_password", "c_ws_plugin__s2member_registrations::generate_password");
95
  add_action("user_register", "c_ws_plugin__s2member_registrations::configure_user_registration");
96
  add_action("register_form", "c_ws_plugin__s2member_custom_reg_fields::custom_registration_fields");
 
97
 
98
  add_filter("add_signup_meta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");
99
  add_filter("bp_signup_usermeta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");
@@ -107,6 +108,7 @@ add_action("wpmu_activate_blog", "c_ws_plugin__s2member_registrations::configure
107
  add_action("signup_extra_fields", "c_ws_plugin__s2member_custom_reg_fields::ms_custom_registration_fields");
108
 
109
  add_action("bp_after_signup_profile_fields", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_registration_fields_4bp");
 
110
  add_action("bp_after_profile_field_content", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_fields_4bp");
111
  add_action("bp_profile_field_item", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_field_items_4bp");
112
 
@@ -154,14 +156,22 @@ add_action("network_admin_notices", "c_ws_plugin__s2member_admin_notices::admin_
154
  add_action("pre_user_query", "c_ws_plugin__s2member_users_list::users_list_query");
155
  add_filter("manage_users_columns", "c_ws_plugin__s2member_users_list::users_list_cols");
156
  add_filter("manage_users_custom_column", "c_ws_plugin__s2member_users_list::users_list_display_cols", 10, 3);
 
 
157
  add_action("edit_user_profile", "c_ws_plugin__s2member_users_list::users_list_edit_cols");
158
  add_action("show_user_profile", "c_ws_plugin__s2member_users_list::users_list_edit_cols");
159
  add_action("edit_user_profile_update", "c_ws_plugin__s2member_users_list::users_list_update_cols");
160
  add_action("personal_options_update", "c_ws_plugin__s2member_users_list::users_list_update_cols");
161
  add_action("set_user_role", "c_ws_plugin__s2member_registration_times::synchronize_paid_reg_times", 10, 2);
162
- add_action("update_user_meta", "c_ws_plugin__s2member_registration_times::log_capability_time", 10, 4);
163
  add_filter("show_password_fields", "c_ws_plugin__s2member_user_securities::hide_password_fields", 10, 2);
164
 
 
 
 
 
 
 
 
165
  add_filter("cron_schedules", "c_ws_plugin__s2member_cron_jobs::extend_cron_schedules");
166
  add_action("ws_plugin__s2member_auto_eot_system__schedule", "c_ws_plugin__s2member_auto_eots::auto_eot_system");
167
 
94
  add_filter("random_password", "c_ws_plugin__s2member_registrations::generate_password");
95
  add_action("user_register", "c_ws_plugin__s2member_registrations::configure_user_registration");
96
  add_action("register_form", "c_ws_plugin__s2member_custom_reg_fields::custom_registration_fields");
97
+ add_filter("registration_errors", "c_ws_plugin__s2member_registrations::custom_registration_field_errors", 10, 3);
98
 
99
  add_filter("add_signup_meta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");
100
  add_filter("bp_signup_usermeta", "c_ws_plugin__s2member_registrations::ms_process_signup_meta");
108
  add_action("signup_extra_fields", "c_ws_plugin__s2member_custom_reg_fields::ms_custom_registration_fields");
109
 
110
  add_action("bp_after_signup_profile_fields", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_registration_fields_4bp");
111
+ add_action("bp_signup_validate", "c_ws_plugin__s2member_registrations::custom_registration_field_errors_4bp");
112
  add_action("bp_after_profile_field_content", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_fields_4bp");
113
  add_action("bp_profile_field_item", "c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_field_items_4bp");
114
 
156
  add_action("pre_user_query", "c_ws_plugin__s2member_users_list::users_list_query");
157
  add_filter("manage_users_columns", "c_ws_plugin__s2member_users_list::users_list_cols");
158
  add_filter("manage_users_custom_column", "c_ws_plugin__s2member_users_list::users_list_display_cols", 10, 3);
159
+ add_filter("manage_users_sortable_columns", "c_ws_plugin__s2member_users_list::users_list_add_sortable");
160
+ add_filter("pre_user_query", "c_ws_plugin__s2member_users_list::users_list_make_sortable");
161
  add_action("edit_user_profile", "c_ws_plugin__s2member_users_list::users_list_edit_cols");
162
  add_action("show_user_profile", "c_ws_plugin__s2member_users_list::users_list_edit_cols");
163
  add_action("edit_user_profile_update", "c_ws_plugin__s2member_users_list::users_list_update_cols");
164
  add_action("personal_options_update", "c_ws_plugin__s2member_users_list::users_list_update_cols");
165
  add_action("set_user_role", "c_ws_plugin__s2member_registration_times::synchronize_paid_reg_times", 10, 2);
 
166
  add_filter("show_password_fields", "c_ws_plugin__s2member_user_securities::hide_password_fields", 10, 2);
167
 
168
+ add_action("add_user_meta", "c_ws_plugin__s2member_access_cap_times::get_user_caps_before_update_on_add", 10, 3);
169
+ add_action("update_user_meta", "c_ws_plugin__s2member_access_cap_times::get_user_caps_before_update", 10, 4);
170
+
171
+ add_action("added_user_meta", "c_ws_plugin__s2member_access_cap_times::log_access_cap_times", 10, 4);
172
+ add_action("updated_user_meta", "c_ws_plugin__s2member_access_cap_times::log_access_cap_times", 10, 4);
173
+ add_action("deleted_user_meta", "c_ws_plugin__s2member_access_cap_times::log_access_cap_times_on_delete", 10, 3);
174
+
175
  add_filter("cron_schedules", "c_ws_plugin__s2member_cron_jobs::extend_cron_schedules");
176
  add_action("ws_plugin__s2member_auto_eot_system__schedule", "c_ws_plugin__s2member_auto_eots::auto_eot_system");
177
 
includes/jquery/.htaccess CHANGED
@@ -1 +1,6 @@
1
- allow from all
 
 
 
 
 
1
+ <IfModule authz_core_module>
2
+ Require all granted
3
+ </IfModule>
4
+ <IfModule !authz_core_module>
5
+ allow from all
6
+ </IfModule>
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-logs/)){$("input#ws-plugin--s2member-gateway-debug-logs-extensive-1").click(function(){var $this=$(this),thisChecked=(this.checked)?true:false;if(thisChecked){$("input#ws-plugin--s2member-gateway-debug-logs-1").attr("checked","checked")}});var $toggles=$("a.ws-plugin--s2member-log-file-viewport-toggle");$toggles.click(function(){$("textarea#ws-plugin--s2member-log-file-viewer").each(function(){var $viewer=$(this);if($viewer.attr("data-state")!=="expanded"){$viewer.css({height:($viewer.prop("scrollHeight")+50)+"px","overflow-y":"auto"});$toggles.html("&#8657; normalize viewport &#10073;");$viewer.attr("data-state","expanded")}else{$viewer.css({height:"auto","overflow-y":"scroll"});$toggles.html("&#8659; expand viewport &#8659;");$viewer.attr("data-state","scrolling")}});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");$("select#ws-plugin--s2member-login-reg-design-enabled").change(function(){var $this=$(this),$loginRegDesign=$("div#ws-plugin--s2member-login-reg-design");if($this.val()==="0"){$(":input",$loginRegDesign).attr("disabled","disabled"),$loginRegDesign.css("opacity","0.5"),$loginRegDesign.hide()}else{$(":input",$loginRegDesign).removeAttr("disabled"),$loginRegDesign.css("opacity",""),$loginRegDesign.show()}}).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".')},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".')},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&&currencyCode.toUpperCase()==="USD"){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&&currencyCode.toUpperCase()==="USD"){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&&currencyCode.toUpperCase()==="USD"){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&&currencyCode.toUpperCase()==="USD"){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-logs/)){$("input#ws-plugin--s2member-gateway-debug-logs-extensive-1").click(function(){var $this=$(this),thisChecked=(this.checked)?true:false;if(thisChecked){$("input#ws-plugin--s2member-gateway-debug-logs-1").attr("checked","checked")}});var $toggles=$("a.ws-plugin--s2member-log-file-viewport-toggle");$toggles.click(function(){$("textarea#ws-plugin--s2member-log-file-viewer").each(function(){var $viewer=$(this);if($viewer.attr("data-state")!=="expanded"){$viewer.css({height:($viewer.prop("scrollHeight")+50)+"px","overflow-y":"auto"});$toggles.html("&#8657; normalize viewport &#10073;");$viewer.attr("data-state","expanded")}else{$viewer.css({height:"auto","overflow-y":"scroll"});$toggles.html("&#8659; expand viewport &#8659;");$viewer.attr("data-state","scrolling")}});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");$("select#ws-plugin--s2member-login-reg-design-enabled").change(function(){var $this=$(this),$loginRegDesign=$("div#ws-plugin--s2member-login-reg-design");if($this.val()==="0"){$(":input",$loginRegDesign).attr("disabled","disabled"),$loginRegDesign.css("opacity","0.5"),$loginRegDesign.hide()}else{$(":input",$loginRegDesign).removeAttr("disabled"),$loginRegDesign.css("opacity",""),$loginRegDesign.show()}}).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".')},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".')},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&&currencyCode.toUpperCase()==="USD"){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&&currencyCode.toUpperCase()==="USD"){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&&currencyCode.toUpperCase()==="USD"){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&&currencyCode.toUpperCase()==="USD"){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
@@ -579,8 +579,8 @@ jQuery(document).ready(function($)
579
  form += '<optgroup label="Any Character Combination">';
580
  for(i = 1; i <= 25; i++)
581
  {
582
- form += '<option value="any-'+i+'"'+((field.expected === 'any-'+i) ? ' selected="selected"' : '')+'">Any Character Combination ( '+i+' character minimum )</option>';
583
- form += '<option value="any-'+i+'-e"'+((field.expected === 'any-'+i+'-e') ? ' selected="selected"' : '')+'">Any Character Combination ( exactly '+i+' character'+((i > 1) ? 's' : '')+' )</option>';
584
  }
585
  form += '</optgroup>';
586
 
@@ -589,8 +589,8 @@ jQuery(document).ready(function($)
589
  form += '<optgroup label="Alphanumerics, Spaces &amp; Punctuation Only">';
590
  for(i = 1; i <= 25; i++)
591
  {
592
- form += '<option value="alphanumerics-spaces-punctuation-'+i+'"'+((field.expected === 'alphanumerics-spaces-punctuation-'+i) ? ' selected="selected"' : '')+'">Alphanumerics, Spaces &amp; Punctuation ( '+i+' character minimum )</option>';
593
- 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>';
594
  }
595
  form += '</optgroup>';
596
 
@@ -599,8 +599,8 @@ jQuery(document).ready(function($)
599
  form += '<optgroup label="Alphanumerics &amp; Spaces Only">';
600
  for(i = 1; i <= 25; i++)
601
  {
602
- form += '<option value="alphanumerics-spaces-'+i+'"'+((field.expected === 'alphanumerics-spaces-'+i) ? ' selected="selected"' : '')+'">Alphanumerics &amp; Spaces ( '+i+' character minimum )</option>';
603
- 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>';
604
  }
605
  form += '</optgroup>';
606
 
@@ -609,8 +609,8 @@ jQuery(document).ready(function($)
609
  form += '<optgroup label="Alphanumerics &amp; Punctuation Only">';
610
  for(i = 1; i <= 25; i++)
611
  {
612
- form += '<option value="alphanumerics-punctuation-'+i+'"'+((field.expected === 'alphanumerics-punctuation-'+i) ? ' selected="selected"' : '')+'">Alphanumerics &amp; Punctuation ( '+i+' character minimum )</option>';
613
- 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>';
614
  }
615
  form += '</optgroup>';
616
 
@@ -619,8 +619,8 @@ jQuery(document).ready(function($)
619
  form += '<optgroup label="Alphanumerics Only">';
620
  for(i = 1; i <= 25; i++)
621
  {
622
- form += '<option value="alphanumerics-'+i+'"'+((field.expected === 'alphanumerics-'+i) ? ' selected="selected"' : '')+'">Alphanumerics ( '+i+' character minimum )</option>';
623
- form += '<option value="alphanumerics-'+i+'-e"'+((field.expected === 'alphanumerics-'+i+'-e') ? ' selected="selected"' : '')+'">Alphanumerics ( exactly '+i+' character'+((i > 1) ? 's' : '')+' )</option>';
624
  }
625
  form += '</optgroup>';
626
 
@@ -629,8 +629,8 @@ jQuery(document).ready(function($)
629
  form += '<optgroup label="Alphabetics Only">';
630
  for(i = 1; i <= 25; i++)
631
  {
632
- form += '<option value="alphabetics-'+i+'"'+((field.expected === 'alphabetics-'+i) ? ' selected="selected"' : '')+'">Alphabetics ( '+i+' character minimum )</option>';
633
- form += '<option value="alphabetics-'+i+'-e"'+((field.expected === 'alphabetics-'+i+'-e') ? ' selected="selected"' : '')+'">Alphabetics ( exactly '+i+' character'+((i > 1) ? 's' : '')+' )</option>';
634
  }
635
  form += '</optgroup>';
636
 
@@ -639,8 +639,8 @@ jQuery(document).ready(function($)
639
  form += '<optgroup label="Numeric Digits Only">';
640
  for(i = 1; i <= 25; i++)
641
  {
642
- form += '<option value="numerics-'+i+'"'+((field.expected === 'numerics-'+i) ? ' selected="selected"' : '')+'">Numeric Digits ( '+i+' digit minimum )</option>';
643
- form += '<option value="numerics-'+i+'-e"'+((field.expected === 'numerics-'+i+'-e') ? ' selected="selected"' : '')+'">Numeric Digits ( exactly '+i+' digit'+((i > 1) ? 's' : '')+' )</option>';
644
  }
645
  form += '</optgroup>';
646
 
579
  form += '<optgroup label="Any Character Combination">';
580
  for(i = 1; i <= 25; i++)
581
  {
582
+ form += '<option value="any-'+i+'"'+((field.expected === 'any-'+i) ? ' selected="selected"' : '')+'">Any Character Combination ('+i+' character minimum)</option>';
583
+ form += '<option value="any-'+i+'-e"'+((field.expected === 'any-'+i+'-e') ? ' selected="selected"' : '')+'">Any Character Combination (exactly '+i+' character'+((i > 1) ? 's' : '')+')</option>';
584
  }
585
  form += '</optgroup>';
586
 
589
  form += '<optgroup label="Alphanumerics, Spaces &amp; Punctuation Only">';
590
  for(i = 1; i <= 25; i++)
591
  {
592
+ form += '<option value="alphanumerics-spaces-punctuation-'+i+'"'+((field.expected === 'alphanumerics-spaces-punctuation-'+i) ? ' selected="selected"' : '')+'">Alphanumerics, Spaces &amp; Punctuation ('+i+' character minimum)</option>';
593
+ 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>';
594
  }
595
  form += '</optgroup>';
596
 
599
  form += '<optgroup label="Alphanumerics &amp; Spaces Only">';
600
  for(i = 1; i <= 25; i++)
601
  {
602
+ form += '<option value="alphanumerics-spaces-'+i+'"'+((field.expected === 'alphanumerics-spaces-'+i) ? ' selected="selected"' : '')+'">Alphanumerics &amp; Spaces ('+i+' character minimum)</option>';
603
+ 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>';
604
  }
605
  form += '</optgroup>';
606
 
609
  form += '<optgroup label="Alphanumerics &amp; Punctuation Only">';
610
  for(i = 1; i <= 25; i++)
611
  {
612
+ form += '<option value="alphanumerics-punctuation-'+i+'"'+((field.expected === 'alphanumerics-punctuation-'+i) ? ' selected="selected"' : '')+'">Alphanumerics &amp; Punctuation ('+i+' character minimum)</option>';
613
+ 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>';
614
  }
615
  form += '</optgroup>';
616
 
619
  form += '<optgroup label="Alphanumerics Only">';
620
  for(i = 1; i <= 25; i++)
621
  {
622
+ form += '<option value="alphanumerics-'+i+'"'+((field.expected === 'alphanumerics-'+i) ? ' selected="selected"' : '')+'">Alphanumerics ('+i+' character minimum)</option>';
623
+ form += '<option value="alphanumerics-'+i+'-e"'+((field.expected === 'alphanumerics-'+i+'-e') ? ' selected="selected"' : '')+'">Alphanumerics (exactly '+i+' character'+((i > 1) ? 's' : '')+')</option>';
624
  }
625
  form += '</optgroup>';
626
 
629
  form += '<optgroup label="Alphabetics Only">';
630
  for(i = 1; i <= 25; i++)
631
  {
632
+ form += '<option value="alphabetics-'+i+'"'+((field.expected === 'alphabetics-'+i) ? ' selected="selected"' : '')+'">Alphabetics ('+i+' character minimum)</option>';
633
+ form += '<option value="alphabetics-'+i+'-e"'+((field.expected === 'alphabetics-'+i+'-e') ? ' selected="selected"' : '')+'">Alphabetics (exactly '+i+' character'+((i > 1) ? 's' : '')+')</option>';
634
  }
635
  form += '</optgroup>';
636
 
639
  form += '<optgroup label="Numeric Digits Only">';
640
  for(i = 1; i <= 25; i++)
641
  {
642
+ form += '<option value="numerics-'+i+'"'+((field.expected === 'numerics-'+i) ? ' selected="selected"' : '')+'">Numeric Digits ('+i+' digit minimum)</option>';
643
+ form += '<option value="numerics-'+i+'-e"'+((field.expected === 'numerics-'+i+'-e') ? ' selected="selected"' : '')+'">Numeric Digits (exactly '+i+' digit'+((i > 1) ? 's' : '')+')</option>';
644
  }
645
  form += '</optgroup>';
646
 
includes/menu-pages/menu-pages.css CHANGED
@@ -200,6 +200,14 @@ div.ws-menu-page .ws-menu-page-hilite
200
  border-radius : 3px;
201
  padding : 0.2em;
202
  }
 
 
 
 
 
 
 
 
203
  div.ws-menu-page .ws-menu-page-error-hilite
204
  {
205
  color : #FFFFFF;
200
  border-radius : 3px;
201
  padding : 0.2em;
202
  }
203
+ div.ws-menu-page .ws-menu-page-bright-hilite
204
+ {
205
+ font-size : 102%;
206
+ background : #EBF084;
207
+
208
+ border-radius : 3px;
209
+ padding : 0.2em;
210
+ }
211
  div.ws-menu-page .ws-menu-page-error-hilite
212
  {
213
  color : #FFFFFF;
includes/s2member-min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function(d){var c='<?php echo c_ws_plugin__s2member_utils_conds::bp_is_installed ("query-active-plugins") ? "1" : ""; ?>';var a='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (c_ws_plugin__s2member_utils_dirs::basename_dir_app_data ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])); ?>';var b=(typeof ws_plugin__s2member_skip_all_file_confirmations!=="undefined"&&ws_plugin__s2member_skip_all_file_confirmations)?true:false;var e=[];if(S2MEMBER_CURRENT_USER_IS_LOGGED_IN&&S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED&&!b){d('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"], a[href^="'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"]').click(function(){if(!this.href.match(/s2member[_\-]file[_\-]download[_\-]key[\=\-].+/i)){var f='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Confirm File Download —", "s2member-front", "s2member")); ?>\n\n';f+=d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`ve downloaded %s protected %s in the last %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY,((S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("file", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("files", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("24 hours", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("%s days", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)))+"\n\n";f+=(S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`re entitled to UNLIMITED downloads though (so, no worries).", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`re entitled to %s unique %s %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED,((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("download", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("downloads", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("each day", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("every %s-day period", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)));if((this.href.match(/s2member[_\-]skip[_\-]confirmation/i)&&!this.href.match(/s2member[_\-]skip[_\-]confirmation[\=\-](0|no|false)/i))||confirm(f)){if(d.inArray(this.href,e)===-1){S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY++,e.push(this.href)}return true}else{return false}}else{return true}})}if(!location.href.match(/\/wp-admin(\/|\?|$)/)){d("input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#ws-plugin--s2member-profile-login"),d("input#ws-plugin--s2member-profile-password1"),d("input#ws-plugin--s2member-profile-password2"),d("div#ws-plugin--s2member-profile-password-strength"))});d("form#ws-plugin--s2member-profile").submit(function(){var h=this,g="",f="",l="";var j=d("input#ws-plugin--s2member-profile-password1",h);var i=d("input#ws-plugin--s2member-profile-password2",h);var k=d("input#ws-plugin--s2member-profile-submit",h);d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("strong").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(d.trim(j.val())&&d.trim(j.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(d.trim(j.val())&&d.trim(j.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(k);return true})}if(location.href.match(/\/wp-signup\.php/)){d("div#content > div.mu_register > form#setupform").submit(function(){var h=this,g="",f="",j="";d("input#user_email",h).attr("data-expected","email");var i=d('p.submit input[type="submit"]',h);d("input#user_name, input#user_email, input#blogname, input#blog_title, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var k=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(k&&(g=d.trim(d('label[for="'+k+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){j+=f+"\n\n"}}});if(j=d.trim(j)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+j);return false}ws_plugin__s2member_animateProcessing(i);return true})}if(location.href.match(/\/wp-login\.php/)){d("div#login > form#registerform input#user_login").attr("tabindex","10");d("div#login > form#registerform input#user_email").attr("tabindex","20");d("div#login > form#registerform input#wp-submit").attr("tabindex","1000");d("input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#user_login"),d("input#ws-plugin--s2member-custom-reg-field-user-pass1"),d("input#ws-plugin--s2member-custom-reg-field-user-pass2"),d("div#ws-plugin--s2member-custom-reg-field-user-pass-strength"))});d("div#login > form#registerform").submit(function(){var h=this,g="",f="",l="";d("input#user_email",h).attr("data-expected","email");var k=d('input#ws-plugin--s2member-custom-reg-field-user-pass1[aria-required="true"]',h);var i=d("input#ws-plugin--s2member-custom-reg-field-user-pass2",h);var j=d("input#wp-submit",h);d("input#user_login, input#user_email, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(d.inArray(m,["user_login","user_email","captcha_code"])!==-1){if((g=d.trim(d(this).parent("label").text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}else{if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(k.length&&d.trim(k.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(k.length&&d.trim(k.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(j);return true})}if(location.href.match(/\/wp-admin\/(user\/)?profile\.php/)){d("form#your-profile").submit(function(){var h=this,g="",f="",i="";d("input#email",h).attr("data-expected","email");d(':input[id^="ws-plugin--s2member-profile-"]',h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}if(c){d("body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#signup_email",h).attr("data-expected","email");d("input#signup_username, input#signup_email, input#signup_password, input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true});d("body.logged-in.profile.profile-edit :input.ws-plugin--s2member-profile-field-4bp").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}ws_plugin__s2member_passwordStrengthMeter=function(h,f){var g=0;if((h!=f)&&f.length>0){return"mismatch"}else{if(h.length<1){return"empty"}else{if(h.length<6){return"short"}}}if(h.match(/[0-9]/)){g+=10}if(h.match(/[a-z]/)){g+=10}if(h.match(/[A-Z]/)){g+=10}if(h.match(/[^0-9a-zA-Z]/)){g=(g===30)?g+20:g+10}if(g<30){return"bad"}if(g<50){return"good"}return"strong"};ws_plugin__s2member_passwordStrength=function(h,k,i,g){if(h instanceof jQuery&&k instanceof jQuery&&i instanceof jQuery&&g instanceof jQuery){var j={empty:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strength indicator", "s2member-front", "s2member")); ?>',"short":'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Very weak", "s2member-front", "s2member")); ?>',bad:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Weak", "s2member-front", "s2member")); ?>',good:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Medium", "s2member-front", "s2member")); ?>',strong:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strong", "s2member-front", "s2member")); ?>',mismatch:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Mismatch", "s2member-front", "s2member")); ?>'};g.removeClass("ws-plugin--s2member-password-strength-short");g.removeClass("ws-plugin--s2member-password-strength-bad");g.removeClass("ws-plugin--s2member-password-strength-good");g.removeClass("ws-plugin--s2member-password-strength-strong");g.removeClass("ws-plugin--s2member-password-strength-mismatch");g.removeClass("ws-plugin--s2member-password-strength-empty");var f=ws_plugin__s2member_passwordStrengthMeter(k.val(),i.val());g.addClass("ws-plugin--s2member-password-strength-"+f).html(j[f])}};ws_plugin__s2member_validationErrors=function(r,q,g,m,l){if(typeof r==="string"&&r&&typeof q==="object"&&typeof g==="object"){if(typeof q.tagName==="string"&&q.tagName.match(/^(input|textarea|select)$/i)&&!q.disabled){var t=q.tagName.toLowerCase(),p=d(q),o=d.trim(p.attr("type")).toLowerCase(),f=d.trim(p.attr("name")),s=p.val();var m=(typeof m==="boolean")?m:(p.attr("aria-required")==="true"),l=(typeof l==="string")?l:d.trim(p.attr("data-expected"));var k=('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>'>0)?true:false;var i=new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@',"i");if(t==="input"&&o==="checkbox"&&f.match(/\[\]$/)){if(typeof q.id==="string"&&q.id.match(/-0$/)){if(m&&!d('input[name="'+f.replace(/([\[\]])/g,"$1")+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please check at least one of the boxes.", "s2member-front", "s2member")); ?>'}}}else{if(t==="input"&&o==="checkbox"){if(m&&!q.checked){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Required. This box must be checked.", "s2member-front", "s2member")); ?>'}}else{if(t==="input"&&o==="radio"){if(typeof q.id==="string"&&q.id.match(/-0$/)){if(m&&!d('input[name="'+f.replace(/([\[\]])/g,"$1")+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please select one of the options.", "s2member-front", "s2member")); ?>'}}}else{if(t==="select"&&p.attr("multiple")){if(m&&(!(s instanceof Array)||!s.length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please select at least one of the options.", "s2member-front", "s2member")); ?>'}}else{if(typeof s!=="string"||(m&&!(s=d.trim(s)).length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("This is a required field, please try again.", "s2member-front", "s2member")); ?>'}else{if((s=d.trim(s)).length&&((t==="input"&&o.match(/^(text|password)$/i))||t==="textarea")&&typeof l==="string"&&l.length){if(l==="numeric-wp-commas"&&(!s.match(/^[0-9\.,]+$/)||isNaN(s.replace(/,/g,"")))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be numeric (with or without decimals, commas allowed).", "s2member-front", "s2member")); ?>'}else{if(l==="numeric"&&(!s.match(/^[0-9\.]+$/)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be numeric (with or without decimals, no commas).", "s2member-front", "s2member")); ?>'}else{if(l==="integer"&&(!s.match(/^[0-9]+$/)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be an integer (a whole number, without any decimals).", "s2member-front", "s2member")); ?>'}else{if(l==="integer-gt-0"&&(!s.match(/^[0-9]+$/)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be an integer > 0 (whole number, no decimals, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="float"&&(!s.match(/^[0-9\.]+$/)||!s.match(/[0-9]/)||!s.match(/\./)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a float (floating point number, decimals required).", "s2member-front", "s2member")); ?>'}else{if(l==="float-gt-0"&&(!s.match(/^[0-9\.]+$/)||!s.match(/[0-9]/)||!s.match(/\./)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a float > 0 (floating point number, decimals required, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="date"&&!s.match(/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&!s.match(/^([a-z_~0-9\+\-]+)(((\.?)([a-z_~0-9\+\-]+))*)(@)([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a valid email address.", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&k&&s.match(i)){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>',s.split("@")[0])}else{if(l==="url"&&!s.match(/^http(s?)\:\/\/(.{5,})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>'}else{if(l==="domain"&&!s.match(/^([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>'}else{if(l==="phone"&&(!s.match(/^[0-9 \(\)\-]+$/)||s.replace(/[^0-9]/g,"").length!==10)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a phone # (10 digits w/possible hyphens,spaces,brackets).", "s2member-front", "s2member")); ?>'}else{if(l==="uszip"&&!s.match(/^[0-9]{5}(-[0-9]{4})?$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a US zipcode (5-9 digits w/possible hyphen).", "s2member-front", "s2member")); ?>'}else{if(l==="cazip"&&!s.match(/^[0-9A-Z]{3}( ?)[0-9A-Z]{3}$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>'}else{if(l==="uczip"&&!s.match(/^[0-9]{5}(-[0-9]{4})?$/)&&!s.match(/^[0-9A-Z]{3}( ?)[0-9A-Z]{3}$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-spaces-punctuation-([0-9]+)(-e)?$/)&&!s.match(/^[a-z 0-9,\.\/\?\:;"'\{\}\[\]\|\\\+\=_\-\(\)\*&\^%\$#@\!`~]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-spaces-([0-9]+)(-e)?$/)&&!s.match(/^[a-z 0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-punctuation-([0-9]+)(-e)?$/)&&!s.match(/^[a-z0-9,\.\/\?\:;"'\{\}\[\]\|\\\+\=_\-\(\)\*&\^%\$#@\!`~]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics-([0-9]+)(-e)?$/)&&!s.match(/^[a-z0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphabetics-([0-9]+)(-e)?$/)&&!s.match(/^[a-z]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^numerics-([0-9]+)(-e)?$/)&&!s.match(/^[0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use numeric digits only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^(any|alphanumerics-spaces-punctuation|alphanumerics-spaces|alphanumerics-punctuation|alphanumerics|alphabetics|numerics)-([0-9]+)(-e)?$/)){var n=l.split("-"),h=Number(n[1]),j=(n.length>2&&n[2]==="e")?true:false;if(j&&s.length!==h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be exactly %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')))}else{if(s.length<h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be at least %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}return""};ws_plugin__s2member_animateProcessingConfig={originalText:"",interval:null,speed:100},ws_plugin__s2member_animateProcessing=function(g,f){if(g instanceof jQuery){if(f){clearInterval(ws_plugin__s2member_animateProcessingConfig.interval);if(ws_plugin__s2member_animateProcessingConfig.originalText){g.val(ws_plugin__s2member_animateProcessingConfig.originalText)}return}g.first().each(function(){var k=d(this),j=0,h="r",l=[".","..","..."];ws_plugin__s2member_animateProcessingConfig.originalText=k.val();clearInterval(ws_plugin__s2member_animateProcessingConfig.interval);ws_plugin__s2member_animateProcessingConfig.interval=setInterval(function(){if(h==="r"){if(j+1<=l.length-1){j=j+1,h="r"}else{j=j-1,h="l"}}else{if(h==="l"){if(j-1>=0){j=j-1,h="l"}else{j=j+1,h="r"}}}for(var m=l[j],i=l[j].length;i<l.length;i++){m+=" "}k.val('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Processing", "s2member-front", "s2member")); ?>'+m)},ws_plugin__s2member_animateProcessingConfig.speed)})}}});
1
+ jQuery(document).ready(function(d){var c='<?php echo c_ws_plugin__s2member_utils_conds::bp_is_installed ("query-active-plugins") ? "1" : ""; ?>';var a='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (c_ws_plugin__s2member_utils_dirs::basename_dir_app_data ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])); ?>';var b=(typeof ws_plugin__s2member_skip_all_file_confirmations!=="undefined"&&ws_plugin__s2member_skip_all_file_confirmations)?true:false;var e=[];if(S2MEMBER_CURRENT_USER_IS_LOGGED_IN&&S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED&&!b){d('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"], a[href^="'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"]').click(function(){if(!this.href.match(/s2member[_\-]file[_\-]download[_\-]key[\=\-].+/i)){var f='<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Confirm File Download —", "s2member-front", "s2member")); ?>\n\n';f+=d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`ve downloaded %s protected %s in the last %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY,((S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("file", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("files", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("24 hours", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("%s days", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)))+"\n\n";f+=(S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`re entitled to UNLIMITED downloads though (so, no worries).", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("You`re entitled to %s unique %s %s.", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED,((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("download", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("downloads", "s2member-front", "s2member")); ?>'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("each day", "s2member-front", "s2member")); ?>':d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("every %s-day period", "s2member-front", "s2member")); ?>',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)));if((this.href.match(/s2member[_\-]skip[_\-]confirmation/i)&&!this.href.match(/s2member[_\-]skip[_\-]confirmation[\=\-](0|no|false)/i))||confirm(f)){if(d.inArray(this.href,e)===-1){S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY++,e.push(this.href)}return true}else{return false}}else{return true}})}if(!location.href.match(/\/wp-admin(\/|\?|$)/)){d("input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#ws-plugin--s2member-profile-login"),d("input#ws-plugin--s2member-profile-password1"),d("input#ws-plugin--s2member-profile-password2"),d("div#ws-plugin--s2member-profile-password-strength"))});d("form#ws-plugin--s2member-profile").submit(function(){var h=this,g="",f="",l="";var j=d("input#ws-plugin--s2member-profile-password1",h);var i=d("input#ws-plugin--s2member-profile-password2",h);var k=d("input#ws-plugin--s2member-profile-submit",h);d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("strong").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(d.trim(j.val())&&d.trim(j.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(d.trim(j.val())&&d.trim(j.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(k);return true})}if(location.href.match(/\/wp-signup\.php/)){d("div#content > div.mu_register > form#setupform").submit(function(){var h=this,g="",f="",j="";d("input#user_email",h).attr("data-expected","email");var i=d('p.submit input[type="submit"]',h);d("input#user_name, input#user_email, input#blogname, input#blog_title, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var k=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(k&&(g=d.trim(d('label[for="'+k+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){j+=f+"\n\n"}}});if(j=d.trim(j)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+j);return false}ws_plugin__s2member_animateProcessing(i);return true})}if(location.href.match(/\/wp-login\.php/)){d("div#login > form#registerform input#user_login").attr("tabindex","10");d("div#login > form#registerform input#user_email").attr("tabindex","20");d("div#login > form#registerform input#wp-submit").attr("tabindex","1000");d("input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2").keyup(function(){ws_plugin__s2member_passwordStrength(d("input#user_login"),d("input#ws-plugin--s2member-custom-reg-field-user-pass1"),d("input#ws-plugin--s2member-custom-reg-field-user-pass2"),d("div#ws-plugin--s2member-custom-reg-field-user-pass-strength"))});d("div#login > form#registerform").submit(function(){var h=this,g="",f="",l="";d("input#user_email",h).attr("data-expected","email");var k=d('input#ws-plugin--s2member-custom-reg-field-user-pass1[aria-required="true"]',h);var i=d("input#ws-plugin--s2member-custom-reg-field-user-pass2",h);var j=d("input#wp-submit",h);d("input#user_login, input#user_email, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(d.inArray(m,["user_login","user_email","captcha_code"])!==-1){if((g=d.trim(d(this).parent("label").text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}else{if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}});if(l=d.trim(l)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+l);return false}else{if(k.length&&d.trim(k.val())!==d.trim(i.val())){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Passwords do not match up. Please try again.", "s2member-front", "s2member")); ?>');return false}else{if(k.length&&d.trim(k.val()).length<6){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Password MUST be at least 6 characters. Please try again.", "s2member-front", "s2member")); ?>');return false}}}ws_plugin__s2member_animateProcessing(j);return true})}if(location.href.match(/\/wp-admin\/(user\/)?profile\.php/)){d("form#your-profile").submit(function(){var h=this,g="",f="",i="";d("input#email",h).attr("data-expected","email");d(':input[id^="ws-plugin--s2member-profile-"]',h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}if(c){d("body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#signup_email",h).attr("data-expected","email");d("input#signup_username, input#signup_email, input#signup_password, input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true});d("body.logged-in.profile.profile-edit :input.ws-plugin--s2member-profile-field-4bp").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("— Oops, you missed something: —", "s2member-front", "s2member")); ?>\n\n'+i);return false}return true})}ws_plugin__s2member_passwordStrengthMeter=function(h,f){var g=0;if((h!=f)&&f.length>0){return"mismatch"}else{if(h.length<1){return"empty"}else{if(h.length<6){return"short"}}}if(h.match(/[0-9]/)){g+=10}if(h.match(/[a-z]/)){g+=10}if(h.match(/[A-Z]/)){g+=10}if(h.match(/[^0-9a-zA-Z]/)){g=(g===30)?g+20:g+10}if(g<30){return"bad"}if(g<50){return"good"}return"strong"};ws_plugin__s2member_passwordStrength=function(h,k,i,g){if(h instanceof jQuery&&k instanceof jQuery&&i instanceof jQuery&&g instanceof jQuery){var j={empty:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strength indicator", "s2member-front", "s2member")); ?>',"short":'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Very weak", "s2member-front", "s2member")); ?>',bad:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Weak", "s2member-front", "s2member")); ?>',good:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Medium", "s2member-front", "s2member")); ?>',strong:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Strong", "s2member-front", "s2member")); ?>',mismatch:'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Mismatch", "s2member-front", "s2member")); ?>'};g.removeClass("ws-plugin--s2member-password-strength-short");g.removeClass("ws-plugin--s2member-password-strength-bad");g.removeClass("ws-plugin--s2member-password-strength-good");g.removeClass("ws-plugin--s2member-password-strength-strong");g.removeClass("ws-plugin--s2member-password-strength-mismatch");g.removeClass("ws-plugin--s2member-password-strength-empty");var f=ws_plugin__s2member_passwordStrengthMeter(k.val(),i.val());g.addClass("ws-plugin--s2member-password-strength-"+f).html(j[f])}};ws_plugin__s2member_validationErrors=function(r,q,g,m,l){if(typeof r==="string"&&r&&typeof q==="object"&&typeof g==="object"){if(typeof q.tagName==="string"&&q.tagName.match(/^(input|textarea|select)$/i)&&!q.disabled){var t=q.tagName.toLowerCase(),p=d(q),o=d.trim(p.attr("type")).toLowerCase(),f=d.trim(p.attr("name")),s=p.val();m=(typeof m==="boolean")?m:(p.attr("aria-required")==="true"),l=(typeof l==="string")?l:d.trim(p.attr("data-expected"));var k=('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>'>0);var i=new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@',"i");if(t==="input"&&o==="checkbox"&&f.match(/\[\]$/)){if(typeof q.id==="string"&&q.id.match(/-0$/)){if(m&&!d('input[name="'+f.replace(/([\[\]])/g,"$1")+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please check at least one of the boxes.", "s2member-front", "s2member")); ?>'}}}else{if(t==="input"&&o==="checkbox"){if(m&&!q.checked){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Required. This box must be checked.", "s2member-front", "s2member")); ?>'}}else{if(t==="input"&&o==="radio"){if(typeof q.id==="string"&&q.id.match(/-0$/)){if(m&&!d('input[name="'+f.replace(/([\[\]])/g,"$1")+'"]:checked',g).length){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please select one of the options.", "s2member-front", "s2member")); ?>'}}}else{if(t==="select"&&p.attr("multiple")){if(m&&(!(s instanceof Array)||!s.length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please select at least one of the options.", "s2member-front", "s2member")); ?>'}}else{if(typeof s!=="string"||(m&&!(s=d.trim(s)).length)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("This is a required field, please try again.", "s2member-front", "s2member")); ?>'}else{if((s=d.trim(s)).length&&((t==="input"&&o.match(/^(text|password)$/i))||t==="textarea")&&typeof l==="string"&&l.length){if(l==="numeric-wp-commas"&&(!s.match(/^[0-9\.,]+$/)||isNaN(s.replace(/,/g,"")))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be numeric (with or without decimals, commas allowed).", "s2member-front", "s2member")); ?>'}else{if(l==="numeric"&&(!s.match(/^[0-9\.]+$/)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be numeric (with or without decimals, no commas).", "s2member-front", "s2member")); ?>'}else{if(l==="integer"&&(!s.match(/^[0-9]+$/)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be an integer (a whole number, without any decimals).", "s2member-front", "s2member")); ?>'}else{if(l==="integer-gt-0"&&(!s.match(/^[0-9]+$/)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be an integer > 0 (whole number, no decimals, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="float"&&(!s.match(/^[0-9\.]+$/)||!s.match(/[0-9]/)||!s.match(/\./)||isNaN(s))){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a float (floating point number, decimals required).", "s2member-front", "s2member")); ?>'}else{if(l==="float-gt-0"&&(!s.match(/^[0-9\.]+$/)||!s.match(/[0-9]/)||!s.match(/\./)||isNaN(s)||s<=0)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a float > 0 (floating point number, decimals required, greater than 0).", "s2member-front", "s2member")); ?>'}else{if(l==="date"&&!s.match(/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&!s.match(/^[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+(?:\.?[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+)*@[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a valid email address.", "s2member-front", "s2member")); ?>'}else{if(l==="email"&&k&&s.match(i)){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>',s.split("@")[0])}else{if(l==="url"&&!s.match(/^https?\:\/\/.+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>'}else{if(l==="domain"&&!s.match(/^[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>'}else{if(l==="phone"&&(!s.match(/^[0-9 ()\-]+$/)||s.replace(/[^0-9]+/g,"").length!==10)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a phone # (10 digits w/possible hyphens, spaces, brackets).", "s2member-front", "s2member")); ?>'}else{if(l==="uszip"&&!s.match(/^[0-9]{5}(?:\-[0-9]{4})?$/)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a US zipcode (5-9 digits w/ possible hyphen).", "s2member-front", "s2member")); ?>'}else{if(l==="cazip"&&!s.match(/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>'}else{if(l==="uczip"&&!s.match(/^[0-9]{5}(?:\-[0-9]{4})?$/)&&!s.match(/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics\-spaces\-punctuation\-[0-9]+(?:\-e)?$/)&&!s.match(/^[a-z 0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics\-spaces\-[0-9]+(?:\-e)?$/)&&!s.match(/^[a-z 0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics\-punctuation\-[0-9]+(?:\-e)?$/)&&!s.match(/^[a-z0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphanumerics\-[0-9]+(?:\-e)?$/)&&!s.match(/^[a-z0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^alphabetics\-[0-9]+(?:\-e)?$/)&&!s.match(/^[a-z]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>'}else{if(l.match(/^numerics\-[0-9]+(?:\-e)?$/)&&!s.match(/^[0-9]+$/i)){return r+'\n<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use numeric digits only.", "s2member-front", "s2member")); ?>'}else{if(l.match(/^(?:any|alphanumerics\-spaces\-punctuation|alphanumerics\-spaces|alphanumerics\-punctuation|alphanumerics|alphabetics|numerics)\-[0-9]+(?:\-e)?$/)){var n=l.split("-"),h=Number(n[1]),j=(n.length>2&&n[2]==="e");if(j&&s.length!==h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be exactly %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')))}else{if(s.length<h){return r+"\n"+d.sprintf('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be at least %s %s.", "s2member-front", "s2member")); ?>',h,((n[0]==="numerics")?((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>'):((h===1)?'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>':'<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}return""};ws_plugin__s2member_animateProcessing=function(g,f){if(f){d(g).removeClass("ws-plugin--s2member-animate-processing")}else{d(g).addClass("ws-plugin--s2member-animate-processing")}}});
includes/s2member.css CHANGED
@@ -15,8 +15,23 @@
15
  */
16
 
17
  /*
18
- Structural styles for s2Member Security Badge.
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
 
 
20
  These are basic CSS rules. You can override any of these
21
  through the `/style.css` file for your WordPress theme.
22
  */
@@ -27,8 +42,61 @@ div.ws-plugin--s2member-s-badge
27
  }
28
 
29
  /*
30
- Structural styles for Password strength indicators.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
 
 
 
 
 
 
 
 
 
 
32
  These are basic CSS rules. You can override any of these
33
  through the `/style.css` file for your WordPress theme.
34
  */
@@ -63,7 +131,6 @@ div.ws-plugin--s2member-password-strength-mismatch
63
 
64
  /*
65
  Structural styles for Multisite Integration Forms.
66
-
67
  These are basic CSS rules. You can override any of these
68
  through the `/style.css` file for your WordPress theme.
69
  */
@@ -132,7 +199,6 @@ div#content > div.mu_register > div.mu_alert
132
 
133
  /*
134
  Structural styles for Return Pages.
135
-
136
  These are basic CSS rules. You can override any of these
137
  through the `/style.css` file for your WordPress theme.
138
  */
@@ -225,7 +291,6 @@ div.s2member-return-support-section div.cc-reminder
225
 
226
  /*
227
  Structural styles for Shortcode Profile Editing panel.
228
-
229
  These are basic CSS rules. You can override any of these
230
  through the `/style.css` file for your WordPress theme.
231
  */
@@ -298,7 +363,6 @@ form#ws-plugin--s2member-profile div.ws-plugin--s2member-profile-field-divider-s
298
 
299
  /*
300
  Structural styles for BuddyPress Profile Field items.
301
-
302
  These are basic CSS rules. You can override any of these
303
  through the `/style.css` file for your WordPress theme.
304
  */
@@ -319,7 +383,6 @@ body.profile.public div.ws-plugin--s2member-profile-field-4bp-divider-section-ti
319
 
320
  /*
321
  Structural styles for BuddyPress Registration Fields.
322
-
323
  These are basic CSS rules. You can override any of these
324
  through the `/style.css` file for your WordPress theme.
325
  */
@@ -372,7 +435,6 @@ body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section div
372
 
373
  /*
374
  Structural styles for BuddyPress Profile Field integrations.
375
-
376
  These are basic CSS rules. You can override any of these
377
  through the `/style.css` file for your WordPress theme.
378
  */
15
  */
16
 
17
  /*
18
+ Clearfix styles for s2Member.
19
+ These are basic CSS rules. You can override any of these
20
+ through the `/style.css` file for your WordPress theme.
21
+ */
22
+ .ws-plugin--s2member-clearfix:before,
23
+ .ws-plugin--s2member-clearfix:after
24
+ {
25
+ content : ' ';
26
+ display : table;
27
+ }
28
+ .ws-plugin--s2member-clearfix::after
29
+ {
30
+ clear : both;
31
+ }
32
 
33
+ /*
34
+ Structural styles for s2Member Security Badge.
35
  These are basic CSS rules. You can override any of these
36
  through the `/style.css` file for your WordPress theme.
37
  */
42
  }
43
 
44
  /*
45
+ Button processing animation.
46
+ These are basic CSS rules. You can override any of these
47
+ through the `/style.css` file for your WordPress theme.
48
+ */
49
+ @-moz-keyframes ws-plugin--s2member-spin
50
+ {
51
+ from
52
+ {
53
+ -moz-transform : rotate(0deg);
54
+ }
55
+ to
56
+ {
57
+ -moz-transform : rotate(360deg);
58
+ }
59
+ }
60
+ @-webkit-keyframes ws-plugin--s2member-spin
61
+ {
62
+ from
63
+ {
64
+ -webkit-transform : rotate(0deg);
65
+ }
66
+ to
67
+ {
68
+ -webkit-transform : rotate(360deg);
69
+ }
70
+ }
71
+ @keyframes ws-plugin--s2member-spin
72
+ {
73
+ from
74
+ {
75
+ transform : rotate(0deg);
76
+ }
77
+ to
78
+ {
79
+ transform : rotate(360deg);
80
+ }
81
+ }
82
+ button.ws-plugin--s2member-animate-processing:after
83
+ {
84
+ content : '';
85
+
86
+ float : right;
87
+ width : .8em;
88
+ height : .8em;
89
+ margin : .25em 0 0 .5em;
90
 
91
+ border-radius : 50%;
92
+ border : 1px dashed;
93
+
94
+ -webkit-animation : ws-plugin--s2member-spin 1s linear infinite;
95
+ animation : ws-plugin--s2member-spin 1s linear infinite;
96
+ }
97
+
98
+ /*
99
+ Structural styles for Password strength indicators.
100
  These are basic CSS rules. You can override any of these
101
  through the `/style.css` file for your WordPress theme.
102
  */
131
 
132
  /*
133
  Structural styles for Multisite Integration Forms.
 
134
  These are basic CSS rules. You can override any of these
135
  through the `/style.css` file for your WordPress theme.
136
  */
199
 
200
  /*
201
  Structural styles for Return Pages.
 
202
  These are basic CSS rules. You can override any of these
203
  through the `/style.css` file for your WordPress theme.
204
  */
291
 
292
  /*
293
  Structural styles for Shortcode Profile Editing panel.
 
294
  These are basic CSS rules. You can override any of these
295
  through the `/style.css` file for your WordPress theme.
296
  */
363
 
364
  /*
365
  Structural styles for BuddyPress Profile Field items.
 
366
  These are basic CSS rules. You can override any of these
367
  through the `/style.css` file for your WordPress theme.
368
  */
383
 
384
  /*
385
  Structural styles for BuddyPress Registration Fields.
 
386
  These are basic CSS rules. You can override any of these
387
  through the `/style.css` file for your WordPress theme.
388
  */
435
 
436
  /*
437
  Structural styles for BuddyPress Profile Field integrations.
 
438
  These are basic CSS rules. You can override any of these
439
  through the `/style.css` file for your WordPress theme.
440
  */
includes/s2member.js CHANGED
@@ -352,9 +352,9 @@ jQuery(document).ready (function($)
352
  if (typeof field.tagName === 'string' && field.tagName.match (/^(input|textarea|select)$/i) && !field.disabled)
353
  {
354
  var tag = field.tagName.toLowerCase (), $field = $(field), type = $.trim ($field.attr ('type')).toLowerCase (), name = $.trim ($field.attr ('name')), value = $field.val ();
355
- var required = ( typeof required === 'boolean') ? required : ($field.attr ('aria-required') === 'true'), expected = ( typeof expected === 'string') ? expected : $.trim ($field.attr ('data-expected'));
356
 
357
- var forcePersonalEmails = ('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>' > 0) ? true : false;
358
  var nonPersonalEmailUsers = new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@', 'i');
359
 
360
  if (tag === 'input' && type === 'checkbox' && name.match (/\[\]$/))
@@ -413,7 +413,7 @@ jQuery(document).ready (function($)
413
  {
414
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>';
415
  }
416
- else if (expected === 'email' && !value.match (/^([a-z_~0-9\+\-]+)(((\.?)([a-z_~0-9\+\-]+))*)(@)([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,6})$/i))
417
  {
418
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a valid email address.", "s2member-front", "s2member")); ?>';
419
  }
@@ -421,57 +421,57 @@ jQuery(document).ready (function($)
421
  {
422
  return label + '\n' + $.sprintf ('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>', value.split ('@')[0]);
423
  }
424
- else if (expected === 'url' && !value.match (/^http(s?)\:\/\/(.{5,})$/i))
425
  {
426
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>';
427
  }
428
- else if (expected === 'domain' && !value.match (/^([a-z0-9]+)(((-*)([a-z0-9]+))*)(((\.)([a-z0-9]+)(((-*)([a-z0-9]+))*))*)(\.)([a-z]{2,})$/i))
429
  {
430
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>';
431
  }
432
- else if (expected === 'phone' && (!value.match (/^[0-9 \(\)\-]+$/) || value.replace (/[^0-9]/g, '').length !== 10))
433
  {
434
- return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a phone # (10 digits w/possible hyphens,spaces,brackets).", "s2member-front", "s2member")); ?>';
435
  }
436
- else if (expected === 'uszip' && !value.match (/^[0-9]{5}(-[0-9]{4})?$/))
437
  {
438
- return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a US zipcode (5-9 digits w/possible hyphen).", "s2member-front", "s2member")); ?>';
439
  }
440
- else if (expected === 'cazip' && !value.match (/^[0-9A-Z]{3}( ?)[0-9A-Z]{3}$/i))
441
  {
442
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>';
443
  }
444
- else if (expected === 'uczip' && !value.match (/^[0-9]{5}(-[0-9]{4})?$/) && !value.match (/^[0-9A-Z]{3}( ?)[0-9A-Z]{3}$/i))
445
  {
446
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>';
447
  }
448
- else if (expected.match (/^alphanumerics-spaces-punctuation-([0-9]+)(-e)?$/) && !value.match (/^[a-z 0-9,\.\/\?\:;"'\{\}\[\]\|\\\+\=_\-\(\)\*&\^%\$#@\!`~]+$/i))
449
  {
450
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>';
451
  }
452
- else if (expected.match (/^alphanumerics-spaces-([0-9]+)(-e)?$/) && !value.match (/^[a-z 0-9]+$/i))
453
  {
454
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>';
455
  }
456
- else if (expected.match (/^alphanumerics-punctuation-([0-9]+)(-e)?$/) && !value.match (/^[a-z0-9,\.\/\?\:;"'\{\}\[\]\|\\\+\=_\-\(\)\*&\^%\$#@\!`~]+$/i))
457
  {
458
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>';
459
  }
460
- else if (expected.match (/^alphanumerics-([0-9]+)(-e)?$/) && !value.match (/^[a-z0-9]+$/i))
461
  {
462
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>';
463
  }
464
- else if (expected.match (/^alphabetics-([0-9]+)(-e)?$/) && !value.match (/^[a-z]+$/i))
465
  {
466
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>';
467
  }
468
- else if (expected.match (/^numerics-([0-9]+)(-e)?$/) && !value.match (/^[0-9]+$/i))
469
  {
470
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use numeric digits only.", "s2member-front", "s2member")); ?>';
471
  }
472
- else if (expected.match (/^(any|alphanumerics-spaces-punctuation|alphanumerics-spaces|alphanumerics-punctuation|alphanumerics|alphabetics|numerics)-([0-9]+)(-e)?$/))
473
  {
474
- var split = expected.split ('-'), length = Number(split[1]), exactLength = (split.length > 2 && split[2] === 'e') ? true : false;
475
 
476
  if /* An exact length is required? */ (exactLength && value.length !== length)
477
  return label + '\n' + $.sprintf ('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be exactly %s %s.", "s2member-front", "s2member")); ?>', length, ((split[0] === 'numerics') ? ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>') : ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')));
@@ -485,54 +485,10 @@ jQuery(document).ready (function($)
485
  return '';
486
  };
487
 
488
- ws_plugin__s2member_animateProcessingConfig = {originalText: '', interval: null, speed: 100}, ws_plugin__s2member_animateProcessing = function($obj, reset)
489
  {
490
- if /* This function expects a valid jQuery object. */ ($obj instanceof jQuery)
491
- {
492
- if /* Resets back to originalText value (also clears interval). */ (reset)
493
- {
494
- clearInterval(ws_plugin__s2member_animateProcessingConfig.interval);
495
-
496
- if (ws_plugin__s2member_animateProcessingConfig.originalText)
497
- $obj.val (ws_plugin__s2member_animateProcessingConfig.originalText);
498
-
499
- return; // No need to proceed any further.
500
- }
501
-
502
- $obj.first ().each ( /* Interval routine configured here. */function()
503
- {
504
- var $this = $(this), i = 0, dir = 'r', dots = ['.', '..', '...'];
505
-
506
- ws_plugin__s2member_animateProcessingConfig.originalText = $this.val ();
507
-
508
- clearInterval(ws_plugin__s2member_animateProcessingConfig.interval);
509
-
510
- ws_plugin__s2member_animateProcessingConfig.interval = setInterval(function()
511
- {
512
- if /* Right... */ (dir === 'r')
513
- {
514
- if (i + 1 <= dots.length - 1)
515
- i = i + 1, dir = 'r';
516
- else // Switch direction.
517
- i = i - 1, dir = 'l';
518
- }
519
-
520
- else if /* Left.. */ (dir === 'l')
521
- {
522
- if (i - 1 >= 0)
523
- i = i - 1, dir = 'l';
524
- else // Switch direction.
525
- i = i + 1, dir = 'r';
526
- }
527
-
528
- for (var _dots = dots[i], l = dots[i].length; l < dots.length; l++)
529
- {
530
- _dots += /* Prevents jumping. */ ' ';
531
- }
532
-
533
- $this.val ('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Processing", "s2member-front", "s2member")); ?>' + _dots);
534
- }, ws_plugin__s2member_animateProcessingConfig.speed);
535
- });
536
- }
537
  };
538
  });
352
  if (typeof field.tagName === 'string' && field.tagName.match (/^(input|textarea|select)$/i) && !field.disabled)
353
  {
354
  var tag = field.tagName.toLowerCase (), $field = $(field), type = $.trim ($field.attr ('type')).toLowerCase (), name = $.trim ($field.attr ('name')), value = $field.val ();
355
+ required = ( typeof required === 'boolean') ? required : ($field.attr ('aria-required') === 'true'), expected = ( typeof expected === 'string') ? expected : $.trim ($field.attr ('data-expected'));
356
 
357
+ var forcePersonalEmails = ('<?php echo strlen($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"]); ?>' > 0);
358
  var nonPersonalEmailUsers = new RegExp('^(<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (implode ("|", preg_split ("/[\r\n\t ;,]+/", preg_quote ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_force_personal_emails"], "/")))); ?>)@', 'i');
359
 
360
  if (tag === 'input' && type === 'checkbox' && name.match (/\[\]$/))
413
  {
414
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a date (required date format: dd/mm/yyyy).", "s2member-front", "s2member")); ?>';
415
  }
416
+ else if (expected === 'email' && !value.match (/^[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+(?:\.?[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+)*@[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/))
417
  {
418
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a valid email address.", "s2member-front", "s2member")); ?>';
419
  }
421
  {
422
  return label + '\n' + $.sprintf ('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use a personal email address.\nAddresses like <%s@> are problematic.", "s2member-front", "s2member")); ?>', value.split ('@')[0]);
423
  }
424
+ else if (expected === 'url' && !value.match (/^https?\:\/\/.+$/i))
425
  {
426
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a full URL (starting with http or https).", "s2member-front", "s2member")); ?>';
427
  }
428
+ else if (expected === 'domain' && !value.match (/^[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/))
429
  {
430
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a domain name (domain name only, without http).", "s2member-front", "s2member")); ?>';
431
  }
432
+ else if (expected === 'phone' && (!value.match (/^[0-9 ()\-]+$/) || value.replace (/[^0-9]+/g, '').length !== 10))
433
  {
434
+ return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a phone # (10 digits w/possible hyphens, spaces, brackets).", "s2member-front", "s2member")); ?>';
435
  }
436
+ else if (expected === 'uszip' && !value.match (/^[0-9]{5}(?:\-[0-9]{4})?$/))
437
  {
438
+ return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a US zipcode (5-9 digits w/ possible hyphen).", "s2member-front", "s2member")); ?>';
439
  }
440
+ else if (expected === 'cazip' && !value.match (/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i))
441
  {
442
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a Canadian zipcode (6 alpha-numerics w/possible space).", "s2member-front", "s2member")); ?>';
443
  }
444
+ else if (expected === 'uczip' && !value.match (/^[0-9]{5}(?:\-[0-9]{4})?$/) && !value.match (/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i))
445
  {
446
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be a zipcode (either a US or Canadian zipcode).", "s2member-front", "s2member")); ?>';
447
  }
448
+ else if (expected.match (/^alphanumerics\-spaces\-punctuation\-[0-9]+(?:\-e)?$/) && !value.match (/^[a-z 0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i))
449
  {
450
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics, spaces & punctuation only.", "s2member-front", "s2member")); ?>';
451
  }
452
+ else if (expected.match (/^alphanumerics\-spaces\-[0-9]+(?:\-e)?$/) && !value.match (/^[a-z 0-9]+$/i))
453
  {
454
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & spaces only.", "s2member-front", "s2member")); ?>';
455
  }
456
+ else if (expected.match (/^alphanumerics\-punctuation\-[0-9]+(?:\-e)?$/) && !value.match (/^[a-z0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i))
457
  {
458
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics & punctuation only (no spaces).", "s2member-front", "s2member")); ?>';
459
  }
460
+ else if (expected.match (/^alphanumerics\-[0-9]+(?:\-e)?$/) && !value.match (/^[a-z0-9]+$/i))
461
  {
462
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphanumerics only (no spaces/punctuation).", "s2member-front", "s2member")); ?>';
463
  }
464
+ else if (expected.match (/^alphabetics\-[0-9]+(?:\-e)?$/) && !value.match (/^[a-z]+$/i))
465
  {
466
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use alphabetics only (no digits/spaces/punctuation).", "s2member-front", "s2member")); ?>';
467
  }
468
+ else if (expected.match (/^numerics\-[0-9]+(?:\-e)?$/) && !value.match (/^[0-9]+$/i))
469
  {
470
  return label + '\n' + '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Please use numeric digits only.", "s2member-front", "s2member")); ?>';
471
  }
472
+ else if (expected.match (/^(?:any|alphanumerics\-spaces\-punctuation|alphanumerics\-spaces|alphanumerics\-punctuation|alphanumerics|alphabetics|numerics)\-[0-9]+(?:\-e)?$/))
473
  {
474
+ var split = expected.split ('-'), length = Number(split[1]), exactLength = (split.length > 2 && split[2] === 'e');
475
 
476
  if /* An exact length is required? */ (exactLength && value.length !== length)
477
  return label + '\n' + $.sprintf ('<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("Must be exactly %s %s.", "s2member-front", "s2member")); ?>', length, ((split[0] === 'numerics') ? ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digit", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("digits", "s2member-front", "s2member")); ?>') : ((length === 1) ? '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("character", "s2member-front", "s2member")); ?>' : '<?php echo c_ws_plugin__s2member_utils_strings::esc_js_sq (_x ("characters", "s2member-front", "s2member")); ?>')));
485
  return '';
486
  };
487
 
488
+ ws_plugin__s2member_animateProcessing = function($obj, reset)
489
  {
490
+ if(reset)
491
+ $($obj).removeClass('ws-plugin--s2member-animate-processing');
492
+ else $($obj).addClass('ws-plugin--s2member-animate-processing');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
493
  };
494
  });
includes/templates/cfg-files/s2member-files-no-gzip.php CHANGED
@@ -8,7 +8,7 @@ $ws_plugin__s2member_temp_s_base = (!empty ($base)) ? $base : c_ws_plugin__s2mem
8
  // Do NOT use ``site`` URL. Must use the `home` URL here, because that's what WordPress uses in its own `mod_rewrite` implementation.
9
  ?>
10
 
11
- <IfModule mod_rewrite.c>
12
  RewriteEngine On
13
  RewriteBase <?php echo $ws_plugin__s2member_temp_s_base . "\n"; ?>
14
  RewriteCond %{QUERY_STRING} (^|\?|&)s2member_file_download\=.+ [OR]
8
  // Do NOT use ``site`` URL. Must use the `home` URL here, because that's what WordPress uses in its own `mod_rewrite` implementation.
9
  ?>
10
 
11
+ <IfModule rewrite_module>
12
  RewriteEngine On
13
  RewriteBase <?php echo $ws_plugin__s2member_temp_s_base . "\n"; ?>
14
  RewriteCond %{QUERY_STRING} (^|\?|&)s2member_file_download\=.+ [OR]
includes/translations/s2member.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: 140423\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2014-04-24 01:15:56+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -17,8 +17,8 @@ msgctxt "s2member-front"
17
  msgid "Max failed logins. Please wait %s and try again."
18
  msgstr ""
19
 
20
- #: s2member/includes/classes/custom-reg-fields.inc.php:339
21
- #: s2member/includes/classes/custom-reg-fields.inc.php:475
22
  #: s2member/includes/classes/profile-in.inc.php:120
23
  #: s2member/includes/classes/sc-profile-in.inc.php:136
24
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:66
@@ -31,8 +31,8 @@ msgctxt "s2member-front"
31
  msgid "First Name"
32
  msgstr ""
33
 
34
- #: s2member/includes/classes/custom-reg-fields.inc.php:351
35
- #: s2member/includes/classes/custom-reg-fields.inc.php:490
36
  #: s2member/includes/classes/profile-in.inc.php:140
37
  #: s2member/includes/classes/sc-profile-in.inc.php:156
38
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:72
@@ -45,8 +45,8 @@ msgctxt "s2member-front"
45
  msgid "Last Name"
46
  msgstr ""
47
 
48
- #: s2member/includes/classes/custom-reg-fields.inc.php:448
49
- #: s2member/includes/classes/custom-reg-fields.inc.php:453
50
  #: s2member/includes/classes/profile-in.inc.php:233
51
  #: s2member/includes/classes/profile-in.inc.php:239
52
  #: s2member/includes/classes/sc-profile-in.inc.php:249
@@ -55,12 +55,12 @@ msgctxt "s2member-front"
55
  msgid "Please type your Password twice to confirm."
56
  msgstr ""
57
 
58
- #: s2member/includes/classes/custom-reg-fields.inc.php:449
59
  msgctxt "s2member-front"
60
  msgid "Password (please type it twice)"
61
  msgstr ""
62
 
63
- #: s2member/includes/classes/custom-reg-fields.inc.php:457
64
  #: s2member/includes/classes/profile-in.inc.php:243
65
  #: s2member/includes/classes/sc-profile-in.inc.php:259
66
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:94
@@ -71,6 +71,212 @@ msgctxt "s2member-front"
71
  msgid "password strength indicator"
72
  msgstr ""
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  #: s2member/includes/classes/email-configs.inc.php:150
75
  msgctxt "s2member-front"
76
  msgid "as a Member"
@@ -735,9 +941,9 @@ msgctxt "s2member-front"
735
  msgid "Save All Changes"
736
  msgstr ""
737
 
738
- #: s2member/includes/classes/profile-mods-in.inc.php:132
739
- #: s2member/includes/classes/profile-mods-in.inc.php:133
740
- #: s2member/includes/classes/profile-mods-in.inc.php:134
741
  #: s2member/includes/classes/sc-profile-in.inc.php:70
742
  msgctxt "s2member-front"
743
  msgid "Profile updated successfully."
@@ -749,7 +955,7 @@ msgctxt "s2member-front"
749
  msgid "<strong>Your Link Expired:</strong><br />Please contact Support if you need assistance."
750
  msgstr ""
751
 
752
- #: s2member/includes/classes/registrations.inc.php:450
753
  msgctxt "s2member-front"
754
  msgid "s2Member security violation. You attempted to POST administrative variables that will NOT be trusted in a NON-administrative zone!"
755
  msgstr ""
@@ -1238,71 +1444,16 @@ msgctxt "s2member-front"
1238
  msgid "Mismatch"
1239
  msgstr ""
1240
 
1241
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:364
1242
- msgctxt "s2member-front"
1243
- msgid "Please check at least one of the boxes."
1244
- msgstr ""
1245
-
1246
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:369
1247
- msgctxt "s2member-front"
1248
- msgid "Required. This box must be checked."
1249
- msgstr ""
1250
-
1251
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:375
1252
- msgctxt "s2member-front"
1253
- msgid "Please select one of the options."
1254
- msgstr ""
1255
-
1256
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:380
1257
- msgctxt "s2member-front"
1258
- msgid "Please select at least one of the options."
1259
- msgstr ""
1260
-
1261
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:384
1262
- msgctxt "s2member-front"
1263
- msgid "This is a required field, please try again."
1264
- msgstr ""
1265
-
1266
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:390
1267
- msgctxt "s2member-front"
1268
- msgid "Must be numeric (with or without decimals, commas allowed)."
1269
- msgstr ""
1270
-
1271
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:394
1272
- msgctxt "s2member-front"
1273
- msgid "Must be numeric (with or without decimals, no commas)."
1274
- msgstr ""
1275
-
1276
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:398
1277
- msgctxt "s2member-front"
1278
- msgid "Must be an integer (a whole number, without any decimals)."
1279
- msgstr ""
1280
-
1281
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:402
1282
  msgctxt "s2member-front"
1283
  msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
1284
  msgstr ""
1285
 
1286
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:406
1287
- msgctxt "s2member-front"
1288
- msgid "Must be a float (floating point number, decimals required)."
1289
- msgstr ""
1290
-
1291
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:410
1292
  msgctxt "s2member-front"
1293
  msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
1294
  msgstr ""
1295
 
1296
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:414
1297
- msgctxt "s2member-front"
1298
- msgid "Must be a date (required date format: dd/mm/yyyy)."
1299
- msgstr ""
1300
-
1301
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:418
1302
- msgctxt "s2member-front"
1303
- msgid "Must be a valid email address."
1304
- msgstr ""
1305
-
1306
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:422
1307
  msgctxt "s2member-front"
1308
  msgid ""
@@ -1310,36 +1461,11 @@ msgid ""
1310
  "Addresses like <%s@> are problematic."
1311
  msgstr ""
1312
 
1313
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:426
1314
- msgctxt "s2member-front"
1315
- msgid "Must be a full URL (starting with http or https)."
1316
- msgstr ""
1317
-
1318
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:430
1319
- msgctxt "s2member-front"
1320
- msgid "Must be a domain name (domain name only, without http)."
1321
- msgstr ""
1322
-
1323
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:434
1324
- msgctxt "s2member-front"
1325
- msgid "Must be a phone # (10 digits w/possible hyphens,spaces,brackets)."
1326
- msgstr ""
1327
-
1328
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:438
1329
- msgctxt "s2member-front"
1330
- msgid "Must be a US zipcode (5-9 digits w/possible hyphen)."
1331
- msgstr ""
1332
-
1333
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:442
1334
  msgctxt "s2member-front"
1335
  msgid "Must be a Canadian zipcode (6 alpha-numerics w/possible space)."
1336
  msgstr ""
1337
 
1338
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:446
1339
- msgctxt "s2member-front"
1340
- msgid "Must be a zipcode (either a US or Canadian zipcode)."
1341
- msgstr ""
1342
-
1343
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:450
1344
  msgctxt "s2member-front"
1345
  msgid "Please use alphanumerics, spaces & punctuation only."
@@ -1355,60 +1481,6 @@ msgctxt "s2member-front"
1355
  msgid "Please use alphanumerics & punctuation only (no spaces)."
1356
  msgstr ""
1357
 
1358
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:462
1359
- msgctxt "s2member-front"
1360
- msgid "Please use alphanumerics only (no spaces/punctuation)."
1361
- msgstr ""
1362
-
1363
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:466
1364
- msgctxt "s2member-front"
1365
- msgid "Please use alphabetics only (no digits/spaces/punctuation)."
1366
- msgstr ""
1367
-
1368
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:470
1369
- msgctxt "s2member-front"
1370
- msgid "Please use numeric digits only."
1371
- msgstr ""
1372
-
1373
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1374
- msgctxt "s2member-front"
1375
- msgid "Must be exactly %s %s."
1376
- msgstr ""
1377
-
1378
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1379
- #: s2member/includes/s2member.js:480
1380
- msgctxt "s2member-front"
1381
- msgid "digit"
1382
- msgstr ""
1383
-
1384
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1385
- #: s2member/includes/s2member.js:480
1386
- msgctxt "s2member-front"
1387
- msgid "digits"
1388
- msgstr ""
1389
-
1390
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1391
- #: s2member/includes/s2member.js:480
1392
- msgctxt "s2member-front"
1393
- msgid "character"
1394
- msgstr ""
1395
-
1396
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1397
- #: s2member/includes/s2member.js:480
1398
- msgctxt "s2member-front"
1399
- msgid "characters"
1400
- msgstr ""
1401
-
1402
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:480
1403
- msgctxt "s2member-front"
1404
- msgid "Must be at least %s %s."
1405
- msgstr ""
1406
-
1407
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:533
1408
- msgctxt "s2member-front"
1409
- msgid "Processing"
1410
- msgstr ""
1411
-
1412
  #: s2member/includes/syscon.inc.php:84
1413
  msgctxt "s2member-front recaptcha-lang-code"
1414
  msgid "en"
@@ -3173,270 +3245,270 @@ msgstr ""
3173
 
3174
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:520
3175
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:570
3176
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:614
3177
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:670
3178
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:762
3179
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:598
3180
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:648
3181
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:692
3182
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:748
3183
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:840
3184
  msgctxt "s2member-front"
3185
  msgid "Missing or invalid Security Code. Please try again."
3186
  msgstr ""
3187
 
3188
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:523
3189
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:531
3190
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:681
3191
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:601
3192
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:609
3193
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:759
3194
  msgctxt "s2member-admin"
3195
  msgid "Unable to process. You are an Administrator. Stopping here for security. Otherwise, an Administrator could lose access."
3196
  msgstr ""
3197
 
3198
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:534
3199
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:631
3200
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:723
3201
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:612
3202
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:709
3203
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:801
3204
  msgctxt "s2member-front"
3205
  msgid "Missing Card Type (Billing Method). Please try again."
3206
  msgstr ""
3207
 
3208
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:537
3209
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:634
3210
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:637
3211
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:726
3212
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:729
 
3213
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:615
3214
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:712
3215
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:715
3216
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:804
3217
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:807
 
3218
  msgctxt "s2member-front"
3219
  msgid "Invalid Card Type (Billing Method). Please try again."
3220
  msgstr ""
3221
 
3222
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:540
3223
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:640
3224
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:732
3225
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:618
3226
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:718
3227
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:810
3228
  msgctxt "s2member-front"
3229
  msgid "Missing Card Number. Please try again."
3230
  msgstr ""
3231
 
3232
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:543
3233
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:643
3234
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:735
3235
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:621
3236
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:721
3237
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:813
3238
  msgctxt "s2member-front"
3239
  msgid "Missing Card Expiration Date (mm/yyyy). Please try again."
3240
  msgstr ""
3241
 
3242
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:546
3243
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:646
3244
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:738
3245
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:624
3246
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:724
3247
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:816
3248
  msgctxt "s2member-front"
3249
  msgid "Invalid Card Expiration Date. Must be in this format (mm/yyyy). Please try again."
3250
  msgstr ""
3251
 
3252
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:549
3253
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:649
3254
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:741
3255
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:627
3256
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:727
3257
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:819
3258
  msgctxt "s2member-front"
3259
  msgid "Missing Card Verification Code. It's on the back of your Card. 3-4 digits. Please try again."
3260
  msgstr ""
3261
 
3262
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:552
3263
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:652
3264
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:744
3265
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:630
3266
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:730
3267
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:822
3268
  msgctxt "s2member-front"
3269
  msgid "Missing Card Start Date, or Issue #. Required for Maestro/Solo. Please try again."
3270
  msgstr ""
3271
 
3272
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:555
3273
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:655
3274
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:747
3275
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:633
3276
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:733
3277
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:825
3278
  msgctxt "s2member-front"
3279
  msgid "Missing Street Address. Please try again."
3280
  msgstr ""
3281
 
3282
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:558
3283
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:658
3284
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:750
3285
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:636
3286
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:736
3287
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:828
3288
  msgctxt "s2member-front"
3289
  msgid "Missing City/Town. Please try again."
3290
  msgstr ""
3291
 
3292
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:561
3293
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:661
3294
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:753
3295
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:639
3296
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:739
3297
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:831
3298
  msgctxt "s2member-front"
3299
  msgid "Missing State/Province. Please try again."
3300
  msgstr ""
3301
 
3302
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:564
3303
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:664
3304
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:756
3305
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:642
3306
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:742
3307
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:834
3308
  msgctxt "s2member-front"
3309
  msgid "Missing Country. Please try again."
3310
  msgstr ""
3311
 
3312
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:567
3313
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:667
3314
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:759
3315
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:645
3316
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:745
3317
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:837
3318
  msgctxt "s2member-front"
3319
  msgid "Missing Postal/Zip Code. Please try again."
3320
  msgstr ""
3321
 
3322
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:575
3323
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:619
3324
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:684
3325
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:653
3326
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:697
3327
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:762
3328
  msgctxt "s2member-front"
3329
  msgid "Missing First Name. Please try again."
3330
  msgstr ""
3331
 
3332
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:578
3333
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:622
3334
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:687
3335
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:656
3336
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:700
3337
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:765
3338
  msgctxt "s2member-front"
3339
  msgid "Missing Last Name. Please try again."
3340
  msgstr ""
3341
 
3342
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:581
3343
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:625
3344
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:690
3345
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:659
3346
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:703
3347
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:768
3348
  msgctxt "s2member-front"
3349
  msgid "Missing or invalid Email Address. Please try again."
3350
  msgstr ""
3351
 
3352
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:584
3353
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:628
3354
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:693
3355
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:662
3356
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:706
3357
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:771
3358
  msgctxt "s2member-front"
3359
  msgid "Invalid Email Address. Please try again."
3360
  msgstr ""
3361
 
3362
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:587
3363
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:696
3364
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:665
3365
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:774
3366
  msgctxt "s2member-front"
3367
  msgid "That Email Address is already in use. Please try again."
3368
  msgstr ""
3369
 
3370
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:590
3371
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:699
3372
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:668
3373
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:777
3374
  msgctxt "s2member-front"
3375
  msgid "Missing or invalid Username. Please try again."
3376
  msgstr ""
3377
 
3378
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:593
3379
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:702
3380
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:671
3381
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:780
3382
  msgctxt "s2member-front"
3383
  msgid "Invalid Username. Please try again. Use ONLY lowercase alphanumerics."
3384
  msgstr ""
3385
 
3386
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:596
3387
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:705
3388
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:674
3389
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:783
3390
  msgctxt "s2member-front"
3391
  msgid "That Username is already in use. Please try again."
3392
  msgstr ""
3393
 
3394
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:602
3395
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:711
3396
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:680
3397
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:789
3398
  msgctxt "s2member-front"
3399
  msgid "Missing Password. Please try again."
3400
  msgstr ""
3401
 
3402
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:605
3403
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:714
3404
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:683
3405
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:792
3406
  msgctxt "s2member-front"
3407
  msgid "Invalid Password. Must be at least 6 characters. Please try again."
3408
  msgstr ""
3409
 
3410
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:608
3411
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:717
3412
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:686
3413
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:795
3414
  msgctxt "s2member-front"
3415
  msgid "Invalid Password. Max length is 20 characters. Please try again."
3416
  msgstr ""
3417
 
3418
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:611
3419
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:720
3420
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:689
3421
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:798
3422
  msgctxt "s2member-front"
3423
  msgid "Password fields do NOT match. Please try again."
3424
  msgstr ""
3425
 
3426
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:675
3427
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:753
3428
  msgctxt "s2member-front"
3429
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to modify your billing plan."
3430
  msgstr ""
3431
 
3432
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:678
3433
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:756
3434
  msgctxt "s2member-front"
3435
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> before making this purchase."
3436
  msgstr ""
3437
 
3438
- #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:765
3439
- #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:843
3440
  msgctxt "s2member-front"
3441
  msgid "Unknown form submission type. Please contact Support."
3442
  msgstr ""
@@ -3473,26 +3545,26 @@ msgctxt "s2member-front"
3473
  msgid "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
3474
  msgstr ""
3475
 
3476
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:662
3477
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:805
3478
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:295
3479
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:438
3480
  msgctxt "s2member-front percentage-symbol"
3481
  msgid "%"
3482
  msgstr ""
3483
 
3484
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:804
3485
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:437
3486
  msgctxt "s2member-front"
3487
  msgid " + tax"
3488
  msgstr ""
3489
 
3490
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:849
3491
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:901
3492
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:914
3493
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:936
3494
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:996
3495
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1011
3496
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:482
3497
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:534
3498
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:547
@@ -3503,12 +3575,12 @@ msgctxt "s2member-front"
3503
  msgid "COUPON %s off. (Now: %s)"
3504
  msgstr ""
3505
 
3506
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:850
3507
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:902
3508
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:915
3509
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:937
3510
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:997
3511
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1012
3512
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:483
3513
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:535
3514
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:548
@@ -3519,12 +3591,12 @@ msgctxt "s2member-front"
3519
  msgid "<div>Coupon: <strong>%s off</strong>. (Now: <strong>%s</strong>)</div>"
3520
  msgstr ""
3521
 
3522
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:862
3523
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:875
3524
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:888
3525
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:951
3526
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:966
3527
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:981
3528
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:495
3529
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:508
3530
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:521
@@ -3535,12 +3607,12 @@ msgctxt "s2member-front"
3535
  msgid "COUPON %s off. (Now: %s, then %s)"
3536
  msgstr ""
3537
 
3538
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:863
3539
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:876
3540
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:889
3541
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:952
3542
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:967
3543
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:982
3544
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:496
3545
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:509
3546
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:522
@@ -3551,27 +3623,27 @@ msgctxt "s2member-front"
3551
  msgid "<div>Coupon: <strong>%s off</strong>. (Now: <strong>%s, then %s</strong>)</div>"
3552
  msgstr ""
3553
 
3554
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:919
3555
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1016
3556
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:552
3557
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:649
3558
  msgctxt "s2member-front"
3559
  msgid "<div>Sorry, your Coupon is not applicable.</div>"
3560
  msgstr ""
3561
 
3562
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1020
3563
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:653
3564
  msgctxt "s2member-front"
3565
  msgid "<div>Coupon: <strong>%s0.00 off</strong>.</div>"
3566
  msgstr ""
3567
 
3568
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1024
3569
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:657
3570
  msgctxt "s2member-front"
3571
  msgid "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
3572
  msgstr ""
3573
 
3574
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1028
3575
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:661
3576
  msgctxt "s2member-front"
3577
  msgid "<div>Sorry, your Coupon <strong>expired</strong>: <em>%s</em>.</div>"
@@ -3579,14 +3651,14 @@ msgstr ""
3579
 
3580
  #. translators: `%1$s` is new price/description, after coupon applied. `%2$s`
3581
  #. is original description.
3582
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1034
3583
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:667
3584
  msgctxt "s2member-front"
3585
  msgid "%1$s ~ ORIGINALLY: %2$s"
3586
  msgstr ""
3587
 
3588
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1063
3589
- #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1066
3590
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:696
3591
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:699
3592
  msgctxt "s2member-front"
@@ -3828,6 +3900,11 @@ msgctxt "s2member-front"
3828
  msgid "My Profile Summary"
3829
  msgstr ""
3830
 
 
 
 
 
 
3831
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3832
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:73
3833
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:167
@@ -4180,6 +4257,26 @@ msgctxt "s2member-front"
4180
  msgid "Update Billing Information"
4181
  msgstr ""
4182
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4183
  #: s2member-pro/includes/templates/options/alipay-membership-ccap-terms.php:6
4184
  #: s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:6
4185
  msgctxt "s2member-admin"
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: 140520\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2014-05-21 05:15:15+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
17
  msgid "Max failed logins. Please wait %s and try again."
18
  msgstr ""
19
 
20
+ #: s2member/includes/classes/custom-reg-fields.inc.php:340
21
+ #: s2member/includes/classes/custom-reg-fields.inc.php:476
22
  #: s2member/includes/classes/profile-in.inc.php:120
23
  #: s2member/includes/classes/sc-profile-in.inc.php:136
24
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:66
31
  msgid "First Name"
32
  msgstr ""
33
 
34
+ #: s2member/includes/classes/custom-reg-fields.inc.php:352
35
+ #: s2member/includes/classes/custom-reg-fields.inc.php:491
36
  #: s2member/includes/classes/profile-in.inc.php:140
37
  #: s2member/includes/classes/sc-profile-in.inc.php:156
38
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:72
45
  msgid "Last Name"
46
  msgstr ""
47
 
48
+ #: s2member/includes/classes/custom-reg-fields.inc.php:449
49
+ #: s2member/includes/classes/custom-reg-fields.inc.php:454
50
  #: s2member/includes/classes/profile-in.inc.php:233
51
  #: s2member/includes/classes/profile-in.inc.php:239
52
  #: s2member/includes/classes/sc-profile-in.inc.php:249
55
  msgid "Please type your Password twice to confirm."
56
  msgstr ""
57
 
58
+ #: s2member/includes/classes/custom-reg-fields.inc.php:450
59
  msgctxt "s2member-front"
60
  msgid "Password (please type it twice)"
61
  msgstr ""
62
 
63
+ #: s2member/includes/classes/custom-reg-fields.inc.php:458
64
  #: s2member/includes/classes/profile-in.inc.php:243
65
  #: s2member/includes/classes/sc-profile-in.inc.php:259
66
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:94
71
  msgid "password strength indicator"
72
  msgstr ""
73
 
74
+ #: s2member/includes/classes/custom-reg-fields.inc.php:605
75
+ #: s2member/includes/classes/custom-reg-fields.inc.php:616
76
+ msgctxt "s2member-front"
77
+ msgid "Invalid data type. Expecting a string."
78
+ msgstr ""
79
+
80
+ #: s2member/includes/classes/custom-reg-fields.inc.php:611
81
+ msgctxt "s2member-front"
82
+ msgid "Invalid data type. Expecting an array."
83
+ msgstr ""
84
+
85
+ #: s2member/includes/classes/custom-reg-fields.inc.php:624
86
+ #: s2member/includes/classes/custom-reg-fields.inc.php:655
87
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:384
88
+ msgctxt "s2member-front"
89
+ msgid "This is a required field, please try again."
90
+ msgstr ""
91
+
92
+ #: s2member/includes/classes/custom-reg-fields.inc.php:630
93
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:369
94
+ msgctxt "s2member-front"
95
+ msgid "Required. This box must be checked."
96
+ msgstr ""
97
+
98
+ #: s2member/includes/classes/custom-reg-fields.inc.php:635
99
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:364
100
+ msgctxt "s2member-front"
101
+ msgid "Please check at least one of the boxes."
102
+ msgstr ""
103
+
104
+ #: s2member/includes/classes/custom-reg-fields.inc.php:640
105
+ #: s2member/includes/classes/custom-reg-fields.inc.php:645
106
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:375
107
+ msgctxt "s2member-front"
108
+ msgid "Please select one of the options."
109
+ msgstr ""
110
+
111
+ #: s2member/includes/classes/custom-reg-fields.inc.php:650
112
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:380
113
+ msgctxt "s2member-front"
114
+ msgid "Please select at least one of the options."
115
+ msgstr ""
116
+
117
+ #: s2member/includes/classes/custom-reg-fields.inc.php:666
118
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:390
119
+ msgctxt "s2member-front"
120
+ msgid "Must be numeric (with or without decimals, commas allowed)."
121
+ msgstr ""
122
+
123
+ #: s2member/includes/classes/custom-reg-fields.inc.php:671
124
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:394
125
+ msgctxt "s2member-front"
126
+ msgid "Must be numeric (with or without decimals, no commas)."
127
+ msgstr ""
128
+
129
+ #: s2member/includes/classes/custom-reg-fields.inc.php:676
130
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:398
131
+ msgctxt "s2member-front"
132
+ msgid "Must be an integer (a whole number, without any decimals)."
133
+ msgstr ""
134
+
135
+ #: s2member/includes/classes/custom-reg-fields.inc.php:681
136
+ msgctxt "s2member-front"
137
+ msgid "Must be an integer &gt; 0 (whole number, no decimals, greater than 0)."
138
+ msgstr ""
139
+
140
+ #: s2member/includes/classes/custom-reg-fields.inc.php:686
141
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:406
142
+ msgctxt "s2member-front"
143
+ msgid "Must be a float (floating point number, decimals required)."
144
+ msgstr ""
145
+
146
+ #: s2member/includes/classes/custom-reg-fields.inc.php:691
147
+ msgctxt "s2member-front"
148
+ msgid "Must be a float &gt; 0 (floating point number, decimals required, greater than 0)."
149
+ msgstr ""
150
+
151
+ #: s2member/includes/classes/custom-reg-fields.inc.php:696
152
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:414
153
+ msgctxt "s2member-front"
154
+ msgid "Must be a date (required date format: dd/mm/yyyy)."
155
+ msgstr ""
156
+
157
+ #: s2member/includes/classes/custom-reg-fields.inc.php:701
158
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:418
159
+ msgctxt "s2member-front"
160
+ msgid "Must be a valid email address."
161
+ msgstr ""
162
+
163
+ #: s2member/includes/classes/custom-reg-fields.inc.php:704
164
+ msgctxt "s2member-front"
165
+ msgid "Please use a personal email address. Addresses like &lt;%s@&gt; are problematic."
166
+ msgstr ""
167
+
168
+ #: s2member/includes/classes/custom-reg-fields.inc.php:709
169
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:426
170
+ msgctxt "s2member-front"
171
+ msgid "Must be a full URL (starting with http or https)."
172
+ msgstr ""
173
+
174
+ #: s2member/includes/classes/custom-reg-fields.inc.php:714
175
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:430
176
+ msgctxt "s2member-front"
177
+ msgid "Must be a domain name (domain name only, without http)."
178
+ msgstr ""
179
+
180
+ #: s2member/includes/classes/custom-reg-fields.inc.php:719
181
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:434
182
+ msgctxt "s2member-front"
183
+ msgid "Must be a phone # (10 digits w/possible hyphens, spaces, brackets)."
184
+ msgstr ""
185
+
186
+ #: s2member/includes/classes/custom-reg-fields.inc.php:724
187
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:438
188
+ msgctxt "s2member-front"
189
+ msgid "Must be a US zipcode (5-9 digits w/ possible hyphen)."
190
+ msgstr ""
191
+
192
+ #: s2member/includes/classes/custom-reg-fields.inc.php:729
193
+ msgctxt "s2member-front"
194
+ msgid "Must be a Canadian zipcode (6 alpha-numerics w/ possible space)."
195
+ msgstr ""
196
+
197
+ #: s2member/includes/classes/custom-reg-fields.inc.php:734
198
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:446
199
+ msgctxt "s2member-front"
200
+ msgid "Must be a zipcode (either a US or Canadian zipcode)."
201
+ msgstr ""
202
+
203
+ #: s2member/includes/classes/custom-reg-fields.inc.php:740
204
+ msgctxt "s2member-front"
205
+ msgid "Please use alphanumerics, spaces &amp; punctuation only."
206
+ msgstr ""
207
+
208
+ #: s2member/includes/classes/custom-reg-fields.inc.php:743
209
+ msgctxt "s2member-front"
210
+ msgid "Please use alphanumerics &amp; spaces only."
211
+ msgstr ""
212
+
213
+ #: s2member/includes/classes/custom-reg-fields.inc.php:746
214
+ msgctxt "s2member-front"
215
+ msgid "Please use alphanumerics &amp; punctuation only (no spaces)."
216
+ msgstr ""
217
+
218
+ #: s2member/includes/classes/custom-reg-fields.inc.php:749
219
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:462
220
+ msgctxt "s2member-front"
221
+ msgid "Please use alphanumerics only (no spaces/punctuation)."
222
+ msgstr ""
223
+
224
+ #: s2member/includes/classes/custom-reg-fields.inc.php:752
225
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:466
226
+ msgctxt "s2member-front"
227
+ msgid "Please use alphabetics only (no digits/spaces/punctuation)."
228
+ msgstr ""
229
+
230
+ #: s2member/includes/classes/custom-reg-fields.inc.php:755
231
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:470
232
+ msgctxt "s2member-front"
233
+ msgid "Please use numeric digits only."
234
+ msgstr ""
235
+
236
+ #: s2member/includes/classes/custom-reg-fields.inc.php:768
237
+ #: s2member/includes/classes/custom-reg-fields.inc.php:782
238
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
239
+ #: s2member/includes/s2member.js:480
240
+ msgctxt "s2member-front"
241
+ msgid "digit"
242
+ msgstr ""
243
+
244
+ #: s2member/includes/classes/custom-reg-fields.inc.php:769
245
+ #: s2member/includes/classes/custom-reg-fields.inc.php:783
246
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
247
+ #: s2member/includes/s2member.js:480
248
+ msgctxt "s2member-front"
249
+ msgid "digits"
250
+ msgstr ""
251
+
252
+ #: s2member/includes/classes/custom-reg-fields.inc.php:772
253
+ #: s2member/includes/classes/custom-reg-fields.inc.php:786
254
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
255
+ #: s2member/includes/s2member.js:480
256
+ msgctxt "s2member-front"
257
+ msgid "character"
258
+ msgstr ""
259
+
260
+ #: s2member/includes/classes/custom-reg-fields.inc.php:773
261
+ #: s2member/includes/classes/custom-reg-fields.inc.php:787
262
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
263
+ #: s2member/includes/s2member.js:480
264
+ msgctxt "s2member-front"
265
+ msgid "characters"
266
+ msgstr ""
267
+
268
+ #: s2member/includes/classes/custom-reg-fields.inc.php:775
269
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
270
+ msgctxt "s2member-front"
271
+ msgid "Must be exactly %s %s."
272
+ msgstr ""
273
+
274
+ #: s2member/includes/classes/custom-reg-fields.inc.php:789
275
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:480
276
+ msgctxt "s2member-front"
277
+ msgid "Must be at least %s %s."
278
+ msgstr ""
279
+
280
  #: s2member/includes/classes/email-configs.inc.php:150
281
  msgctxt "s2member-front"
282
  msgid "as a Member"
941
  msgid "Save All Changes"
942
  msgstr ""
943
 
944
+ #: s2member/includes/classes/profile-mods-in.inc.php:141
945
+ #: s2member/includes/classes/profile-mods-in.inc.php:142
946
+ #: s2member/includes/classes/profile-mods-in.inc.php:143
947
  #: s2member/includes/classes/sc-profile-in.inc.php:70
948
  msgctxt "s2member-front"
949
  msgid "Profile updated successfully."
955
  msgid "<strong>Your Link Expired:</strong><br />Please contact Support if you need assistance."
956
  msgstr ""
957
 
958
+ #: s2member/includes/classes/registrations.inc.php:510
959
  msgctxt "s2member-front"
960
  msgid "s2Member security violation. You attempted to POST administrative variables that will NOT be trusted in a NON-administrative zone!"
961
  msgstr ""
1444
  msgid "Mismatch"
1445
  msgstr ""
1446
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1447
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:402
1448
  msgctxt "s2member-front"
1449
  msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
1450
  msgstr ""
1451
 
 
 
 
 
 
1452
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:410
1453
  msgctxt "s2member-front"
1454
  msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
1455
  msgstr ""
1456
 
 
 
 
 
 
 
 
 
 
 
1457
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:422
1458
  msgctxt "s2member-front"
1459
  msgid ""
1461
  "Addresses like <%s@> are problematic."
1462
  msgstr ""
1463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1464
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:442
1465
  msgctxt "s2member-front"
1466
  msgid "Must be a Canadian zipcode (6 alpha-numerics w/possible space)."
1467
  msgstr ""
1468
 
 
 
 
 
 
1469
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:450
1470
  msgctxt "s2member-front"
1471
  msgid "Please use alphanumerics, spaces & punctuation only."
1481
  msgid "Please use alphanumerics & punctuation only (no spaces)."
1482
  msgstr ""
1483
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1484
  #: s2member/includes/syscon.inc.php:84
1485
  msgctxt "s2member-front recaptcha-lang-code"
1486
  msgid "en"
3245
 
3246
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:520
3247
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:570
3248
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:617
3249
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:673
3250
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:768
3251
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:598
3252
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:648
3253
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:695
3254
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:751
3255
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:846
3256
  msgctxt "s2member-front"
3257
  msgid "Missing or invalid Security Code. Please try again."
3258
  msgstr ""
3259
 
3260
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:523
3261
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:531
3262
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:684
3263
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:601
3264
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:609
3265
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:762
3266
  msgctxt "s2member-admin"
3267
  msgid "Unable to process. You are an Administrator. Stopping here for security. Otherwise, an Administrator could lose access."
3268
  msgstr ""
3269
 
3270
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:534
3271
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:634
3272
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:729
3273
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:612
3274
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:712
3275
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:807
3276
  msgctxt "s2member-front"
3277
  msgid "Missing Card Type (Billing Method). Please try again."
3278
  msgstr ""
3279
 
3280
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:537
 
3281
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:637
3282
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:640
3283
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:732
3284
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:735
3285
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:615
 
3286
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:715
3287
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:718
3288
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:810
3289
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:813
3290
  msgctxt "s2member-front"
3291
  msgid "Invalid Card Type (Billing Method). Please try again."
3292
  msgstr ""
3293
 
3294
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:540
3295
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:643
3296
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:738
3297
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:618
3298
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:721
3299
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:816
3300
  msgctxt "s2member-front"
3301
  msgid "Missing Card Number. Please try again."
3302
  msgstr ""
3303
 
3304
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:543
3305
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:646
3306
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:741
3307
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:621
3308
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:724
3309
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:819
3310
  msgctxt "s2member-front"
3311
  msgid "Missing Card Expiration Date (mm/yyyy). Please try again."
3312
  msgstr ""
3313
 
3314
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:546
3315
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:649
3316
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:744
3317
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:624
3318
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:727
3319
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:822
3320
  msgctxt "s2member-front"
3321
  msgid "Invalid Card Expiration Date. Must be in this format (mm/yyyy). Please try again."
3322
  msgstr ""
3323
 
3324
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:549
3325
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:652
3326
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:747
3327
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:627
3328
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:730
3329
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:825
3330
  msgctxt "s2member-front"
3331
  msgid "Missing Card Verification Code. It's on the back of your Card. 3-4 digits. Please try again."
3332
  msgstr ""
3333
 
3334
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:552
3335
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:655
3336
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:750
3337
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:630
3338
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:733
3339
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:828
3340
  msgctxt "s2member-front"
3341
  msgid "Missing Card Start Date, or Issue #. Required for Maestro/Solo. Please try again."
3342
  msgstr ""
3343
 
3344
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:555
3345
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:658
3346
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:753
3347
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:633
3348
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:736
3349
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:831
3350
  msgctxt "s2member-front"
3351
  msgid "Missing Street Address. Please try again."
3352
  msgstr ""
3353
 
3354
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:558
3355
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:661
3356
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:756
3357
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:636
3358
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:739
3359
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:834
3360
  msgctxt "s2member-front"
3361
  msgid "Missing City/Town. Please try again."
3362
  msgstr ""
3363
 
3364
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:561
3365
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:664
3366
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:759
3367
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:639
3368
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:742
3369
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:837
3370
  msgctxt "s2member-front"
3371
  msgid "Missing State/Province. Please try again."
3372
  msgstr ""
3373
 
3374
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:564
3375
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:667
3376
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:762
3377
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:642
3378
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:745
3379
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:840
3380
  msgctxt "s2member-front"
3381
  msgid "Missing Country. Please try again."
3382
  msgstr ""
3383
 
3384
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:567
3385
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:670
3386
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:765
3387
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:645
3388
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:748
3389
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:843
3390
  msgctxt "s2member-front"
3391
  msgid "Missing Postal/Zip Code. Please try again."
3392
  msgstr ""
3393
 
3394
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:575
3395
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:622
3396
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:687
3397
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:653
3398
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:700
3399
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:765
3400
  msgctxt "s2member-front"
3401
  msgid "Missing First Name. Please try again."
3402
  msgstr ""
3403
 
3404
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:578
3405
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:625
3406
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:690
3407
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:656
3408
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:703
3409
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:768
3410
  msgctxt "s2member-front"
3411
  msgid "Missing Last Name. Please try again."
3412
  msgstr ""
3413
 
3414
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:581
3415
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:628
3416
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:693
3417
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:659
3418
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:706
3419
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:771
3420
  msgctxt "s2member-front"
3421
  msgid "Missing or invalid Email Address. Please try again."
3422
  msgstr ""
3423
 
3424
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:584
3425
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:631
3426
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:696
3427
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:662
3428
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:709
3429
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:774
3430
  msgctxt "s2member-front"
3431
  msgid "Invalid Email Address. Please try again."
3432
  msgstr ""
3433
 
3434
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:587
3435
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:699
3436
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:665
3437
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:777
3438
  msgctxt "s2member-front"
3439
  msgid "That Email Address is already in use. Please try again."
3440
  msgstr ""
3441
 
3442
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:590
3443
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:702
3444
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:668
3445
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:780
3446
  msgctxt "s2member-front"
3447
  msgid "Missing or invalid Username. Please try again."
3448
  msgstr ""
3449
 
3450
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:593
3451
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:705
3452
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:671
3453
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:783
3454
  msgctxt "s2member-front"
3455
  msgid "Invalid Username. Please try again. Use ONLY lowercase alphanumerics."
3456
  msgstr ""
3457
 
3458
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:596
3459
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:708
3460
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:674
3461
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:786
3462
  msgctxt "s2member-front"
3463
  msgid "That Username is already in use. Please try again."
3464
  msgstr ""
3465
 
3466
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:602
3467
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:714
3468
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:680
3469
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:792
3470
  msgctxt "s2member-front"
3471
  msgid "Missing Password. Please try again."
3472
  msgstr ""
3473
 
3474
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:605
3475
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:717
3476
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:683
3477
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:795
3478
  msgctxt "s2member-front"
3479
  msgid "Invalid Password. Must be at least 6 characters. Please try again."
3480
  msgstr ""
3481
 
3482
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:608
3483
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:720
3484
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:686
3485
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:798
3486
  msgctxt "s2member-front"
3487
  msgid "Invalid Password. Max length is 20 characters. Please try again."
3488
  msgstr ""
3489
 
3490
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:611
3491
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:723
3492
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:689
3493
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:801
3494
  msgctxt "s2member-front"
3495
  msgid "Password fields do NOT match. Please try again."
3496
  msgstr ""
3497
 
3498
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:678
3499
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:756
3500
  msgctxt "s2member-front"
3501
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to modify your billing plan."
3502
  msgstr ""
3503
 
3504
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:681
3505
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:759
3506
  msgctxt "s2member-front"
3507
  msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> before making this purchase."
3508
  msgstr ""
3509
 
3510
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:771
3511
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:849
3512
  msgctxt "s2member-front"
3513
  msgid "Unknown form submission type. Please contact Support."
3514
  msgstr ""
3545
  msgid "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
3546
  msgstr ""
3547
 
3548
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:664
3549
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:807
3550
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:295
3551
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:438
3552
  msgctxt "s2member-front percentage-symbol"
3553
  msgid "%"
3554
  msgstr ""
3555
 
3556
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:806
3557
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:437
3558
  msgctxt "s2member-front"
3559
  msgid " + tax"
3560
  msgstr ""
3561
 
3562
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:851
3563
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:903
3564
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:916
3565
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:938
3566
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:998
3567
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1013
3568
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:482
3569
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:534
3570
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:547
3575
  msgid "COUPON %s off. (Now: %s)"
3576
  msgstr ""
3577
 
3578
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:852
3579
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:904
3580
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:917
3581
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:939
3582
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:999
3583
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1014
3584
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:483
3585
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:535
3586
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:548
3591
  msgid "<div>Coupon: <strong>%s off</strong>. (Now: <strong>%s</strong>)</div>"
3592
  msgstr ""
3593
 
3594
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:864
3595
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:877
3596
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:890
3597
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:953
3598
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:968
3599
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:983
3600
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:495
3601
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:508
3602
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:521
3607
  msgid "COUPON %s off. (Now: %s, then %s)"
3608
  msgstr ""
3609
 
3610
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:865
3611
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:878
3612
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:891
3613
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:954
3614
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:969
3615
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:984
3616
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:496
3617
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:509
3618
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:522
3623
  msgid "<div>Coupon: <strong>%s off</strong>. (Now: <strong>%s, then %s</strong>)</div>"
3624
  msgstr ""
3625
 
3626
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:921
3627
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1018
3628
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:552
3629
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:649
3630
  msgctxt "s2member-front"
3631
  msgid "<div>Sorry, your Coupon is not applicable.</div>"
3632
  msgstr ""
3633
 
3634
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1022
3635
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:653
3636
  msgctxt "s2member-front"
3637
  msgid "<div>Coupon: <strong>%s0.00 off</strong>.</div>"
3638
  msgstr ""
3639
 
3640
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1026
3641
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:657
3642
  msgctxt "s2member-front"
3643
  msgid "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
3644
  msgstr ""
3645
 
3646
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1030
3647
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:661
3648
  msgctxt "s2member-front"
3649
  msgid "<div>Sorry, your Coupon <strong>expired</strong>: <em>%s</em>.</div>"
3651
 
3652
  #. translators: `%1$s` is new price/description, after coupon applied. `%2$s`
3653
  #. is original description.
3654
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1036
3655
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:667
3656
  msgctxt "s2member-front"
3657
  msgid "%1$s ~ ORIGINALLY: %2$s"
3658
  msgstr ""
3659
 
3660
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1065
3661
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1068
3662
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:696
3663
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:699
3664
  msgctxt "s2member-front"
3900
  msgid "My Profile Summary"
3901
  msgstr ""
3902
 
3903
+ #: s2member-pro/includes/classes/sc-member-list-in.inc.php:205
3904
+ msgctxt "s2member-front"
3905
+ msgid "Search users..."
3906
+ msgstr ""
3907
+
3908
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3909
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:73
3910
  #: s2member-pro/includes/separates/gateways/authnet/authnet.js:167
4257
  msgid "Update Billing Information"
4258
  msgstr ""
4259
 
4260
+ #: s2member-pro/includes/templates/members/member-list-search-box.php:25
4261
+ msgctxt "s2member-front"
4262
+ msgid "Search"
4263
+ msgstr ""
4264
+
4265
+ #: s2member-pro/includes/templates/members/member-list.php:88
4266
+ msgctxt "s2member-front"
4267
+ msgid "Page:"
4268
+ msgstr ""
4269
+
4270
+ #: s2member-pro/includes/templates/members/member-list.php:96
4271
+ msgctxt "s2member-front"
4272
+ msgid "Sorry, your search returned 0 results."
4273
+ msgstr ""
4274
+
4275
+ #: s2member-pro/includes/templates/members/member-list.php:98
4276
+ msgctxt "s2member-front"
4277
+ msgid "Sorry, there are no users to list at this time."
4278
+ msgstr ""
4279
+
4280
  #: s2member-pro/includes/templates/options/alipay-membership-ccap-terms.php:6
4281
  #: s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:6
4282
  msgctxt "s2member-admin"
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 140423
4
- Stable tag: 140423
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -142,12 +142,24 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
142
 
143
  == Upgrade Notice ==
144
 
145
- = v140423 =
146
 
147
- (Maintenance Release) Upgrade immediately.
148
 
149
  == Changelog ==
150
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  = v140423 =
152
 
153
  * (s2Member/s2Member Pro) **WP v3.9 Compatibility**. Resolving an incompatibility between s2Member and WP v3.9 where s2Member was attempting to use the jQuery `highlight` effect no longer available by default; starting with WP v3.9. A symptom of this bug was to have problems closing the dialog box when creating new Registration/Profile Fields with s2Member in the WP Dashboard. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/108).
@@ -499,101 +511,5 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
499
 
500
  = v121213 =
501
 
502
- * **(Maintenance Release) Upgrade immediately.**
503
- * **Updated for compatibility with WordPress® v3.5. Backward compatibility remains for previous versions of WordPress®, as far back as WordPress® v3.2.**
504
- * (s2Member Pro) **Bug Fix**. An issue first introduced in s2Member® Pro v120517 where we fixed problems with the `maxlength` attribute in Authorize.Net Pro Forms, left a remaining problem. The State/Province field in the Billing Address section of a Pro Form, since s2Member® Pro v120517, has only accepted 2 characters when it should have been capable of accepting up to 40 characters. Fixed in this release.
505
- * (s2Member / s2Member Pro) **Compatibility**. s2Member's Multsite Network patches now support `/wp-login.php` in WordPress® v3.5. Discussed in [this thread](http://www.s2member.com/forums/topic/fyi-wpmu-3-5-wp-login-php-file-not-verified/#post-34457).
506
- * (s2Member / s2Member Pro) **Compatibility**. s2Member's login customizations for `/wp-login.php` have been tweaked to support WordPress® v3.5.
507
- * (s2Member / s2Member Pro) **Checksums**. Each copy of s2Member® and s2Member® Pro now include a `checksum.txt` file in their root plugin directory. This file is used by server-scanning tools provided by WebSharks, Inc. This file simply serves to identify the state of the file structure upon each official release of the software.
508
- * (s2Member Pro) **Bug Fix**. Free Registration Pro Forms submitted without having payment gateway API credentials configured within s2Member® resulted in an on-site error message when there should NOT be one (because a site owner is dealing with Free Registration only in this scenario). Fixed in this release.
509
-
510
- = v121204 =
511
-
512
- * **(Maintenance Release) Upgrade immediately.**
513
- * (s2Member / s2Member Pro) **Bug Fix**. An issue with long billing agreement descriptions under PayPal® Pro (Payflow® Edition) accounts, when coupon codes were being used by customers, was addressed in this release. Symptoms of this bug were errors in s2Member® log files from the Payflow® API, with error code: `11581-Profile description is invalid`. Caused by undocumented length requirements for the billing agreement description under the Payflow® API. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/error-generic-processor-error-11581/page/2/#post-33477).
514
- * (s2Member / s2Member Pro) **Compatibility**. Updated JW Player code samples for compatibility with JW Player v6. Discussed in [this thread](http://www.s2member.com/forums/topic/jw-player-rtmp-streaming-mp4-amazon-s3/page/2/#post-32074).
515
-
516
- = v121201 =
517
-
518
- * **(Maintenance Release) Upgrade immediately.**
519
- * (s2Member / s2Member Pro) **Bug Fix**. Support Rep Cristián Lávaque found a bug in the behavior of s2Member’s Alternative View Restrictions, associated with Category listings in custom menu widgets. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/welcome-page-title-shows-but-no-content/page/2/#post-29802).
520
- * (s2Member Pro) **Feature Enhancement**. s2Member Pro Forms integrated ONLY with PayPal Express Checkout (`accept="paypal" accept_via_paypal="paypal"`), will no longer display a Billing Method section on the Pro Form, as it's not necessary (there's only one possible option in this case, and it's already depicted by the PayPal button at the bottom of the Pro Form). Many site owners had implemented CSS hacks to hide this section of a Pro Form configured this way, based on [this FAQ article](http://www.s2member.com/faqs/#s2-faqs-paypal-pro-not-required). This hack is no longer necessary - starting with this release.
521
- * (s2Member Pro) **Bug Fix**. s2Member Pro Forms integrated with Payflow Recurring Billing via PayPal Express Checkout were failing against some accounts with an erroneous error #10422 related to an invalid funding source. With some help from other site owners and the assistance of PayPal technical support, the underlying issue has been fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/paypal-error-36-transaction-failed/page/2/#post-31490).
522
- * (s2Member Pro) **Compatiblity**. ccBill Buttons can now be generated for amounts exceeding $100.00, so long as prior ccBill approval is obtained from ccBill merchant support. Discussed in [this thread](http://www.s2member.com/forums/topic/cc-bill-button-increase-dollar-amount/#post-31636).
523
- * (s2Member/s2Member Pro) **Compatiblity**. Updated to support Dynamic Roles introduced in bbPress® v2.2. Discussed in [this thread](http://www.s2member.com/forums/topic/dont-upgrade-to-bbpress-2-2/#post-32523).
524
- * (s2Member Pro) **Authorize.Net**. True montly billing instead of every 30 days. Fixed in this release. Discussed in [this thread](http://www.s2member.com/forums/topic/1-month-recurring-billing-instead-of-30-days/#post-30420).
525
-
526
- = v121023 =
527
-
528
- * **(Maintenance Release) Upgrade immediately.**
529
- * (s2Member / s2Member Pro) **Bug Fix**. A bug related to s2Member's `is_site_root()` method, when fancy permalinks are NOT in use; has been corrected for compatibility with the latest version of WordPress. Please see [this thread](http://www.s2member.com/forums/topic/new-custom-field-default-not-on-old-users/#post-28792) for futher details.
530
- * (s2Member Pro) **Import/Export Bug Fix**. An issue related to RFC guidelines for escape sequences in CSV files has been addressed in this release. Please see [this thread](http://www.s2member.com/forums/topic/new-custom-field-default-not-on-old-users/#post-28792) for futher details.
531
- * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was updated for improved compatibility across multiple ccBill® sub-accounts.
532
- * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was updated for improved compatibility w/ ccBill® servers running on MST timezone.
533
- * (s2Member/s2Member Pro) **API Function**. A new API Function was added. See: `s2member_login_ips_for($username)`. Please check the [s2Member® Codex](http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/) for documentation. [This thread](http://www.s2member.com/forums/topic/s2member-restriction-options-unique-ip/#post-20562) may also be of some assistance.
534
- * (s2Member/s2Member Pro) **404 Error (Bug Fix)**. A former dependency on `l10n.js` from the WordPress® core is no longer necessary. This old dependency has been removed to prevent 404 errors in the latest versions of WordPress®. Please check [this thread](http://www.s2member.com/forums/topic/wordpress-i10n-file-404-from-s2member/#post-20567) for further details.
535
- * (s2Member Pro) **reCAPTCHA® Bug Fix**. A bug sometimes causing failed reCAPTCHA® responses after PayPal® Express Checkout has been corrected in this release. This occurred during certain scenarios, whenever reCAPTCHA® was enabled for checkout forms, and PayPal Express Checkout was selected as the payment method of choice.
536
- * (s2Member Pro) **ccBill® DataLink Integration**. DataLink integration with ccBill® was modified to prevent dates in the future from being requested from the DataLink API. ccBill® was responding to some DataLink requests with a failed authentication, which were caused by dates/times in the future; according to MST on the ccBill® side of things.
537
-
538
- = v120703 =
539
-
540
- * **(Maintenance Release) Upgrade immediately.**
541
- * (s2Member/s2Member Pro) **Payflow® Express Checkout**. An issue related to Express Checkout (when using the Payflow® API), has been corrected in this release. A bug in previous releases, was causing error messages under certain circumstances that read `Field format error: Invalid PayerID`.
542
- * (s2Member/s2Member Pro) **WordPress® v3.4**. Standards compliance. Routine maintenance. Re-confirmed compatibility with WordPress® v3.4.
543
-
544
- = v120622 =
545
-
546
- * **(Maintenance Release) Upgrade immediately.**
547
- * (s2Member/s2Member Pro) **WordPress® v3.4**. Confirmed compatibility with WordPress® v3.4.
548
- * (s2Member/s2Member Pro) **Currency Conversion**. This release updates s2Member's currency conversion API, which is powered by Google®. Please see [this thread](http://www.s2member.com/forums/topic/paypal-agreecontinue-sends-to-memb-options/#post-16972) for further details.
549
- * (s2Member/s2Member Pro) **Payflow® Bug Fix**. This release addresses a bug that existed in s2Member's Payflow® integration with Express Checkout. Resolved in this release. Please see [this thread](http://www.s2member.com/forums/topic/cant-do-recurring-billing-via-paypal-payflow/#post-16966) for further details.
550
- * (s2Member/s2Member Pro) **Character Encoding**. This release fixes a big in s2Member's character encoding conversion, for IPN responses received from PayPal®. This releases also fixes an issue specifically with the pound sterling symbol `£`, which was causing some transient IPN data to become corrupted, under the right scenario.
551
-
552
- = v120608 =
553
-
554
- * **(Maintenance Release) Upgrade immediately.**
555
- * (s2Member/s2Member Pro) **WordPress® v3.4**. Updated for compatibility with the coming release of [WordPress® v3.4](http://wordpress.org/news/2012/06/wordpress-3-4-release-candidate-2/). Additional details available [here](http://wordpress.org/news/2012/06/wordpress-3-4-release-candidate-2/).
556
- * (s2Member/s2Member Pro) **Payflow® Bug Fix**. This release addresses two bugs that existed in s2Member's Payflow® integration. Resolved in this release. Please see [this thread](http://www.s2member.com/forums/topic/transactions-not-going-through/#post-15896) for further details.
557
- * (s2Member Pro) **PayPal® Express Checkout**. This release enables "PayPal Account Optional" for PayPal® Express Checkout, via s2Member Pro Forms. In other words, this release makes the PayPal® Express Checkout option through Pro Forms, behave more like a standard PayPal® Button; where a customer is not always required to have a PayPal® account during checkout. This functionality is enabled automatically, there's nothing you need to change in your s2Member® integration. However, we do suggest that you turn "PayPal Account Optional" (on) inside your PayPal® account. Please see [this thread](http://www.s2member.com/forums/topic/paypal-express-for-paypal-pro-user/#post-15892) for further details.
558
- * (s2Member) **Documentation**. Code samples for Content Dripping have been updated in the Dashboard, in order to correct a date comparison snippet, which was WRONG. Please check your Dashboard under: `s2Member® -› API Scripting -› Content Dripping -› Example #2`, for the updated code sample.
559
-
560
- = v120601 =
561
-
562
- * **(Maintenance Release) Upgrade immediately.**
563
- * (s2Member Pro) **ClickBank® Button Shortcodes**. This release works around a bug that has been discovered on the ClickBank® side of things, when a `+` character appears in the `desc=""` attribute of your ClickBank® Button Shortcode. Resolved in this release. Please see [this thread](http://www.s2member.com/forums/topic/clickbank-output-url/#post-15166) for further details.
564
- * (s2Member Pro) **Payflow® Daily Recurrence (Limitation)**. PayPal® Pro accounts with the Payflow® Edition API, are NOT capable of charging on a `daily` recurring basis. Previous releases of s2Member® Pro mistakenly documented this as being possible. Resolved in this release. PayPal® Pro accounts operating with the Payflow® Edition (and integrated with s2Member®), are only capable of charging recurring fees on the following schedules: `weekly, bi-weekly, monthly, quarterly, or yearly`. This is in large part, a limitation in the Payflow® API, which we hope will be resolved by PayPal® in a future version. Please feel free to contact PayPal® if you'd like to vote for this feature! This limitation does NOT affect existing PayPal® Pro accounts operating exclusively under the PayPal® Pro API (e.g. without Payflow®).
565
- * (s2Member Pro) **New ccBill® Shortcodes**. s2Member® Pro now includes two new Shortcode Attributes for ccBill® payment button integrations. These include: `sub_account` and `form`. Making it possible to integrate a single installation of s2Member® Pro with multiple ccBill® sub-accounts, and/or multiple ccBill® forms (as they exist in your ccBill® account). For further details, please read the Shortcode documentation, found in your Dashboard under: `s2Member® -› ccBill® Buttons -› Shortcode Attributes (Explained)`.
566
- * (s2Member/s2Member Pro) **Bug Fix**. A bug related to inaccurate role assignment, under certain scenarios (for administrative accounts). Resolved in this release. Please see [this thread](http://www.s2member.com/forums/topic/inaccurate-role-assignment-in-s2member-pro/#post-14122) for further details.
567
-
568
- = v120517 =
569
-
570
- * **(Maintenance Release) Upgrade immediately.**
571
- * (s2Member Pro) **PayPal® Pro Forms**. This release removes all limitations on the maximum length of an initial trial/period. It is now possible to offer any number of days/weeks/months/years for free, or at a different initial rate.
572
- * (s2Member Pro) **Authorize.Net® Bug Fix**. Max length (i.e. `maxlength=""`) adjusted in Pro Forms integrating with Authorize.Net. 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.
573
- * (s2Member/s2Member Pro) **JW Player® Code Samples**. Updated code samples for JW Player®, to reduce the possibility of a namespace conflict in configuration variables. For further details, please check [this thread](http://www.s2member.com/forums/topic/jw-player-new-code-conflict/#post-13819).
574
-
575
- = v120514 =
576
-
577
- * **(Maintenance Release) Upgrade immediately.**
578
- * (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`.
579
- * (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)`.
580
- * (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.
581
- * (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`.
582
- * (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).
583
- * (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`.
584
-
585
- = v120309 =
586
-
587
- * (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`.
588
- * (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.
589
-
590
- = v120308 =
591
-
592
- * (s2Member/s2Member Pro) **Custom Registration/Profile Fields**. Now possible to create a Custom Field that's always hidden, during both registration and any future Profile edits (e.g. for administrative purposes only).
593
- * (s2Member/s2Member Pro) **Compatibility**. Minor updates for compatibility with the coming release of WordPress® v3.4.
594
- * (s2Member Pro) **Bug fix**. Broken link in UI leading to: `s2m-pro-extras.zip`. Corrected in this release.
595
-
596
- = v120301 - 1.0 =
597
-
598
- * ... trimmed away at v111220.
599
  * Initial release: v1.0.
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 140520
4
+ Stable tag: 140520
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
142
 
143
  == Upgrade Notice ==
144
 
145
+ = v140520 =
146
 
147
+ (Maintenance Release) Upgrade immediately!
148
 
149
  == Changelog ==
150
 
151
+ = v140520 =
152
+
153
+ * (s2Member Pro) **`[s2Member-List /]` Shortcode** Amazing new feature! It is now possible to list members using a powerful shortcode, and even make it possible for members to view and search for each other. See [this KB article](http://www.s2member.com/?p=62860) for all the details on this feature. Very cool!
154
+ * (s2Member/s2Member Pro) **Server-Side Validation** For Registration/Profile Fields that you configure on your own (using the s2Member software), there is now support within all areas of the s2Member codebase for both JavaScript and *now server-side validation too*. In the past, all validations applied to custom fields was via JavaScript only. With server-side validation too, now it is impossible for required and/or invalid fields that you configure to go missing. This also resolves a few issues related to spam bots attempting to bypass JavaScript validation. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/99) if you'd like further details.
155
+ * (s2Member Pro) **Button Processing Animation**. Improving the processing animation used in submit buttons across Pro Forms. Instead of a script-based solution (rather jumpy), we are now taking advantage of CSS3 for a much smoother animation. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/114) if you'd like further details.
156
+ * (s2Member Pro) **`[s2Drip /]` Shortcode Enhancement** This release adds support for a new `access=""` shortcode attribute that can parse `and` / `or` logic. Also, it is now possible for `[s2Drip /]` to be used with Custom Capabilities too! See [this KB article](http://www.s2member.com/kb/s2drip-shortcode/) for all the details.
157
+ * (s2Member/s2Member Pro) **Bug Fix, Custom Fields UI** This release corrects a bug related to the `jquery/.htaccess` file that ships with s2Member. A symptom was to have issues with the Registration/Profile Fields UI and find a JS error in the browser's developer console. Fixed in this release. See also, [this GitHub issue](https://github.com/WebSharks/s2Member/issues/144#issuecomment-43198045) if you'd like further details.
158
+ * (s2Member Pro) **Bug Fix, Clickbank HTTPS** This release corrects a bug in the default Auto-Return Page for ClickBank, when/if it's served over the `https` protocol. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/145) if you'd like further details.
159
+ * (s2Member/s2Member Pro) **Sortable User Columns** This release adds support for sortable user columns in the Dashboard, where possible. Things like EOT Time, Registration Time, Last Login Time, Total Logins, etc. NOTE: it is currently NOT possible to sort by Custom Registration/Profile Fields (yet). See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/147) if you'd like further details.
160
+ * (s2Member/s2Member Pro) **Hook Priority for Translations** This release corrects a bug related to Gettext translations. There were a couple of areas within s2Member that weren't picking up all of the translation entries; caused by a conflict in hook priority. Fixed in this release. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/132) if you'd like further details.
161
+ * (s2Member Pro) **`[s2MOP /]` Shortcode Enhancement** A new Replacement Code was added: `%%REQUIRED_LEVEL_LABEL%%`. See [this KB article](http://www.s2member.com/kb/s2mop-shortcode/) and [this GitHub issue](https://github.com/WebSharks/s2Member/issues/129) if you'd like further details.
162
+
163
  = v140423 =
164
 
165
  * (s2Member/s2Member Pro) **WP v3.9 Compatibility**. Resolving an incompatibility between s2Member and WP v3.9 where s2Member was attempting to use the jQuery `highlight` effect no longer available by default; starting with WP v3.9. A symptom of this bug was to have problems closing the dialog box when creating new Registration/Profile Fields with s2Member in the WP Dashboard. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/108).
511
 
512
  = v121213 =
513
 
514
+ * ... trimmed away at v121213.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
515
  * Initial release: v1.0.
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 140423
23
- Stable tag: 140423
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
@@ -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", "140423" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
@@ -105,7 +105,7 @@ if(!defined("WS_PLUGIN__S2MEMBER_MIN_WP_VERSION"))
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
- define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "140423" /* !#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: 140520
23
+ Stable tag: 140520
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
+ define("WS_PLUGIN__S2MEMBER_VERSION", "140520" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
+ define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "140520" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.