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

Version Description

= v130123 = Maintenance release. Upgrade immediately.

Download this release

Release Info

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

Code changes from version 130121 to 130123

checksum.txt CHANGED
@@ -1 +1 @@
1
- 1929917d1855921a8a385f7a1198bc7b
1
+ 2e812841193a58035113e349bc6a37c2
images/brand-kb.png ADDED
Binary file
images/brand-kb.pspimage ADDED
Binary file
includes/classes/menu-pages-rs.inc.php CHANGED
@@ -75,6 +75,13 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages_rs"))
75
  echo '</div>' . "\n";
76
  }
77
  /**/
 
 
 
 
 
 
 
78
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["videos"])
79
  {
80
  echo '<div class="ws-menu-page-videos">' . "\n";
75
  echo '</div>' . "\n";
76
  }
77
  /**/
78
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["kb"])
79
+ {
80
+ echo '<div class="ws-menu-page-kb">' . "\n";
81
+ echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Knowledge Base")) . '" target="_blank"><img src="' . esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/brand-kb.png" alt="." /></a>' . "\n";
82
+ echo '</div>' . "\n";
83
+ }
84
+ /**/
85
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["videos"])
86
  {
87
  echo '<div class="ws-menu-page-videos">' . "\n";
includes/classes/sc-files-in.inc.php CHANGED
@@ -102,7 +102,7 @@ if(!class_exists("c_ws_plugin__s2member_sc_files_in"))
102
  /**/
103
  $attr = /* Force array; trim quote entities. */ c_ws_plugin__s2member_utils_strings::trim_qts_deep((array)$attr);
104
  /**/
105
- $attr = shortcode_atts(array("download" => "", "download_key" => "", "stream" => "yes", "inline" => "yes", "storage" => "", "remote" => "", "ssl" => "", "rewrite" => "yes", "rewrite_base" => "", "skip_confirmation" => "", "url_to_storage_source" => "yes", "count_against_user" => "yes", "check_user" => "yes", /* Shortcode-specifics » */ "file_download" => "", "player" => "jwplayer-v6-rtmp", "player_id" => "s2-stream-".md5(uniqid("", TRUE)), "player_path" => "/jwplayer/jwplayer.js", "player_image" => "", "player_title" => "", /* Layout » */ "player_controls" => "yes", "player_height" => "270", "player_skin" => "", "player_stretching" => "uniform", "player_width" => "480", /* Playback » */ "player_autostart" => "no", "player_fallback" => "yes", "player_mute" => "no", "player_primary" => "flash", "player_repeat" => "no", "player_startparam" => ""), $attr);
106
  $attr["download"] = (!empty($attr["file_download"])) ? $attr["file_download"] : $attr["download"];
107
  /**/
108
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
@@ -134,6 +134,7 @@ if(!class_exists("c_ws_plugin__s2member_sc_files_in"))
134
  /**/
135
  $get = preg_replace("/%%player_id%%/", $attr["player_id"], $get);
136
  $get = preg_replace("/%%player_path%%/", $attr["player_path"], $get);
 
137
  /**/
138
  $get = preg_replace("/%%player_image%%/", $attr["player_image"], $get);
139
  $get = preg_replace("/%%player_title%%/", $attr["player_title"], $get);
@@ -150,6 +151,8 @@ if(!class_exists("c_ws_plugin__s2member_sc_files_in"))
150
  $get = preg_replace("/%%player_primary%%/", $attr["player_primary"], $get);
151
  $get = preg_replace("/%%player_repeat%%/", ((filter_var($attr["player_repeat"], FILTER_VALIDATE_BOOLEAN)) ? "true" : "false"), $get);
152
  $get = preg_replace("/%%player_startparam%%/", $attr["player_startparam"], $get);
 
 
153
  }
154
  }
155
  }
102
  /**/
103
  $attr = /* Force array; trim quote entities. */ c_ws_plugin__s2member_utils_strings::trim_qts_deep((array)$attr);
104
  /**/
105
+ $attr = shortcode_atts(array("download" => "", "download_key" => "", "stream" => "yes", "inline" => "yes", "storage" => "", "remote" => "", "ssl" => "", "rewrite" => "yes", "rewrite_base" => "", "skip_confirmation" => "", "url_to_storage_source" => "yes", "count_against_user" => "yes", "check_user" => "yes", /* Shortcode-specifics »» */ "file_download" => "", /* Configuration » */ "player" => "jwplayer-v6-rtmp", "player_id" => "s2-stream-".md5(uniqid("", TRUE)), "player_path" => "/jwplayer/jwplayer.js", "player_key" => "", "player_image" => "", "player_title" => "", /* Layout » */ "player_controls" => "yes", "player_height" => "270", "player_skin" => "", "player_stretching" => "uniform", "player_width" => "480", /* Playback » */ "player_autostart" => "no", "player_fallback" => "yes", "player_mute" => "no", "player_primary" => "flash", "player_repeat" => "no", "player_startparam" => "", /* Advanced option blocks » */ "player_option_blocks" => ""), $attr);
106
  $attr["download"] = (!empty($attr["file_download"])) ? $attr["file_download"] : $attr["download"];
107
  /**/
108
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
134
  /**/
135
  $get = preg_replace("/%%player_id%%/", $attr["player_id"], $get);
136
  $get = preg_replace("/%%player_path%%/", $attr["player_path"], $get);
137
+ $get = preg_replace("/%%player_key%%/", $attr["player_key"], $get);
138
  /**/
139
  $get = preg_replace("/%%player_image%%/", $attr["player_image"], $get);
140
  $get = preg_replace("/%%player_title%%/", $attr["player_title"], $get);
151
  $get = preg_replace("/%%player_primary%%/", $attr["player_primary"], $get);
152
  $get = preg_replace("/%%player_repeat%%/", ((filter_var($attr["player_repeat"], FILTER_VALIDATE_BOOLEAN)) ? "true" : "false"), $get);
153
  $get = preg_replace("/%%player_startparam%%/", $attr["player_startparam"], $get);
154
+ /**/
155
+ $get = preg_replace("/%%player_option_blocks%%/", ((strpos($attr["player_option_blocks"], ":") !== false) ? $attr["player_option_blocks"] : base64_decode($attr["player_option_blocks"])), $get);
156
  }
157
  }
158
  }
includes/menu-pages/api-ops.inc.php CHANGED
@@ -56,6 +56,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
56
  echo '<p>If you use affiliate software, or have back-office routines that need to be notified whenever a new Subscription is created, you\'ll want to read this section. This is marked `Signup`, because the URLs that you list below, will be notified each time a "new", "paying" Member, signs up. Depending on your fee structure, this may include a first Initial Payment that establishes their Subscription, or it may not. This Notification will only be triggered once for each Member. Signup Notifications are sent right after a "new", "paying" Member, signs up successfully through your Payment Gateway, regardless of whether any money has actually been transacted initially. In other words, this Notification is triggered anytime a "new", "paying" Member, signs up through your Payment Gateway, even if you provided them with a 100% Free Trial Period <em>( e.g. no money is being transacted intially )</em>.</p>' . "\n";
57
  echo '<p>This Notification will NOT be processed for Free Subscribers that register without going through your Payment Gateway at all. This Notification will NOT be processed when an "existing" User/Member pays for a new Subscription <em>( see: Modification Notifications for that scenario )</em>.' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' And, this Notification will NOT be processed on Buy Now transactions for Independent Custom Capabilities <em>( see: Payment Notifications for that scenario )</em>.') . '</p>' . "\n";
58
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Signup Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
 
59
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_signup_notifications", get_defined_vars ());
60
  /**/
61
  echo '<table class="form-table">' . "\n";
@@ -147,6 +148,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
147
  echo '<p>If you use affiliate software, or have back-office routines that need to be notified whenever a "new" Member is created, you\'ll want to read this section. This is marked `Registration`, because the URLs that you list below, will be notified each time a "new" Member registers a Username. This is usually triggered right after a `Signup` Notification; at the point in which a "new" Member successfully completes the Registration form, and they are assigned a Username.</p>' . "\n";
148
  echo '<p>This Notification is ALSO triggered whenever you create a "new" User inside your WordPress® Dashboard.</p>' . "\n";
149
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Registration Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
 
150
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_registration_notifications", get_defined_vars ());
151
  /**/
152
  echo '<table class="form-table">' . "\n";
@@ -248,6 +250,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
248
  echo '<p>So, unlike the `Signup` Notification, `Payment` Notifications take place whenever actual payments are received, instead of just once after signup is completed. If a payment is required during signup <em>( i.e. no Free Trial is being offered )</em>, a Signup Notification will be triggered, and a Payment Notification will ALSO be triggered. In other words, a Payment Notification occurs anytime funds are received, no matter what.</p>' . "\n";
249
  echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p>Payment Notifications are also triggered whenever a Buy Now purchase for Independent Custom Capabilities takes place.</p>' . "\n" : '';
250
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Payment Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
 
251
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_payment_notifications", get_defined_vars ());
252
  /**/
253
  echo '<table class="form-table">' . "\n";
@@ -353,6 +356,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
353
  echo '<p>Modification Notifications are sent right after a Member signs up and/or modifies billing terms successfully through your Payment Gateway, regardless of whether any money has actually been transacted initially. In other words, this Notification is triggered, even if you provided them with a 100% Free Trial Period <em>( e.g. no money is being transacted intially )</em>.</p>' . "\n";
354
  echo '<p>This Notification will NOT be processed for Free Subscribers that register without going through your Payment Gateway at all. This Notification will NOT be processed for "new" Users/Members <em>( see: Signup Notifications for that scenario )</em>.' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' And, this Notification will NOT be processed for Independent Custom Capability purchases <em>( see: Payment Notifications for that scenario )</em>.') . '</p>' . "\n";
355
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Modification Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
 
356
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_modification_notifications", get_defined_vars ());
357
  /**/
358
  echo '<table class="form-table">' . "\n";
@@ -460,6 +464,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
460
  echo '<p><em><strong>*Understanding Cancellations*</strong> It\'s important to realize that a Cancellation is not an EOT ( End Of Term ). All that happens during a Cancellation event, is that billing is stopped, and it\'s understood that the Customer is going to lose access, at some point in the future. This does NOT mean, that access will be revoked immediately. A separate EOT event will automatically handle a (demotion or deletion) later, at the appropriate time; which could be several days, or even a year after the Cancellation took place.</em></p>' . "\n";
461
  echo '<p><em><strong>*Some Hairy Details*</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through your Payment Gateway... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT ( End Of Term ) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by s2Member.</em></p>' . "\n";
462
  echo '<p><em>s2Member will not process an EOT ( End Of Term ) until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system ( based on your configuration ). s2Member also calculates one extra day ( 24 hours ) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>' . "\n";
 
463
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_cancellation_notifications", get_defined_vars ());
464
  /**/
465
  echo '<table class="form-table">' . "\n";
@@ -561,6 +566,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
561
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These EOT/Deletion Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
562
  echo '<p><em><strong>*Some Hairy Details*</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through your Payment Gateway... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT ( End Of Term ) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by s2Member.</em></p>' . "\n";
563
  echo '<p><em>s2Member will not process an EOT ( End Of Term ) until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system ( based on your configuration ). s2Member also calculates one extra day ( 24 hours ) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>' . "\n";
 
564
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_eot_deletion_notifications", get_defined_vars ());
565
  /**/
566
  echo '<table class="form-table">' . "\n";
@@ -659,6 +665,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
659
  echo '<p>This is very similar to the EOT/Deletion Notification described above. However, there is an important distinction. The all-inclusive EOT/Deletion Notification includes cancellations, expirations, failed payments, refunds, chargebacks, and even manual deletions by the Administrator from within the Dashboard. In other words, EOT/Deletion Notifications are processed ANY time a deletion or End Of Term action takes place. This API Notification, that is, Refund/Reversal Notifications, do NOT include all of those scenarios.</p>' . "\n";
660
  echo '<p>So the distinction is that Refund/Reversal Notifications are ONLY sent under two specific circumstances: 1. You log into your Payment Gateway and refund a payment that is associated with a Subscription. 2. The Customer complains to your Payment Gateway and a chargeback occurs, forcing a Reversal. In both of these cases, an EOT/Deletion Notification will be sent <em>( as described in the previous section )</em>, but since EOT/Deletion is a broader Notification, these Refund/Reversal Notifications are here so you can nail down specific back-office operations in these two specific scenarios.</p>' . "\n";
661
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Refund/Reversal Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
 
662
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_refund_reversal_notifications", get_defined_vars ());
663
  /**/
664
  echo '<table class="form-table">' . "\n";
@@ -759,6 +766,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
759
  echo '<p>If you use affiliate software, or have back-office routines that need to be notified whenever Specific Post/Page sales take place, you\'ll want to read this section. This is marked `Specific Post/Page`, because the URLs that you list below, will be notified each time a payment occurs, on a sale providing access to a Specific Post/Page.</p>' . "\n";
760
  echo '<p>This is one of only two API Notifications that are sent for Specific Post/Page Access <em>( i.e. this one, and another below, for Refunds/Reversals )</em>. All of the other API Notifications are designed for Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and Independent Custom Capabilities') . '. None of the other API Notifications will ever be processed for Specific Post/Page Access. If you intend to respond to events related to Specific Post/Page Access, you MUST use one of the two API Notifications specifically geared to Post/Page Access.</p>' . "\n";
761
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Sale Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
 
762
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_sp_sale_notifications", get_defined_vars ());
763
  /**/
764
  echo '<table class="form-table">' . "\n";
@@ -850,6 +858,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_api_ops"))
850
  echo '<p>If you use affiliate software, or have back-office routines that need to be notified whenever sales have been refunded or reversed <em>( i.e. charged back to you )</em>, you\'ll want to read this section. This is marked `Specific Post/Page`, because the URLs that you list below, will be notified each time a Refund or Reversal occurs, on a sale that provided access to a Specific Post/Page.</p>' . "\n";
851
  echo '<p>This is one of only two Notifications that are sent for Specific Post/Page Access <em>( i.e. this one, and another above, for Sales )</em>. All of the other API Notifications are designed for Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and Independent Custom Capabilities') . '. None of the other API Notifications will ever be processed for Specific Post/Page Access. If you intend to respond to events related to Specific Post/Page Access, you MUST use one of the two API Notifications specifically geared to Post/Page Access.</p>' . "\n";
852
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Refund/Reversal Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
 
853
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_sp_refund_reversal_notifications", get_defined_vars ());
854
  /**/
855
  echo '<table class="form-table">' . "\n";
56
  echo '<p>If you use affiliate software, or have back-office routines that need to be notified whenever a new Subscription is created, you\'ll want to read this section. This is marked `Signup`, because the URLs that you list below, will be notified each time a "new", "paying" Member, signs up. Depending on your fee structure, this may include a first Initial Payment that establishes their Subscription, or it may not. This Notification will only be triggered once for each Member. Signup Notifications are sent right after a "new", "paying" Member, signs up successfully through your Payment Gateway, regardless of whether any money has actually been transacted initially. In other words, this Notification is triggered anytime a "new", "paying" Member, signs up through your Payment Gateway, even if you provided them with a 100% Free Trial Period <em>( e.g. no money is being transacted intially )</em>.</p>' . "\n";
57
  echo '<p>This Notification will NOT be processed for Free Subscribers that register without going through your Payment Gateway at all. This Notification will NOT be processed when an "existing" User/Member pays for a new Subscription <em>( see: Modification Notifications for that scenario )</em>.' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' And, this Notification will NOT be processed on Buy Now transactions for Independent Custom Capabilities <em>( see: Payment Notifications for that scenario )</em>.') . '</p>' . "\n";
58
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Signup Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
59
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
60
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_signup_notifications", get_defined_vars ());
61
  /**/
62
  echo '<table class="form-table">' . "\n";
148
  echo '<p>If you use affiliate software, or have back-office routines that need to be notified whenever a "new" Member is created, you\'ll want to read this section. This is marked `Registration`, because the URLs that you list below, will be notified each time a "new" Member registers a Username. This is usually triggered right after a `Signup` Notification; at the point in which a "new" Member successfully completes the Registration form, and they are assigned a Username.</p>' . "\n";
149
  echo '<p>This Notification is ALSO triggered whenever you create a "new" User inside your WordPress® Dashboard.</p>' . "\n";
150
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Registration Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
151
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
152
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_registration_notifications", get_defined_vars ());
153
  /**/
154
  echo '<table class="form-table">' . "\n";
250
  echo '<p>So, unlike the `Signup` Notification, `Payment` Notifications take place whenever actual payments are received, instead of just once after signup is completed. If a payment is required during signup <em>( i.e. no Free Trial is being offered )</em>, a Signup Notification will be triggered, and a Payment Notification will ALSO be triggered. In other words, a Payment Notification occurs anytime funds are received, no matter what.</p>' . "\n";
251
  echo (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) ? '<p>Payment Notifications are also triggered whenever a Buy Now purchase for Independent Custom Capabilities takes place.</p>' . "\n" : '';
252
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Payment Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
253
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
254
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_payment_notifications", get_defined_vars ());
255
  /**/
256
  echo '<table class="form-table">' . "\n";
356
  echo '<p>Modification Notifications are sent right after a Member signs up and/or modifies billing terms successfully through your Payment Gateway, regardless of whether any money has actually been transacted initially. In other words, this Notification is triggered, even if you provided them with a 100% Free Trial Period <em>( e.g. no money is being transacted intially )</em>.</p>' . "\n";
357
  echo '<p>This Notification will NOT be processed for Free Subscribers that register without going through your Payment Gateway at all. This Notification will NOT be processed for "new" Users/Members <em>( see: Signup Notifications for that scenario )</em>.' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' And, this Notification will NOT be processed for Independent Custom Capability purchases <em>( see: Payment Notifications for that scenario )</em>.') . '</p>' . "\n";
358
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Modification Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
359
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
360
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_modification_notifications", get_defined_vars ());
361
  /**/
362
  echo '<table class="form-table">' . "\n";
464
  echo '<p><em><strong>*Understanding Cancellations*</strong> It\'s important to realize that a Cancellation is not an EOT ( End Of Term ). All that happens during a Cancellation event, is that billing is stopped, and it\'s understood that the Customer is going to lose access, at some point in the future. This does NOT mean, that access will be revoked immediately. A separate EOT event will automatically handle a (demotion or deletion) later, at the appropriate time; which could be several days, or even a year after the Cancellation took place.</em></p>' . "\n";
465
  echo '<p><em><strong>*Some Hairy Details*</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through your Payment Gateway... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT ( End Of Term ) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by s2Member.</em></p>' . "\n";
466
  echo '<p><em>s2Member will not process an EOT ( End Of Term ) until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system ( based on your configuration ). s2Member also calculates one extra day ( 24 hours ) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>' . "\n";
467
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
468
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_cancellation_notifications", get_defined_vars ());
469
  /**/
470
  echo '<table class="form-table">' . "\n";
566
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These EOT/Deletion Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
567
  echo '<p><em><strong>*Some Hairy Details*</strong> There might be times whenever you notice that a Member\'s Subscription has been cancelled through your Payment Gateway... but, s2Member continues allowing the User access to your site as a paid Member. Please don\'t be confused by this... in 99.9% of these cases, the reason for this is legitimate. s2Member will only remove the User\'s Membership privileges when an EOT ( End Of Term ) is processed, a refund occurs, a chargeback occurs, or when a cancellation occurs - which would later result in a delayed Auto-EOT by s2Member.</em></p>' . "\n";
568
  echo '<p><em>s2Member will not process an EOT ( End Of Term ) until the User has completely used up the time they paid for. In other words, if a User signs up for a monthly Subscription on Jan 1st, and then cancels their Subscription on Jan 15th; technically, they should still be allowed to access the site for another 15 days, and then on Feb 1st, the time they paid for has completely elapsed. At that time, s2Member will remove their Membership privileges; by either demoting them to a Free Subscriber, or deleting their account from the system ( based on your configuration ). s2Member also calculates one extra day ( 24 hours ) into its equation, just to make sure access is not removed sooner than a Customer might expect.</em></p>' . "\n";
569
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
570
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_eot_deletion_notifications", get_defined_vars ());
571
  /**/
572
  echo '<table class="form-table">' . "\n";
665
  echo '<p>This is very similar to the EOT/Deletion Notification described above. However, there is an important distinction. The all-inclusive EOT/Deletion Notification includes cancellations, expirations, failed payments, refunds, chargebacks, and even manual deletions by the Administrator from within the Dashboard. In other words, EOT/Deletion Notifications are processed ANY time a deletion or End Of Term action takes place. This API Notification, that is, Refund/Reversal Notifications, do NOT include all of those scenarios.</p>' . "\n";
666
  echo '<p>So the distinction is that Refund/Reversal Notifications are ONLY sent under two specific circumstances: 1. You log into your Payment Gateway and refund a payment that is associated with a Subscription. 2. The Customer complains to your Payment Gateway and a chargeback occurs, forcing a Reversal. In both of these cases, an EOT/Deletion Notification will be sent <em>( as described in the previous section )</em>, but since EOT/Deletion is a broader Notification, these Refund/Reversal Notifications are here so you can nail down specific back-office operations in these two specific scenarios.</p>' . "\n";
667
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Refund/Reversal Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
668
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
669
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_refund_reversal_notifications", get_defined_vars ());
670
  /**/
671
  echo '<table class="form-table">' . "\n";
766
  echo '<p>If you use affiliate software, or have back-office routines that need to be notified whenever Specific Post/Page sales take place, you\'ll want to read this section. This is marked `Specific Post/Page`, because the URLs that you list below, will be notified each time a payment occurs, on a sale providing access to a Specific Post/Page.</p>' . "\n";
767
  echo '<p>This is one of only two API Notifications that are sent for Specific Post/Page Access <em>( i.e. this one, and another below, for Refunds/Reversals )</em>. All of the other API Notifications are designed for Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and Independent Custom Capabilities') . '. None of the other API Notifications will ever be processed for Specific Post/Page Access. If you intend to respond to events related to Specific Post/Page Access, you MUST use one of the two API Notifications specifically geared to Post/Page Access.</p>' . "\n";
768
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Sale Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
769
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
770
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_sp_sale_notifications", get_defined_vars ());
771
  /**/
772
  echo '<table class="form-table">' . "\n";
858
  echo '<p>If you use affiliate software, or have back-office routines that need to be notified whenever sales have been refunded or reversed <em>( i.e. charged back to you )</em>, you\'ll want to read this section. This is marked `Specific Post/Page`, because the URLs that you list below, will be notified each time a Refund or Reversal occurs, on a sale that provided access to a Specific Post/Page.</p>' . "\n";
859
  echo '<p>This is one of only two Notifications that are sent for Specific Post/Page Access <em>( i.e. this one, and another above, for Sales )</em>. All of the other API Notifications are designed for Membership Level Access' . ((is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()) ? '' : ' and Independent Custom Capabilities') . '. None of the other API Notifications will ever be processed for Specific Post/Page Access. If you intend to respond to events related to Specific Post/Page Access, you MUST use one of the two API Notifications specifically geared to Post/Page Access.</p>' . "\n";
860
  echo '<p>Please note, this feature is not to be confused with the PayPal® IPN service. PayPal® IPN <em>( and other service integrations )</em> are already built into s2Member. They remain active at all times. These Refund/Reversal Notifications are an added layer of functionality, and they are completely optional.</p>' . "\n";
861
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/building-an-api-notification-handler/" target="_blank" rel="external">Building An API Notification Handler</a>.</p>'."\n";
862
  do_action ("ws_plugin__s2member_during_api_ops_page_during_left_sections_during_sp_refund_reversal_notifications", get_defined_vars ());
863
  /**/
864
  echo '<table class="form-table">' . "\n";
includes/menu-pages/down-ops.inc.php CHANGED
@@ -488,6 +488,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
488
  echo '<a href="http://www.longtailvideo.com/players/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/jwplayer-logo.png" class="ws-menu-page-right" style="width:179px; height:58px; border:0;" alt="." /></a>'."\n";
489
  echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon® S3 or CloudFront; we DO highly recommend that you integrate both Amazon® S3 and Amazon® CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon® S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Support Forums</a> for tips/tricks if you like.</p>'."\n";
490
  echo '<p><strong>One of the great things about Amazon® CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon® CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon® S3 and Amazon® CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon® CloudFront Streaming Distribution.</p>'."\n";
 
491
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_rtmp_streaming", get_defined_vars());
492
  /**/
493
  echo '<div class="ws-menu-page-hr"></div>'."\n";
@@ -647,6 +648,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
647
  echo '<div class="ws-menu-page-hr"></div>'."\n";
648
  /**/
649
  echo '<h4 style="margin:0;">Additional <code>[s2Stream /]</code> Shortcode Attributes:</h4>'."\n";
 
650
  echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_url()" target="_blank" rel="external">s2member_file_download_url()</a> for PHP integration.</p>'."\n";
651
  echo '<table class="form-table" style="margin-top:0;">'."\n";
652
  echo '<tbody>'."\n";
@@ -658,7 +660,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
658
  echo '<li><code>player="jwplayer-v6-rtmp"</code> Required. Current supported players in this Shortcode include: <code>jwplayer-v6</code> (works with any audio/video file, and you do NOT need to have Amazon® S3 or CloudFront™ integrated for this to work), <code>jwplayer-v6-rtmp</code> (streams with the RTMP protocol, plus there is a full download fallback of the source file if streaming is not possible on a particular device; this requires both Amazon® S3 and CloudFront™ integration), <code>jwplayer-v6-rtmp-only</code> (streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream; this requires both Amazon® S3 and CloudFront™ integration).</li>'."\n";
659
  echo '<li><code>player_id=""</code> Optional. HTML div ID for the audio/video player. Defaults to a unique ID generated by s2Member® for each instance of your Shortcode.</li>'."\n";
660
  echo '<li><code>player_path="/jwplayer/jwplayer.js"</code> Required. Path to the player\'s JavaScript file (ex: <code>/jwplayer/jwplayer.js</code> — you should upload the <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">/jwplayer</a> folder to the root of your web directory).</li>'."\n";
661
- echo '<li><code>player_[setting]=""</code> Optional. Any additional attributes supported by your audio/video player, prefixed with <code>player_</code>. For JW Player™ v6, see <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player" target="_blank" rel="external">this article please</a>. Examples: <code>player_width="480"</code>, <code>player_height="270"</code>, <code>player_image="http://www.example.com/wp-content/uploads/video-preview.jpg"</code>, <code>player_autostart="true"</code>, <code>player_skin="/jwplayer/my-skin.xml"</code>. Please note that "Advanced Options Blocks" listed on <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player" target="_blank" rel="external">this page</a> are currently NOT supported here. All others are.</li>'."\n";
 
662
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs_s2stream_lis", get_defined_vars());
663
  echo '</ul>'."\n";
664
  echo '</td>'."\n";
488
  echo '<a href="http://www.longtailvideo.com/players/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/jwplayer-logo.png" class="ws-menu-page-right" style="width:179px; height:58px; border:0;" alt="." /></a>'."\n";
489
  echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon® S3 or CloudFront; we DO highly recommend that you integrate both Amazon® S3 and Amazon® CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon® S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Support Forums</a> for tips/tricks if you like.</p>'."\n";
490
  echo '<p><strong>One of the great things about Amazon® CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon® CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon® S3 and Amazon® CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon® CloudFront Streaming Distribution.</p>'."\n";
491
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player® w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
492
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_rtmp_streaming", get_defined_vars());
493
  /**/
494
  echo '<div class="ws-menu-page-hr"></div>'."\n";
648
  echo '<div class="ws-menu-page-hr"></div>'."\n";
649
  /**/
650
  echo '<h4 style="margin:0;">Additional <code>[s2Stream /]</code> Shortcode Attributes:</h4>'."\n";
651
+ echo '<p style="margin:0;"><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player® w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
652
  echo '<p style="margin:0;"><strong>See also:</strong> API Function <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-functions/#src_doc_s2member_file_download_url()" target="_blank" rel="external">s2member_file_download_url()</a> for PHP integration.</p>'."\n";
653
  echo '<table class="form-table" style="margin-top:0;">'."\n";
654
  echo '<tbody>'."\n";
660
  echo '<li><code>player="jwplayer-v6-rtmp"</code> Required. Current supported players in this Shortcode include: <code>jwplayer-v6</code> (works with any audio/video file, and you do NOT need to have Amazon® S3 or CloudFront™ integrated for this to work), <code>jwplayer-v6-rtmp</code> (streams with the RTMP protocol, plus there is a full download fallback of the source file if streaming is not possible on a particular device; this requires both Amazon® S3 and CloudFront™ integration), <code>jwplayer-v6-rtmp-only</code> (streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream; this requires both Amazon® S3 and CloudFront™ integration).</li>'."\n";
661
  echo '<li><code>player_id=""</code> Optional. HTML div ID for the audio/video player. Defaults to a unique ID generated by s2Member® for each instance of your Shortcode.</li>'."\n";
662
  echo '<li><code>player_path="/jwplayer/jwplayer.js"</code> Required. Path to the player\'s JavaScript file (ex: <code>/jwplayer/jwplayer.js</code> — you should upload the <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">/jwplayer</a> folder to the root of your web directory).</li>'."\n";
663
+ echo '<li><code>player_[setting]=""</code> Optional. Any additional configuration attributes supported by your audio/video player, prefixed with <code>player_</code>. For JW Player™ v6, see <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player" target="_blank" rel="external">this article please</a>. Examples: <code>player_width="480"</code>, <code>player_height="270"</code>, <code>player_image="http://www.example.com/wp-content/uploads/video-preview.jpg"</code>, <code>player_autostart="true"</code>, <code>player_skin="/jwplayer/my-skin.xml"</code>, <code>player_key="my-license-key"</code>. Please note that "Advanced Options Blocks" listed on <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player" target="_blank" rel="external">this page</a> are NOT supported here. For those, please use: <code>player_option_blocks=""</code>.</li>'."\n";
664
+ echo '<li><code>player_option_blocks=""</code> Optional. Any "Advanced Option Blocks" supported by your audio/video player. For JW Player™ v6, see <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player" target="_blank" rel="external">this article please</a>. Here are some examples: <code>player_option_blocks="sharing:{}"</code>, <code>player_option_blocks="sharing:{}, logo: {file: \'/logo.png\', link: \'http://example.com\'}"</code>. Or: <code>player_option_blocks="c2hhcmluZzoge30="</code> (base64 encoded version of <code>sharing: {}</code>). Please note that "Advanced Options Blocks" can be defined in plain text or with a <a href="http://www.base64encode.org/" target="_blank" rel="external">base64 encoded string</a>. Advanced Option Blocks are JavaScript objects with properties. If you have trouble defining JavaScript object properties inside a Shortcode Attribute, please use <a href="http://www.base64encode.org/" target="_blank" rel="external">this tool</a> to base64 encode your Advanced Option Blocks, so that you end up with a string that\'s compatible with Shortcode Attributes.</li>'."\n";
665
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs_s2stream_lis", get_defined_vars());
666
  echo '</ul>'."\n";
667
  echo '</td>'."\n";
includes/menu-pages/gen-ops.inc.php CHANGED
@@ -1122,6 +1122,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_gen_ops"))
1122
  echo '<p>Please create and/or choose an existing Page to use as the first page Members will see after logging in.</p>' . "\n";
1123
  echo (c_ws_plugin__s2member_utils_conds::bp_is_installed ()) ? '<p><em><strong>BuddyPress:</strong> s2Member integrates with BuddyPress. Your Login Welcome Page affects BuddyPress too.</em></p>' . "\n" : '';
1124
  echo '<p><em><strong>*Tip*</strong> This special Page will be protected from public access ( automatically ) by s2Member.</em></p>' . "\n";
 
1125
  do_action ("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_login_welcome_page", get_defined_vars ());
1126
  /**/
1127
  echo '<table class="form-table">' . "\n";
1122
  echo '<p>Please create and/or choose an existing Page to use as the first page Members will see after logging in.</p>' . "\n";
1123
  echo (c_ws_plugin__s2member_utils_conds::bp_is_installed ()) ? '<p><em><strong>BuddyPress:</strong> s2Member integrates with BuddyPress. Your Login Welcome Page affects BuddyPress too.</em></p>' . "\n" : '';
1124
  echo '<p><em><strong>*Tip*</strong> This special Page will be protected from public access ( automatically ) by s2Member.</em></p>' . "\n";
1125
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/customizing-your-lwp/" target="_blank" rel="external">Customizing Your Login Welcome Page</a>.</p>'."\n";
1126
  do_action ("ws_plugin__s2member_during_gen_ops_page_during_left_sections_during_login_welcome_page", get_defined_vars ());
1127
  /**/
1128
  echo '<table class="form-table">' . "\n";
includes/menu-pages/menu-pages-min.css ADDED
@@ -0,0 +1 @@
 
1
+ div.ws-menu-page{min-width:800px;margin-bottom:20px;background:url('<?php echo $i;?>/brand-bg.png') no-repeat top right;}div.ws-menu-page a.ws-dotted-link{text-decoration:none;border-bottom:1px dotted;}div.ws-menu-page>h2{margin-bottom:15px;}div.ws-menu-page .ws-menu-page-right{float:right;margin-left:25px;}div.ws-menu-page .ws-menu-page-left{float:left;margin-right:25px;}div.ws-menu-page .ws-menu-page-center{display:block;margin-left:auto;margin-right:auto;}div.ws-menu-page div.ws-menu-page-hr{height:1px;line-height:1px;background:#DDD;margin:20px 0 20px 0;}div.ws-menu-page .ws-menu-page-hilite{font-size:102%;background:#FAF9BB;}div.ws-menu-page .ws-menu-page-error{color:#C00;}div.ws-menu-page .ws-menu-page-error-hilite{color:#FFF;background:#F00;}div.ws-menu-page img.ws-menu-page-img-16{border:0;width:16px;height:16px;}div.ws-menu-page img.ws-menu-page-img-24{border:0;width:24px;height:24px;}div.ws-menu-page img.ws-menu-page-img-32{border:0;width:32px;height:32px;}div.ws-menu-page img.ws-menu-page-img-48{border:0;width:48px;height:48px;}div.ws-menu-page img.ws-menu-page-img-64{border:0;width:64px;height:64px;}div.ws-menu-page img.ws-menu-page-img-128{border:0;width:128px;height:128px;}div.ws-menu-page img.ws-menu-page-img-200{border:0;width:200px;height:200px;}div.ws-menu-page img.ws-menu-page-img-256{border:0;width:256px;height:256px;}div.ws-menu-page img.ws-menu-page-img-200-auto{border:0;width:200px;height:auto;}div.ws-menu-page img.ws-menu-page-img-256-auto{border:0;width:256px;height:auto;}table.ws-menu-page-table{border:0;width:100%;}table.ws-menu-page-table ul,table.ws-menu-page-table ol{margin:10px 0 10px 20px;}table.ws-menu-page-table ul>li{list-style:disc outside;}table.ws-menu-page-table ol>li{list-style:decimal outside;}table.ws-menu-page-table>tbody>tr{vertical-align:top;}table.ws-menu-page-table td.ws-menu-page-table-l{padding:0;width:100%;}table.ws-menu-page-table td.ws-menu-page-table-r{padding:0;width:auto;}table.ws-menu-page-table img.ws-menu-page-brand-icon{border:0;float:right;width:128px;height:128px;margin:0 0 0 25px;vertical-align:middle;}table.ws-menu-page-table img.ws-menu-page-brand-updates{border:0;float:right;width:155px;height:40px;margin:0 -153px 0 25px;vertical-align:middle;}table.ws-menu-page-table p.submit{margin:0;padding:0;}table.ws-menu-page-table a[rel ~= "external"]{padding-right:18px;background:url('<?php echo $i;?>/brand-xlink.png') no-repeat center right;}table.ws-menu-page-table div.ws-menu-page-groups-show,table.ws-menu-page-table div.ws-menu-page-groups-hide{float:right;height:24px;width:24px;color:#333;padding:10px;cursor:pointer;font-size:28px;font-weight:bold;line-height:24px;text-align:center;background:#FFF;margin:0 0 0 20px;vertical-align:middle;font-family:monospace;border:1px solid #666;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-user-select:none;-webkit-user-select:none;user-select:none;}table.ws-menu-page-table div.ws-menu-page-groups-hide{color:#999;border-color:#999;}table.ws-menu-page-table div.ws-menu-page-group-header,table.ws-menu-page-table div.ws-menu-page-r-group-header{height:24px;color:#666;padding:10px;cursor:pointer;font-size:19px;line-height:24px;position:relative;background:#FFF;margin:30px 0 30px 0;vertical-align:middle;font-family:'Georgia',serif;border:1px solid #CCC;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-user-select:none;-webkit-user-select:none;user-select:none;}table.ws-menu-page-table div.ws-menu-page-group-header>ins,table.ws-menu-page-table div.ws-menu-page-r-group-header>ins{padding:0;width:22px;height:22px;color:#CCC;font-size:22px;line-height:22px;font-weight:bold;text-align:center;margin:0 10px 0 0;background:#666;text-decoration:none;font-family:monospace;vertical-align:text-top;border:1px solid transparent;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;display:inline-block;zoom:1!ie<8;display:inline!ie<8;margin-top:0!ie<8;}table.ws-menu-page-table div.ws-menu-page-group-header:hover,table.ws-menu-page-table div.ws-menu-page-group-header.open,table.ws-menu-page-table div.ws-menu-page-r-group-header:hover,table.ws-menu-page-table div.ws-menu-page-r-group-header.open{color:#164A61;border-color:#666;}table.ws-menu-page-table div.ws-menu-page-group-header:hover>ins,table.ws-menu-page-table div.ws-menu-page-group-header.open>ins,table.ws-menu-page-table div.ws-menu-page-r-group-header:hover>ins,table.ws-menu-page-table div.ws-menu-page-r-group-header.open>ins{color:#FFF;background:#164A61;}table.ws-menu-page-table div.ws-menu-page-group,table.ws-menu-page-table div.ws-menu-page-r-group{display:none;margin:-35px 5px 0 5px;padding:20px 10px 10px 10px;border:1px solid #CCC;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:#FFF url('<?php echo $i;?>/brand-gradient-bg.png') repeat-x;}table.ws-menu-page-table div.ws-menu-page-group>div.ws-menu-page-hr,table.ws-menu-page-table div.ws-menu-page-r-group>div.ws-menu-page-hr{background:#666;margin:15px 0 15px 0;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr{vertical-align:top;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>th{width:auto;color:#164A61;font-size:115%;padding:10px 10px 0 0;font-family:'Georgia',serif;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td{width:auto;padding:8px 10px 8px 0;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>th.ws-menu-page-th-side{width:200px;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>input[type = "text"],table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>input[type = "password"],table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>textarea,table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>select{width:100%;width:98%!ie<8;box-sizing:border-box;-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>select{width:99.5%!ie<8;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>textarea{font-family:'Courier New',monospace;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>input[type = "checkbox"],table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>input[type = "radio"]{margin-right:3px;vertical-align:middle;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>input[type = "button"].ws-menu-page-media-btn{float:left;margin:5px 25px 0 0;}table.ws-menu-page-table div.ws-menu-page-group table.form-table>tbody>tr>td>div.ws-menu-page-scrollbox{margin:1px;padding:5px;height:150px;overflow-y:scroll;overflow-x:visible;background:#FFF;border:1px solid #CCC;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;}div.ws-menu-page-readme>div.readme>div.section{margin:0 0 20px 0;padding:0 0 20px 0;border:0 solid #DDD;border-width:0 0 1px 0;}div.ws-menu-page-readme>div.readme>div.section>h2{margin-top:0;padding-top:0;font-size:150%;}div.ws-menu-page-readme>div.readme>div.section>div.content ul,div.ws-menu-page-readme>div.readme>div.section>div.content ol{padding:0;margin:10px 0 0 25px;}div.ws-menu-page-readme>div.readme>div.section>div.content ul>li{list-style:disc outside;}div.ws-menu-page-readme>div.readme>div.section>div.content ol>li{list-style:decimal outside;}td.ws-menu-page-table-r div.ws-menu-page-js-c-w,td.ws-menu-page-table-r div.ws-menu-page-updates,td.ws-menu-page-table-r div.ws-menu-page-installation,td.ws-menu-page-table-r div.ws-menu-page-tools,td.ws-menu-page-table-r div.ws-menu-page-kb,td.ws-menu-page-table-r div.ws-menu-page-videos,td.ws-menu-page-table-r div.ws-menu-page-support,td.ws-menu-page-table-r div.ws-menu-page-donations,td.ws-menu-page-table-r div.ws-menu-page-others{width:200px;margin:0 0 25px 25px;}td.ws-menu-page-table-r div.ws-menu-page-installation img,td.ws-menu-page-table-r div.ws-menu-page-tools img,td.ws-menu-page-table-r div.ws-menu-page-kb img,td.ws-menu-page-table-r div.ws-menu-page-videos img,td.ws-menu-page-table-r div.ws-menu-page-support img,td.ws-menu-page-table-r div.ws-menu-page-donations img,td.ws-menu-page-table-r div.ws-menu-page-others img{border:0;width:200px;height:auto;}td.ws-menu-page-table-r div.ws-menu-page-js-c-w{width:178px;padding:10px;background:#FFF5F7;text-align:justify;border:1px solid #FA4D4D;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;}div.ws-menu-page-updates ul{padding:0;margin:0 0 0 12px;}div.ws-menu-page-updates ul>li{padding:0;margin:5px 0 5px 0;list-style:square outside;-moz-user-select:none;-webkit-user-select:none;user-select:none;}div.ws-menu-page-updates ul>li:first-child{margin-top:0;}div.ws-menu-page-updates a[target = "_blank"]{padding-right:18px;background:url('<?php echo $i;?>/brand-xlink.png') no-repeat center right;}div.ws-menu-page-updates div#creditfooter{display:none;}div.ws-menu-page-updates div#ws-updates-div-fname,div.ws-menu-page-updates div#ws-updates-div-lname,div.ws-menu-page-updates div#ws-updates-div-email,div.ws-menu-page-updates div#ws-updates-div-subs,div.ws-menu-page-updates div#ws-updates-div-priv{margin:0 0 10px 0;}div.ws-menu-page-updates div#ws-updates-div-subs{margin:15px 0 0 0;}div.ws-menu-page-updates div#ws-updates-div-priv{font-size:80%;margin:0 0 5px 0;}div.ws-menu-page-updates input[type = "text"],div.ws-menu-page-updates input[type = "password"],div.ws-menu-page-updates input[type = "submit"],div.ws-menu-page-updates textarea,div.ws-menu-page-updates select{width:100%;width:98%!ie<8;box-sizing:border-box;-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;}div.ws-menu-page-updates input[type = "checkbox"],div.ws-menu-page-updates input[type = "radio"]{margin-right:3px;vertical-align:middle;}div.ws-menu-page-updates input[type = "submit"]{width:100%!ie<8;}div.ws-menu-page-updates select{width:99.5%!ie<8;}
includes/menu-pages/menu-pages.css CHANGED
@@ -409,6 +409,7 @@ td.ws-menu-page-table-r div.ws-menu-page-js-c-w,
409
  td.ws-menu-page-table-r div.ws-menu-page-updates,
410
  td.ws-menu-page-table-r div.ws-menu-page-installation,
411
  td.ws-menu-page-table-r div.ws-menu-page-tools,
 
412
  td.ws-menu-page-table-r div.ws-menu-page-videos,
413
  td.ws-menu-page-table-r div.ws-menu-page-support,
414
  td.ws-menu-page-table-r div.ws-menu-page-donations,
@@ -419,6 +420,7 @@ td.ws-menu-page-table-r div.ws-menu-page-others
419
  }
420
  td.ws-menu-page-table-r div.ws-menu-page-installation img,
421
  td.ws-menu-page-table-r div.ws-menu-page-tools img,
 
422
  td.ws-menu-page-table-r div.ws-menu-page-videos img,
423
  td.ws-menu-page-table-r div.ws-menu-page-support img,
424
  td.ws-menu-page-table-r div.ws-menu-page-donations img,
409
  td.ws-menu-page-table-r div.ws-menu-page-updates,
410
  td.ws-menu-page-table-r div.ws-menu-page-installation,
411
  td.ws-menu-page-table-r div.ws-menu-page-tools,
412
+ td.ws-menu-page-table-r div.ws-menu-page-kb,
413
  td.ws-menu-page-table-r div.ws-menu-page-videos,
414
  td.ws-menu-page-table-r div.ws-menu-page-support,
415
  td.ws-menu-page-table-r div.ws-menu-page-donations,
420
  }
421
  td.ws-menu-page-table-r div.ws-menu-page-installation img,
422
  td.ws-menu-page-table-r div.ws-menu-page-tools img,
423
+ td.ws-menu-page-table-r div.ws-menu-page-kb img,
424
  td.ws-menu-page-table-r div.ws-menu-page-videos img,
425
  td.ws-menu-page-table-r div.ws-menu-page-support img,
426
  td.ws-menu-page-table-r div.ws-menu-page-donations img,
includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -54,7 +54,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
54
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-account-details-section">'."\n";
55
  echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
56
  echo '<h3>PayPal® Account Details ( required, if using PayPal® )</h3>'."\n";
57
- echo '<p>This plugin works in conjunction with <a href="http://www.s2member.com/paypal" target="_blank" rel="external">PayPal® Website Payments Standard</a>, for businesses. You do NOT need a PayPal® Pro account. You just need to upgrade your Personal PayPal® account to a Business status, which is free. A PayPal® account can be <a href="http://pages.ebay.com/help/buy/questions/upgrade-paypal-account.html" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account, simply by going to the `Profile` button under the `My Account` tab, selecting the `Personal Business Information` button, and then clicking the `Upgrade Your Account` button.</p>'."\n";
58
  echo '<p><em><strong>*PayPal® API Credentials*</strong> Once you have a PayPal® Business account, you\'ll need access to your <a href="http://www.s2member.com/paypal-profile-api-access" target="_blank" rel="external">PayPal® API Credentials</a>. Log into your PayPal® account, and navigate to <code>Profile -> API Access (or Request API Credentials)</code>. You\'ll choose <code>( PayPal® / Request API Signature )</code>.</em></p>'."\n";
59
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars());
60
  /**/
@@ -218,6 +218,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
218
  echo '<p>Newer PayPal® Pro accounts come with the Payflow® API for Recurring Billing service. If you have a newer PayPal® Pro account, and you wish to integrate PayPal\'s Recurring Billing service with s2Member® Pro Forms, you will need to fill in the details here. Providing Payflow® API Credentials here, automatically puts s2Member\'s Recurring Billing integration through Pro Forms, into Payflow® mode. Just fill in the details below, and you\'re ready to generate Pro Forms that charge customers on a recurring basis. s2Member® will use the Payflow® API instead of the standard PayPal® Pro API, which is being slowly phased out in favor of Payflow®.</p>'."\n";
219
  echo '<p><em><strong>*Payflow® API Credentials*</strong> Once you have a PayPal® Pro account, you\'ll need access to your <a href="http://www.s2member.com/paypal-profile-api-access" target="_blank" rel="external">Payflow® API Credentials</a>. Log into your PayPal® account, and navigate to <code>Profile -> API Access (or Request API Credentials)</code>. You\'ll choose <code>( Payflow® / API Access )</code>.</em></p>'."\n";
220
  echo '<p><em><strong>*Important Note*</strong> s2Member® always uses the PayPal® Pro API. It can also use the Payflow® API (if details are supplied here). But please note... supplying Payflow® API Credentials here, does NOT mean you can bypass other sections. Please supply s2Member® with ALL of your PayPal® account details.</em></p>'."\n";
 
221
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_payflow_account_details", get_defined_vars());
222
  /**/
223
  echo '<table class="form-table">'."\n";
54
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-account-details-section">'."\n";
55
  echo '<a href="http://www.s2member.com/paypal" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
56
  echo '<h3>PayPal® Account Details ( required, if using PayPal® )</h3>'."\n";
57
+ echo '<p>This plugin works in conjunction with <a href="http://www.s2member.com/paypal" target="_blank" rel="external">PayPal® Website Payments Standard</a>, for businesses. You do NOT need a PayPal® Pro account. You just need to upgrade your Personal PayPal® account to a Business status, which is free. A PayPal® account can be <a href="http://pages.ebay.com/help/buy/questions/upgrade-paypal-account.html" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account, simply by going to the `Profile` button under the `My Account` tab, selecting the `Personal Business Information` button, and then clicking the `Upgrade Your Account` button. <strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/paypal-account-types/" target="_blank" rel="external">PayPal® Compatibility (Account Types)</a>.</p>'."\n";
58
  echo '<p><em><strong>*PayPal® API Credentials*</strong> Once you have a PayPal® Business account, you\'ll need access to your <a href="http://www.s2member.com/paypal-profile-api-access" target="_blank" rel="external">PayPal® API Credentials</a>. Log into your PayPal® account, and navigate to <code>Profile -> API Access (or Request API Credentials)</code>. You\'ll choose <code>( PayPal® / Request API Signature )</code>.</em></p>'."\n";
59
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars());
60
  /**/
218
  echo '<p>Newer PayPal® Pro accounts come with the Payflow® API for Recurring Billing service. If you have a newer PayPal® Pro account, and you wish to integrate PayPal\'s Recurring Billing service with s2Member® Pro Forms, you will need to fill in the details here. Providing Payflow® API Credentials here, automatically puts s2Member\'s Recurring Billing integration through Pro Forms, into Payflow® mode. Just fill in the details below, and you\'re ready to generate Pro Forms that charge customers on a recurring basis. s2Member® will use the Payflow® API instead of the standard PayPal® Pro API, which is being slowly phased out in favor of Payflow®.</p>'."\n";
219
  echo '<p><em><strong>*Payflow® API Credentials*</strong> Once you have a PayPal® Pro account, you\'ll need access to your <a href="http://www.s2member.com/paypal-profile-api-access" target="_blank" rel="external">Payflow® API Credentials</a>. Log into your PayPal® account, and navigate to <code>Profile -> API Access (or Request API Credentials)</code>. You\'ll choose <code>( Payflow® / API Access )</code>.</em></p>'."\n";
220
  echo '<p><em><strong>*Important Note*</strong> s2Member® always uses the PayPal® Pro API. It can also use the Payflow® API (if details are supplied here). But please note... supplying Payflow® API Credentials here, does NOT mean you can bypass other sections. Please supply s2Member® with ALL of your PayPal® account details.</em></p>'."\n";
221
+ echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/paypal-pro-payflow-edition/" target="_blank" rel="external">PayPal® Pro (PayFlow Edition)</a>.</p>'."\n";
222
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_payflow_account_details", get_defined_vars());
223
  /**/
224
  echo '<table class="form-table">'."\n";
includes/syscon.inc.php CHANGED
@@ -83,7 +83,7 @@ $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["recaptcha"] = array("public_key" => "6
83
  /*
84
  Configure the right menu options panel for s2Member.
85
  */
86
- $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"] = array("updates" => true, "upsell-pro" => true, "installation" => false, "tools" => false, "videos" => true, "support" => true, "donations" => true);
87
  /*
88
  Check if s2Member has been configured *should be set after the first config via options panel*.
89
  */
83
  /*
84
  Configure the right menu options panel for s2Member.
85
  */
86
+ $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"] = array("updates" => true, "upsell-pro" => true, "installation" => false, "tools" => false, "kb" => true, "videos" => true, "support" => true, "donations" => true);
87
  /*
88
  Check if s2Member has been configured *should be set after the first config via options panel*.
89
  */
includes/templates/players/jwplayer-v6-rtmp-only.php CHANGED
@@ -6,7 +6,7 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
6
  <div id="%%player_id%%"></div>
7
  <script type="text/javascript" src="%%player_path%%"></script>
8
  <script type="text/javascript">
9
- jwplayer('%%player_id%%').setup({
10
 
11
  playlist:
12
  [{
@@ -30,6 +30,8 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
30
  mute: %%player_mute%%,
31
  primary: '%%player_primary%%',
32
  repeat: %%player_repeat%%,
33
- startparam: '%%player_startparam%%'
 
 
34
  });
35
  </script>
6
  <div id="%%player_id%%"></div>
7
  <script type="text/javascript" src="%%player_path%%"></script>
8
  <script type="text/javascript">
9
+ jwplayer.key = '%%player_key%%', jwplayer('%%player_id%%').setup({
10
 
11
  playlist:
12
  [{
30
  mute: %%player_mute%%,
31
  primary: '%%player_primary%%',
32
  repeat: %%player_repeat%%,
33
+ startparam: '%%player_startparam%%',
34
+
35
+ %%player_option_blocks%%
36
  });
37
  </script>
includes/templates/players/jwplayer-v6-rtmp.php CHANGED
@@ -6,7 +6,7 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
6
  <div id="%%player_id%%"></div>
7
  <script type="text/javascript" src="%%player_path%%"></script>
8
  <script type="text/javascript">
9
- jwplayer('%%player_id%%').setup({
10
 
11
  playlist:
12
  [{
@@ -31,6 +31,8 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
31
  mute: %%player_mute%%,
32
  primary: '%%player_primary%%',
33
  repeat: %%player_repeat%%,
34
- startparam: '%%player_startparam%%'
 
 
35
  });
36
  </script>
6
  <div id="%%player_id%%"></div>
7
  <script type="text/javascript" src="%%player_path%%"></script>
8
  <script type="text/javascript">
9
+ jwplayer.key = '%%player_key%%', jwplayer('%%player_id%%').setup({
10
 
11
  playlist:
12
  [{
31
  mute: %%player_mute%%,
32
  primary: '%%player_primary%%',
33
  repeat: %%player_repeat%%,
34
+ startparam: '%%player_startparam%%',
35
+
36
+ %%player_option_blocks%%
37
  });
38
  </script>
includes/templates/players/jwplayer-v6.php CHANGED
@@ -6,7 +6,7 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
6
  <div id="%%player_id%%"></div>
7
  <script type="text/javascript" src="%%player_path%%"></script>
8
  <script type="text/javascript">
9
- jwplayer('%%player_id%%').setup({
10
 
11
  playlist:
12
  [{
@@ -30,6 +30,8 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
30
  mute: %%player_mute%%,
31
  primary: '%%player_primary%%',
32
  repeat: %%player_repeat%%,
33
- startparam: '%%player_startparam%%'
 
 
34
  });
35
  </script>
6
  <div id="%%player_id%%"></div>
7
  <script type="text/javascript" src="%%player_path%%"></script>
8
  <script type="text/javascript">
9
+ jwplayer.key = '%%player_key%%', jwplayer('%%player_id%%').setup({
10
 
11
  playlist:
12
  [{
30
  mute: %%player_mute%%,
31
  primary: '%%player_primary%%',
32
  repeat: %%player_repeat%%,
33
+ startparam: '%%player_startparam%%',
34
+
35
+ %%player_option_blocks%%
36
  });
37
  </script>
includes/translations/s2member.pot CHANGED
@@ -4,7 +4,7 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: s2Member® Framework 130116\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/___s2member\n"
7
- "POT-Creation-Date: 2013-01-21 09:34:11+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
4
  msgstr ""
5
  "Project-Id-Version: s2Member® Framework 130116\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/___s2member\n"
7
+ "POT-Creation-Date: 2013-01-24 00:54:01+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 130121
4
- Stable tag: 130121
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -35,6 +35,7 @@ Forum URI: http://www.s2member.com/forums/
35
  Plugin URI: http://www.s2member.com/framework/
36
  Privacy URI: http://www.s2member.com/privacy/
37
  Video Tutorials: http://www.s2member.com/videos/
 
38
  Pro Module / Home Page: http://www.s2member.com/
39
  Pro Module / Prices: http://www.s2member.com/prices/
40
  Pro Module / Auto-Update URL: http://www.s2member.com/
@@ -91,16 +92,25 @@ Please see [this FAQ entry](http://www.s2member.com/faqs/#s2-faqs-translations)
91
 
92
  == Upgrade Notice ==
93
 
94
- = v130121 =
95
  Maintenance release. Upgrade immediately.
96
 
97
  == Changelog ==
98
 
 
 
 
 
 
 
 
 
99
  = v130121 =
100
  * **(Maintenance Release) Upgrade immediately.**
101
  * **New Feature** s2Member® now comes with a new Shortcode `[s2Stream file_download="video.mp4" player="jwplayer-v6" ... /]`, making it MUCH easier for site owners to implemement RTMP streams of audio/video content. For further details, please check your Dashboard under: `s2Member® -> Download Options -> JW Player® v6 and RTMP Protocol Examples`. See also: `s2Member® -> Download Options -> Shortcode Attributes (Explained)`.
102
  * **Compatibility (Issue #75)** Updated s2Member's local file storage engine (for File Downloads via s2Member®), to support special characters in file names. Discussed in [this thread](http://www.s2member.com/forums/topic/problem-with-quotes-in-filename-downloads/#post-38395).
103
  * **Bug Fix (Issue #71)** A bug first introduced in the previous release of v130116, where we added support for byte-range requests to s2Member's File Download functionality, was causing multiple byte-range requests (processed by s2Member) to count against each User/Member as multiple File Downloads. Fixed in this release.
 
104
 
105
  = v130116 =
106
  * **(Maintenance Release) Upgrade immediately.**
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 130123
4
+ Stable tag: 130123
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
35
  Plugin URI: http://www.s2member.com/framework/
36
  Privacy URI: http://www.s2member.com/privacy/
37
  Video Tutorials: http://www.s2member.com/videos/
38
+ Knowledge Base: http://www.s2member.com/kb/
39
  Pro Module / Home Page: http://www.s2member.com/
40
  Pro Module / Prices: http://www.s2member.com/prices/
41
  Pro Module / Auto-Update URL: http://www.s2member.com/
92
 
93
  == Upgrade Notice ==
94
 
95
+ = v130123 =
96
  Maintenance release. Upgrade immediately.
97
 
98
  == Changelog ==
99
 
100
+ = v130123 =
101
+ * **(Maintenance Release) Upgrade immediately.**
102
+ * (s2Member/s2Member Pro) **s2Stream Shortcode (Issue #78)** s2Member® now supports JW Player® license keys using Shortcode Attribute `player_key=""`. See [this KB article](http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/) please. Also discussed in [this thread](http://www.s2member.com/forums/topic/new-jw-player-6-s2-video-audio-shortcodes/#post-38768).
103
+ * (s2Member/s2Member Pro) **s2Stream Shortcode (Issue #79)** s2Member® now supports JW Player® [Advanced Option Blocks](http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player) using Shortcode Attribute `player_option_blocks=""`. Example: `player_option_blocks="sharing:{}"`. See [this KB article](http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/) please. Also discussed in [this thread](http://www.s2member.com/forums/topic/new-jw-player-6-s2-video-audio-shortcodes/#post-38768).
104
+ * (s2Member Pro) **User Exportation (Issue #80)** s2Member® Pro User Exportation now occurs with MySQL `ORDER BY ID`, instead of no `ORDER BY` at all. This helps to prevent confusion and buggy behavior. Discussed in [this thread](http://www.s2member.com/forums/topic/user-export-not-working-properly/#post-39123).
105
+ * (s2Member Pro) **User Exportation (Issue #81)** s2Member Pro's User Exportation now supports the exporation of up to `1000` User/Member table rows at once. Of course it remains possible to export ALL of your Users/Members with s2Member® Pro. All we've done here is bump the default limit from `250` up to `1000` at a time. In addition, there is a new Filter making it possible to extend this limit further on servers that can handle it. Use Filter: `ws_plugin__s2member_pro_export_users_limit` if you would like to export more Users all at once. See also: `Dashboard -› s2Member® Pro -> User/Member Exportation`.
106
+ * (s2Member/s2Member Pro) **KB Articles** Inline documentation updated in some areas, with a few links pointing to helpful/related KB articles.
107
+
108
  = v130121 =
109
  * **(Maintenance Release) Upgrade immediately.**
110
  * **New Feature** s2Member® now comes with a new Shortcode `[s2Stream file_download="video.mp4" player="jwplayer-v6" ... /]`, making it MUCH easier for site owners to implemement RTMP streams of audio/video content. For further details, please check your Dashboard under: `s2Member® -> Download Options -> JW Player® v6 and RTMP Protocol Examples`. See also: `s2Member® -> Download Options -> Shortcode Attributes (Explained)`.
111
  * **Compatibility (Issue #75)** Updated s2Member's local file storage engine (for File Downloads via s2Member®), to support special characters in file names. Discussed in [this thread](http://www.s2member.com/forums/topic/problem-with-quotes-in-filename-downloads/#post-38395).
112
  * **Bug Fix (Issue #71)** A bug first introduced in the previous release of v130116, where we added support for byte-range requests to s2Member's File Download functionality, was causing multiple byte-range requests (processed by s2Member) to count against each User/Member as multiple File Downloads. Fixed in this release.
113
+ * **Compatibility** Updated s2Member's integration with Amazon® S3 to extend the default 30 second connection timeout (which was too conservative for many integrations) up to 24 hours by default, making it match the same as s2Member's Amazon® CloudFront connection timeout. For further details, please check your Dashboard under: `s2Member® -> Download Options -> Amazon® S3/CDN Storage -> Dev Note w/Technical Details`. It is possible to modify this connection timeout through a Filter discussed there.
114
 
115
  = v130116 =
116
  * **(Maintenance Release) Upgrade immediately.**
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 130121
23
- Stable tag: 130121
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", "130121" /* !#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", "130121" /* !#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: 130123
23
+ Stable tag: 130123
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", "130123" /* !#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", "130123" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.