WC Vendors - Version 1.8.9

Version Description

No Upgrade required at this time.

Download this release

Release Info

Developer digitalchild
Plugin Icon 128x128 WC Vendors
Version 1.8.9
Comparing to
See all releases

Code changes from version 1.8.8 to 1.8.9

Files changed (121) hide show
  1. changelog.txt +5 -0
  2. class-wc-vendors.php +2 -2
  3. classes/admin/class-admin-reports.php +8 -2
  4. classes/admin/settings/classes/sf-class-settings.php +6 -0
  5. languages/default.pot +28 -17
  6. languages/wcvendors-sv_SE.mo +0 -0
  7. trunk/languages/default.pot → languages/wcvendors-sv_SE.po +478 -321
  8. readme.txt +8 -2
  9. trunk/assets/css/admin-orders.css +0 -7
  10. trunk/assets/css/wcv-frontend.css +0 -545
  11. trunk/assets/images/icons/truck.png +0 -0
  12. trunk/assets/js/front-orders.js +0 -8
  13. trunk/assets/js/wcv-admin-quick-edit.js +0 -34
  14. trunk/changelog.txt +0 -417
  15. trunk/class-wc-vendors.php +0 -373
  16. trunk/classes/admin/class-admin-page.php +0 -597
  17. trunk/classes/admin/class-admin-reports.php +0 -549
  18. trunk/classes/admin/class-admin-users.php +0 -493
  19. trunk/classes/admin/class-product-meta.php +0 -267
  20. trunk/classes/admin/class-vendor-admin-dashboard.php +0 -634
  21. trunk/classes/admin/class-vendor-applicants.php +0 -103
  22. trunk/classes/admin/class-vendor-reports.php +0 -121
  23. trunk/classes/admin/emails/class-emails.php +0 -151
  24. trunk/classes/admin/emails/class-wc-approve-vendor.php +0 -165
  25. trunk/classes/admin/emails/class-wc-notify-admin.php +0 -176
  26. trunk/classes/admin/emails/class-wc-notify-shipped.php +0 -198
  27. trunk/classes/admin/emails/class-wc-notify-vendor.php +0 -293
  28. trunk/classes/admin/settings/README.md +0 -126
  29. trunk/classes/admin/settings/assets/css/sf-styles.css +0 -167
  30. trunk/classes/admin/settings/assets/img/tip.png +0 -0
  31. trunk/classes/admin/settings/assets/js/bootstrap-tooltip.js +0 -126
  32. trunk/classes/admin/settings/assets/js/js.iml +0 -10
  33. trunk/classes/admin/settings/assets/js/select2/select2-bootstrap.css +0 -87
  34. trunk/classes/admin/settings/assets/js/select2/select2-spinner.gif +0 -0
  35. trunk/classes/admin/settings/assets/js/select2/select2.css +0 -704
  36. trunk/classes/admin/settings/assets/js/select2/select2.js +0 -3541
  37. trunk/classes/admin/settings/assets/js/select2/select2.min.js +0 -23
  38. trunk/classes/admin/settings/assets/js/select2/select2.png +0 -0
  39. trunk/classes/admin/settings/assets/js/select2/select2x2.png +0 -0
  40. trunk/classes/admin/settings/assets/js/sf-jquery.js +0 -23
  41. trunk/classes/admin/settings/assets/js/wcvendors-media.js +0 -50
  42. trunk/classes/admin/settings/classes/sf-class-format-options.php +0 -347
  43. trunk/classes/admin/settings/classes/sf-class-sanitize.php +0 -177
  44. trunk/classes/admin/settings/classes/sf-class-settings.php +0 -929
  45. trunk/classes/admin/settings/sf-options.php +0 -353
  46. trunk/classes/admin/views/html-vendor-settings-page.php +0 -76
  47. trunk/classes/class-commission.php +0 -428
  48. trunk/classes/class-cron.php +0 -165
  49. trunk/classes/class-install.php +0 -246
  50. trunk/classes/class-queries.php +0 -280
  51. trunk/classes/class-shipping.php +0 -322
  52. trunk/classes/class-vendors.php +0 -462
  53. trunk/classes/front/class-vendor-cart.php +0 -64
  54. trunk/classes/front/class-vendor-shop.php +0 -292
  55. trunk/classes/front/dashboard/class-vendor-dashboard.php +0 -462
  56. trunk/classes/front/orders/class-export-csv.php +0 -99
  57. trunk/classes/front/orders/class-orders.php +0 -259
  58. trunk/classes/front/orders/class-submit-comment.php +0 -81
  59. trunk/classes/front/signup/class-vendor-signup.php +0 -148
  60. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/assets/icons/index.php +0 -0
  61. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/assets/icons/paypalap.png +0 -0
  62. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/assets/index.php +0 -0
  63. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/ChangeLog.txt +0 -33
  64. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/LICENSE.txt +0 -41
  65. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/README.md +0 -57
  66. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/build.xml +0 -24
  67. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/config/cert_key.pem +0 -31
  68. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/config/sdk_config.ini +0 -26
  69. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/IPPCredential.php +0 -53
  70. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPAPIService.php +0 -62
  71. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPAuthenticationManager.php +0 -91
  72. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPBaseService.php +0 -88
  73. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPCertificateCredential.php +0 -72
  74. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPConfigManager.php +0 -124
  75. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPConnectionManager.php +0 -48
  76. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPCredentialManager.php +0 -117
  77. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPHttpConnection.php +0 -184
  78. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPLoggingManager.php +0 -84
  79. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPObjectTransformer.php +0 -33
  80. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPSignatureCredential.php +0 -49
  81. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPUtils.php +0 -274
  82. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/auth/AuthUtil.php +0 -83
  83. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/auth/PPAuth.php +0 -1077
  84. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/cacert.pem +0 -171
  85. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPConfigurationException.php +0 -9
  86. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPConnectionException.php +0 -20
  87. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPInvalidCredentialException.php +0 -22
  88. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPMissingCredentialException.php +0 -22
  89. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPTransformerException.php +0 -20
  90. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/services/AdaptivePayments/AdaptivePayments.php +0 -5797
  91. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/services/AdaptivePayments/AdaptivePaymentsService.php +0 -314
  92. trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/index.php +0 -0
  93. trunk/classes/gateways/PayPal_AdvPayments/paypal_ap.php +0 -555
  94. trunk/classes/gateways/PayPal_Masspay/api/ChangeLog.txt +0 -48
  95. trunk/classes/gateways/PayPal_Masspay/api/LICENSE.txt +0 -41
  96. trunk/classes/gateways/PayPal_Masspay/api/README.md +0 -60
  97. trunk/classes/gateways/PayPal_Masspay/api/build.xml +0 -24
  98. trunk/classes/gateways/PayPal_Masspay/api/config/sdk-cert.pem +0 -41
  99. trunk/classes/gateways/PayPal_Masspay/api/config/sdk_config.ini +0 -39
  100. trunk/classes/gateways/PayPal_Masspay/api/lib/IPPCredential.php +0 -53
  101. trunk/classes/gateways/PayPal_Masspay/api/lib/PPAPIService.php +0 -62
  102. trunk/classes/gateways/PayPal_Masspay/api/lib/PPAuthenticationManager.php +0 -99
  103. trunk/classes/gateways/PayPal_Masspay/api/lib/PPBaseService.php +0 -88
  104. trunk/classes/gateways/PayPal_Masspay/api/lib/PPCertificateCredential.php +0 -77
  105. trunk/classes/gateways/PayPal_Masspay/api/lib/PPConfigManager.php +0 -121
  106. trunk/classes/gateways/PayPal_Masspay/api/lib/PPConnectionManager.php +0 -48
  107. trunk/classes/gateways/PayPal_Masspay/api/lib/PPCredentialManager.php +0 -119
  108. trunk/classes/gateways/PayPal_Masspay/api/lib/PPHttpConnection.php +0 -184
  109. trunk/classes/gateways/PayPal_Masspay/api/lib/PPLoggingManager.php +0 -84
  110. trunk/classes/gateways/PayPal_Masspay/api/lib/PPObjectTransformer.php +0 -33
  111. trunk/classes/gateways/PayPal_Masspay/api/lib/PPSignatureCredential.php +0 -56
  112. trunk/classes/gateways/PayPal_Masspay/api/lib/PPUtils.php +0 -284
  113. trunk/classes/gateways/PayPal_Masspay/api/lib/auth/AuthUtil.php +0 -83
  114. trunk/classes/gateways/PayPal_Masspay/api/lib/auth/PPAuth.php +0 -1057
  115. trunk/classes/gateways/PayPal_Masspay/api/lib/cacert.pem +0 -171
  116. trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPConfigurationException.php +0 -9
  117. trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPConnectionException.php +0 -20
  118. trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPInvalidCredentialException.php +0 -22
  119. trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPMissingCredentialException.php +0 -22
  120. trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPTransformerException.php +0 -20
  121. trunk/classes/gateways/PayPal_Masspay/api/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php +0 -1471
changelog.txt CHANGED
@@ -1,5 +1,10 @@
1
  Changelog for WC Vendors
2
 
 
 
 
 
 
3
  Version 1.8.8
4
 
5
  * Fixed: Undefined variable error in commission class
1
  Changelog for WC Vendors
2
 
3
+ Version 1.8.9
4
+
5
+ * Fixed: Commission Totals Report Inaccurate #267
6
+ * Added: Swedish Translation Thanks Arvid!
7
+
8
  Version 1.8.8
9
 
10
  * Fixed: Undefined variable error in commission class
class-wc-vendors.php CHANGED
@@ -7,9 +7,9 @@
7
  * Author: WC Vendors
8
  * Author URI: https://www.wcvendors.com
9
  *
10
- * Version: 1.8.8
11
  * Requires at least: 4.0.0
12
- * Tested up to: 4.4.1
13
  *
14
  * Text Domain: wcvendors
15
  * Domain Path: /languages/
7
  * Author: WC Vendors
8
  * Author URI: https://www.wcvendors.com
9
  *
10
+ * Version: 1.8.9
11
  * Requires at least: 4.0.0
12
+ * Tested up to: 4.5.1
13
  *
14
  * Text Domain: wcvendors
15
  * Domain Path: /languages/
classes/admin/class-admin-reports.php CHANGED
@@ -415,7 +415,10 @@ class WCV_Admin_Reports
415
  $total_start_date = !empty( $_POST[ 'total_start_date' ] ) ? $_POST[ 'total_start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
416
  $total_end_date = !empty( $_POST[ 'total_end_date' ] ) ? $_POST[ 'total_end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
417
  $commission_status = !empty( $_POST[ 'commission_status' ] ) ? $_POST[ 'commission_status' ] : 'due';
418
- $date_sql = ( !empty( $_POST[ 'total_start_date' ] ) && !empty( $_POST[ 'total_end_date' ] ) ) ? " time >= '$total_start_date' AND time <= '$total_end_date' AND" : "";
 
 
 
419
 
420
  $status_sql = " status='$commission_status'";
421
 
@@ -445,7 +448,10 @@ class WCV_Admin_Reports
445
  <option value="reversed"><?php _e( 'Reversed', 'wcvendors' ); ?></option>
446
  </select>
447
 
448
- <input type="submit" class="button" value="<?php _e( 'Show', 'wcvendors' ); ?>"/></p>
 
 
 
449
  </form>
450
 
451
  <div class="woocommerce-reports-main">
415
  $total_start_date = !empty( $_POST[ 'total_start_date' ] ) ? $_POST[ 'total_start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
416
  $total_end_date = !empty( $_POST[ 'total_end_date' ] ) ? $_POST[ 'total_end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
417
  $commission_status = !empty( $_POST[ 'commission_status' ] ) ? $_POST[ 'commission_status' ] : 'due';
418
+ $date_sql = ( !empty( $_POST[ 'total_start_date' ] ) && !empty( $_POST[ 'total_end_date' ] ) ) ? " time BETWEEN '$total_start_date 00:00:00' AND '$total_end_date 23:59:59' AND" : "";
419
+
420
+ error_log( $total_start_date );
421
+ error_log( $total_end_date );
422
 
423
  $status_sql = " status='$commission_status'";
424
 
448
  <option value="reversed"><?php _e( 'Reversed', 'wcvendors' ); ?></option>
449
  </select>
450
 
451
+ <input type="submit" class="button" value="<?php _e( 'Show', 'wcvendors' ); ?>"/>
452
+
453
+ <?php do_action( 'wcvendors_after_commission_reports', $commissions ); ?>
454
+ </p>
455
  </form>
456
 
457
  <div class="woocommerce-reports-main">
classes/admin/settings/classes/sf-class-settings.php CHANGED
@@ -493,7 +493,13 @@ if ( !class_exists( 'SF_Settings_API' ) ) {
493
  */
494
  private function template_footer()
495
  {
 
 
 
 
496
  echo '</div>';
 
 
497
  }
498
 
499
 
493
  */
494
  private function template_footer()
495
  {
496
+
497
+ $message = apply_filters( 'wcvendors_footer_msg', __( 'Please help with a <a href="https://wordpress.org/support/view/plugin-reviews/wc-vendors?rate=5#postform" target="top">High Five!</a> | <a href="https://www.wcvendors.com/product/wc-vendors-pro/" target="top">WC Vendors Pro</a> | <a href="https://www.wcvendors.com/product/stripe-commissions-gateway/" target="top">Stripe Commissions & Gateway</a> | <a href="https://www.wcvendors.com/kb/" target="top">KnowledgeBase</a> | <a href="https://www.wcvendors.com/help/" target="top">Help Forums</a>', 'wc-vendors' ) );
498
+
499
+ echo '<div><p>' . $message . '</a></p>';
500
  echo '</div>';
501
+
502
+
503
  }
504
 
505
 
languages/default.pot CHANGED
@@ -2,7 +2,7 @@
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: WC Vendors\n"
5
- "POT-Creation-Date: 2016-03-14 16:10+1000\n"
6
  "PO-Revision-Date: 2015-04-24 09:29+1000\n"
7
  "Last-Translator: \n"
8
  "Language-Team: WC Vendors <support@wcvendors.com>\n"
@@ -41,7 +41,7 @@ msgstr ""
41
 
42
  #: ../class-wc-vendors.php:271 ../classes/admin/class-admin-page.php:253
43
  #: ../classes/admin/class-admin-reports.php:175
44
- #: ../classes/admin/class-admin-reports.php:455
45
  #: ../classes/admin/class-product-meta.php:46
46
  #: ../classes/admin/class-product-meta.php:187
47
  #: ../classes/admin/class-product-meta.php:223 ../classes/class-install.php:66
@@ -117,7 +117,7 @@ msgstr ""
117
 
118
  #: ../classes/admin/class-admin-page.php:255
119
  #: ../classes/admin/class-admin-reports.php:178
120
- #: ../classes/admin/class-admin-reports.php:458
121
  msgid "Status"
122
  msgstr ""
123
 
@@ -195,20 +195,20 @@ msgid ""
195
  msgstr ""
196
 
197
  #: ../classes/admin/class-admin-reports.php:121
198
- #: ../classes/admin/class-admin-reports.php:437
199
  #: ../templates/dashboard/date-picker.php:3
200
  msgid "From:"
201
  msgstr ""
202
 
203
  #: ../classes/admin/class-admin-reports.php:123
204
- #: ../classes/admin/class-admin-reports.php:439
205
  #: ../templates/dashboard/date-picker.php:7
206
  msgid "To:"
207
  msgstr ""
208
 
209
  #: ../classes/admin/class-admin-reports.php:125
210
  #: ../classes/admin/class-admin-reports.php:283
211
- #: ../classes/admin/class-admin-reports.php:448
212
  #: ../templates/dashboard/date-picker.php:12
213
  msgid "Show"
214
  msgstr ""
@@ -289,33 +289,33 @@ msgid "Shipping"
289
  msgstr ""
290
 
291
  #: ../classes/admin/class-admin-reports.php:348
292
- #: ../classes/admin/class-admin-reports.php:445
293
  msgid "Reversed"
294
  msgstr ""
295
 
296
  #: ../classes/admin/class-admin-reports.php:349
297
- #: ../classes/admin/class-admin-reports.php:444
298
  msgid "Paid"
299
  msgstr ""
300
 
301
  #: ../classes/admin/class-admin-reports.php:350
302
- #: ../classes/admin/class-admin-reports.php:443
303
  msgid "Due"
304
  msgstr ""
305
 
306
- #: ../classes/admin/class-admin-reports.php:456
307
  msgid "Tax Total"
308
  msgstr ""
309
 
310
- #: ../classes/admin/class-admin-reports.php:457
311
  msgid "Shipping Total"
312
  msgstr ""
313
 
314
- #: ../classes/admin/class-admin-reports.php:459
315
  msgid "Commission Total"
316
  msgstr ""
317
 
318
- #: ../classes/admin/class-admin-reports.php:481
319
  msgid "No commissions found."
320
  msgstr ""
321
 
@@ -660,7 +660,7 @@ msgid "Shipping Subtotal:"
660
  msgstr ""
661
 
662
  #: ../classes/admin/settings/classes/sf-class-format-options.php:211
663
- #: ../classes/admin/settings/classes/sf-class-settings.php:780
664
  msgid "Select a page..."
665
  msgstr ""
666
 
@@ -682,17 +682,28 @@ msgstr ""
682
  msgid "Save %s changes"
683
  msgstr ""
684
 
685
- #: ../classes/admin/settings/classes/sf-class-settings.php:837
 
 
 
 
 
 
 
 
 
 
 
686
  #, php-format
687
  msgid "Update %s"
688
  msgstr ""
689
 
690
- #: ../classes/admin/settings/classes/sf-class-settings.php:837
691
  #, php-format
692
  msgid "Add %s"
693
  msgstr ""
694
 
695
- #: ../classes/admin/settings/classes/sf-class-settings.php:837
696
  #, php-format
697
  msgid "Upload an image for the %s"
698
  msgstr ""
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: WC Vendors\n"
5
+ "POT-Creation-Date: 2016-05-02 11:07+1000\n"
6
  "PO-Revision-Date: 2015-04-24 09:29+1000\n"
7
  "Last-Translator: \n"
8
  "Language-Team: WC Vendors <support@wcvendors.com>\n"
41
 
42
  #: ../class-wc-vendors.php:271 ../classes/admin/class-admin-page.php:253
43
  #: ../classes/admin/class-admin-reports.php:175
44
+ #: ../classes/admin/class-admin-reports.php:461
45
  #: ../classes/admin/class-product-meta.php:46
46
  #: ../classes/admin/class-product-meta.php:187
47
  #: ../classes/admin/class-product-meta.php:223 ../classes/class-install.php:66
117
 
118
  #: ../classes/admin/class-admin-page.php:255
119
  #: ../classes/admin/class-admin-reports.php:178
120
+ #: ../classes/admin/class-admin-reports.php:464
121
  msgid "Status"
122
  msgstr ""
123
 
195
  msgstr ""
196
 
197
  #: ../classes/admin/class-admin-reports.php:121
198
+ #: ../classes/admin/class-admin-reports.php:440
199
  #: ../templates/dashboard/date-picker.php:3
200
  msgid "From:"
201
  msgstr ""
202
 
203
  #: ../classes/admin/class-admin-reports.php:123
204
+ #: ../classes/admin/class-admin-reports.php:442
205
  #: ../templates/dashboard/date-picker.php:7
206
  msgid "To:"
207
  msgstr ""
208
 
209
  #: ../classes/admin/class-admin-reports.php:125
210
  #: ../classes/admin/class-admin-reports.php:283
211
+ #: ../classes/admin/class-admin-reports.php:451
212
  #: ../templates/dashboard/date-picker.php:12
213
  msgid "Show"
214
  msgstr ""
289
  msgstr ""
290
 
291
  #: ../classes/admin/class-admin-reports.php:348
292
+ #: ../classes/admin/class-admin-reports.php:448
293
  msgid "Reversed"
294
  msgstr ""
295
 
296
  #: ../classes/admin/class-admin-reports.php:349
297
+ #: ../classes/admin/class-admin-reports.php:447
298
  msgid "Paid"
299
  msgstr ""
300
 
301
  #: ../classes/admin/class-admin-reports.php:350
302
+ #: ../classes/admin/class-admin-reports.php:446
303
  msgid "Due"
304
  msgstr ""
305
 
306
+ #: ../classes/admin/class-admin-reports.php:462
307
  msgid "Tax Total"
308
  msgstr ""
309
 
310
+ #: ../classes/admin/class-admin-reports.php:463
311
  msgid "Shipping Total"
312
  msgstr ""
313
 
314
+ #: ../classes/admin/class-admin-reports.php:465
315
  msgid "Commission Total"
316
  msgstr ""
317
 
318
+ #: ../classes/admin/class-admin-reports.php:487
319
  msgid "No commissions found."
320
  msgstr ""
321
 
660
  msgstr ""
661
 
662
  #: ../classes/admin/settings/classes/sf-class-format-options.php:211
663
+ #: ../classes/admin/settings/classes/sf-class-settings.php:786
664
  msgid "Select a page..."
665
  msgstr ""
666
 
682
  msgid "Save %s changes"
683
  msgstr ""
684
 
685
+ #: ../classes/admin/settings/classes/sf-class-settings.php:497
686
+ msgid ""
687
+ "Please help with a <a href=\"https://wordpress.org/support/view/plugin-"
688
+ "reviews/wc-vendors?rate=5#postform\" target=\"top\">High Five!</a> | <a href="
689
+ "\"https://www.wcvendors.com/product/wc-vendors-pro/\" target=\"top\">WC "
690
+ "Vendors Pro</a> | <a href=\"https://www.wcvendors.com/product/stripe-"
691
+ "commissions-gateway/\" target=\"top\">Stripe Commissions & Gateway</a> | <a "
692
+ "href=\"https://www.wcvendors.com/kb/\" target=\"top\">KnowledgeBase</a> | <a "
693
+ "href=\"https://www.wcvendors.com/help/\" target=\"top\">Help Forums</a>"
694
+ msgstr ""
695
+
696
+ #: ../classes/admin/settings/classes/sf-class-settings.php:843
697
  #, php-format
698
  msgid "Update %s"
699
  msgstr ""
700
 
701
+ #: ../classes/admin/settings/classes/sf-class-settings.php:843
702
  #, php-format
703
  msgid "Add %s"
704
  msgstr ""
705
 
706
+ #: ../classes/admin/settings/classes/sf-class-settings.php:843
707
  #, php-format
708
  msgid "Upload an image for the %s"
709
  msgstr ""
languages/wcvendors-sv_SE.mo ADDED
Binary file
trunk/languages/default.pot → languages/wcvendors-sv_SE.po RENAMED
@@ -1,16 +1,15 @@
1
- #, fuzzy
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: WC Vendors\n"
5
- "POT-Creation-Date: 2016-03-14 16:10+1000\n"
6
- "PO-Revision-Date: 2015-04-24 09:29+1000\n"
7
  "Last-Translator: \n"
8
  "Language-Team: WC Vendors <support@wcvendors.com>\n"
9
- "Language: en\n"
10
  "MIME-Version: 1.0\n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
- "X-Generator: Poedit 1.8.5\n"
14
  "X-Poedit-Basepath: .\n"
15
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
  "X-Poedit-SourceCharset: UTF-8\n"
@@ -23,21 +22,24 @@ msgid ""
23
  "WC Vendors requires WooCommerce to run. Please install WooCommerce and "
24
  "activate before attempting to activate again."
25
  msgstr ""
 
 
26
 
27
  #: ../class-wc-vendors.php:81 ../classes/admin/class-admin-reports.php:41
28
  #: ../classes/admin/class-admin-users.php:399
29
  msgid "WC Vendors"
30
- msgstr ""
31
 
32
  #: ../class-wc-vendors.php:109
33
  msgid ""
34
  "<b>WC Vendors is disabled</b>. WC Vendors requires a minimum of WooCommerce "
35
  "v2.4.0."
36
  msgstr ""
 
37
 
38
  #: ../class-wc-vendors.php:248 ../classes/admin/settings/sf-options.php:183
39
  msgid "Capabilities"
40
- msgstr ""
41
 
42
  #: ../class-wc-vendors.php:271 ../classes/admin/class-admin-page.php:253
43
  #: ../classes/admin/class-admin-reports.php:175
@@ -46,23 +48,23 @@ msgstr ""
46
  #: ../classes/admin/class-product-meta.php:187
47
  #: ../classes/admin/class-product-meta.php:223 ../classes/class-install.php:66
48
  msgid "Vendor"
49
- msgstr ""
50
 
51
  #: ../class-wc-vendors.php:273 ../classes/admin/settings/sf-options.php:4
52
  msgid "General"
53
- msgstr ""
54
 
55
  #: ../class-wc-vendors.php:311
56
  msgid "Documentation/KB"
57
- msgstr ""
58
 
59
  #: ../class-wc-vendors.php:312
60
  msgid "Help Forums"
61
- msgstr ""
62
 
63
  #: ../class-wc-vendors.php:313
64
  msgid "Paid Support"
65
- msgstr ""
66
 
67
  #: ../class-wc-vendors.php:335
68
  #, php-format
@@ -70,6 +72,8 @@ msgid ""
70
  "WC Vendors requires the Vendor shop page value be set <a href=\"%s\">click "
71
  "here to set it.</a> | <a href=\"%s\">Hide Notice</a>"
72
  msgstr ""
 
 
73
 
74
  #: ../class-wc-vendors.php:343
75
  #, php-format
@@ -77,14 +81,16 @@ msgid ""
77
  "You must save your permalinks once you have modified your vendor page. <a "
78
  "href=\"%s\">click here to save</a>. | <a href=\"%s\">Hide Notice</a>"
79
  msgstr ""
 
 
80
 
81
  #: ../classes/admin/class-admin-page.php:27
82
  msgid "Vendors shipped"
83
- msgstr ""
84
 
85
  #: ../classes/admin/class-admin-page.php:50
86
  msgid "Vendors Shipped"
87
- msgstr ""
88
 
89
  #: ../classes/admin/class-admin-page.php:72
90
  #: ../classes/admin/class-admin-page.php:132
@@ -92,7 +98,7 @@ msgstr ""
92
  #: ../classes/admin/class-product-meta.php:167
93
  #: ../templates/dashboard/reports.php:19
94
  msgid "Commission"
95
- msgstr ""
96
 
97
  #: ../classes/admin/class-admin-page.php:251
98
  #: ../classes/admin/class-admin-reports.php:174
@@ -100,12 +106,12 @@ msgstr ""
100
  #: ../templates/emails/notify-vendor-shipped.php:22
101
  #: ../templates/emails/vendor-new-order.php:22
102
  msgid "Product"
103
- msgstr ""
104
 
105
  #: ../classes/admin/class-admin-page.php:252
106
  #: ../classes/admin/class-vendor-admin-dashboard.php:283
107
  msgid "Order ID"
108
- msgstr ""
109
 
110
  #: ../classes/admin/class-admin-page.php:254
111
  #: ../classes/admin/class-admin-reports.php:176
@@ -113,79 +119,79 @@ msgstr ""
113
  #: ../classes/admin/class-vendor-admin-dashboard.php:286
114
  #: ../templates/dashboard/orders.php:35
115
  msgid "Total"
116
- msgstr ""
117
 
118
  #: ../classes/admin/class-admin-page.php:255
119
  #: ../classes/admin/class-admin-reports.php:178
120
  #: ../classes/admin/class-admin-reports.php:458
121
  msgid "Status"
122
- msgstr ""
123
 
124
  #: ../classes/admin/class-admin-page.php:256
125
  #: ../classes/admin/class-vendor-admin-dashboard.php:288
126
  #: ../classes/front/orders/class-orders.php:181
127
  #: ../templates/dashboard/orders.php:36
128
  msgid "Date"
129
- msgstr ""
130
 
131
  #: ../classes/admin/class-admin-page.php:293
132
  msgid "Mark paid"
133
- msgstr ""
134
 
135
  #: ../classes/admin/class-admin-page.php:294
136
  msgid "Mark due"
137
- msgstr ""
138
 
139
  #: ../classes/admin/class-admin-page.php:295
140
  msgid "Mark reversed"
141
- msgstr ""
142
 
143
  #: ../classes/admin/class-admin-page.php:312
144
  #: ../classes/admin/class-admin-page.php:316
145
  msgid "Filter"
146
- msgstr ""
147
 
148
  #: ../classes/admin/class-admin-page.php:351
149
  msgid "Show all dates"
150
- msgstr ""
151
 
152
  #: ../classes/admin/class-admin-page.php:364
153
  #, php-format
154
  msgid "%1$s %2$d"
155
- msgstr ""
156
 
157
  #: ../classes/admin/class-admin-page.php:386
158
  msgid "Show all Statuses"
159
- msgstr ""
160
 
161
  #: ../classes/admin/class-admin-page.php:412
162
  msgid "Commission marked paid."
163
- msgstr ""
164
 
165
  #: ../classes/admin/class-admin-page.php:419
166
  msgid "Commission marked due."
167
- msgstr ""
168
 
169
  #: ../classes/admin/class-admin-page.php:426
170
  msgid "Commission marked reversed."
171
- msgstr ""
172
 
173
  #: ../classes/admin/class-admin-reports.php:44
174
  msgid "Overview"
175
- msgstr ""
176
 
177
  #: ../classes/admin/class-admin-reports.php:50
178
  msgid "Commission by vendor"
179
- msgstr ""
180
 
181
  #: ../classes/admin/class-admin-reports.php:56
182
  msgid "Commission by product"
183
- msgstr ""
184
 
185
  #: ../classes/admin/class-admin-reports.php:62
186
  #: ../classes/admin/class-admin-reports.php:345
187
  msgid "Commission Totals"
188
- msgstr ""
189
 
190
  #: ../classes/admin/class-admin-reports.php:63
191
  msgid ""
@@ -193,308 +199,311 @@ msgid ""
193
  "date range is used and all due commissions are returned. Use the date range "
194
  "to filter."
195
  msgstr ""
 
 
 
196
 
197
  #: ../classes/admin/class-admin-reports.php:121
198
  #: ../classes/admin/class-admin-reports.php:437
199
  #: ../templates/dashboard/date-picker.php:3
200
  msgid "From:"
201
- msgstr ""
202
 
203
  #: ../classes/admin/class-admin-reports.php:123
204
  #: ../classes/admin/class-admin-reports.php:439
205
  #: ../templates/dashboard/date-picker.php:7
206
  msgid "To:"
207
- msgstr ""
208
 
209
  #: ../classes/admin/class-admin-reports.php:125
210
  #: ../classes/admin/class-admin-reports.php:283
211
  #: ../classes/admin/class-admin-reports.php:448
212
  #: ../templates/dashboard/date-picker.php:12
213
  msgid "Show"
214
- msgstr ""
215
 
216
  #: ../classes/admin/class-admin-reports.php:131
217
  msgid "Total paid in range"
218
- msgstr ""
219
 
220
  #: ../classes/admin/class-admin-reports.php:134
221
  #: ../classes/admin/class-admin-reports.php:141
222
  #: ../classes/admin/class-admin-reports.php:148
223
  msgid "n/a"
224
- msgstr ""
225
 
226
  #: ../classes/admin/class-admin-reports.php:138
227
  msgid "Total due in range"
228
- msgstr ""
229
 
230
  #: ../classes/admin/class-admin-reports.php:145
231
  msgid "Total reversed in range"
232
- msgstr ""
233
 
234
  #: ../classes/admin/class-admin-reports.php:155
235
  msgid "Recent Commission"
236
- msgstr ""
237
 
238
  #: ../classes/admin/class-admin-reports.php:173
239
  #: ../classes/front/orders/class-orders.php:173
240
  #: ../templates/dashboard/orders.php:33
241
  msgid "Order"
242
- msgstr ""
243
 
244
  #: ../classes/admin/class-admin-reports.php:177
245
  msgid "Date &amp; Time"
246
- msgstr ""
247
 
248
  #: ../classes/admin/class-admin-reports.php:186
249
  msgid "N/A"
250
- msgstr ""
251
 
252
  #: ../classes/admin/class-admin-reports.php:191
253
  msgid "D j M Y \\a\\t h:ia"
254
- msgstr ""
255
 
256
  #: ../classes/admin/class-admin-reports.php:200
257
  msgid "No commission yet"
258
- msgstr ""
259
 
260
  #: ../classes/admin/class-admin-reports.php:234
261
  msgid "Show:"
262
- msgstr ""
263
 
264
  #: ../classes/admin/class-admin-reports.php:243
265
  msgid "Search for a product&hellip;"
266
- msgstr ""
267
 
268
  #: ../classes/admin/class-admin-reports.php:246
269
  msgid "Type in a product name to start searching..."
270
- msgstr ""
271
 
272
  #: ../classes/admin/class-admin-reports.php:278
273
  msgid "Select a vendor&hellip;"
274
- msgstr ""
275
 
276
  #: ../classes/admin/class-admin-reports.php:344
277
  msgid "Month"
278
- msgstr ""
279
 
280
  #: ../classes/admin/class-admin-reports.php:346
281
  msgid "Tax"
282
- msgstr ""
283
 
284
  #: ../classes/admin/class-admin-reports.php:347
285
  #: ../classes/admin/settings/sf-options.php:52
286
  #: ../classes/admin/settings/sf-options.php:127
287
  #: ../templates/dashboard/orders.php:34 ../templates/orders/orders.php:115
288
  msgid "Shipping"
289
- msgstr ""
290
 
291
  #: ../classes/admin/class-admin-reports.php:348
292
  #: ../classes/admin/class-admin-reports.php:445
293
  msgid "Reversed"
294
- msgstr ""
295
 
296
  #: ../classes/admin/class-admin-reports.php:349
297
  #: ../classes/admin/class-admin-reports.php:444
298
  msgid "Paid"
299
- msgstr ""
300
 
301
  #: ../classes/admin/class-admin-reports.php:350
302
  #: ../classes/admin/class-admin-reports.php:443
303
  msgid "Due"
304
- msgstr ""
305
 
306
  #: ../classes/admin/class-admin-reports.php:456
307
  msgid "Tax Total"
308
- msgstr ""
309
 
310
  #: ../classes/admin/class-admin-reports.php:457
311
  msgid "Shipping Total"
312
- msgstr ""
313
 
314
  #: ../classes/admin/class-admin-reports.php:459
315
  msgid "Commission Total"
316
- msgstr ""
317
 
318
  #: ../classes/admin/class-admin-reports.php:481
319
  msgid "No commissions found."
320
- msgstr ""
321
 
322
  #: ../classes/admin/class-admin-users.php:409
323
  msgid "Enable HTML for the shop description"
324
- msgstr ""
325
 
326
  #: ../classes/admin/class-admin-users.php:415
327
  msgid "Shop name"
328
- msgstr ""
329
 
330
  #: ../classes/admin/class-admin-users.php:422
331
  msgid "PayPal E-mail"
332
- msgstr ""
333
 
334
  #: ../classes/admin/class-admin-users.php:423
335
  msgid "required"
336
- msgstr ""
337
 
338
  #: ../classes/admin/class-admin-users.php:430
339
  msgid "Commission rate"
340
- msgstr ""
341
 
342
  #: ../classes/admin/class-admin-users.php:431
343
  #: ../classes/admin/class-product-meta.php:174
344
  msgid "Leave blank for default"
345
- msgstr ""
346
 
347
  #: ../classes/admin/class-admin-users.php:437
348
  msgid "Give Tax"
349
- msgstr ""
350
 
351
  #: ../classes/admin/class-admin-users.php:442
352
  msgid "Tax override for vendor"
353
- msgstr ""
354
 
355
  #: ../classes/admin/class-admin-users.php:448
356
  msgid "Give Shipping"
357
- msgstr ""
358
 
359
  #: ../classes/admin/class-admin-users.php:453
360
  msgid "Shipping override for vendor"
361
- msgstr ""
362
 
363
  #: ../classes/admin/class-admin-users.php:459
364
  #: ../classes/admin/views/html-vendor-settings-page.php:30
365
  #: ../templates/dashboard/settings/seller-info.php:3
366
  msgid "Seller info"
367
- msgstr ""
368
 
369
  #: ../classes/admin/class-admin-users.php:464
370
  msgid "Shop description"
371
- msgstr ""
372
 
373
  #: ../classes/admin/class-vendor-admin-dashboard.php:20
374
  #: ../classes/class-install.php:167
375
  msgid "Shop Settings"
376
- msgstr ""
377
 
378
  #: ../classes/admin/class-vendor-admin-dashboard.php:21
379
  #: ../classes/admin/class-vendor-admin-dashboard.php:146
380
  #: ../classes/admin/settings/sf-options.php:187
381
  #: ../classes/class-install.php:166 ../templates/dashboard/orders.php:24
382
  msgid "Orders"
383
- msgstr ""
384
 
385
  #: ../classes/admin/class-vendor-admin-dashboard.php:58
386
  #: ../classes/front/dashboard/class-vendor-dashboard.php:106
387
  msgid "Your PayPal address is not a valid email address."
388
- msgstr ""
389
 
390
  #: ../classes/admin/class-vendor-admin-dashboard.php:67
391
  #: ../classes/front/dashboard/class-vendor-dashboard.php:115
392
  msgid "That shop name is already taken. Your shop name must be unique."
393
- msgstr ""
394
 
395
  #: ../classes/admin/class-vendor-admin-dashboard.php:87
396
  #: ../classes/admin/settings/classes/sf-class-settings.php:368
397
  #: ../classes/front/dashboard/class-vendor-dashboard.php:133
398
  msgid "Settings saved."
399
- msgstr ""
400
 
401
  #: ../classes/admin/class-vendor-admin-dashboard.php:284
402
  msgid "Customer"
403
- msgstr ""
404
 
405
  #: ../classes/admin/class-vendor-admin-dashboard.php:285
406
  #: ../classes/admin/settings/sf-options.php:118
407
  #: ../classes/admin/settings/sf-options.php:245
408
  msgid "Products"
409
- msgstr ""
410
 
411
  #: ../classes/admin/class-vendor-admin-dashboard.php:289
412
  #: ../templates/dashboard/orders.php:92
413
  msgid "Shipped"
414
- msgstr ""
415
 
416
  #: ../classes/admin/class-vendor-admin-dashboard.php:324
417
  #: ../templates/dashboard/orders.php:85
418
  msgid "Mark shipped"
419
- msgstr ""
420
 
421
  #: ../classes/admin/class-vendor-admin-dashboard.php:349
422
  msgid "Orders marked shipped."
423
- msgstr ""
424
 
425
  #: ../classes/admin/class-vendor-admin-dashboard.php:465
426
  #: ../templates/orders/orders.php:84
427
  #, php-format
428
  msgid "Comments (%s)"
429
- msgstr ""
430
 
431
  #: ../classes/admin/class-vendor-admin-dashboard.php:468
432
  msgid "Comments to Customer"
433
- msgstr ""
434
 
435
  #: ../classes/admin/class-vendor-admin-dashboard.php:477
436
  #: ../templates/orders/comments/existing-comments.php:9
437
  #, php-format
438
  msgid "added %s ago"
439
- msgstr ""
440
 
441
  #: ../classes/admin/class-vendor-admin-dashboard.php:483
442
  msgid "No comments currently to customer."
443
- msgstr ""
444
 
445
  #: ../classes/admin/class-vendor-admin-dashboard.php:492
446
  #: ../templates/orders/comments/add-new-comment.php:11
447
  msgid "Add comment"
448
- msgstr ""
449
 
450
  #: ../classes/admin/class-vendor-applicants.php:26
451
  msgid "Approve"
452
- msgstr ""
453
 
454
  #: ../classes/admin/class-vendor-applicants.php:27
455
  msgid "Deny"
456
- msgstr ""
457
 
458
  #: ../classes/admin/class-vendor-applicants.php:73
459
  msgid "Vendor has been <b>denied</b>."
460
- msgstr ""
461
 
462
  #: ../classes/admin/class-vendor-applicants.php:84
463
  msgid "Vendor has been <b>approved</b>."
464
- msgstr ""
465
 
466
  #: ../classes/admin/class-vendor-applicants.php:98
467
  msgid "Pending Vendors"
468
- msgstr ""
469
 
470
  #: ../classes/admin/emails/class-emails.php:59
471
  #: ../classes/admin/emails/class-wc-approve-vendor.php:70
472
  msgid "pending"
473
- msgstr ""
474
 
475
  #: ../classes/admin/emails/class-emails.php:61
476
  msgid "approved"
477
- msgstr ""
478
 
479
  #: ../classes/admin/emails/class-emails.php:63
480
  msgid "denied"
481
- msgstr ""
482
 
483
  #: ../classes/admin/emails/class-wc-approve-vendor.php:28
484
  msgid "Vendor Application"
485
- msgstr ""
486
 
487
  #: ../classes/admin/emails/class-wc-approve-vendor.php:29
488
  msgid "Vendor application will either be approved, denied, or pending."
489
- msgstr ""
490
 
491
  #: ../classes/admin/emails/class-wc-approve-vendor.php:31
492
  msgid "Application {status}"
493
- msgstr ""
494
 
495
  #: ../classes/admin/emails/class-wc-approve-vendor.php:32
496
  msgid "[{blogname}] Your vendor application has been {status}"
497
- msgstr ""
498
 
499
  #: ../classes/admin/emails/class-wc-approve-vendor.php:123
500
  #: ../classes/admin/emails/class-wc-notify-admin.php:134
@@ -502,19 +511,19 @@ msgstr ""
502
  #: ../classes/admin/emails/class-wc-notify-vendor.php:258
503
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:62
504
  msgid "Enable/Disable"
505
- msgstr ""
506
 
507
  #: ../classes/admin/emails/class-wc-approve-vendor.php:125
508
  #: ../classes/admin/emails/class-wc-notify-admin.php:136
509
  #: ../classes/admin/emails/class-wc-notify-shipped.php:165
510
  #: ../classes/admin/emails/class-wc-notify-vendor.php:260
511
  msgid "Enable this email notification"
512
- msgstr ""
513
 
514
  #: ../classes/admin/emails/class-wc-approve-vendor.php:129
515
  #: ../classes/admin/emails/class-wc-notify-admin.php:140
516
  msgid "Recipient(s)"
517
- msgstr ""
518
 
519
  #: ../classes/admin/emails/class-wc-approve-vendor.php:131
520
  #: ../classes/admin/emails/class-wc-notify-admin.php:142
@@ -523,13 +532,15 @@ msgid ""
523
  "Enter recipients (comma separated) for this email. Defaults to <code>%s</"
524
  "code>."
525
  msgstr ""
 
 
526
 
527
  #: ../classes/admin/emails/class-wc-approve-vendor.php:136
528
  #: ../classes/admin/emails/class-wc-notify-admin.php:147
529
  #: ../classes/admin/emails/class-wc-notify-shipped.php:169
530
  #: ../classes/admin/emails/class-wc-notify-vendor.php:264
531
  msgid "Subject"
532
- msgstr ""
533
 
534
  #: ../classes/admin/emails/class-wc-approve-vendor.php:138
535
  #: ../classes/admin/emails/class-wc-notify-admin.php:149
@@ -540,13 +551,15 @@ msgid ""
540
  "This controls the email subject line. Leave blank to use the default "
541
  "subject: <code>%s</code>."
542
  msgstr ""
 
 
543
 
544
  #: ../classes/admin/emails/class-wc-approve-vendor.php:143
545
  #: ../classes/admin/emails/class-wc-notify-admin.php:154
546
  #: ../classes/admin/emails/class-wc-notify-shipped.php:176
547
  #: ../classes/admin/emails/class-wc-notify-vendor.php:271
548
  msgid "Email Heading"
549
- msgstr ""
550
 
551
  #: ../classes/admin/emails/class-wc-approve-vendor.php:145
552
  #: ../classes/admin/emails/class-wc-notify-admin.php:156
@@ -557,153 +570,161 @@ msgid ""
557
  "This controls the main heading contained within the email notification. "
558
  "Leave blank to use the default heading: <code>%s</code>."
559
  msgstr ""
 
 
560
 
561
  #: ../classes/admin/emails/class-wc-approve-vendor.php:150
562
  #: ../classes/admin/emails/class-wc-notify-admin.php:161
563
  #: ../classes/admin/emails/class-wc-notify-shipped.php:183
564
  #: ../classes/admin/emails/class-wc-notify-vendor.php:278
565
  msgid "Email type"
566
- msgstr ""
567
 
568
  #: ../classes/admin/emails/class-wc-approve-vendor.php:152
569
  #: ../classes/admin/emails/class-wc-notify-admin.php:163
570
  #: ../classes/admin/emails/class-wc-notify-shipped.php:185
571
  #: ../classes/admin/emails/class-wc-notify-vendor.php:280
572
  msgid "Choose which format of email to send."
573
- msgstr ""
574
 
575
  #: ../classes/admin/emails/class-wc-approve-vendor.php:156
576
  #: ../classes/admin/emails/class-wc-notify-admin.php:167
577
  #: ../classes/admin/emails/class-wc-notify-shipped.php:189
578
  #: ../classes/admin/emails/class-wc-notify-vendor.php:284
579
  msgid "Plain text"
580
- msgstr ""
581
 
582
  #: ../classes/admin/emails/class-wc-approve-vendor.php:157
583
  #: ../classes/admin/emails/class-wc-notify-admin.php:168
584
  #: ../classes/admin/emails/class-wc-notify-shipped.php:190
585
  #: ../classes/admin/emails/class-wc-notify-vendor.php:285
586
  msgid "HTML"
587
- msgstr ""
588
 
589
  #: ../classes/admin/emails/class-wc-approve-vendor.php:158
590
  #: ../classes/admin/emails/class-wc-notify-admin.php:169
591
  #: ../classes/admin/emails/class-wc-notify-shipped.php:191
592
  #: ../classes/admin/emails/class-wc-notify-vendor.php:286
593
  msgid "Multipart"
594
- msgstr ""
595
 
596
  #: ../classes/admin/emails/class-wc-notify-admin.php:28
597
  msgid "New Vendor Product"
598
- msgstr ""
599
 
600
  #: ../classes/admin/emails/class-wc-notify-admin.php:29
601
  msgid "New order emails are sent when a new product is submitted by a vendor"
602
  msgstr ""
 
603
 
604
  #: ../classes/admin/emails/class-wc-notify-admin.php:31
605
  msgid "New product submitted: {product_name}"
606
- msgstr ""
607
 
608
  #: ../classes/admin/emails/class-wc-notify-admin.php:32
609
  msgid "[{blogname}] New product submitted by {vendor_name} - {product_name}"
610
- msgstr ""
611
 
612
  #: ../classes/admin/emails/class-wc-notify-shipped.php:28
613
  msgid "Vendor has shipped"
614
- msgstr ""
615
 
616
  #: ../classes/admin/emails/class-wc-notify-shipped.php:29
617
  msgid ""
618
  "An email is sent when a vendor has marked one of their orders as shipped."
619
  msgstr ""
 
 
620
 
621
  #: ../classes/admin/emails/class-wc-notify-shipped.php:31
622
  msgid "Your order has been shipped"
623
- msgstr ""
624
 
625
  #: ../classes/admin/emails/class-wc-notify-shipped.php:32
626
  msgid ""
627
  "[{blogname}] Your order has been shipped ({order_number}) - {order_date}"
628
  msgstr ""
 
 
629
 
630
  #: ../classes/admin/emails/class-wc-notify-shipped.php:112
631
  msgid "Subtotal:"
632
- msgstr ""
633
 
634
  #: ../classes/admin/emails/class-wc-notify-vendor.php:27
635
  msgid "Notify vendors"
636
- msgstr ""
637
 
638
  #: ../classes/admin/emails/class-wc-notify-vendor.php:28
639
  msgid "New order emails are sent when an order is received/paid by a customer."
640
  msgstr ""
 
641
 
642
  #: ../classes/admin/emails/class-wc-notify-vendor.php:30
643
  msgid "New customer order"
644
- msgstr ""
645
 
646
  #: ../classes/admin/emails/class-wc-notify-vendor.php:31
647
  msgid "[{blogname}] New customer order ({order_number}) - {order_date}"
648
- msgstr ""
649
 
650
  #: ../classes/admin/emails/class-wc-notify-vendor.php:113
651
  msgid "Commission Subtotal:"
652
- msgstr ""
653
 
654
  #: ../classes/admin/emails/class-wc-notify-vendor.php:119
655
  msgid "Tax Subtotal:"
656
- msgstr ""
657
 
658
  #: ../classes/admin/emails/class-wc-notify-vendor.php:127
659
  msgid "Shipping Subtotal:"
660
- msgstr ""
661
 
662
  #: ../classes/admin/settings/classes/sf-class-format-options.php:211
663
  #: ../classes/admin/settings/classes/sf-class-settings.php:780
664
  msgid "Select a page..."
665
- msgstr ""
666
 
667
  #: ../classes/admin/settings/classes/sf-class-settings.php:153
668
  #: ../templates/dashboard/settings/settings.php:1
669
  msgid "Settings"
670
- msgstr ""
671
 
672
  #: ../classes/admin/settings/classes/sf-class-settings.php:302
673
  msgid "Could not load settings at: "
674
- msgstr ""
675
 
676
  #: ../classes/admin/settings/classes/sf-class-settings.php:302
677
  msgid "Error - WP Settings Framework"
678
- msgstr ""
679
 
680
  #: ../classes/admin/settings/classes/sf-class-settings.php:484
681
  #, php-format
682
  msgid "Save %s changes"
683
- msgstr ""
684
 
685
  #: ../classes/admin/settings/classes/sf-class-settings.php:837
686
  #, php-format
687
  msgid "Update %s"
688
- msgstr ""
689
 
690
  #: ../classes/admin/settings/classes/sf-class-settings.php:837
691
  #, php-format
692
  msgid "Add %s"
693
- msgstr ""
694
 
695
  #: ../classes/admin/settings/classes/sf-class-settings.php:837
696
  #, php-format
697
  msgid "Upload an image for the %s"
698
- msgstr ""
699
 
700
  #: ../classes/admin/settings/sf-options.php:5
701
  msgid "General options"
702
- msgstr ""
703
 
704
  #: ../classes/admin/settings/sf-options.php:8
705
  msgid "Default commission (%)"
706
- msgstr ""
707
 
708
  #: ../classes/admin/settings/sf-options.php:9
709
  msgid ""
@@ -712,11 +733,15 @@ msgid ""
712
  "user account.<br>Also, you can edit an individual products commission to "
713
  "override both of these settings on a per product basis."
714
  msgstr ""
 
 
 
 
715
 
716
  #: ../classes/admin/settings/sf-options.php:20
717
  #: ../classes/admin/settings/sf-options.php:27
718
  msgid "Allow users or guests to apply to become a vendor"
719
- msgstr ""
720
 
721
  #: ../classes/admin/settings/sf-options.php:22
722
  msgid ""
@@ -725,10 +750,15 @@ msgid ""
725
  "page</strong>\" in your <strong>WooCommerce > Settings > Accounts</strong> "
726
  "page for this option to work. Currently, you have registration disabled."
727
  msgstr ""
 
 
 
 
 
728
 
729
  #: ../classes/admin/settings/sf-options.php:26
730
  msgid "Registration"
731
- msgstr ""
732
 
733
  #: ../classes/admin/settings/sf-options.php:28
734
  msgid ""
@@ -736,33 +766,39 @@ msgid ""
736
  "if the user would like to apply to be a vendor. Also, on the Vendor "
737
  "Dashboard, users can still apply to become a vendor even if this is disabled."
738
  msgstr ""
 
 
 
 
739
 
740
  #: ../classes/admin/settings/sf-options.php:35
741
  msgid "Approve vendor applications manually"
742
- msgstr ""
743
 
744
  #: ../classes/admin/settings/sf-options.php:36
745
  msgid ""
746
  "With this unchecked, all vendor applications are automatically accepted. "
747
  "Otherwise, you must approve each manually."
748
  msgstr ""
 
749
 
750
  #: ../classes/admin/settings/sf-options.php:43
751
  #: ../classes/admin/settings/sf-options.php:166
752
  msgid "Taxes"
753
- msgstr ""
754
 
755
  #: ../classes/admin/settings/sf-options.php:44
756
  msgid "Give vendors any tax collected per-product"
757
- msgstr ""
758
 
759
  #: ../classes/admin/settings/sf-options.php:45
760
  msgid "The tax collected on a vendor's product will be given in its entirety"
761
  msgstr ""
 
762
 
763
  #: ../classes/admin/settings/sf-options.php:53
764
  msgid "Give vendors any shipping collected per-product"
765
- msgstr ""
766
 
767
  #: ../classes/admin/settings/sf-options.php:54
768
  msgid ""
@@ -770,38 +806,46 @@ msgid ""
770
  "gateway. WC Vendors Pro - Give vendors shipping when using Vendor "
771
  "Shipping. No other shipping module is compatible with this option."
772
  msgstr ""
 
 
 
773
 
774
  #: ../classes/admin/settings/sf-options.php:60
775
  msgid "Shop options"
776
- msgstr ""
777
 
778
  #: ../classes/admin/settings/sf-options.php:63
779
  msgid "Shop HTML"
780
- msgstr ""
781
 
782
  #: ../classes/admin/settings/sf-options.php:64
783
  msgid ""
784
  "Enable HTML for a vendor's shop description by default. You can enable or "
785
  "disable this per vendor by editing the vendors user account."
786
  msgstr ""
 
 
 
787
 
788
  #: ../classes/admin/settings/sf-options.php:71
789
  msgid "Vendor Shop Page"
790
- msgstr ""
791
 
792
  #: ../classes/admin/settings/sf-options.php:72
793
  msgid ""
794
  "Enter one word for the URI. If you enter \"<strong>vendors</strong>\" your "
795
  "vendors store will be <code>yourdomain.com/vendors/store-name/</code>"
796
  msgstr ""
 
 
797
 
798
  #: ../classes/admin/settings/sf-options.php:79
799
  msgid "Shop Headers"
800
- msgstr ""
801
 
802
  #: ../classes/admin/settings/sf-options.php:80
803
  msgid "Enable vendor shop headers"
804
- msgstr ""
805
 
806
  #: ../classes/admin/settings/sf-options.php:81
807
  msgid ""
@@ -809,218 +853,236 @@ msgid ""
809
  "pages. In order to customize the shop headers visit wcvendors.com and read "
810
  "the article in the Knowledgebase titled Changing the Vendor Templates."
811
  msgstr ""
 
 
 
812
 
813
  #: ../classes/admin/settings/sf-options.php:88
814
  msgid "Vendor Display Name"
815
- msgstr ""
816
 
817
  #: ../classes/admin/settings/sf-options.php:89
818
  msgid ""
819
  "Select what will be displayed for the sold by text throughout the store."
820
- msgstr ""
821
 
822
  #: ../classes/admin/settings/sf-options.php:93
823
  msgid "Display Name"
824
- msgstr ""
825
 
826
  #: ../classes/admin/settings/sf-options.php:94
827
  #: ../classes/admin/views/html-vendor-settings-page.php:22
828
  #: ../templates/dashboard/settings/shop-name.php:2
829
  msgid "Shop Name"
830
- msgstr ""
831
 
832
  #: ../classes/admin/settings/sf-options.php:95
833
  msgid "User Login"
834
- msgstr ""
835
 
836
  #: ../classes/admin/settings/sf-options.php:96
837
  msgid "User Email"
838
- msgstr ""
839
 
840
  #: ../classes/admin/settings/sf-options.php:103
841
  msgid "Sold By Label"
842
- msgstr ""
843
 
844
  #: ../classes/admin/settings/sf-options.php:104
845
  msgid "The sold by label used on the site and emails."
846
  msgstr ""
 
847
 
848
  #: ../classes/admin/settings/sf-options.php:107
849
  msgid "Sold By"
850
- msgstr ""
851
 
852
  #: ../classes/admin/settings/sf-options.php:111
853
  msgid "Seller Info Label"
854
- msgstr ""
855
 
856
  #: ../classes/admin/settings/sf-options.php:112
857
  msgid "The seller info tab title on the single product page."
858
- msgstr ""
859
 
860
  #: ../classes/admin/settings/sf-options.php:115
861
  msgid "Seller Info"
862
- msgstr ""
863
 
864
  #: ../classes/admin/settings/sf-options.php:119
865
  msgid "Product Add Page"
866
- msgstr ""
867
 
868
  #: ../classes/admin/settings/sf-options.php:119
869
  msgid "Configure what to hide from all vendors when adding a product"
870
  msgstr ""
 
 
871
 
872
  #: ../classes/admin/settings/sf-options.php:122
873
  msgid "Left side panel"
874
- msgstr ""
875
 
876
  #: ../classes/admin/settings/sf-options.php:123
877
  msgid ""
878
  "CHECKING these boxes will **HIDE** these areas of the add product page for "
879
  "vendors"
880
  msgstr ""
 
 
881
 
882
  #: ../classes/admin/settings/sf-options.php:126
883
  msgid "Inventory"
884
- msgstr ""
885
 
886
  #: ../classes/admin/settings/sf-options.php:128
887
  msgid "Linked Products"
888
- msgstr ""
889
 
890
  #: ../classes/admin/settings/sf-options.php:129
891
  msgid "Attributes"
892
- msgstr ""
893
 
894
  #: ../classes/admin/settings/sf-options.php:130
895
  msgid "Advanced"
896
- msgstr ""
897
 
898
  #: ../classes/admin/settings/sf-options.php:137
899
  msgid "Types"
900
- msgstr ""
901
 
902
  #: ../classes/admin/settings/sf-options.php:138
903
  msgid "CHECKING these boxes will HIDE these product types from the vendor"
904
  msgstr ""
 
905
 
906
  #: ../classes/admin/settings/sf-options.php:141
907
  msgid "Simple"
908
- msgstr ""
909
 
910
  #: ../classes/admin/settings/sf-options.php:142
911
  msgid "Variable"
912
- msgstr ""
913
 
914
  #: ../classes/admin/settings/sf-options.php:143
915
  msgid "Grouped"
916
- msgstr ""
917
 
918
  #: ../classes/admin/settings/sf-options.php:144
919
  msgid "External / affiliate"
920
- msgstr ""
921
 
922
  #: ../classes/admin/settings/sf-options.php:151
923
  msgid "Type options"
924
- msgstr ""
925
 
926
  #: ../classes/admin/settings/sf-options.php:152
927
  msgid ""
928
  "CHECKING these boxes will **HIDE** these product options from the vendor"
929
  msgstr ""
 
 
930
 
931
  #: ../classes/admin/settings/sf-options.php:155
932
  msgid "Virtual"
933
- msgstr ""
934
 
935
  #: ../classes/admin/settings/sf-options.php:156
936
  msgid "Downloadable"
937
- msgstr ""
938
 
939
  #: ../classes/admin/settings/sf-options.php:163
940
  msgid "Miscellaneous"
941
- msgstr ""
942
 
943
  #: ../classes/admin/settings/sf-options.php:167
944
  msgid "SKU"
945
- msgstr ""
946
 
947
  #: ../classes/admin/settings/sf-options.php:168
948
  msgid "Featured"
949
- msgstr ""
950
 
951
  #: ../classes/admin/settings/sf-options.php:169
952
  msgid "Duplicate Product"
953
- msgstr ""
954
 
955
  #: ../classes/admin/settings/sf-options.php:176
956
  msgid "Stylesheet"
957
- msgstr ""
958
 
959
  #: ../classes/admin/settings/sf-options.php:177
960
  msgid ""
961
  "You can add CSS in this textarea, which will be loaded on the product add/"
962
  "edit page for vendors."
963
  msgstr ""
 
 
964
 
965
  #: ../classes/admin/settings/sf-options.php:184
966
  msgid "Permissions"
967
- msgstr ""
968
 
969
  #: ../classes/admin/settings/sf-options.php:184
970
  msgid "General permissions used around the shop"
971
- msgstr ""
972
 
973
  #: ../classes/admin/settings/sf-options.php:188
974
  msgid "View orders"
975
- msgstr ""
976
 
977
  #: ../classes/admin/settings/sf-options.php:189
978
  msgid "Show customer details such as email, address, name, etc, for each order"
979
- msgstr ""
980
 
981
  #: ../classes/admin/settings/sf-options.php:196
982
  msgid "View comments"
983
- msgstr ""
984
 
985
  #: ../classes/admin/settings/sf-options.php:197
986
  msgid "View all vendor comments for an order on the frontend"
987
- msgstr ""
988
 
989
  #: ../classes/admin/settings/sf-options.php:204
990
  msgid "Submit comments"
991
- msgstr ""
992
 
993
  #: ../classes/admin/settings/sf-options.php:205
994
  msgid ""
995
  "Submit comments for an order on the frontend. Eg, tracking ID for a product"
996
  msgstr ""
 
997
 
998
  #: ../classes/admin/settings/sf-options.php:212
999
  msgid "View email addresses"
1000
- msgstr ""
1001
 
1002
  #: ../classes/admin/settings/sf-options.php:213
1003
  msgid ""
1004
  "While viewing order details on the frontend, you can disable or enable email "
1005
  "addresses"
1006
  msgstr ""
 
 
1007
 
1008
  #: ../classes/admin/settings/sf-options.php:220
1009
  msgid "Export a CSV file of orders for a product"
1010
- msgstr ""
1011
 
1012
  #: ../classes/admin/settings/sf-options.php:221
1013
  msgid "Vendors could export orders for a product on the frontend"
1014
- msgstr ""
1015
 
1016
  #: ../classes/admin/settings/sf-options.php:228
1017
  msgid "Reports"
1018
- msgstr ""
1019
 
1020
  #: ../classes/admin/settings/sf-options.php:229
1021
  msgid ""
1022
  "<strike>View backend sales reports</strike>. <strong>Depreciated</strong>"
1023
  msgstr ""
 
 
1024
 
1025
  #: ../classes/admin/settings/sf-options.php:230
1026
  msgid ""
@@ -1028,10 +1090,13 @@ msgid ""
1028
  "completely removed in future versions. Vendors should use their Vendor "
1029
  "Dashboard for reports as all identical functionality is already there. "
1030
  msgstr ""
 
 
 
1031
 
1032
  #: ../classes/admin/settings/sf-options.php:237
1033
  msgid "View Frontend sales reports"
1034
- msgstr ""
1035
 
1036
  #: ../classes/admin/settings/sf-options.php:238
1037
  msgid ""
@@ -1039,20 +1104,25 @@ msgid ""
1039
  "only display sales data that pertain to their products, and only for orders "
1040
  "that are processing or completed."
1041
  msgstr ""
 
 
 
1042
 
1043
  #: ../classes/admin/settings/sf-options.php:246
1044
  msgid "Submit products"
1045
- msgstr ""
1046
 
1047
  #: ../classes/admin/settings/sf-options.php:247
1048
  msgid ""
1049
  "Check to allow vendors to list new products. Admin must approve new "
1050
  "products by editing the product, and clicking Publish."
1051
  msgstr ""
 
 
1052
 
1053
  #: ../classes/admin/settings/sf-options.php:254
1054
  msgid "Edit live products"
1055
- msgstr ""
1056
 
1057
  #: ../classes/admin/settings/sf-options.php:255
1058
  msgid ""
@@ -1060,28 +1130,35 @@ msgid ""
1060
  "is no approval or review after editing a live product. This could be "
1061
  "dangerous with malicious vendors, so take caution."
1062
  msgstr ""
 
 
 
 
1063
 
1064
  #: ../classes/admin/settings/sf-options.php:262
1065
  msgid "Submit products live without requiring approval"
1066
- msgstr ""
1067
 
1068
  #: ../classes/admin/settings/sf-options.php:263
1069
  msgid ""
1070
  "Vendors can submit products without review or approval from a shop admin. "
1071
  "This could be dangerous with malicious vendors, so take caution."
1072
  msgstr ""
 
 
 
1073
 
1074
  #: ../classes/admin/settings/sf-options.php:269
1075
  msgid "Pages"
1076
- msgstr ""
1077
 
1078
  #: ../classes/admin/settings/sf-options.php:270
1079
  msgid "Page configuration"
1080
- msgstr ""
1081
 
1082
  #: ../classes/admin/settings/sf-options.php:273
1083
  msgid "Vendor dashboard"
1084
- msgstr ""
1085
 
1086
  #: ../classes/admin/settings/sf-options.php:274
1087
  msgid ""
@@ -1090,10 +1167,14 @@ msgid ""
1090
  "upgrade to Pro, keep this page unchanged as both Pro Dashboard and this "
1091
  "Dashboard page must be set."
1092
  msgstr ""
 
 
 
 
1093
 
1094
  #: ../classes/admin/settings/sf-options.php:281
1095
  msgid "Shop settings"
1096
- msgstr ""
1097
 
1098
  #: ../classes/admin/settings/sf-options.php:282
1099
  msgid ""
@@ -1101,20 +1182,25 @@ msgid ""
1101
  ">These are the shop settings a vendor can configure. By default, Vendor "
1102
  "Dashboard > Shop Settings should have this shortcode."
1103
  msgstr ""
 
 
 
1104
 
1105
  #: ../classes/admin/settings/sf-options.php:289
1106
  msgid "Orders page"
1107
- msgstr ""
1108
 
1109
  #: ../classes/admin/settings/sf-options.php:290
1110
  msgid ""
1111
  "Choose the page that has the shortcode <code>[wcv_orders]</code><br/>By "
1112
  "default, Vendor Dashboard > Orders should have the shortcode."
1113
  msgstr ""
 
 
1114
 
1115
  #: ../classes/admin/settings/sf-options.php:297
1116
  msgid "Vendor terms"
1117
- msgstr ""
1118
 
1119
  #: ../classes/admin/settings/sf-options.php:298
1120
  msgid ""
@@ -1122,23 +1208,26 @@ msgid ""
1122
  "vendor.<br/>If left blank, no terms will be shown to the applicant. Vendor "
1123
  "must accept terms in order to register, if set."
1124
  msgstr ""
 
 
 
1125
 
1126
  #: ../classes/admin/settings/sf-options.php:305
1127
  msgid "payments"
1128
- msgstr ""
1129
 
1130
  #: ../classes/admin/settings/sf-options.php:316
1131
  msgid "Payments"
1132
- msgstr ""
1133
 
1134
  #: ../classes/admin/settings/sf-options.php:318
1135
  msgid "PayPal Adaptive Payments Scheduling"
1136
- msgstr ""
1137
 
1138
  #: ../classes/admin/settings/sf-options.php:319
1139
  #, php-format
1140
  msgid "Total commission currently due: %s. <a href=\"%s\">View details</a>."
1141
- msgstr ""
1142
 
1143
  #: ../classes/admin/settings/sf-options.php:320
1144
  #, php-format
@@ -1155,195 +1244,216 @@ msgid ""
1155
  "\"https://www.wcvendors.com/product/wc-vendors-pro/\" target=\"top\">WC "
1156
  "Vendors Pro</a>."
1157
  msgstr ""
 
 
 
 
 
 
 
 
 
 
 
1158
 
1159
  #: ../classes/admin/settings/sf-options.php:324
1160
  msgid "Instant pay"
1161
- msgstr ""
1162
 
1163
  #: ../classes/admin/settings/sf-options.php:325
1164
  msgid ""
1165
  "Instantly pay vendors their commission when an order is made, and if a "
1166
  "vendor has a valid PayPal email added on their Shop Settings page."
1167
  msgstr ""
 
 
 
1168
 
1169
  #: ../classes/admin/settings/sf-options.php:326
1170
  msgid ""
1171
  "For this to work, customers must checkout with the PayPal Adaptive Payments "
1172
  "gateway. Using any other gateways will not pay vendors instantly"
1173
  msgstr ""
 
 
 
1174
 
1175
  #: ../classes/admin/settings/sf-options.php:333
1176
  msgid "Payment schedule"
1177
- msgstr ""
1178
 
1179
  #: ../classes/admin/settings/sf-options.php:334
1180
  msgid "Note: Schedule will only work if instant pay is unchecked"
1181
- msgstr ""
1182
 
1183
  #: ../classes/admin/settings/sf-options.php:339
1184
  msgid "Weekly"
1185
- msgstr ""
1186
 
1187
  #: ../classes/admin/settings/sf-options.php:340
1188
  msgid "Biweekly"
1189
- msgstr ""
1190
 
1191
  #: ../classes/admin/settings/sf-options.php:341
1192
  msgid "Monthly"
1193
- msgstr ""
1194
 
1195
  #: ../classes/admin/settings/sf-options.php:342
1196
  msgid "Manual"
1197
- msgstr ""
1198
 
1199
  #: ../classes/admin/settings/sf-options.php:343
1200
  msgid "Now"
1201
- msgstr ""
1202
 
1203
  #: ../classes/admin/settings/sf-options.php:348
1204
  msgid "Email notification"
1205
- msgstr ""
1206
 
1207
  #: ../classes/admin/settings/sf-options.php:349
1208
  msgid ""
1209
  "Send the WooCommerce admin an email each time a payment has been made via "
1210
  "the payment schedule options above"
1211
  msgstr ""
 
 
1212
 
1213
  #: ../classes/admin/views/html-vendor-settings-page.php:11
1214
  #: ../templates/dashboard/settings/paypal-email-form.php:2
1215
  msgid "PayPal Address"
1216
- msgstr ""
1217
 
1218
  #: ../classes/admin/views/html-vendor-settings-page.php:15
1219
  #: ../templates/dashboard/settings/paypal-email-form.php:3
1220
  msgid "Your PayPal address is used to send you your commission."
1221
- msgstr ""
1222
 
1223
  #: ../classes/admin/views/html-vendor-settings-page.php:24
1224
  #: ../templates/dashboard/settings/shop-name.php:3
1225
  msgid "Your shop name is public and must be unique."
1226
- msgstr ""
1227
 
1228
  #: ../classes/admin/views/html-vendor-settings-page.php:43
1229
  #: ../templates/dashboard/settings/seller-info.php:4
1230
  msgid "This is displayed on each of your products."
1231
- msgstr ""
1232
 
1233
  #: ../classes/admin/views/html-vendor-settings-page.php:49
1234
  #: ../templates/dashboard/settings/shop-description.php:2
1235
  msgid "Shop Description"
1236
- msgstr ""
1237
 
1238
  #: ../classes/admin/views/html-vendor-settings-page.php:61
1239
  #: ../templates/dashboard/settings/shop-description.php:3
1240
  #, php-format
1241
  msgid "This is displayed on your <a href=\"%s\">shop page</a>."
1242
- msgstr ""
1243
 
1244
  #: ../classes/admin/views/html-vendor-settings-page.php:70
1245
  msgid "Save Shop Settings"
1246
- msgstr ""
1247
 
1248
  #: ../classes/class-cron.php:87
1249
  #, php-format
1250
  msgid "Payment total: %s"
1251
- msgstr ""
1252
 
1253
  #: ../classes/class-cron.php:148
1254
  msgid "Once Weekly"
1255
- msgstr ""
1256
 
1257
  #: ../classes/class-cron.php:153
1258
  msgid "Once every two weeks"
1259
- msgstr ""
1260
 
1261
  #: ../classes/class-cron.php:158
1262
  msgid "Once a month"
1263
- msgstr ""
1264
 
1265
  #: ../classes/class-install.php:59 ../classes/class-install.php:214
1266
  msgid "Pending Vendor"
1267
- msgstr ""
1268
 
1269
  #: ../classes/class-install.php:165
1270
  msgid "Vendor Dashboard"
1271
- msgstr ""
1272
 
1273
  #: ../classes/front/dashboard/class-vendor-dashboard.php:48
1274
  msgid "Order marked shipped."
1275
- msgstr ""
1276
 
1277
  #: ../classes/front/dashboard/class-vendor-dashboard.php:49
1278
  msgid " has marked as shipped. "
1279
- msgstr ""
1280
 
1281
  #: ../classes/front/dashboard/class-vendor-dashboard.php:77
1282
  #: ../classes/front/dashboard/class-vendor-dashboard.php:78
1283
  msgid "Tracking number"
1284
- msgstr ""
1285
 
1286
  #: ../classes/front/dashboard/class-vendor-dashboard.php:80
1287
  msgid "Success. Your tracking number has been updated."
1288
- msgstr ""
1289
 
1290
  #: ../classes/front/orders/class-export-csv.php:19
1291
  #: ../templates/dashboard/reports.php:18
1292
  #: ../templates/emails/notify-vendor-shipped.php:23
1293
  #: ../templates/emails/vendor-new-order.php:23
1294
  msgid "Quantity"
1295
- msgstr ""
1296
 
1297
  #: ../classes/front/orders/class-orders.php:107
1298
  msgid ""
1299
  "You haven't selected a product's orders to view! Please go back to the "
1300
  "Vendor Dashboard and click Show Orders on the product you'd like to view."
1301
  msgstr ""
 
 
1302
 
1303
  #: ../classes/front/orders/class-orders.php:111
1304
  msgid "No orders."
1305
- msgstr ""
1306
 
1307
  #: ../classes/front/orders/class-orders.php:174
1308
  msgid "Product Title"
1309
- msgstr ""
1310
 
1311
  #: ../classes/front/orders/class-orders.php:175
1312
  msgid "Full name"
1313
- msgstr ""
1314
 
1315
  #: ../classes/front/orders/class-orders.php:176
1316
  msgid "Address"
1317
- msgstr ""
1318
 
1319
  #: ../classes/front/orders/class-orders.php:177
1320
  msgid "City"
1321
- msgstr ""
1322
 
1323
  #: ../classes/front/orders/class-orders.php:178
1324
  msgid "State"
1325
- msgstr ""
1326
 
1327
  #: ../classes/front/orders/class-orders.php:179
1328
  msgid "Zip"
1329
- msgstr ""
1330
 
1331
  #: ../classes/front/orders/class-orders.php:180
1332
  msgid "Email address"
1333
- msgstr ""
1334
 
1335
  #: ../classes/front/orders/class-submit-comment.php:41
1336
  msgid "You've left the comment field empty!"
1337
- msgstr ""
1338
 
1339
  #: ../classes/front/orders/class-submit-comment.php:63
1340
  msgid "Success. The customer has been notified of your comment."
1341
- msgstr ""
1342
 
1343
  #: ../classes/front/signup/class-vendor-signup.php:45
1344
  #: ../templates/dashboard/denied.php:22
1345
  msgid "Apply to become a vendor? "
1346
- msgstr ""
1347
 
1348
  #: ../classes/front/signup/class-vendor-signup.php:54
1349
  #, php-format
@@ -1351,68 +1461,70 @@ msgid ""
1351
  "I have read and accepted the <a target=\"top\" href=\"%s\">terms and "
1352
  "conditions</a>"
1353
  msgstr ""
 
 
1354
 
1355
  #: ../classes/front/signup/class-vendor-signup.php:88
1356
  msgid "Application denied. You are an administrator."
1357
- msgstr ""
1358
 
1359
  #: ../classes/front/signup/class-vendor-signup.php:90
1360
  msgid "Your application has been submitted."
1361
- msgstr ""
1362
 
1363
  #: ../classes/front/signup/class-vendor-signup.php:130
1364
  #: ../classes/front/signup/class-vendor-signup.php:142
1365
  msgid "You must accept the terms and conditions to become a vendor."
1366
- msgstr ""
1367
 
1368
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:43
1369
  msgid "PayPal Adaptive Payments"
1370
- msgstr ""
1371
 
1372
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:119
1373
  #, php-format
1374
  msgid ""
1375
  "Something went wrong. Response from PayPal invalidated this order. Status: "
1376
  "%s."
1377
- msgstr ""
1378
 
1379
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:124
1380
  msgid "IPN payment completed"
1381
- msgstr ""
1382
 
1383
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:146
1384
  msgid "Enable PayPal Adaptive Payments"
1385
- msgstr ""
1386
 
1387
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:152
1388
  msgid "Method Title"
1389
- msgstr ""
1390
 
1391
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:153
1392
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:70
1393
  msgid "This controls the title which the user sees during checkout."
1394
- msgstr ""
1395
 
1396
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:154
1397
  msgid "PayPal"
1398
- msgstr ""
1399
 
1400
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:159
1401
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:75
1402
  msgid "Description"
1403
- msgstr ""
1404
 
1405
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:160
1406
  msgid "This controls the description which the user sees during checkout."
1407
- msgstr ""
1408
 
1409
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:161
1410
  msgid "Pay via PayPal!"
1411
- msgstr ""
1412
 
1413
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:172
1414
  msgid "Live Credentials"
1415
- msgstr ""
1416
 
1417
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:174
1418
  #, php-format
@@ -1420,43 +1532,45 @@ msgid ""
1420
  "You must have an <a href=\"%s\">Application ID</a> to process live "
1421
  "transactions. You do not need one for testing in Sandbox mode."
1422
  msgstr ""
 
 
1423
 
1424
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:179
1425
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:213
1426
  msgid "PayPal Email"
1427
- msgstr ""
1428
 
1429
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:180
1430
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:214
1431
  msgid "The email address main payments should go to."
1432
- msgstr ""
1433
 
1434
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:185
1435
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:219
1436
  msgid "API Username"
1437
- msgstr ""
1438
 
1439
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:190
1440
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:224
1441
  msgid "API Password"
1442
- msgstr ""
1443
 
1444
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:195
1445
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:229
1446
  msgid "API Signature"
1447
- msgstr ""
1448
 
1449
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:200
1450
  msgid "Application ID"
1451
- msgstr ""
1452
 
1453
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:202
1454
  msgid "Only required when doing live transactions."
1455
- msgstr ""
1456
 
1457
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:206
1458
  msgid "Sandbox Credentials"
1459
- msgstr ""
1460
 
1461
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:208
1462
  #, php-format
@@ -1464,18 +1578,21 @@ msgid ""
1464
  "You can signup for a sandbox developer account <a href=\"%s\">here</a>. You "
1465
  "need a developer account if you want to enable Sandbox mode for testing."
1466
  msgstr ""
 
 
 
1467
 
1468
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:240
1469
  msgid "Misc. Settings"
1470
- msgstr ""
1471
 
1472
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:245
1473
  msgid "Enable PayPal Sandbox mode"
1474
- msgstr ""
1475
 
1476
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:251
1477
  msgid "Enable logging"
1478
- msgstr ""
1479
 
1480
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:269
1481
  msgid ""
@@ -1483,36 +1600,40 @@ msgid ""
1483
  "due commission (if enabled). Also used to mass pay vendors on a schedule / "
1484
  "manual method (if enabled)."
1485
  msgstr ""
 
 
 
1486
 
1487
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:280
1488
  msgid "Gateway Disabled"
1489
- msgstr ""
1490
 
1491
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:280
1492
  #, php-format
1493
  msgid "%s does not support your store currency."
1494
- msgstr ""
1495
 
1496
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:384
1497
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:498
1498
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:153
1499
  #, php-format
1500
  msgid "Error: %s"
1501
- msgstr ""
1502
 
1503
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:393
1504
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:394
1505
  #, php-format
1506
  msgid "Error ID: %s. %s"
1507
- msgstr ""
1508
 
1509
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:115
1510
  msgid "No vendors found to pay. Maybe they haven't set a PayPal address?"
1511
  msgstr ""
 
1512
 
1513
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:167
1514
  msgid "All due commission has been paid for."
1515
- msgstr ""
1516
 
1517
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:173
1518
  msgid ""
@@ -1520,36 +1641,42 @@ msgid ""
1520
  "profiles due to an internal error. Commission will still be listed as due. "
1521
  "Please manually mark the commission as paid from the Commissions page."
1522
  msgstr ""
 
 
 
 
1523
 
1524
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:208
1525
  msgid "WooCommerce: Mass payments for vendors update"
1526
- msgstr ""
1527
 
1528
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:210
1529
  msgid ""
1530
  "Hello! A payment was just triggered to mass pay all vendors their due "
1531
  "commission."
1532
  msgstr ""
 
 
1533
 
1534
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:211
1535
  #, php-format
1536
  msgid "Payment status: %s."
1537
- msgstr ""
1538
 
1539
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:212
1540
  #, php-format
1541
  msgid "Payment message: %s."
1542
- msgstr ""
1543
 
1544
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:215
1545
  #, php-format
1546
  msgid "Payment total: %s."
1547
- msgstr ""
1548
 
1549
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:35
1550
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:71
1551
  msgid "WC Vendors Test Gateway"
1552
- msgstr ""
1553
 
1554
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:36
1555
  msgid ""
@@ -1558,18 +1685,21 @@ msgid ""
1558
  "problems with this - you should use this gateway for all of your non-PayPal "
1559
  "testing."
1560
  msgstr ""
 
 
 
1561
 
1562
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:64
1563
  msgid "Enable WC Vendors Test Gateway Payment"
1564
- msgstr ""
1565
 
1566
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:68
1567
  msgid "Title"
1568
- msgstr ""
1569
 
1570
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:77
1571
  msgid "Payment method description that the customer will see on your checkout."
1572
- msgstr ""
1573
 
1574
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:78
1575
  msgid ""
@@ -1577,10 +1707,13 @@ msgid ""
1577
  "transactions. <a href=\"http://www.wcvendors.com/\" target=\"top\">Click "
1578
  "here to visit WCVendors.com</a>."
1579
  msgstr ""
 
 
 
1580
 
1581
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:82
1582
  msgid "Instructions"
1583
- msgstr ""
1584
 
1585
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:84
1586
  msgid ""
@@ -1588,219 +1721,243 @@ msgid ""
1588
  "be sent an email as long as you have the Notify Vendors email enabled under "
1589
  "WooCommerce--Settings--Emails."
1590
  msgstr ""
 
 
 
1591
 
1592
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:124
1593
  msgid "Test gateway transation complete. Order processing."
1594
- msgstr ""
1595
 
1596
  #: ../templates/dashboard/denied.php:8
1597
  msgid ""
1598
  "Your account has not yet been approved to become a vendor. When it is, you "
1599
  "will receive an email telling you that your account is approved!"
1600
  msgstr ""
 
 
1601
 
1602
  #: ../templates/dashboard/denied.php:12
1603
  msgid "Your account is not setup as a vendor."
1604
- msgstr ""
1605
 
1606
  #: ../templates/dashboard/denied.php:33
1607
  #, php-format
1608
  msgid "I have read and accepted the <a href=\"%s\">terms and conditions</a>"
1609
  msgstr ""
 
1610
 
1611
  #: ../templates/dashboard/denied.php:53
1612
  msgid "Submit"
1613
- msgstr ""
1614
 
1615
  #: ../templates/dashboard/links.php:3
1616
  msgid "View Your Store"
1617
- msgstr ""
1618
 
1619
  #: ../templates/dashboard/links.php:4
1620
  msgid "Store Settings"
1621
- msgstr ""
1622
 
1623
  #: ../templates/dashboard/links.php:7
1624
  msgid "Add New Product"
1625
- msgstr ""
1626
 
1627
  #: ../templates/dashboard/links.php:8
1628
  msgid "Edit Products"
1629
- msgstr ""
1630
 
1631
  #: ../templates/dashboard/orders.php:7 ../templates/dashboard/orders.php:10
1632
  msgid "Hide items"
1633
- msgstr ""
1634
 
1635
  #: ../templates/dashboard/orders.php:8 ../templates/dashboard/orders.php:79
1636
  msgid "View items"
1637
- msgstr ""
1638
 
1639
  #: ../templates/dashboard/orders.php:37
1640
  msgid "Links"
1641
- msgstr ""
1642
 
1643
  #: ../templates/dashboard/orders.php:100
1644
  msgid "Tracking"
1645
- msgstr ""
1646
 
1647
  #: ../templates/dashboard/orders.php:176
1648
  msgid "You have no orders during this period."
1649
- msgstr ""
1650
 
1651
  #: ../templates/dashboard/reports.php:1
1652
  msgid "Sales Report"
1653
- msgstr ""
1654
 
1655
  #: ../templates/dashboard/reports.php:20
1656
  msgid "Rate"
1657
- msgstr ""
1658
 
1659
  #: ../templates/dashboard/reports.php:47
1660
  msgid "Show Orders"
1661
- msgstr ""
1662
 
1663
  #: ../templates/dashboard/reports.php:56
1664
  msgid "Totals"
1665
- msgstr ""
1666
 
1667
  #: ../templates/dashboard/reports.php:71
1668
  msgid "You have no sales during this period."
1669
- msgstr ""
1670
 
1671
  #: ../templates/dashboard/reports.php:82
1672
  msgid "You haven't made any sales yet."
1673
- msgstr ""
1674
 
1675
  #: ../templates/dashboard/settings/settings.php:47
1676
  msgid "Save"
1677
- msgstr ""
1678
 
1679
  #: ../templates/emails/application-status.php:5
1680
  #, php-format
1681
  msgid "Hi there. This is a notification about a vendor application on %s."
1682
- msgstr ""
1683
 
1684
  #: ../templates/emails/application-status.php:8
1685
  #, php-format
1686
  msgid "Application status: %s"
1687
- msgstr ""
1688
 
1689
  #: ../templates/emails/application-status.php:9
1690
  #, php-format
1691
  msgid "Applicant username: %s"
1692
- msgstr ""
1693
 
1694
  #: ../templates/emails/new-product.php:5
1695
  #, php-format
1696
  msgid "Hi there. This is a notification about a new product on %s."
1697
- msgstr ""
1698
 
1699
  #: ../templates/emails/new-product.php:8
1700
  #, php-format
1701
  msgid "Product title: %s"
1702
- msgstr ""
1703
 
1704
  #: ../templates/emails/new-product.php:9
1705
  #, php-format
1706
  msgid "Submitted by: %s"
1707
- msgstr ""
1708
 
1709
  #: ../templates/emails/new-product.php:10
1710
  #, php-format
1711
  msgid "Edit product: %s"
1712
- msgstr ""
1713
 
1714
  #: ../templates/emails/notify-vendor-shipped.php:13
1715
  msgid ""
1716
  "A vendor has marked part of your order as shipped. The items that are "
1717
  "shipped are as follows:"
1718
  msgstr ""
 
 
1719
 
1720
  #: ../templates/emails/notify-vendor-shipped.php:17
1721
  #: ../templates/emails/vendor-new-order.php:17
1722
  #, php-format
1723
  msgid "Order: %s"
1724
- msgstr ""
1725
 
1726
  #: ../templates/emails/notify-vendor-shipped.php:24
1727
  #: ../templates/emails/vendor-new-order.php:24
1728
  msgid "Price"
1729
- msgstr ""
1730
 
1731
  #: ../templates/emails/notify-vendor-shipped.php:56
1732
  #: ../templates/emails/vendor-new-order.php:56
1733
  msgid "Customer details"
1734
- msgstr ""
1735
 
1736
  #: ../templates/emails/notify-vendor-shipped.php:59
1737
  #: ../templates/emails/vendor-new-order.php:59
1738
  msgid "Email:"
1739
- msgstr ""
1740
 
1741
  #: ../templates/emails/notify-vendor-shipped.php:62
1742
  #: ../templates/emails/vendor-new-order.php:62
1743
  msgid "Tel:"
1744
- msgstr ""
1745
 
1746
  #: ../templates/emails/vendor-new-order.php:13
1747
  #, php-format
1748
  msgid "You have received an order from %s. Their order is as follows:"
1749
- msgstr ""
1750
 
1751
  #: ../templates/orders/csv-export.php:6
1752
  msgid "Export orders"
1753
- msgstr ""
1754
 
1755
  #: ../templates/orders/customer-note/customer-note.php:4
1756
  msgid "Customer note"
1757
- msgstr ""
1758
 
1759
  #: ../templates/orders/customer-note/customer-note.php:8
1760
  msgid "No customer note."
1761
- msgstr ""
1762
 
1763
  #: ../templates/orders/shipping/shipping-form.php:6
1764
  msgid "Provider:"
1765
- msgstr ""
1766
 
1767
  #: ../templates/orders/shipping/shipping-form.php:8
1768
  msgid "Custom Provider"
1769
- msgstr ""
1770
 
1771
  #: ../templates/orders/shipping/shipping-form.php:31
1772
  msgid "Provider Name:"
1773
- msgstr ""
1774
 
1775
  #: ../templates/orders/shipping/shipping-form.php:40
1776
  msgid "Tracking number:"
1777
- msgstr ""
1778
 
1779
  #: ../templates/orders/shipping/shipping-form.php:48
1780
  msgid "Tracking link:"
1781
- msgstr ""
1782
 
1783
  #: ../templates/orders/shipping/shipping-form.php:58
1784
  msgid "Date shipped:"
1785
- msgstr ""
1786
 
1787
  #: ../templates/orders/shipping/shipping-form.php:66
1788
  msgid "Preview:"
1789
- msgstr ""
1790
 
1791
  #: ../templates/orders/shipping/shipping-form.php:66
1792
  msgid "Click here to track your shipment"
1793
- msgstr ""
1794
 
1795
  #: ../templates/orders/shipping/shipping-form.php:75
1796
  msgid "Update tracking number"
1797
- msgstr ""
1798
 
1799
  #: ../templates/orders/shipping/shipping-form.php:77
1800
  msgid "Mark as shipped"
1801
- msgstr ""
1802
 
1803
  #: ../templates/orders/table-body.php:25
1804
  #, php-format
1805
  msgid "Quantity: %d"
1806
- msgstr ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WC Vendors\n"
4
+ "POT-Creation-Date: 2016-03-24 21:34+0100\n"
5
+ "PO-Revision-Date: 2016-03-31 18:38+0200\n"
6
  "Last-Translator: \n"
7
  "Language-Team: WC Vendors <support@wcvendors.com>\n"
8
+ "Language: sv_SE\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.8.6\n"
13
  "X-Poedit-Basepath: .\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
22
  "WC Vendors requires WooCommerce to run. Please install WooCommerce and "
23
  "activate before attempting to activate again."
24
  msgstr ""
25
+ "WC Vendors Pro kräver WooCommerce för att fungera. Vänligen installera "
26
+ "WooCommerce och aktivera innan du försöker aktivera WC Vendors Pro igen."
27
 
28
  #: ../class-wc-vendors.php:81 ../classes/admin/class-admin-reports.php:41
29
  #: ../classes/admin/class-admin-users.php:399
30
  msgid "WC Vendors"
31
+ msgstr "WC Vendors"
32
 
33
  #: ../class-wc-vendors.php:109
34
  msgid ""
35
  "<b>WC Vendors is disabled</b>. WC Vendors requires a minimum of WooCommerce "
36
  "v2.4.0."
37
  msgstr ""
38
+ "<b>WC Vendors är inaktiverat</b>. WC Vendors kräver minst WooCommerce v2.2.0."
39
 
40
  #: ../class-wc-vendors.php:248 ../classes/admin/settings/sf-options.php:183
41
  msgid "Capabilities"
42
+ msgstr "Funktioner"
43
 
44
  #: ../class-wc-vendors.php:271 ../classes/admin/class-admin-page.php:253
45
  #: ../classes/admin/class-admin-reports.php:175
48
  #: ../classes/admin/class-product-meta.php:187
49
  #: ../classes/admin/class-product-meta.php:223 ../classes/class-install.php:66
50
  msgid "Vendor"
51
+ msgstr "Säljare"
52
 
53
  #: ../class-wc-vendors.php:273 ../classes/admin/settings/sf-options.php:4
54
  msgid "General"
55
+ msgstr "Allmänt"
56
 
57
  #: ../class-wc-vendors.php:311
58
  msgid "Documentation/KB"
59
+ msgstr "Dokumentation/KB"
60
 
61
  #: ../class-wc-vendors.php:312
62
  msgid "Help Forums"
63
+ msgstr "Hjälpforum"
64
 
65
  #: ../class-wc-vendors.php:313
66
  msgid "Paid Support"
67
+ msgstr "Betald Support"
68
 
69
  #: ../class-wc-vendors.php:335
70
  #, php-format
72
  "WC Vendors requires the Vendor shop page value be set <a href=\"%s\">click "
73
  "here to set it.</a> | <a href=\"%s\">Hide Notice</a>"
74
  msgstr ""
75
+ "WC Vendors kräver att säljarnas butikssida är inställd <a href=”%s”>Klicka "
76
+ "här för att ställa in den.</a> | <a href=”%s”>Göm notis</a>"
77
 
78
  #: ../class-wc-vendors.php:343
79
  #, php-format
81
  "You must save your permalinks once you have modified your vendor page. <a "
82
  "href=\"%s\">click here to save</a>. | <a href=\"%s\">Hide Notice</a>"
83
  msgstr ""
84
+ "Du måste spara dina permalänkar när du har ändrat leverantörssidan. <a "
85
+ "href=”%s”>Klicka här för att spara</a> . | <a href=”%s”>Göm notis</a>"
86
 
87
  #: ../classes/admin/class-admin-page.php:27
88
  msgid "Vendors shipped"
89
+ msgstr "Säljaren skickat"
90
 
91
  #: ../classes/admin/class-admin-page.php:50
92
  msgid "Vendors Shipped"
93
+ msgstr "Säljaren skickat"
94
 
95
  #: ../classes/admin/class-admin-page.php:72
96
  #: ../classes/admin/class-admin-page.php:132
98
  #: ../classes/admin/class-product-meta.php:167
99
  #: ../templates/dashboard/reports.php:19
100
  msgid "Commission"
101
+ msgstr "Provision"
102
 
103
  #: ../classes/admin/class-admin-page.php:251
104
  #: ../classes/admin/class-admin-reports.php:174
106
  #: ../templates/emails/notify-vendor-shipped.php:22
107
  #: ../templates/emails/vendor-new-order.php:22
108
  msgid "Product"
109
+ msgstr "Produkt"
110
 
111
  #: ../classes/admin/class-admin-page.php:252
112
  #: ../classes/admin/class-vendor-admin-dashboard.php:283
113
  msgid "Order ID"
114
+ msgstr "Ordernummer"
115
 
116
  #: ../classes/admin/class-admin-page.php:254
117
  #: ../classes/admin/class-admin-reports.php:176
119
  #: ../classes/admin/class-vendor-admin-dashboard.php:286
120
  #: ../templates/dashboard/orders.php:35
121
  msgid "Total"
122
+ msgstr "Totalt"
123
 
124
  #: ../classes/admin/class-admin-page.php:255
125
  #: ../classes/admin/class-admin-reports.php:178
126
  #: ../classes/admin/class-admin-reports.php:458
127
  msgid "Status"
128
+ msgstr "Status"
129
 
130
  #: ../classes/admin/class-admin-page.php:256
131
  #: ../classes/admin/class-vendor-admin-dashboard.php:288
132
  #: ../classes/front/orders/class-orders.php:181
133
  #: ../templates/dashboard/orders.php:36
134
  msgid "Date"
135
+ msgstr "Datum"
136
 
137
  #: ../classes/admin/class-admin-page.php:293
138
  msgid "Mark paid"
139
+ msgstr "Markera som betald"
140
 
141
  #: ../classes/admin/class-admin-page.php:294
142
  msgid "Mark due"
143
+ msgstr "Markera som obetald"
144
 
145
  #: ../classes/admin/class-admin-page.php:295
146
  msgid "Mark reversed"
147
+ msgstr "Markera som avbruten"
148
 
149
  #: ../classes/admin/class-admin-page.php:312
150
  #: ../classes/admin/class-admin-page.php:316
151
  msgid "Filter"
152
+ msgstr "Filter"
153
 
154
  #: ../classes/admin/class-admin-page.php:351
155
  msgid "Show all dates"
156
+ msgstr "Visa alla datum"
157
 
158
  #: ../classes/admin/class-admin-page.php:364
159
  #, php-format
160
  msgid "%1$s %2$d"
161
+ msgstr "%1$s %2$d"
162
 
163
  #: ../classes/admin/class-admin-page.php:386
164
  msgid "Show all Statuses"
165
+ msgstr "Visa alla Statusar"
166
 
167
  #: ../classes/admin/class-admin-page.php:412
168
  msgid "Commission marked paid."
169
+ msgstr "Provision markerad som betald."
170
 
171
  #: ../classes/admin/class-admin-page.php:419
172
  msgid "Commission marked due."
173
+ msgstr "Provision markerad som obetald."
174
 
175
  #: ../classes/admin/class-admin-page.php:426
176
  msgid "Commission marked reversed."
177
+ msgstr "Provision markerad som avbruten."
178
 
179
  #: ../classes/admin/class-admin-reports.php:44
180
  msgid "Overview"
181
+ msgstr "Översikt"
182
 
183
  #: ../classes/admin/class-admin-reports.php:50
184
  msgid "Commission by vendor"
185
+ msgstr "Provision per säljare"
186
 
187
  #: ../classes/admin/class-admin-reports.php:56
188
  msgid "Commission by product"
189
+ msgstr "Provision per produkt"
190
 
191
  #: ../classes/admin/class-admin-reports.php:62
192
  #: ../classes/admin/class-admin-reports.php:345
193
  msgid "Commission Totals"
194
+ msgstr "Provision Totalt"
195
 
196
  #: ../classes/admin/class-admin-reports.php:63
197
  msgid ""
199
  "date range is used and all due commissions are returned. Use the date range "
200
  "to filter."
201
  msgstr ""
202
+ "Total provision för alla säljare inkluderar frakt och skatter. Som standard "
203
+ "används inget datumintervall och alla innestående provisioner returneras. "
204
+ "Använd datumintervall för att filtrera."
205
 
206
  #: ../classes/admin/class-admin-reports.php:121
207
  #: ../classes/admin/class-admin-reports.php:437
208
  #: ../templates/dashboard/date-picker.php:3
209
  msgid "From:"
210
+ msgstr "Från:"
211
 
212
  #: ../classes/admin/class-admin-reports.php:123
213
  #: ../classes/admin/class-admin-reports.php:439
214
  #: ../templates/dashboard/date-picker.php:7
215
  msgid "To:"
216
+ msgstr "Till:"
217
 
218
  #: ../classes/admin/class-admin-reports.php:125
219
  #: ../classes/admin/class-admin-reports.php:283
220
  #: ../classes/admin/class-admin-reports.php:448
221
  #: ../templates/dashboard/date-picker.php:12
222
  msgid "Show"
223
+ msgstr "Visa"
224
 
225
  #: ../classes/admin/class-admin-reports.php:131
226
  msgid "Total paid in range"
227
+ msgstr "Totalt utbetalt under perioden"
228
 
229
  #: ../classes/admin/class-admin-reports.php:134
230
  #: ../classes/admin/class-admin-reports.php:141
231
  #: ../classes/admin/class-admin-reports.php:148
232
  msgid "n/a"
233
+ msgstr "n/a"
234
 
235
  #: ../classes/admin/class-admin-reports.php:138
236
  msgid "Total due in range"
237
+ msgstr "Totalt inte utbetalt under perioden"
238
 
239
  #: ../classes/admin/class-admin-reports.php:145
240
  msgid "Total reversed in range"
241
+ msgstr "Totalt avbrutet under perioden"
242
 
243
  #: ../classes/admin/class-admin-reports.php:155
244
  msgid "Recent Commission"
245
+ msgstr "Senaste provisioner"
246
 
247
  #: ../classes/admin/class-admin-reports.php:173
248
  #: ../classes/front/orders/class-orders.php:173
249
  #: ../templates/dashboard/orders.php:33
250
  msgid "Order"
251
+ msgstr "Beställning"
252
 
253
  #: ../classes/admin/class-admin-reports.php:177
254
  msgid "Date &amp; Time"
255
+ msgstr "Datum &amp; Tid"
256
 
257
  #: ../classes/admin/class-admin-reports.php:186
258
  msgid "N/A"
259
+ msgstr "N/A"
260
 
261
  #: ../classes/admin/class-admin-reports.php:191
262
  msgid "D j M Y \\a\\t h:ia"
263
+ msgstr "D j M Y \\a\\t h:ia"
264
 
265
  #: ../classes/admin/class-admin-reports.php:200
266
  msgid "No commission yet"
267
+ msgstr "Ingen provision ännu"
268
 
269
  #: ../classes/admin/class-admin-reports.php:234
270
  msgid "Show:"
271
+ msgstr "Visa:"
272
 
273
  #: ../classes/admin/class-admin-reports.php:243
274
  msgid "Search for a product&hellip;"
275
+ msgstr "Sök efter produktt&hellip;"
276
 
277
  #: ../classes/admin/class-admin-reports.php:246
278
  msgid "Type in a product name to start searching..."
279
+ msgstr "Sök efter produktnamn…"
280
 
281
  #: ../classes/admin/class-admin-reports.php:278
282
  msgid "Select a vendor&hellip;"
283
+ msgstr "Välj en säljare&hellip;"
284
 
285
  #: ../classes/admin/class-admin-reports.php:344
286
  msgid "Month"
287
+ msgstr "Månad"
288
 
289
  #: ../classes/admin/class-admin-reports.php:346
290
  msgid "Tax"
291
+ msgstr "Moms"
292
 
293
  #: ../classes/admin/class-admin-reports.php:347
294
  #: ../classes/admin/settings/sf-options.php:52
295
  #: ../classes/admin/settings/sf-options.php:127
296
  #: ../templates/dashboard/orders.php:34 ../templates/orders/orders.php:115
297
  msgid "Shipping"
298
+ msgstr "Frakt"
299
 
300
  #: ../classes/admin/class-admin-reports.php:348
301
  #: ../classes/admin/class-admin-reports.php:445
302
  msgid "Reversed"
303
+ msgstr "Avbruten"
304
 
305
  #: ../classes/admin/class-admin-reports.php:349
306
  #: ../classes/admin/class-admin-reports.php:444
307
  msgid "Paid"
308
+ msgstr "Betald"
309
 
310
  #: ../classes/admin/class-admin-reports.php:350
311
  #: ../classes/admin/class-admin-reports.php:443
312
  msgid "Due"
313
+ msgstr "Obetald"
314
 
315
  #: ../classes/admin/class-admin-reports.php:456
316
  msgid "Tax Total"
317
+ msgstr "Total skatt"
318
 
319
  #: ../classes/admin/class-admin-reports.php:457
320
  msgid "Shipping Total"
321
+ msgstr "Total frakt"
322
 
323
  #: ../classes/admin/class-admin-reports.php:459
324
  msgid "Commission Total"
325
+ msgstr "Total provision"
326
 
327
  #: ../classes/admin/class-admin-reports.php:481
328
  msgid "No commissions found."
329
+ msgstr "Inga provisioner hittades."
330
 
331
  #: ../classes/admin/class-admin-users.php:409
332
  msgid "Enable HTML for the shop description"
333
+ msgstr "Aktivera HTML för butiksbeskrivningen"
334
 
335
  #: ../classes/admin/class-admin-users.php:415
336
  msgid "Shop name"
337
+ msgstr "Butiksnamn"
338
 
339
  #: ../classes/admin/class-admin-users.php:422
340
  msgid "PayPal E-mail"
341
+ msgstr "PayPal E-post"
342
 
343
  #: ../classes/admin/class-admin-users.php:423
344
  msgid "required"
345
+ msgstr "obligatorisk"
346
 
347
  #: ../classes/admin/class-admin-users.php:430
348
  msgid "Commission rate"
349
+ msgstr "Provision"
350
 
351
  #: ../classes/admin/class-admin-users.php:431
352
  #: ../classes/admin/class-product-meta.php:174
353
  msgid "Leave blank for default"
354
+ msgstr "Lämna blankt för standard"
355
 
356
  #: ../classes/admin/class-admin-users.php:437
357
  msgid "Give Tax"
358
+ msgstr "Ge Skatt"
359
 
360
  #: ../classes/admin/class-admin-users.php:442
361
  msgid "Tax override for vendor"
362
+ msgstr "Skatteundantag för säljare"
363
 
364
  #: ../classes/admin/class-admin-users.php:448
365
  msgid "Give Shipping"
366
+ msgstr "Ge Frakt"
367
 
368
  #: ../classes/admin/class-admin-users.php:453
369
  msgid "Shipping override for vendor"
370
+ msgstr "Fraktundantag för säljare"
371
 
372
  #: ../classes/admin/class-admin-users.php:459
373
  #: ../classes/admin/views/html-vendor-settings-page.php:30
374
  #: ../templates/dashboard/settings/seller-info.php:3
375
  msgid "Seller info"
376
+ msgstr "Säljarinfo"
377
 
378
  #: ../classes/admin/class-admin-users.php:464
379
  msgid "Shop description"
380
+ msgstr "Butiksbeskrivning"
381
 
382
  #: ../classes/admin/class-vendor-admin-dashboard.php:20
383
  #: ../classes/class-install.php:167
384
  msgid "Shop Settings"
385
+ msgstr "Butiksinställningar"
386
 
387
  #: ../classes/admin/class-vendor-admin-dashboard.php:21
388
  #: ../classes/admin/class-vendor-admin-dashboard.php:146
389
  #: ../classes/admin/settings/sf-options.php:187
390
  #: ../classes/class-install.php:166 ../templates/dashboard/orders.php:24
391
  msgid "Orders"
392
+ msgstr "Beställningar"
393
 
394
  #: ../classes/admin/class-vendor-admin-dashboard.php:58
395
  #: ../classes/front/dashboard/class-vendor-dashboard.php:106
396
  msgid "Your PayPal address is not a valid email address."
397
+ msgstr "Din PayPal adress är inte en korrekt e-post adress."
398
 
399
  #: ../classes/admin/class-vendor-admin-dashboard.php:67
400
  #: ../classes/front/dashboard/class-vendor-dashboard.php:115
401
  msgid "That shop name is already taken. Your shop name must be unique."
402
+ msgstr "Butiksnamnet är redan taget. Ditt butiksnamn måste vara unikt."
403
 
404
  #: ../classes/admin/class-vendor-admin-dashboard.php:87
405
  #: ../classes/admin/settings/classes/sf-class-settings.php:368
406
  #: ../classes/front/dashboard/class-vendor-dashboard.php:133
407
  msgid "Settings saved."
408
+ msgstr "Inställningar sparade."
409
 
410
  #: ../classes/admin/class-vendor-admin-dashboard.php:284
411
  msgid "Customer"
412
+ msgstr "Kund"
413
 
414
  #: ../classes/admin/class-vendor-admin-dashboard.php:285
415
  #: ../classes/admin/settings/sf-options.php:118
416
  #: ../classes/admin/settings/sf-options.php:245
417
  msgid "Products"
418
+ msgstr "Produkter"
419
 
420
  #: ../classes/admin/class-vendor-admin-dashboard.php:289
421
  #: ../templates/dashboard/orders.php:92
422
  msgid "Shipped"
423
+ msgstr "Skickad"
424
 
425
  #: ../classes/admin/class-vendor-admin-dashboard.php:324
426
  #: ../templates/dashboard/orders.php:85
427
  msgid "Mark shipped"
428
+ msgstr "Markera som skickad"
429
 
430
  #: ../classes/admin/class-vendor-admin-dashboard.php:349
431
  msgid "Orders marked shipped."
432
+ msgstr "Beställningar markerade som skickade."
433
 
434
  #: ../classes/admin/class-vendor-admin-dashboard.php:465
435
  #: ../templates/orders/orders.php:84
436
  #, php-format
437
  msgid "Comments (%s)"
438
+ msgstr "Kommentarer (%s)"
439
 
440
  #: ../classes/admin/class-vendor-admin-dashboard.php:468
441
  msgid "Comments to Customer"
442
+ msgstr "Kommentarer till Kunder"
443
 
444
  #: ../classes/admin/class-vendor-admin-dashboard.php:477
445
  #: ../templates/orders/comments/existing-comments.php:9
446
  #, php-format
447
  msgid "added %s ago"
448
+ msgstr "tillagd för %s sen"
449
 
450
  #: ../classes/admin/class-vendor-admin-dashboard.php:483
451
  msgid "No comments currently to customer."
452
+ msgstr "För tillfället inga kommentarer till kunden."
453
 
454
  #: ../classes/admin/class-vendor-admin-dashboard.php:492
455
  #: ../templates/orders/comments/add-new-comment.php:11
456
  msgid "Add comment"
457
+ msgstr "Lägg till kommentar"
458
 
459
  #: ../classes/admin/class-vendor-applicants.php:26
460
  msgid "Approve"
461
+ msgstr "Godkänn"
462
 
463
  #: ../classes/admin/class-vendor-applicants.php:27
464
  msgid "Deny"
465
+ msgstr "Ej godkänd"
466
 
467
  #: ../classes/admin/class-vendor-applicants.php:73
468
  msgid "Vendor has been <b>denied</b>."
469
+ msgstr "Säljaren har <b>inte blivit godkänd</b>."
470
 
471
  #: ../classes/admin/class-vendor-applicants.php:84
472
  msgid "Vendor has been <b>approved</b>."
473
+ msgstr "Säljaren har <b> blivit godkänd</b>."
474
 
475
  #: ../classes/admin/class-vendor-applicants.php:98
476
  msgid "Pending Vendors"
477
+ msgstr "Väntande Säljare"
478
 
479
  #: ../classes/admin/emails/class-emails.php:59
480
  #: ../classes/admin/emails/class-wc-approve-vendor.php:70
481
  msgid "pending"
482
+ msgstr "väntande"
483
 
484
  #: ../classes/admin/emails/class-emails.php:61
485
  msgid "approved"
486
+ msgstr "godkänd"
487
 
488
  #: ../classes/admin/emails/class-emails.php:63
489
  msgid "denied"
490
+ msgstr "ej godkänd"
491
 
492
  #: ../classes/admin/emails/class-wc-approve-vendor.php:28
493
  msgid "Vendor Application"
494
+ msgstr "Säljaransökan"
495
 
496
  #: ../classes/admin/emails/class-wc-approve-vendor.php:29
497
  msgid "Vendor application will either be approved, denied, or pending."
498
+ msgstr "Säljaransökan kommer antingen bli godkänd, ej godkänd, eller väntande."
499
 
500
  #: ../classes/admin/emails/class-wc-approve-vendor.php:31
501
  msgid "Application {status}"
502
+ msgstr "Ansökan {status}"
503
 
504
  #: ../classes/admin/emails/class-wc-approve-vendor.php:32
505
  msgid "[{blogname}] Your vendor application has been {status}"
506
+ msgstr "[{blogname}] Din säljaransökan {status}"
507
 
508
  #: ../classes/admin/emails/class-wc-approve-vendor.php:123
509
  #: ../classes/admin/emails/class-wc-notify-admin.php:134
511
  #: ../classes/admin/emails/class-wc-notify-vendor.php:258
512
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:62
513
  msgid "Enable/Disable"
514
+ msgstr "Aktivera/Avaktivera"
515
 
516
  #: ../classes/admin/emails/class-wc-approve-vendor.php:125
517
  #: ../classes/admin/emails/class-wc-notify-admin.php:136
518
  #: ../classes/admin/emails/class-wc-notify-shipped.php:165
519
  #: ../classes/admin/emails/class-wc-notify-vendor.php:260
520
  msgid "Enable this email notification"
521
+ msgstr "Aktivera denna e-postnotis"
522
 
523
  #: ../classes/admin/emails/class-wc-approve-vendor.php:129
524
  #: ../classes/admin/emails/class-wc-notify-admin.php:140
525
  msgid "Recipient(s)"
526
+ msgstr "Mottagare"
527
 
528
  #: ../classes/admin/emails/class-wc-approve-vendor.php:131
529
  #: ../classes/admin/emails/class-wc-notify-admin.php:142
532
  "Enter recipients (comma separated) for this email. Defaults to <code>%s</"
533
  "code>."
534
  msgstr ""
535
+ "Ange mottagare (separerade med komma) för denna e-post. Standard till <code>"
536
+ "%s</code>."
537
 
538
  #: ../classes/admin/emails/class-wc-approve-vendor.php:136
539
  #: ../classes/admin/emails/class-wc-notify-admin.php:147
540
  #: ../classes/admin/emails/class-wc-notify-shipped.php:169
541
  #: ../classes/admin/emails/class-wc-notify-vendor.php:264
542
  msgid "Subject"
543
+ msgstr "Ämne"
544
 
545
  #: ../classes/admin/emails/class-wc-approve-vendor.php:138
546
  #: ../classes/admin/emails/class-wc-notify-admin.php:149
551
  "This controls the email subject line. Leave blank to use the default "
552
  "subject: <code>%s</code>."
553
  msgstr ""
554
+ "Detta styr e-postens ämnesrad. Lämna blank för att använda standardämnet: "
555
+ "<code>%s</code>."
556
 
557
  #: ../classes/admin/emails/class-wc-approve-vendor.php:143
558
  #: ../classes/admin/emails/class-wc-notify-admin.php:154
559
  #: ../classes/admin/emails/class-wc-notify-shipped.php:176
560
  #: ../classes/admin/emails/class-wc-notify-vendor.php:271
561
  msgid "Email Heading"
562
+ msgstr "E-post Rubrik"
563
 
564
  #: ../classes/admin/emails/class-wc-approve-vendor.php:145
565
  #: ../classes/admin/emails/class-wc-notify-admin.php:156
570
  "This controls the main heading contained within the email notification. "
571
  "Leave blank to use the default heading: <code>%s</code>."
572
  msgstr ""
573
+ "Detta bestämmer sidhuvudet i e-postutskicket. Lämna tomt för att använda "
574
+ "standardsidhuvudet: <code>%s</code>."
575
 
576
  #: ../classes/admin/emails/class-wc-approve-vendor.php:150
577
  #: ../classes/admin/emails/class-wc-notify-admin.php:161
578
  #: ../classes/admin/emails/class-wc-notify-shipped.php:183
579
  #: ../classes/admin/emails/class-wc-notify-vendor.php:278
580
  msgid "Email type"
581
+ msgstr "E-post typ"
582
 
583
  #: ../classes/admin/emails/class-wc-approve-vendor.php:152
584
  #: ../classes/admin/emails/class-wc-notify-admin.php:163
585
  #: ../classes/admin/emails/class-wc-notify-shipped.php:185
586
  #: ../classes/admin/emails/class-wc-notify-vendor.php:280
587
  msgid "Choose which format of email to send."
588
+ msgstr "Välj format för e-post som ska skickas."
589
 
590
  #: ../classes/admin/emails/class-wc-approve-vendor.php:156
591
  #: ../classes/admin/emails/class-wc-notify-admin.php:167
592
  #: ../classes/admin/emails/class-wc-notify-shipped.php:189
593
  #: ../classes/admin/emails/class-wc-notify-vendor.php:284
594
  msgid "Plain text"
595
+ msgstr "Ren text"
596
 
597
  #: ../classes/admin/emails/class-wc-approve-vendor.php:157
598
  #: ../classes/admin/emails/class-wc-notify-admin.php:168
599
  #: ../classes/admin/emails/class-wc-notify-shipped.php:190
600
  #: ../classes/admin/emails/class-wc-notify-vendor.php:285
601
  msgid "HTML"
602
+ msgstr "HTML"
603
 
604
  #: ../classes/admin/emails/class-wc-approve-vendor.php:158
605
  #: ../classes/admin/emails/class-wc-notify-admin.php:169
606
  #: ../classes/admin/emails/class-wc-notify-shipped.php:191
607
  #: ../classes/admin/emails/class-wc-notify-vendor.php:286
608
  msgid "Multipart"
609
+ msgstr "Multidelar"
610
 
611
  #: ../classes/admin/emails/class-wc-notify-admin.php:28
612
  msgid "New Vendor Product"
613
+ msgstr "Ny produkt från säljare"
614
 
615
  #: ../classes/admin/emails/class-wc-notify-admin.php:29
616
  msgid "New order emails are sent when a new product is submitted by a vendor"
617
  msgstr ""
618
+ "E-post om ny beställning skickas när en produkt har lagts upp av en säljare"
619
 
620
  #: ../classes/admin/emails/class-wc-notify-admin.php:31
621
  msgid "New product submitted: {product_name}"
622
+ msgstr "Ny produkt upplagd: {product_name}"
623
 
624
  #: ../classes/admin/emails/class-wc-notify-admin.php:32
625
  msgid "[{blogname}] New product submitted by {vendor_name} - {product_name}"
626
+ msgstr "[{blogname}] Ny produkt tillagd av {vendor_name} - {product_name}"
627
 
628
  #: ../classes/admin/emails/class-wc-notify-shipped.php:28
629
  msgid "Vendor has shipped"
630
+ msgstr "Säljaren har skickat"
631
 
632
  #: ../classes/admin/emails/class-wc-notify-shipped.php:29
633
  msgid ""
634
  "An email is sent when a vendor has marked one of their orders as shipped."
635
  msgstr ""
636
+ "E-post skickas ut när säljaren har markerat en av dess beställningar som "
637
+ "skickad."
638
 
639
  #: ../classes/admin/emails/class-wc-notify-shipped.php:31
640
  msgid "Your order has been shipped"
641
+ msgstr "Din beställning har blivit skickad"
642
 
643
  #: ../classes/admin/emails/class-wc-notify-shipped.php:32
644
  msgid ""
645
  "[{blogname}] Your order has been shipped ({order_number}) - {order_date}"
646
  msgstr ""
647
+ "[{blogname}] Din beställningar har blivit skickad ({order_number}) - "
648
+ "{order_date}"
649
 
650
  #: ../classes/admin/emails/class-wc-notify-shipped.php:112
651
  msgid "Subtotal:"
652
+ msgstr "Delsumma:"
653
 
654
  #: ../classes/admin/emails/class-wc-notify-vendor.php:27
655
  msgid "Notify vendors"
656
+ msgstr "Meddela säljare"
657
 
658
  #: ../classes/admin/emails/class-wc-notify-vendor.php:28
659
  msgid "New order emails are sent when an order is received/paid by a customer."
660
  msgstr ""
661
+ "E-post för nya beställningar skickas ut när en ny order görs av en kund."
662
 
663
  #: ../classes/admin/emails/class-wc-notify-vendor.php:30
664
  msgid "New customer order"
665
+ msgstr "Ny kundbeställning"
666
 
667
  #: ../classes/admin/emails/class-wc-notify-vendor.php:31
668
  msgid "[{blogname}] New customer order ({order_number}) - {order_date}"
669
+ msgstr "[{blogname}] Ny kundbeställning ({order_number}) - {order_date}"
670
 
671
  #: ../classes/admin/emails/class-wc-notify-vendor.php:113
672
  msgid "Commission Subtotal:"
673
+ msgstr "Provision Delsumma:"
674
 
675
  #: ../classes/admin/emails/class-wc-notify-vendor.php:119
676
  msgid "Tax Subtotal:"
677
+ msgstr "Skatt Delsumma:"
678
 
679
  #: ../classes/admin/emails/class-wc-notify-vendor.php:127
680
  msgid "Shipping Subtotal:"
681
+ msgstr "Frakt Delsumma:"
682
 
683
  #: ../classes/admin/settings/classes/sf-class-format-options.php:211
684
  #: ../classes/admin/settings/classes/sf-class-settings.php:780
685
  msgid "Select a page..."
686
+ msgstr "Välj en sida…"
687
 
688
  #: ../classes/admin/settings/classes/sf-class-settings.php:153
689
  #: ../templates/dashboard/settings/settings.php:1
690
  msgid "Settings"
691
+ msgstr "Inställningar"
692
 
693
  #: ../classes/admin/settings/classes/sf-class-settings.php:302
694
  msgid "Could not load settings at: "
695
+ msgstr "Det gick inte att ladda inställningar från:"
696
 
697
  #: ../classes/admin/settings/classes/sf-class-settings.php:302
698
  msgid "Error - WP Settings Framework"
699
+ msgstr "Fel - WP Settings Framework"
700
 
701
  #: ../classes/admin/settings/classes/sf-class-settings.php:484
702
  #, php-format
703
  msgid "Save %s changes"
704
+ msgstr "Spara %s ändringar"
705
 
706
  #: ../classes/admin/settings/classes/sf-class-settings.php:837
707
  #, php-format
708
  msgid "Update %s"
709
+ msgstr "Uppdatera %s"
710
 
711
  #: ../classes/admin/settings/classes/sf-class-settings.php:837
712
  #, php-format
713
  msgid "Add %s"
714
+ msgstr "Lägg till ny %s"
715
 
716
  #: ../classes/admin/settings/classes/sf-class-settings.php:837
717
  #, php-format
718
  msgid "Upload an image for the %s"
719
+ msgstr "Ladda upp en bild för %s"
720
 
721
  #: ../classes/admin/settings/sf-options.php:5
722
  msgid "General options"
723
+ msgstr "Allmänna alternativ"
724
 
725
  #: ../classes/admin/settings/sf-options.php:8
726
  msgid "Default commission (%)"
727
+ msgstr "Standard provision (%)"
728
 
729
  #: ../classes/admin/settings/sf-options.php:9
730
  msgid ""
733
  "user account.<br>Also, you can edit an individual products commission to "
734
  "override both of these settings on a per product basis."
735
  msgstr ""
736
+ "Den standardandel som du betalar varje säljare för en produktförsäljning."
737
+ "<br>Du kan också ge säljarna egna individuella provisionsandelar genom att "
738
+ "redigera säljarens användarkonto.<br>Dessutom kan du redigera provisionen på "
739
+ "enskilda produkter som åsidosätter båda dessa inställningar per produkt."
740
 
741
  #: ../classes/admin/settings/sf-options.php:20
742
  #: ../classes/admin/settings/sf-options.php:27
743
  msgid "Allow users or guests to apply to become a vendor"
744
+ msgstr "Tillåt användare eller gäster att bli säljare"
745
 
746
  #: ../classes/admin/settings/sf-options.php:22
747
  msgid ""
750
  "page</strong>\" in your <strong>WooCommerce > Settings > Accounts</strong> "
751
  "page for this option to work. Currently, you have registration disabled."
752
  msgstr ""
753
+ "Tillåt användare eller gäster att ansöka om att bli säljare."
754
+ "<br><br><strong>VARNING:</strong> Du måste ”<strong>aktivera registrering "
755
+ "på sidan ”Mitt Konto”</strong>” under <strong>WooCommerce > Inställningar > "
756
+ "Konton</strong> för att detta alternativ ska fungera. För närvarande är "
757
+ "registreringen inaktiverad."
758
 
759
  #: ../classes/admin/settings/sf-options.php:26
760
  msgid "Registration"
761
+ msgstr "Registrering"
762
 
763
  #: ../classes/admin/settings/sf-options.php:28
764
  msgid ""
766
  "if the user would like to apply to be a vendor. Also, on the Vendor "
767
  "Dashboard, users can still apply to become a vendor even if this is disabled."
768
  msgstr ""
769
+ "Detta kommer att visa en kryssruta på Mitt kontos registreringsformulär och "
770
+ "fråga om användaren vill ansöka om att bli en säljare. Under Säljarnas "
771
+ "kontrollpanel kan användarna fortfarande ansöka om att bli en säljare, även "
772
+ "om detta är inaktiverat ."
773
 
774
  #: ../classes/admin/settings/sf-options.php:35
775
  msgid "Approve vendor applications manually"
776
+ msgstr "Godkänn säljaransökningar manuellt"
777
 
778
  #: ../classes/admin/settings/sf-options.php:36
779
  msgid ""
780
  "With this unchecked, all vendor applications are automatically accepted. "
781
  "Otherwise, you must approve each manually."
782
  msgstr ""
783
+ "Om inte markerad, kommer alla säljaransökningar automatiskt att godkännas."
784
 
785
  #: ../classes/admin/settings/sf-options.php:43
786
  #: ../classes/admin/settings/sf-options.php:166
787
  msgid "Taxes"
788
+ msgstr "Skatt"
789
 
790
  #: ../classes/admin/settings/sf-options.php:44
791
  msgid "Give vendors any tax collected per-product"
792
+ msgstr "Ge säljarna eventuell skatt per produkt"
793
 
794
  #: ../classes/admin/settings/sf-options.php:45
795
  msgid "The tax collected on a vendor's product will be given in its entirety"
796
  msgstr ""
797
+ "Skatten från en säljares produkt kommer att ges i sin helhet till säljaren"
798
 
799
  #: ../classes/admin/settings/sf-options.php:53
800
  msgid "Give vendors any shipping collected per-product"
801
+ msgstr "Ge säljarna eventuell fraktkostnad per produkt"
802
 
803
  #: ../classes/admin/settings/sf-options.php:54
804
  msgid ""
806
  "gateway. WC Vendors Pro - Give vendors shipping when using Vendor "
807
  "Shipping. No other shipping module is compatible with this option."
808
  msgstr ""
809
+ "WC Vendors Free - Ge säljarna fraktkostnaden vid användning av per produkt "
810
+ "frakt. WC Vendors Pro - Ge säljarna fraktkostnaden vid användning av per "
811
+ "säljare frakt. Ingen annan fraktmodul är kompatibel med det här alternativet."
812
 
813
  #: ../classes/admin/settings/sf-options.php:60
814
  msgid "Shop options"
815
+ msgstr "Butiksinställningar"
816
 
817
  #: ../classes/admin/settings/sf-options.php:63
818
  msgid "Shop HTML"
819
+ msgstr "Butik HTML"
820
 
821
  #: ../classes/admin/settings/sf-options.php:64
822
  msgid ""
823
  "Enable HTML for a vendor's shop description by default. You can enable or "
824
  "disable this per vendor by editing the vendors user account."
825
  msgstr ""
826
+ "Aktivera HTML för en säljares butiksbeskrivning som standard. Du kan "
827
+ "aktivera eller inaktivera detta per säljare genom att redigera säljarens "
828
+ "användarkonto."
829
 
830
  #: ../classes/admin/settings/sf-options.php:71
831
  msgid "Vendor Shop Page"
832
+ msgstr "Säljarens butikssida"
833
 
834
  #: ../classes/admin/settings/sf-options.php:72
835
  msgid ""
836
  "Enter one word for the URI. If you enter \"<strong>vendors</strong>\" your "
837
  "vendors store will be <code>yourdomain.com/vendors/store-name/</code>"
838
  msgstr ""
839
+ "Ange ett ord för URI. Om du anger \"<strong> säljare </strong>\" kommer "
840
+ "länken till butiken att vara <code>dindomän.com/säljare/butiksnamn</ code>"
841
 
842
  #: ../classes/admin/settings/sf-options.php:79
843
  msgid "Shop Headers"
844
+ msgstr "Butikshuvud"
845
 
846
  #: ../classes/admin/settings/sf-options.php:80
847
  msgid "Enable vendor shop headers"
848
+ msgstr "Aktivera butikshuvud"
849
 
850
  #: ../classes/admin/settings/sf-options.php:81
851
  msgid ""
853
  "pages. In order to customize the shop headers visit wcvendors.com and read "
854
  "the article in the Knowledgebase titled Changing the Vendor Templates."
855
  msgstr ""
856
+ "Detta kommer att åsidosätta den HTML-baserade butiksbeskrivning som finns på "
857
+ "produkt-arkiv-sidorna . För att anpassa butikens huvud, besök wcvendors.com "
858
+ "och läs artikeln i Kunskapsbasen ”Changing the Vendor Templates.”"
859
 
860
  #: ../classes/admin/settings/sf-options.php:88
861
  msgid "Vendor Display Name"
862
+ msgstr "Säljares Visningsnamn"
863
 
864
  #: ../classes/admin/settings/sf-options.php:89
865
  msgid ""
866
  "Select what will be displayed for the sold by text throughout the store."
867
+ msgstr "Välj vilket namn som ska visas efter ”Såld av”."
868
 
869
  #: ../classes/admin/settings/sf-options.php:93
870
  msgid "Display Name"
871
+ msgstr "Visningsnamn"
872
 
873
  #: ../classes/admin/settings/sf-options.php:94
874
  #: ../classes/admin/views/html-vendor-settings-page.php:22
875
  #: ../templates/dashboard/settings/shop-name.php:2
876
  msgid "Shop Name"
877
+ msgstr "Butiksnamn"
878
 
879
  #: ../classes/admin/settings/sf-options.php:95
880
  msgid "User Login"
881
+ msgstr "Användarinlogg"
882
 
883
  #: ../classes/admin/settings/sf-options.php:96
884
  msgid "User Email"
885
+ msgstr "Användar e-post"
886
 
887
  #: ../classes/admin/settings/sf-options.php:103
888
  msgid "Sold By Label"
889
+ msgstr "Såld av-etikett"
890
 
891
  #: ../classes/admin/settings/sf-options.php:104
892
  msgid "The sold by label used on the site and emails."
893
  msgstr ""
894
+ "Såld av-etiketten används på flera ställen på webbplatsen och i e-post."
895
 
896
  #: ../classes/admin/settings/sf-options.php:107
897
  msgid "Sold By"
898
+ msgstr "Såld av"
899
 
900
  #: ../classes/admin/settings/sf-options.php:111
901
  msgid "Seller Info Label"
902
+ msgstr "Om säljaren-etikett"
903
 
904
  #: ../classes/admin/settings/sf-options.php:112
905
  msgid "The seller info tab title on the single product page."
906
+ msgstr "Om säljaren-etiketten visas på sidan för enskild produkt."
907
 
908
  #: ../classes/admin/settings/sf-options.php:115
909
  msgid "Seller Info"
910
+ msgstr "Om säljaren"
911
 
912
  #: ../classes/admin/settings/sf-options.php:119
913
  msgid "Product Add Page"
914
+ msgstr "Ny produkt-sida"
915
 
916
  #: ../classes/admin/settings/sf-options.php:119
917
  msgid "Configure what to hide from all vendors when adding a product"
918
  msgstr ""
919
+ "Konfigurera vad du vill dölja från alla säljare när de lägger upp en ny "
920
+ "produkt"
921
 
922
  #: ../classes/admin/settings/sf-options.php:122
923
  msgid "Left side panel"
924
+ msgstr "Vänster sidopanel"
925
 
926
  #: ../classes/admin/settings/sf-options.php:123
927
  msgid ""
928
  "CHECKING these boxes will **HIDE** these areas of the add product page for "
929
  "vendors"
930
  msgstr ""
931
+ "MARKERING av dessa rutor kommer ** GÖMMA ** dessa områden i Ny produkt-sidan "
932
+ "för säljare"
933
 
934
  #: ../classes/admin/settings/sf-options.php:126
935
  msgid "Inventory"
936
+ msgstr "Lager"
937
 
938
  #: ../classes/admin/settings/sf-options.php:128
939
  msgid "Linked Products"
940
+ msgstr "Länkade Produkter"
941
 
942
  #: ../classes/admin/settings/sf-options.php:129
943
  msgid "Attributes"
944
+ msgstr "Attributer"
945
 
946
  #: ../classes/admin/settings/sf-options.php:130
947
  msgid "Advanced"
948
+ msgstr "Avancerat"
949
 
950
  #: ../classes/admin/settings/sf-options.php:137
951
  msgid "Types"
952
+ msgstr "Typer"
953
 
954
  #: ../classes/admin/settings/sf-options.php:138
955
  msgid "CHECKING these boxes will HIDE these product types from the vendor"
956
  msgstr ""
957
+ "MARKERING av dessa rutor kommer att dölja dessa produkttyper från säljaren"
958
 
959
  #: ../classes/admin/settings/sf-options.php:141
960
  msgid "Simple"
961
+ msgstr "Enkel"
962
 
963
  #: ../classes/admin/settings/sf-options.php:142
964
  msgid "Variable"
965
+ msgstr "Variabel"
966
 
967
  #: ../classes/admin/settings/sf-options.php:143
968
  msgid "Grouped"
969
+ msgstr "Grupperad"
970
 
971
  #: ../classes/admin/settings/sf-options.php:144
972
  msgid "External / affiliate"
973
+ msgstr "Extern"
974
 
975
  #: ../classes/admin/settings/sf-options.php:151
976
  msgid "Type options"
977
+ msgstr "Typ alternativ"
978
 
979
  #: ../classes/admin/settings/sf-options.php:152
980
  msgid ""
981
  "CHECKING these boxes will **HIDE** these product options from the vendor"
982
  msgstr ""
983
+ "MARKERING av dessa rutor kommer att **DÖLJA** dessa produktalternativ från "
984
+ "säljaren"
985
 
986
  #: ../classes/admin/settings/sf-options.php:155
987
  msgid "Virtual"
988
+ msgstr "Virtuell"
989
 
990
  #: ../classes/admin/settings/sf-options.php:156
991
  msgid "Downloadable"
992
+ msgstr "Nedladdningsbar"
993
 
994
  #: ../classes/admin/settings/sf-options.php:163
995
  msgid "Miscellaneous"
996
+ msgstr "Diverse"
997
 
998
  #: ../classes/admin/settings/sf-options.php:167
999
  msgid "SKU"
1000
+ msgstr "Artikelnr"
1001
 
1002
  #: ../classes/admin/settings/sf-options.php:168
1003
  msgid "Featured"
1004
+ msgstr "Utvald"
1005
 
1006
  #: ../classes/admin/settings/sf-options.php:169
1007
  msgid "Duplicate Product"
1008
+ msgstr "Duplicera Produkt"
1009
 
1010
  #: ../classes/admin/settings/sf-options.php:176
1011
  msgid "Stylesheet"
1012
+ msgstr "Stilmall"
1013
 
1014
  #: ../classes/admin/settings/sf-options.php:177
1015
  msgid ""
1016
  "You can add CSS in this textarea, which will be loaded on the product add/"
1017
  "edit page for vendors."
1018
  msgstr ""
1019
+ "Du kan lägga till CSS i denna textarea , som kommer att visas på Ny- eller "
1020
+ "redigera produkt-sidan för säljare."
1021
 
1022
  #: ../classes/admin/settings/sf-options.php:184
1023
  msgid "Permissions"
1024
+ msgstr "Behörigheter"
1025
 
1026
  #: ../classes/admin/settings/sf-options.php:184
1027
  msgid "General permissions used around the shop"
1028
+ msgstr "Allmänna behörigheter som används runt om i butiken"
1029
 
1030
  #: ../classes/admin/settings/sf-options.php:188
1031
  msgid "View orders"
1032
+ msgstr "Visa ordrar"
1033
 
1034
  #: ../classes/admin/settings/sf-options.php:189
1035
  msgid "Show customer details such as email, address, name, etc, for each order"
1036
+ msgstr "Visa kunddetaljer så som e-post, adress, namn, etc, för varje order"
1037
 
1038
  #: ../classes/admin/settings/sf-options.php:196
1039
  msgid "View comments"
1040
+ msgstr "Visa kommentarer"
1041
 
1042
  #: ../classes/admin/settings/sf-options.php:197
1043
  msgid "View all vendor comments for an order on the frontend"
1044
+ msgstr "Visa alla säljarkommentarer för en order i frontend"
1045
 
1046
  #: ../classes/admin/settings/sf-options.php:204
1047
  msgid "Submit comments"
1048
+ msgstr "Skicka kommentar"
1049
 
1050
  #: ../classes/admin/settings/sf-options.php:205
1051
  msgid ""
1052
  "Submit comments for an order on the frontend. Eg, tracking ID for a product"
1053
  msgstr ""
1054
+ "Skicka kommenterar för en order i frontend. T.ex. koll-ID för en produkt."
1055
 
1056
  #: ../classes/admin/settings/sf-options.php:212
1057
  msgid "View email addresses"
1058
+ msgstr "Visa e-postadresser"
1059
 
1060
  #: ../classes/admin/settings/sf-options.php:213
1061
  msgid ""
1062
  "While viewing order details on the frontend, you can disable or enable email "
1063
  "addresses"
1064
  msgstr ""
1065
+ "Medan du tittar på beställningsinformationen i frontend, kan du aktivera "
1066
+ "eller inaktivera e-postadresser"
1067
 
1068
  #: ../classes/admin/settings/sf-options.php:220
1069
  msgid "Export a CSV file of orders for a product"
1070
+ msgstr "Exportera en CSV-fil med ordrar för en produkt"
1071
 
1072
  #: ../classes/admin/settings/sf-options.php:221
1073
  msgid "Vendors could export orders for a product on the frontend"
1074
+ msgstr "Säljare kan exportera ordrar för en produkt i frontend"
1075
 
1076
  #: ../classes/admin/settings/sf-options.php:228
1077
  msgid "Reports"
1078
+ msgstr "Rapporter"
1079
 
1080
  #: ../classes/admin/settings/sf-options.php:229
1081
  msgid ""
1082
  "<strike>View backend sales reports</strike>. <strong>Depreciated</strong>"
1083
  msgstr ""
1084
+ "<strike>Visa försäljningsrapporter i backend </strike>. <strong>Ej "
1085
+ "Rekommenderat</strong>"
1086
 
1087
  #: ../classes/admin/settings/sf-options.php:230
1088
  msgid ""
1090
  "completely removed in future versions. Vendors should use their Vendor "
1091
  "Dashboard for reports as all identical functionality is already there. "
1092
  msgstr ""
1093
+ "Detta alternativ har tagits bort och fungerar inte längre. Det kommer att "
1094
+ "vara helt tas bort i framtida versioner. Säljare bör använda sin "
1095
+ "kontrollpanel för rapporter eftersom alla funktioner redan finns där."
1096
 
1097
  #: ../classes/admin/settings/sf-options.php:237
1098
  msgid "View Frontend sales reports"
1099
+ msgstr "Visa försäljningsrapporter i frontend"
1100
 
1101
  #: ../classes/admin/settings/sf-options.php:238
1102
  msgid ""
1104
  "only display sales data that pertain to their products, and only for orders "
1105
  "that are processing or completed."
1106
  msgstr ""
1107
+ "Försäljningsdata i frontend på säljarens kontrollpanel . Tabellen visar "
1108
+ "endast försäljningsdata som hänför sig till deras produkter, och bara för "
1109
+ "ordrar som behandlas eller avslutats."
1110
 
1111
  #: ../classes/admin/settings/sf-options.php:246
1112
  msgid "Submit products"
1113
+ msgstr "Skicka produkter"
1114
 
1115
  #: ../classes/admin/settings/sf-options.php:247
1116
  msgid ""
1117
  "Check to allow vendors to list new products. Admin must approve new "
1118
  "products by editing the product, and clicking Publish."
1119
  msgstr ""
1120
+ "Markera för att tillåta säljare att lista nya produkter. Admin måste "
1121
+ "godkänna nya produkter genom att redigera produkten, och klicka på Publicera."
1122
 
1123
  #: ../classes/admin/settings/sf-options.php:254
1124
  msgid "Edit live products"
1125
+ msgstr "Redigera publicerade produkter"
1126
 
1127
  #: ../classes/admin/settings/sf-options.php:255
1128
  msgid ""
1130
  "is no approval or review after editing a live product. This could be "
1131
  "dangerous with malicious vendors, so take caution."
1132
  msgstr ""
1133
+ "Säljare kan redigera en godkänd produkt efter den har blivit publicerad. Det "
1134
+ "finns inget godkännande eller översyn efter redigeringen av den publicerade "
1135
+ "produkten. Detta kan vara farligt med klumpiga säljare, så vidta med "
1136
+ "försiktighet."
1137
 
1138
  #: ../classes/admin/settings/sf-options.php:262
1139
  msgid "Submit products live without requiring approval"
1140
+ msgstr "Publicera produkter direkt utan godkännande från Admin. "
1141
 
1142
  #: ../classes/admin/settings/sf-options.php:263
1143
  msgid ""
1144
  "Vendors can submit products without review or approval from a shop admin. "
1145
  "This could be dangerous with malicious vendors, so take caution."
1146
  msgstr ""
1147
+ "Säljare kan publicera produkter utan granskning eller godkännande från en "
1148
+ "butiksadministratör. Detta kan vara farligt med klumpiga säljare, så vidta "
1149
+ "med försiktighet."
1150
 
1151
  #: ../classes/admin/settings/sf-options.php:269
1152
  msgid "Pages"
1153
+ msgstr "Sidor"
1154
 
1155
  #: ../classes/admin/settings/sf-options.php:270
1156
  msgid "Page configuration"
1157
+ msgstr "Sidkonfiguration"
1158
 
1159
  #: ../classes/admin/settings/sf-options.php:273
1160
  msgid "Vendor dashboard"
1161
+ msgstr "Kontrollpanel för säljare"
1162
 
1163
  #: ../classes/admin/settings/sf-options.php:274
1164
  msgid ""
1167
  "upgrade to Pro, keep this page unchanged as both Pro Dashboard and this "
1168
  "Dashboard page must be set."
1169
  msgstr ""
1170
+ "Välj den sida som har kortkod <code> [wcv_vendor_dashboard] </ code> <br/>Om "
1171
+ "denna sida inte är inställd, kommer din webbplats inte fungera. Om du "
1172
+ "uppgraderar till Pro, behålla denna sida oförändrad eftersom både "
1173
+ "kontrollpanelen i PRO och denna kontrollpanel måste ställas in."
1174
 
1175
  #: ../classes/admin/settings/sf-options.php:281
1176
  msgid "Shop settings"
1177
+ msgstr "Butiksinställningar"
1178
 
1179
  #: ../classes/admin/settings/sf-options.php:282
1180
  msgid ""
1182
  ">These are the shop settings a vendor can configure. By default, Vendor "
1183
  "Dashboard > Shop Settings should have this shortcode."
1184
  msgstr ""
1185
+ "Välj den sida som har kortkod <code> [wcv_shop_settings] </ code> <br/> "
1186
+ "Dessa är de butiksinställningar en säljare kan göra. Som standard bör "
1187
+ "Kontrollpanelen > Inställningar ha denna kortkod."
1188
 
1189
  #: ../classes/admin/settings/sf-options.php:289
1190
  msgid "Orders page"
1191
+ msgstr "Ordersida"
1192
 
1193
  #: ../classes/admin/settings/sf-options.php:290
1194
  msgid ""
1195
  "Choose the page that has the shortcode <code>[wcv_orders]</code><br/>By "
1196
  "default, Vendor Dashboard > Orders should have the shortcode."
1197
  msgstr ""
1198
+ "Välj den sida som har kortkod <code> [wcv_orders] </ code> <br/> Som "
1199
+ "standard bör Kontrollpanelen > Ordrar ha denna kortkod."
1200
 
1201
  #: ../classes/admin/settings/sf-options.php:297
1202
  msgid "Vendor terms"
1203
+ msgstr "Säljarvillkor"
1204
 
1205
  #: ../classes/admin/settings/sf-options.php:298
1206
  msgid ""
1208
  "vendor.<br/>If left blank, no terms will be shown to the applicant. Vendor "
1209
  "must accept terms in order to register, if set."
1210
  msgstr ""
1211
+ "Dessa villkor visas för en användare när de lämnar in en ansökan om att bli "
1212
+ "en säljare. <br/> Om den lämnas tom, kommer inga villkor att visas för den "
1213
+ "sökande. Säljaren måste acceptera villkoren för att registrera."
1214
 
1215
  #: ../classes/admin/settings/sf-options.php:305
1216
  msgid "payments"
1217
+ msgstr "betalningar"
1218
 
1219
  #: ../classes/admin/settings/sf-options.php:316
1220
  msgid "Payments"
1221
+ msgstr "Betalningar"
1222
 
1223
  #: ../classes/admin/settings/sf-options.php:318
1224
  msgid "PayPal Adaptive Payments Scheduling"
1225
+ msgstr "Schemaläggning av PayPals adaptiva betalningar"
1226
 
1227
  #: ../classes/admin/settings/sf-options.php:319
1228
  #, php-format
1229
  msgid "Total commission currently due: %s. <a href=\"%s\">View details</a>."
1230
+ msgstr "Innestående provision totalt: %s. <a href=\"%s\">Visa detaljer</a>."
1231
 
1232
  #: ../classes/admin/settings/sf-options.php:320
1233
  #, php-format
1244
  "\"https://www.wcvendors.com/product/wc-vendors-pro/\" target=\"top\">WC "
1245
  "Vendors Pro</a>."
1246
  msgstr ""
1247
+ "Se till att du uppdaterar dina inställningar för adaptiva betalningar hos "
1248
+ "PayPal <a href=\"%s\">här</a>. <br><br> För att omedelbart betala med "
1249
+ "adaptiva betalningar måste du aktivera paypalap gateway som kassa. <br><a "
1250
+ "href=\"https://www.wcvendors.com/kb/configuring-paypal-adaptive-payments/\" "
1251
+ "target=\"top\">PayPal AP Hjälp</a>. <br><br> En annan kassa som erbjuder "
1252
+ "direktbetalningar till säljare, som också accepterar kreditkort direkt i "
1253
+ "kassan, är Stripe. <br><a href=\"https://www.wcvendors.com/product/stripe-"
1254
+ "commissions-gateway/\" target=\"top\">Stripe Commissions & Gateway plugin</"
1255
+ "a> kostar $49 och är specifikt utvecklat för WC Vendors och <a href="
1256
+ "\"https://www.wcvendors.com/product/wc-vendors-pro/\" target=\"top\">WC "
1257
+ "Vendors Pro</a>."
1258
 
1259
  #: ../classes/admin/settings/sf-options.php:324
1260
  msgid "Instant pay"
1261
+ msgstr "Omedelbar betalning"
1262
 
1263
  #: ../classes/admin/settings/sf-options.php:325
1264
  msgid ""
1265
  "Instantly pay vendors their commission when an order is made, and if a "
1266
  "vendor has a valid PayPal email added on their Shop Settings page."
1267
  msgstr ""
1268
+ "Betalar omedelbart säljare deras provision när en beställning görs, om "
1269
+ "säljaren har en giltigt PayPal e-postadress tillagd i deras "
1270
+ "butiksinställningar."
1271
 
1272
  #: ../classes/admin/settings/sf-options.php:326
1273
  msgid ""
1274
  "For this to work, customers must checkout with the PayPal Adaptive Payments "
1275
  "gateway. Using any other gateways will not pay vendors instantly"
1276
  msgstr ""
1277
+ "För att detta ska fungera måste kunderna betala i kassan med PayPals "
1278
+ "adaptiva betalningssystem. Användning av andra kassasystem kommer inte att "
1279
+ "betala säljaren omedelbart"
1280
 
1281
  #: ../classes/admin/settings/sf-options.php:333
1282
  msgid "Payment schedule"
1283
+ msgstr "Utbetalningsschema"
1284
 
1285
  #: ../classes/admin/settings/sf-options.php:334
1286
  msgid "Note: Schedule will only work if instant pay is unchecked"
1287
+ msgstr "Obs: Schemat fungerar bara om omedelbar betalning är omarkerad"
1288
 
1289
  #: ../classes/admin/settings/sf-options.php:339
1290
  msgid "Weekly"
1291
+ msgstr "Varje vecka"
1292
 
1293
  #: ../classes/admin/settings/sf-options.php:340
1294
  msgid "Biweekly"
1295
+ msgstr "Varannan vecka"
1296
 
1297
  #: ../classes/admin/settings/sf-options.php:341
1298
  msgid "Monthly"
1299
+ msgstr "Varje månad"
1300
 
1301
  #: ../classes/admin/settings/sf-options.php:342
1302
  msgid "Manual"
1303
+ msgstr "Manuell"
1304
 
1305
  #: ../classes/admin/settings/sf-options.php:343
1306
  msgid "Now"
1307
+ msgstr "Nu"
1308
 
1309
  #: ../classes/admin/settings/sf-options.php:348
1310
  msgid "Email notification"
1311
+ msgstr "E-postnotis"
1312
 
1313
  #: ../classes/admin/settings/sf-options.php:349
1314
  msgid ""
1315
  "Send the WooCommerce admin an email each time a payment has been made via "
1316
  "the payment schedule options above"
1317
  msgstr ""
1318
+ "Skicka WooCommerce admin ett e-postmeddelande varje gång en betalning har "
1319
+ "gjorts via betalningsplanen ovan"
1320
 
1321
  #: ../classes/admin/views/html-vendor-settings-page.php:11
1322
  #: ../templates/dashboard/settings/paypal-email-form.php:2
1323
  msgid "PayPal Address"
1324
+ msgstr "PayPal Adress"
1325
 
1326
  #: ../classes/admin/views/html-vendor-settings-page.php:15
1327
  #: ../templates/dashboard/settings/paypal-email-form.php:3
1328
  msgid "Your PayPal address is used to send you your commission."
1329
+ msgstr "Din PayPal adress används för att betala ut provision till dig."
1330
 
1331
  #: ../classes/admin/views/html-vendor-settings-page.php:24
1332
  #: ../templates/dashboard/settings/shop-name.php:3
1333
  msgid "Your shop name is public and must be unique."
1334
+ msgstr "Ditt butiksnamn är publikt och måste vara unikt."
1335
 
1336
  #: ../classes/admin/views/html-vendor-settings-page.php:43
1337
  #: ../templates/dashboard/settings/seller-info.php:4
1338
  msgid "This is displayed on each of your products."
1339
+ msgstr "Detta visas på var och en av dina produkter."
1340
 
1341
  #: ../classes/admin/views/html-vendor-settings-page.php:49
1342
  #: ../templates/dashboard/settings/shop-description.php:2
1343
  msgid "Shop Description"
1344
+ msgstr "Butiksbeskrivning"
1345
 
1346
  #: ../classes/admin/views/html-vendor-settings-page.php:61
1347
  #: ../templates/dashboard/settings/shop-description.php:3
1348
  #, php-format
1349
  msgid "This is displayed on your <a href=\"%s\">shop page</a>."
1350
+ msgstr "Detta visas på din <a href=\"%s\">butikssida</a>."
1351
 
1352
  #: ../classes/admin/views/html-vendor-settings-page.php:70
1353
  msgid "Save Shop Settings"
1354
+ msgstr "Spara Butiksinställningar"
1355
 
1356
  #: ../classes/class-cron.php:87
1357
  #, php-format
1358
  msgid "Payment total: %s"
1359
+ msgstr "Betalning totalt: %s."
1360
 
1361
  #: ../classes/class-cron.php:148
1362
  msgid "Once Weekly"
1363
+ msgstr "En gång i veckan"
1364
 
1365
  #: ../classes/class-cron.php:153
1366
  msgid "Once every two weeks"
1367
+ msgstr "En gång varannan vecka"
1368
 
1369
  #: ../classes/class-cron.php:158
1370
  msgid "Once a month"
1371
+ msgstr "En gång i månaden"
1372
 
1373
  #: ../classes/class-install.php:59 ../classes/class-install.php:214
1374
  msgid "Pending Vendor"
1375
+ msgstr "Väntande säljare"
1376
 
1377
  #: ../classes/class-install.php:165
1378
  msgid "Vendor Dashboard"
1379
+ msgstr "Kontrollpanel"
1380
 
1381
  #: ../classes/front/dashboard/class-vendor-dashboard.php:48
1382
  msgid "Order marked shipped."
1383
+ msgstr "Order markerad som skickad."
1384
 
1385
  #: ../classes/front/dashboard/class-vendor-dashboard.php:49
1386
  msgid " has marked as shipped. "
1387
+ msgstr " har markerat som skickad."
1388
 
1389
  #: ../classes/front/dashboard/class-vendor-dashboard.php:77
1390
  #: ../classes/front/dashboard/class-vendor-dashboard.php:78
1391
  msgid "Tracking number"
1392
+ msgstr "Koll-ID"
1393
 
1394
  #: ../classes/front/dashboard/class-vendor-dashboard.php:80
1395
  msgid "Success. Your tracking number has been updated."
1396
+ msgstr "Lyckades. Koll-ID har uppdaterats."
1397
 
1398
  #: ../classes/front/orders/class-export-csv.php:19
1399
  #: ../templates/dashboard/reports.php:18
1400
  #: ../templates/emails/notify-vendor-shipped.php:23
1401
  #: ../templates/emails/vendor-new-order.php:23
1402
  msgid "Quantity"
1403
+ msgstr "Antal"
1404
 
1405
  #: ../classes/front/orders/class-orders.php:107
1406
  msgid ""
1407
  "You haven't selected a product's orders to view! Please go back to the "
1408
  "Vendor Dashboard and click Show Orders on the product you'd like to view."
1409
  msgstr ""
1410
+ "Du har inte valt en produkts order att visa! Gå tillbaka till "
1411
+ "kontrollpanelen och klicka på Visa Order på den produkt du vill visa."
1412
 
1413
  #: ../classes/front/orders/class-orders.php:111
1414
  msgid "No orders."
1415
+ msgstr "Inga ordrar."
1416
 
1417
  #: ../classes/front/orders/class-orders.php:174
1418
  msgid "Product Title"
1419
+ msgstr "Produktnamn"
1420
 
1421
  #: ../classes/front/orders/class-orders.php:175
1422
  msgid "Full name"
1423
+ msgstr "Fullständigt namn"
1424
 
1425
  #: ../classes/front/orders/class-orders.php:176
1426
  msgid "Address"
1427
+ msgstr "Adress"
1428
 
1429
  #: ../classes/front/orders/class-orders.php:177
1430
  msgid "City"
1431
+ msgstr "Stad"
1432
 
1433
  #: ../classes/front/orders/class-orders.php:178
1434
  msgid "State"
1435
+ msgstr "Postort"
1436
 
1437
  #: ../classes/front/orders/class-orders.php:179
1438
  msgid "Zip"
1439
+ msgstr "Postnummer"
1440
 
1441
  #: ../classes/front/orders/class-orders.php:180
1442
  msgid "Email address"
1443
+ msgstr "E-postadress"
1444
 
1445
  #: ../classes/front/orders/class-submit-comment.php:41
1446
  msgid "You've left the comment field empty!"
1447
+ msgstr "Du har lämnat kommentarfältet tomt!"
1448
 
1449
  #: ../classes/front/orders/class-submit-comment.php:63
1450
  msgid "Success. The customer has been notified of your comment."
1451
+ msgstr "Lyckades. Kunden har meddelats om din kommentar."
1452
 
1453
  #: ../classes/front/signup/class-vendor-signup.php:45
1454
  #: ../templates/dashboard/denied.php:22
1455
  msgid "Apply to become a vendor? "
1456
+ msgstr "Jag vill bli säljare hos Petmade!"
1457
 
1458
  #: ../classes/front/signup/class-vendor-signup.php:54
1459
  #, php-format
1461
  "I have read and accepted the <a target=\"top\" href=\"%s\">terms and "
1462
  "conditions</a>"
1463
  msgstr ""
1464
+ "Jag har läst och godkänner <strong><a target=\"top\" href=\"%s"
1465
+ "\">säljarvillkoren</a></strong>"
1466
 
1467
  #: ../classes/front/signup/class-vendor-signup.php:88
1468
  msgid "Application denied. You are an administrator."
1469
+ msgstr "Ansökan avslogs. Du är en administratör."
1470
 
1471
  #: ../classes/front/signup/class-vendor-signup.php:90
1472
  msgid "Your application has been submitted."
1473
+ msgstr "Din ansökan har mottagits."
1474
 
1475
  #: ../classes/front/signup/class-vendor-signup.php:130
1476
  #: ../classes/front/signup/class-vendor-signup.php:142
1477
  msgid "You must accept the terms and conditions to become a vendor."
1478
+ msgstr "Du måste godkänna säljarvillkoren för att bli en säljare."
1479
 
1480
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:43
1481
  msgid "PayPal Adaptive Payments"
1482
+ msgstr "PayPals adaptiva betalningar"
1483
 
1484
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:119
1485
  #, php-format
1486
  msgid ""
1487
  "Something went wrong. Response from PayPal invalidated this order. Status: "
1488
  "%s."
1489
+ msgstr "Något gick snett. PayPal anser att ordern är ogiltig. Status: %s."
1490
 
1491
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:124
1492
  msgid "IPN payment completed"
1493
+ msgstr "IPN-betalning genomförd"
1494
 
1495
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:146
1496
  msgid "Enable PayPal Adaptive Payments"
1497
+ msgstr "Aktivera PayPals adaptiva betalningar"
1498
 
1499
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:152
1500
  msgid "Method Title"
1501
+ msgstr "Titel"
1502
 
1503
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:153
1504
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:70
1505
  msgid "This controls the title which the user sees during checkout."
1506
+ msgstr "Detta bestämmer vilket kassanamn kunden ser i kassan."
1507
 
1508
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:154
1509
  msgid "PayPal"
1510
+ msgstr "PayPal"
1511
 
1512
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:159
1513
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:75
1514
  msgid "Description"
1515
+ msgstr "Beskrivning"
1516
 
1517
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:160
1518
  msgid "This controls the description which the user sees during checkout."
1519
+ msgstr "Detta bestämmer kassabeskrivningen som kunden ser i kassan."
1520
 
1521
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:161
1522
  msgid "Pay via PayPal!"
1523
+ msgstr "Betala med PayPal!"
1524
 
1525
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:172
1526
  msgid "Live Credentials"
1527
+ msgstr "Live Uppgifter"
1528
 
1529
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:174
1530
  #, php-format
1532
  "You must have an <a href=\"%s\">Application ID</a> to process live "
1533
  "transactions. You do not need one for testing in Sandbox mode."
1534
  msgstr ""
1535
+ "Du måste ha ett <a href=\"%s\">Applikations ID</a> för att använda live-"
1536
+ "transaktioner. Du behöver inte ett för att testa i sandlåde-läge. "
1537
 
1538
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:179
1539
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:213
1540
  msgid "PayPal Email"
1541
+ msgstr "PayPal e-postadress"
1542
 
1543
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:180
1544
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:214
1545
  msgid "The email address main payments should go to."
1546
+ msgstr "E-postadressen som huvudbetalningarna ska gå till."
1547
 
1548
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:185
1549
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:219
1550
  msgid "API Username"
1551
+ msgstr "API Användarnamn"
1552
 
1553
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:190
1554
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:224
1555
  msgid "API Password"
1556
+ msgstr "API Lösenord"
1557
 
1558
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:195
1559
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:229
1560
  msgid "API Signature"
1561
+ msgstr "API Signatur"
1562
 
1563
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:200
1564
  msgid "Application ID"
1565
+ msgstr "Applikations ID"
1566
 
1567
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:202
1568
  msgid "Only required when doing live transactions."
1569
+ msgstr "Krävs endast när man gör live-transaktioner."
1570
 
1571
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:206
1572
  msgid "Sandbox Credentials"
1573
+ msgstr "Sandbox Uppgifter"
1574
 
1575
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:208
1576
  #, php-format
1578
  "You can signup for a sandbox developer account <a href=\"%s\">here</a>. You "
1579
  "need a developer account if you want to enable Sandbox mode for testing."
1580
  msgstr ""
1581
+ "Du kan registrera dig för ett sandlåde-utvecklarkonto <a href=\"%s\"> här </"
1582
+ "a>. Du behöver ett utvecklarkonto om du vill aktivera Sandbox-läge för "
1583
+ "testning."
1584
 
1585
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:240
1586
  msgid "Misc. Settings"
1587
+ msgstr "Alt. Inställningar"
1588
 
1589
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:245
1590
  msgid "Enable PayPal Sandbox mode"
1591
+ msgstr "Aktivera PayPal Sandlåde-läge"
1592
 
1593
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:251
1594
  msgid "Enable logging"
1595
+ msgstr "Aktivera loggning"
1596
 
1597
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:269
1598
  msgid ""
1600
  "due commission (if enabled). Also used to mass pay vendors on a schedule / "
1601
  "manual method (if enabled)."
1602
  msgstr ""
1603
+ "PayPals adaptiva betalning kan omedelbart betala dina säljare sin provision "
1604
+ "(om den är aktiverad). Kan också användas för att massbetala säljare på ett "
1605
+ "rullande schema eller manuellt (om det är aktiverat)."
1606
 
1607
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:280
1608
  msgid "Gateway Disabled"
1609
+ msgstr "Port avstängd."
1610
 
1611
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:280
1612
  #, php-format
1613
  msgid "%s does not support your store currency."
1614
+ msgstr "%s stödjer inte valutan i din butik."
1615
 
1616
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:384
1617
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:498
1618
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:153
1619
  #, php-format
1620
  msgid "Error: %s"
1621
+ msgstr "Fel: %s"
1622
 
1623
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:393
1624
  #: ../classes/gateways/PayPal_AdvPayments/paypal_ap.php:394
1625
  #, php-format
1626
  msgid "Error ID: %s. %s"
1627
+ msgstr "Fel ID: %s. %s"
1628
 
1629
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:115
1630
  msgid "No vendors found to pay. Maybe they haven't set a PayPal address?"
1631
  msgstr ""
1632
+ "Hittade inga säljare att betala. De kanske inte har angett PayPal-adress?"
1633
 
1634
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:167
1635
  msgid "All due commission has been paid for."
1636
+ msgstr "Alla obetalda provisioner har blivit utbetalda."
1637
 
1638
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:173
1639
  msgid ""
1641
  "profiles due to an internal error. Commission will still be listed as due. "
1642
  "Please manually mark the commission as paid from the Commissions page."
1643
  msgstr ""
1644
+ "Alla provisioner har betalats ut, men jag kunde inte ta bort det från deras "
1645
+ "profiler pågrund av ett internt fel. Provisionen kommer fortfarande att vara "
1646
+ "listad som innestående. Markera provisionen manuellt som utbetalad från "
1647
+ "sidan Provision."
1648
 
1649
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:208
1650
  msgid "WooCommerce: Mass payments for vendors update"
1651
+ msgstr "WooCommerce: Massbetalningar för säljare uppdatera"
1652
 
1653
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:210
1654
  msgid ""
1655
  "Hello! A payment was just triggered to mass pay all vendors their due "
1656
  "commission."
1657
  msgstr ""
1658
+ "Hej! En betalning utlöste precis en massbetalning för alla säljares "
1659
+ "innestående provision."
1660
 
1661
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:211
1662
  #, php-format
1663
  msgid "Payment status: %s."
1664
+ msgstr "Betalningsstatus: %s."
1665
 
1666
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:212
1667
  #, php-format
1668
  msgid "Payment message: %s."
1669
+ msgstr "Betalningsmeddelande: %s."
1670
 
1671
  #: ../classes/gateways/PayPal_Masspay/class-paypal-masspay.php:215
1672
  #, php-format
1673
  msgid "Payment total: %s."
1674
+ msgstr "Betalning totalt: %s."
1675
 
1676
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:35
1677
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:71
1678
  msgid "WC Vendors Test Gateway"
1679
+ msgstr "WC Vendors Test Kassa"
1680
 
1681
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:36
1682
  msgid ""
1685
  "problems with this - you should use this gateway for all of your non-PayPal "
1686
  "testing."
1687
  msgstr ""
1688
+ "Denna kassa sätter ordrar till behandlas vid köp så att du kan testa "
1689
+ "transaktioner i din butik. Några kassor som ingår i WooCommerce har problem "
1690
+ "med detta - du bör använda denna kassa för all din icke-PayPal testning."
1691
 
1692
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:64
1693
  msgid "Enable WC Vendors Test Gateway Payment"
1694
+ msgstr "Aktivera WC Vendors test-port för betalning"
1695
 
1696
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:68
1697
  msgid "Title"
1698
+ msgstr "Titel"
1699
 
1700
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:77
1701
  msgid "Payment method description that the customer will see on your checkout."
1702
+ msgstr "Beskrivning av betalningsmetoden som kunden kommer se i kassan."
1703
 
1704
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:78
1705
  msgid ""
1707
  "transactions. <a href=\"http://www.wcvendors.com/\" target=\"top\">Click "
1708
  "here to visit WCVendors.com</a>."
1709
  msgstr ""
1710
+ "Detta är en test kassa — ska inte användas på live sajter med live "
1711
+ "transaktioner. <a href=\"http://www.wcvendors.com/\" target=\"top\">Klicka "
1712
+ "här för att besöka WCVendors.com</a>."
1713
 
1714
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:82
1715
  msgid "Instructions"
1716
+ msgstr "Instruktioner"
1717
 
1718
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:84
1719
  msgid ""
1721
  "be sent an email as long as you have the Notify Vendors email enabled under "
1722
  "WooCommerce--Settings--Emails."
1723
  msgstr ""
1724
+ "Lyckades! Din testorder är nu markerad som behandlas och alla säljare kommer "
1725
+ "motta ett e-postmeddelande så länge Meddela Säljare är aktiverat under "
1726
+ "WooCommerce—Inställningar—E-post"
1727
 
1728
  #: ../classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:124
1729
  msgid "Test gateway transation complete. Order processing."
1730
+ msgstr "Test kassans transaktion genomförd. Ordern behandlas."
1731
 
1732
  #: ../templates/dashboard/denied.php:8
1733
  msgid ""
1734
  "Your account has not yet been approved to become a vendor. When it is, you "
1735
  "will receive an email telling you that your account is approved!"
1736
  msgstr ""
1737
+ "Ditt konto har ännu inte blivit godkänt som säljare. Du kommer att få ett "
1738
+ "mejl när ditt konto har blivit godkänt!"
1739
 
1740
  #: ../templates/dashboard/denied.php:12
1741
  msgid "Your account is not setup as a vendor."
1742
+ msgstr "Ditt konto är inte satt upp som säljare."
1743
 
1744
  #: ../templates/dashboard/denied.php:33
1745
  #, php-format
1746
  msgid "I have read and accepted the <a href=\"%s\">terms and conditions</a>"
1747
  msgstr ""
1748
+ "Jag har läst och förstått <strong><a href=\"%s\">säljarvillkoren</a></strong>"
1749
 
1750
  #: ../templates/dashboard/denied.php:53
1751
  msgid "Submit"
1752
+ msgstr "Skicka in"
1753
 
1754
  #: ../templates/dashboard/links.php:3
1755
  msgid "View Your Store"
1756
+ msgstr "Visa min butik"
1757
 
1758
  #: ../templates/dashboard/links.php:4
1759
  msgid "Store Settings"
1760
+ msgstr "Butiksinställningar"
1761
 
1762
  #: ../templates/dashboard/links.php:7
1763
  msgid "Add New Product"
1764
+ msgstr "Lägg till ny produkt"
1765
 
1766
  #: ../templates/dashboard/links.php:8
1767
  msgid "Edit Products"
1768
+ msgstr "Redigera produkter"
1769
 
1770
  #: ../templates/dashboard/orders.php:7 ../templates/dashboard/orders.php:10
1771
  msgid "Hide items"
1772
+ msgstr "Göm objekt"
1773
 
1774
  #: ../templates/dashboard/orders.php:8 ../templates/dashboard/orders.php:79
1775
  msgid "View items"
1776
+ msgstr "Visa objekt"
1777
 
1778
  #: ../templates/dashboard/orders.php:37
1779
  msgid "Links"
1780
+ msgstr "Länkar"
1781
 
1782
  #: ../templates/dashboard/orders.php:100
1783
  msgid "Tracking"
1784
+ msgstr "Spårning"
1785
 
1786
  #: ../templates/dashboard/orders.php:176
1787
  msgid "You have no orders during this period."
1788
+ msgstr "Du har inga beställningar under denna period."
1789
 
1790
  #: ../templates/dashboard/reports.php:1
1791
  msgid "Sales Report"
1792
+ msgstr "Säljrapport"
1793
 
1794
  #: ../templates/dashboard/reports.php:20
1795
  msgid "Rate"
1796
+ msgstr "Momssats"
1797
 
1798
  #: ../templates/dashboard/reports.php:47
1799
  msgid "Show Orders"
1800
+ msgstr "Visa beställningar"
1801
 
1802
  #: ../templates/dashboard/reports.php:56
1803
  msgid "Totals"
1804
+ msgstr "Totalt"
1805
 
1806
  #: ../templates/dashboard/reports.php:71
1807
  msgid "You have no sales during this period."
1808
+ msgstr "Du har inte sålt någonting under denna period."
1809
 
1810
  #: ../templates/dashboard/reports.php:82
1811
  msgid "You haven't made any sales yet."
1812
+ msgstr "Du har inte sålt någonting ännu."
1813
 
1814
  #: ../templates/dashboard/settings/settings.php:47
1815
  msgid "Save"
1816
+ msgstr "Spara"
1817
 
1818
  #: ../templates/emails/application-status.php:5
1819
  #, php-format
1820
  msgid "Hi there. This is a notification about a vendor application on %s."
1821
+ msgstr "Hej där. Det här är en notifikation om en ny säljaransökan på %s."
1822
 
1823
  #: ../templates/emails/application-status.php:8
1824
  #, php-format
1825
  msgid "Application status: %s"
1826
+ msgstr "Ansökningsstatus: %s"
1827
 
1828
  #: ../templates/emails/application-status.php:9
1829
  #, php-format
1830
  msgid "Applicant username: %s"
1831
+ msgstr "Sökandes användarnamn: %s"
1832
 
1833
  #: ../templates/emails/new-product.php:5
1834
  #, php-format
1835
  msgid "Hi there. This is a notification about a new product on %s."
1836
+ msgstr "Hej där. Det här är en notifikation om en ny produkt på %s."
1837
 
1838
  #: ../templates/emails/new-product.php:8
1839
  #, php-format
1840
  msgid "Product title: %s"
1841
+ msgstr "Produktnamn: %s"
1842
 
1843
  #: ../templates/emails/new-product.php:9
1844
  #, php-format
1845
  msgid "Submitted by: %s"
1846
+ msgstr "Upplagd av: %s"
1847
 
1848
  #: ../templates/emails/new-product.php:10
1849
  #, php-format
1850
  msgid "Edit product: %s"
1851
+ msgstr "Redigera produkt: %s"
1852
 
1853
  #: ../templates/emails/notify-vendor-shipped.php:13
1854
  msgid ""
1855
  "A vendor has marked part of your order as shipped. The items that are "
1856
  "shipped are as follows:"
1857
  msgstr ""
1858
+ "En säljare har markerat delar av din beställning som skickad. Följande "
1859
+ "produkter är skickade:"
1860
 
1861
  #: ../templates/emails/notify-vendor-shipped.php:17
1862
  #: ../templates/emails/vendor-new-order.php:17
1863
  #, php-format
1864
  msgid "Order: %s"
1865
+ msgstr "Beställning: %s"
1866
 
1867
  #: ../templates/emails/notify-vendor-shipped.php:24
1868
  #: ../templates/emails/vendor-new-order.php:24
1869
  msgid "Price"
1870
+ msgstr "Pris"
1871
 
1872
  #: ../templates/emails/notify-vendor-shipped.php:56
1873
  #: ../templates/emails/vendor-new-order.php:56
1874
  msgid "Customer details"
1875
+ msgstr "Kunddetaljer"
1876
 
1877
  #: ../templates/emails/notify-vendor-shipped.php:59
1878
  #: ../templates/emails/vendor-new-order.php:59
1879
  msgid "Email:"
1880
+ msgstr "E-post:"
1881
 
1882
  #: ../templates/emails/notify-vendor-shipped.php:62
1883
  #: ../templates/emails/vendor-new-order.php:62
1884
  msgid "Tel:"
1885
+ msgstr "Tfn:"
1886
 
1887
  #: ../templates/emails/vendor-new-order.php:13
1888
  #, php-format
1889
  msgid "You have received an order from %s. Their order is as follows:"
1890
+ msgstr "Du har mottagit en beställning från %s. Beställningen är följande:"
1891
 
1892
  #: ../templates/orders/csv-export.php:6
1893
  msgid "Export orders"
1894
+ msgstr "Exportera Ordrar"
1895
 
1896
  #: ../templates/orders/customer-note/customer-note.php:4
1897
  msgid "Customer note"
1898
+ msgstr "Kundmeddelande"
1899
 
1900
  #: ../templates/orders/customer-note/customer-note.php:8
1901
  msgid "No customer note."
1902
+ msgstr "Inget kundmeddelande."
1903
 
1904
  #: ../templates/orders/shipping/shipping-form.php:6
1905
  msgid "Provider:"
1906
+ msgstr "Fraktbolag:"
1907
 
1908
  #: ../templates/orders/shipping/shipping-form.php:8
1909
  msgid "Custom Provider"
1910
+ msgstr "Anpassat fraktbolag"
1911
 
1912
  #: ../templates/orders/shipping/shipping-form.php:31
1913
  msgid "Provider Name:"
1914
+ msgstr "Fraktbolagets namn:"
1915
 
1916
  #: ../templates/orders/shipping/shipping-form.php:40
1917
  msgid "Tracking number:"
1918
+ msgstr "Koll-id:"
1919
 
1920
  #: ../templates/orders/shipping/shipping-form.php:48
1921
  msgid "Tracking link:"
1922
+ msgstr "Länk för att spåra beställningen:"
1923
 
1924
  #: ../templates/orders/shipping/shipping-form.php:58
1925
  msgid "Date shipped:"
1926
+ msgstr "Skickad datum:"
1927
 
1928
  #: ../templates/orders/shipping/shipping-form.php:66
1929
  msgid "Preview:"
1930
+ msgstr "Förhandsvisning:"
1931
 
1932
  #: ../templates/orders/shipping/shipping-form.php:66
1933
  msgid "Click here to track your shipment"
1934
+ msgstr "Klicka här för att "
1935
 
1936
  #: ../templates/orders/shipping/shipping-form.php:75
1937
  msgid "Update tracking number"
1938
+ msgstr "Uppdatera koll-id"
1939
 
1940
  #: ../templates/orders/shipping/shipping-form.php:77
1941
  msgid "Mark as shipped"
1942
+ msgstr "Markera som skickad"
1943
 
1944
  #: ../templates/orders/table-body.php:25
1945
  #, php-format
1946
  msgid "Quantity: %d"
1947
+ msgstr "Kvantitet %d"
1948
+
1949
+ #~ msgid ""
1950
+ #~ "<b>WC Vendors is disabled</b>. WC Vendors requires a minimum of "
1951
+ #~ "WooCommerce v2.2.0."
1952
+ #~ msgstr ""
1953
+ #~ "<b>WC Vendors är inaktiverat</b>. WC Vendors kräver minst WooCommerce "
1954
+ #~ "v2.2.0."
1955
+
1956
+ #~ msgid "Sold by: "
1957
+ #~ msgstr "Såld av:"
1958
+
1959
+ #~ msgid "Vendor shop page"
1960
+ #~ msgstr "Säljarens butikssida"
1961
+
1962
+ #~ msgid "Unmark shipped"
1963
+ #~ msgstr "Markera som oskickad"
readme.txt CHANGED
@@ -5,8 +5,8 @@ Donate link: http://www.wcvendors.com/
5
  Author URI: http://www.wcvendors.com/
6
  Plugin URI: http://www.wcvendors.com/
7
  Requires at least: 4.0
8
- Tested up to: 4.4.2
9
- Stable tag: 1.8.8
10
  License: GPLv2 or later
11
 
12
  The free multi-vendor plugin for WooCommerce. Now you can allow anyone to open a store on your site!
@@ -78,6 +78,7 @@ We currently ship WC Vendors free with the following language translations. If y
78
  * Portuguese
79
  * Persian
80
  * French
 
81
  * ...and more
82
 
83
  == Installation ==
@@ -118,6 +119,11 @@ No Upgrade required at this time.
118
 
119
  == Changelog ==
120
 
 
 
 
 
 
121
  = Version 1.8.8 - 22nd March 2016 =
122
 
123
  * Fixed: Undefined variable error in commission class
5
  Author URI: http://www.wcvendors.com/
6
  Plugin URI: http://www.wcvendors.com/
7
  Requires at least: 4.0
8
+ Tested up to: 4.5.0
9
+ Stable tag: 1.8.9
10
  License: GPLv2 or later
11
 
12
  The free multi-vendor plugin for WooCommerce. Now you can allow anyone to open a store on your site!
78
  * Portuguese
79
  * Persian
80
  * French
81
+ * Swedish
82
  * ...and more
83
 
84
  == Installation ==
119
 
120
  == Changelog ==
121
 
122
+ = Version 1.8.9 - 1st May 2016 =
123
+
124
+ * Fixed: Commission Totals Report Inaccurate #267
125
+ * Added: Swedish Translation Thanks Arvid!
126
+
127
  = Version 1.8.8 - 22nd March 2016 =
128
 
129
  * Fixed: Undefined variable error in commission class
trunk/assets/css/admin-orders.css DELETED
@@ -1,7 +0,0 @@
1
- .wp-list-table .column-order_id { width: 10%; }
2
- .wp-list-table .column-customer { width: 15%; }
3
- .wp-list-table .column-product { width: 35%; }
4
- .wp-list-table .column-total { width: 10%;}
5
- /*.wp-list-table .column-comments { width: 27.5%;}*/
6
- .wp-list-table .column-date { width: 15%;}
7
- .wp-list-table .column-status { width: 15%;}
 
 
 
 
 
 
 
trunk/assets/css/wcv-frontend.css DELETED
@@ -1,545 +0,0 @@
1
- /*!
2
- * Bootstrap v2.1.1
3
- *
4
- * Copyright 2012 Twitter, Inc
5
- * Licensed under the Apache License v2.0
6
- * http://www.apache.org/licenses/LICENSE-2.0
7
- *
8
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
- */
10
- clearfix {
11
- *zoom: 1;
12
- }
13
-
14
- .clearfix:before, .clearfix:after {
15
- display: table;
16
- content: "";
17
- line-height: 0;
18
- }
19
-
20
- .clearfix:after {
21
- clear: both;
22
- }
23
-
24
- .hide-text {
25
- font: 0/0 a;
26
- color: transparent;
27
- text-shadow: none;
28
- background-color: transparent;
29
- border: 0;
30
- }
31
-
32
- .input-block-level {
33
- display: block;
34
- width: 100%;
35
- min-height: 30px;
36
- -webkit-box-sizing: border-box;
37
- -moz-box-sizing: border-box;
38
- box-sizing: border-box;
39
- }
40
-
41
- .wcv-btn {
42
- display: inline-block;
43
- *display: inline;
44
- *zoom: 1;
45
- padding: 4px 14px;
46
- margin-bottom: 0;
47
- font-size: 14px;
48
- line-height: 20px;
49
- *line-height: 20px;
50
- text-align: center;
51
- vertical-align: middle;
52
- cursor: pointer;
53
- color: #333333;
54
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
55
- background-color: #f5f5f5;
56
- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
57
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
58
- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
59
- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
60
- background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
61
- background-repeat: repeat-x;
62
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
63
- border-color: #e6e6e6 #e6e6e6 #bfbfbf;
64
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
65
- *background-color: #e6e6e6;
66
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
67
- border: 1px solid #bbbbbb;
68
- *border: 0;
69
- border-bottom-color: #a2a2a2;
70
- -webkit-border-radius: 4px;
71
- -moz-border-radius: 4px;
72
- border-radius: 4px;
73
- *margin-left: .3em;
74
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
75
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
76
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
77
- }
78
-
79
- .wcv-btn:hover, .wcv-btn:active, .wcv-btn.active, .wcv-btn.disabled, .wcv-btn[disabled] {
80
- color: #333333;
81
- background-color: #e6e6e6;
82
- *background-color: #d9d9d9;
83
- }
84
-
85
- .wcv-btn:active, .wcv-btn.active {
86
- background-color: #cccccc \9;
87
- }
88
-
89
- .wcv-btn:first-child {
90
- *margin-left: 0;
91
- }
92
-
93
- .wcv-btn:hover {
94
- color: #333333;
95
- text-decoration: none;
96
- background-color: #e6e6e6;
97
- *background-color: #d9d9d9;
98
- background-position: 0 -15px;
99
- -webkit-transition: background-position 0.1s linear;
100
- -moz-transition: background-position 0.1s linear;
101
- -o-transition: background-position 0.1s linear;
102
- transition: background-position 0.1s linear;
103
- }
104
-
105
- .wcv-btn:focus {
106
- outline: thin dotted #333;
107
- outline: 5px auto -webkit-focus-ring-color;
108
- outline-offset: -2px;
109
- }
110
-
111
- .wcv-btn.active, .wcv-btn:active {
112
- background-color: #e6e6e6;
113
- background-color: #d9d9d9 \9;
114
- background-image: none;
115
- outline: 0;
116
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
117
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
118
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
119
- }
120
-
121
- .wcv-btn.disabled, .wcv-btn[disabled] {
122
- cursor: default;
123
- background-color: #e6e6e6;
124
- background-image: none;
125
- opacity: 0.65;
126
- filter: alpha(opacity=65);
127
- -webkit-box-shadow: none;
128
- -moz-box-shadow: none;
129
- box-shadow: none;
130
- }
131
-
132
- .wcv-btn-large {
133
- padding: 9px 14px;
134
- font-size: 16px;
135
- line-height: normal;
136
- -webkit-border-radius: 5px;
137
- -moz-border-radius: 5px;
138
- border-radius: 5px;
139
- }
140
-
141
- .wcv-btn-large [class^="icon-"] {
142
- margin-top: 2px;
143
- }
144
-
145
- .wcv-btn-small {
146
- padding: 3px 9px;
147
- font-size: 12px;
148
- line-height: 18px;
149
- }
150
-
151
- .wcv-btn-small [class^="icon-"] {
152
- margin-top: 0;
153
- }
154
-
155
- .wcv-btn-mini {
156
- padding: 2px 6px;
157
- font-size: 11px;
158
- line-height: 17px;
159
- }
160
-
161
- .wcv-btn-block {
162
- display: block;
163
- width: 100%;
164
- padding-left: 0;
165
- padding-right: 0;
166
- -webkit-box-sizing: border-box;
167
- -moz-box-sizing: border-box;
168
- box-sizing: border-box;
169
- }
170
-
171
- .wcv-btn-block + .wcv-btn-block {
172
- margin-top: 5px;
173
- }
174
-
175
- input[type="submit"].wcv-btn-block, input[type="reset"].wcv-btn-block, input[type="button"].wcv-btn-block {
176
- width: 100%;
177
- }
178
-
179
- .wcv-btn-primary.active, .wcv-btn-warning.active, .wcv-btn-danger.active, .wcv-btn-success.active, .wcv-btn-info.active, .wcv-btn-inverse.active {
180
- color: rgba(255, 255, 255, 0.75);
181
- }
182
-
183
- .wcv-btn {
184
- border-color: #c5c5c5;
185
- border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
186
- }
187
-
188
- .wcv-btn-primary {
189
- color: #ffffff;
190
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
191
- background-color: #006dcc;
192
- background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
193
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
194
- background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
195
- background-image: -o-linear-gradient(top, #0088cc, #0044cc);
196
- background-image: linear-gradient(to bottom, #0088cc, #0044cc);
197
- background-repeat: repeat-x;
198
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
199
- border-color: #0044cc #0044cc #002a80;
200
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
201
- *background-color: #0044cc;
202
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
203
- }
204
-
205
- .wcv-btn-primary:hover, .wcv-btn-primary:active, .wcv-btn-primary.active, .wcv-btn-primary.disabled, .wcv-btn-primary[disabled] {
206
- color: #ffffff;
207
- background-color: #0044cc;
208
- *background-color: #003bb3;
209
- }
210
-
211
- .wcv-btn-primary:active, .wcv-btn-primary.active {
212
- background-color: #003399 \9;
213
- }
214
-
215
- .wcv-btn-warning {
216
- color: #ffffff;
217
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
218
- background-color: #faa732;
219
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
220
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
221
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
222
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
223
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
224
- background-repeat: repeat-x;
225
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
226
- border-color: #f89406 #f89406 #ad6704;
227
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
228
- *background-color: #f89406;
229
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
230
- }
231
-
232
- .wcv-btn-warning:hover, .wcv-btn-warning:active, .wcv-btn-warning.active, .wcv-btn-warning.disabled, .wcv-btn-warning[disabled] {
233
- color: #ffffff;
234
- background-color: #f89406;
235
- *background-color: #df8505;
236
- }
237
-
238
- .wcv-btn-warning:active, .wcv-btn-warning.active {
239
- background-color: #c67605 \9;
240
- }
241
-
242
- .wcv-btn-danger {
243
- color: #ffffff;
244
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
245
- background-color: #da4f49;
246
- background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
247
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
248
- background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
249
- background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
250
- background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
251
- background-repeat: repeat-x;
252
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
253
- border-color: #bd362f #bd362f #802420;
254
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
255
- *background-color: #bd362f;
256
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
257
- }
258
-
259
- .wcv-btn-danger:hover, .wcv-btn-danger:active, .wcv-btn-danger.active, .wcv-btn-danger.disabled, .wcv-btn-danger[disabled] {
260
- color: #ffffff;
261
- background-color: #bd362f;
262
- *background-color: #a9302a;
263
- }
264
-
265
- .wcv-btn-danger:active, .wcv-btn-danger.active {
266
- background-color: #942a25 \9;
267
- }
268
-
269
- .wcv-btn-success {
270
- color: #ffffff;
271
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
272
- background-color: #5bb75b;
273
- background-image: -moz-linear-gradient(top, #62c462, #51a351);
274
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
275
- background-image: -webkit-linear-gradient(top, #62c462, #51a351);
276
- background-image: -o-linear-gradient(top, #62c462, #51a351);
277
- background-image: linear-gradient(to bottom, #62c462, #51a351);
278
- background-repeat: repeat-x;
279
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
280
- border-color: #51a351 #51a351 #387038;
281
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
282
- *background-color: #51a351;
283
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
284
- }
285
-
286
- .wcv-btn-success:hover, .wcv-btn-success:active, .wcv-btn-success.active, .wcv-btn-success.disabled, .wcv-btn-success[disabled] {
287
- color: #ffffff;
288
- background-color: #51a351;
289
- *background-color: #499249;
290
- }
291
-
292
- .wcv-btn-success:active, .wcv-btn-success.active {
293
- background-color: #408140 \9;
294
- }
295
-
296
- .wcv-btn-info {
297
- color: #ffffff;
298
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
299
- background-color: #49afcd;
300
- background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
301
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
302
- background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
303
- background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
304
- background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
305
- background-repeat: repeat-x;
306
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
307
- border-color: #2f96b4 #2f96b4 #1f6377;
308
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
309
- *background-color: #2f96b4;
310
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
311
- }
312
-
313
- .wcv-btn-info:hover, .wcv-btn-info:active, .wcv-btn-info.active, .wcv-btn-info.disabled, .wcv-btn-info[disabled] {
314
- color: #ffffff;
315
- background-color: #2f96b4;
316
- *background-color: #2a85a0;
317
- }
318
-
319
- .wcv-btn-info:active, .wcv-btn-info.active {
320
- background-color: #24748c \9;
321
- }
322
-
323
- .wcv-btn-inverse {
324
- color: #ffffff;
325
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
326
- background-color: #363636;
327
- background-image: -moz-linear-gradient(top, #444444, #222222);
328
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
329
- background-image: -webkit-linear-gradient(top, #444444, #222222);
330
- background-image: -o-linear-gradient(top, #444444, #222222);
331
- background-image: linear-gradient(to bottom, #444444, #222222);
332
- background-repeat: repeat-x;
333
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
334
- border-color: #222222 #222222 #000000;
335
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
336
- *background-color: #222222;
337
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
338
- }
339
-
340
- .wcv-btn-inverse:hover, .wcv-btn-inverse:active, .wcv-btn-inverse.active, .wcv-btn-inverse.disabled, .wcv-btn-inverse[disabled] {
341
- color: #ffffff;
342
- background-color: #222222;
343
- *background-color: #151515;
344
- }
345
-
346
- .wcv-btn-inverse:active, .wcv-btn-inverse.active {
347
- background-color: #080808 \9;
348
- }
349
-
350
- button.wcv-btn, input[type="submit"].wcv-btn {
351
- *padding-top: 3px;
352
- *padding-bottom: 3px;
353
- }
354
-
355
- button.wcv-btn::-moz-focus-inner, input[type="submit"].wcv-btn::-moz-focus-inner {
356
- padding: 0;
357
- border: 0;
358
- }
359
-
360
- button.wcv-btn.wcv-btn-large, input[type="submit"].wcv-btn.wcv-btn-large {
361
- *padding-top: 7px;
362
- *padding-bottom: 7px;
363
- }
364
-
365
- button.wcv-btn.wcv-btn-small, input[type="submit"].wcv-btn.wcv-btn-small {
366
- *padding-top: 3px;
367
- *padding-bottom: 3px;
368
- }
369
-
370
- button.wcv-btn.wcv-btn-mini, input[type="submit"].wcv-btn.wcv-btn-mini {
371
- *padding-top: 1px;
372
- *padding-bottom: 1px;
373
- }
374
-
375
- .wcv-btn-link, .wcv-btn-link:active, .wcv-btn-link[disabled] {
376
- background-color: transparent;
377
- background-image: none;
378
- -webkit-box-shadow: none;
379
- -moz-box-shadow: none;
380
- box-shadow: none;
381
- }
382
-
383
- .wcv-btn-link {
384
- border-color: transparent;
385
- cursor: pointer;
386
- color: #0088cc;
387
- -webkit-border-radius: 0;
388
- -moz-border-radius: 0;
389
- border-radius: 0;
390
- }
391
-
392
- .wcv-btn-link:hover {
393
- color: #005580;
394
- text-decoration: underline;
395
- background-color: transparent;
396
- }
397
-
398
- .wcv-btn-link[disabled]:hover {
399
- color: #333333;
400
- text-decoration: none;
401
- }
402
-
403
- table {
404
- max-width: 100%;
405
- background-color: transparent;
406
- border-collapse: collapse;
407
- border-spacing: 0;
408
- }
409
-
410
- .table {
411
- width: 100%;
412
- margin-bottom: 20px;
413
- }
414
-
415
- .table th, .table td {
416
- padding: 8px;
417
- line-height: 20px;
418
- text-align: left;
419
- vertical-align: top;
420
- border-top: 1px solid #dddddd;
421
- }
422
-
423
- .table th {
424
- font-weight: bold;
425
- }
426
-
427
- .table thead th {
428
- vertical-align: bottom;
429
- }
430
-
431
- .table caption + thead tr:first-child th, .table caption + thead tr:first-child td, .table colgroup + thead tr:first-child th, .table colgroup + thead tr:first-child td, .table thead:first-child tr:first-child th, .table thead:first-child tr:first-child td {
432
- border-top: 0;
433
- }
434
-
435
- .table tbody + tbody {
436
- border-top: 2px solid #dddddd;
437
- }
438
-
439
- .table-condensed th, .table-condensed td {
440
- padding: 4px 5px;
441
- }
442
-
443
- .table-bordered {
444
- border: 1px solid #dddddd;
445
- border-collapse: separate;
446
- *border-collapse: collapse;
447
- border-left: 0;
448
- -webkit-border-radius: 4px;
449
- -moz-border-radius: 4px;
450
- border-radius: 4px;
451
- }
452
-
453
- .table-bordered th, .table-bordered td {
454
- border-left: 1px solid #dddddd;
455
- }
456
-
457
- .table-bordered caption + thead tr:first-child th, .table-bordered caption + tbody tr:first-child th, .table-bordered caption + tbody tr:first-child td, .table-bordered colgroup + thead tr:first-child th, .table-bordered colgroup + tbody tr:first-child th, .table-bordered colgroup + tbody tr:first-child td, .table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td {
458
- border-top: 0;
459
- }
460
-
461
- .table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child {
462
- -webkit-border-top-left-radius: 4px;
463
- border-top-left-radius: 4px;
464
- -moz-border-radius-topleft: 4px;
465
- }
466
-
467
- .table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child {
468
- -webkit-border-top-right-radius: 4px;
469
- border-top-right-radius: 4px;
470
- -moz-border-radius-topright: 4px;
471
- }
472
-
473
- .table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child, .table-bordered tfoot:last-child tr:last-child td:first-child {
474
- -webkit-border-radius: 0 0 0 4px;
475
- -moz-border-radius: 0 0 0 4px;
476
- border-radius: 0 0 0 4px;
477
- -webkit-border-bottom-left-radius: 4px;
478
- border-bottom-left-radius: 4px;
479
- -moz-border-radius-bottomleft: 4px;
480
- }
481
-
482
- .table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child, .table-bordered tfoot:last-child tr:last-child td:last-child {
483
- -webkit-border-bottom-right-radius: 4px;
484
- border-bottom-right-radius: 4px;
485
- -moz-border-radius-bottomright: 4px;
486
- }
487
-
488
- .table-bordered caption + thead tr:first-child th:first-child, .table-bordered caption + tbody tr:first-child td:first-child, .table-bordered colgroup + thead tr:first-child th:first-child, .table-bordered colgroup + tbody tr:first-child td:first-child {
489
- -webkit-border-top-left-radius: 4px;
490
- border-top-left-radius: 4px;
491
- -moz-border-radius-topleft: 4px;
492
- }
493
-
494
- .table-bordered caption + thead tr:first-child th:last-child, .table-bordered caption + tbody tr:first-child td:last-child, .table-bordered colgroup + thead tr:first-child th:last-child, .table-bordered colgroup + tbody tr:first-child td:last-child {
495
- -webkit-border-top-right-radius: 4px;
496
- border-top-right-radius: 4px;
497
- -moz-border-radius-topleft: 4px;
498
- }
499
-
500
- .table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th {
501
- background-color: #f9f9f9;
502
- }
503
-
504
- .table-hover tbody tr:hover td, .table-hover tbody tr:hover th {
505
- background-color: #f5f5f5;
506
- }
507
-
508
- table [class*=span], .row-fluid table [class*=span] {
509
- display: table-cell;
510
- float: none;
511
- margin-left: 0;
512
- }
513
-
514
- .table tbody tr.success td {
515
- background-color: #dff0d8;
516
- }
517
-
518
- .table tbody tr.error td {
519
- background-color: #f2dede;
520
- }
521
-
522
- .table tbody tr.warning td {
523
- background-color: #fcf8e3;
524
- }
525
-
526
- .table tbody tr.info td {
527
- background-color: #d9edf7;
528
- }
529
-
530
- .table-hover tbody tr.success:hover td {
531
- background-color: #d0e9c6;
532
- }
533
-
534
- .table-hover tbody tr.error:hover td {
535
- background-color: #ebcccc;
536
- }
537
-
538
- .table-hover tbody tr.warning:hover td {
539
- background-color: #faf2cc;
540
- }
541
-
542
- .table-hover tbody tr.info:hover td {
543
- background-color: #c4e3f3;
544
- }
545
- .hidden { display: none; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/images/icons/truck.png DELETED
Binary file
trunk/assets/js/front-orders.js DELETED
@@ -1,8 +0,0 @@
1
- jQuery(function () {
2
- jQuery('div.order-comments, div.order-tracking').hide();
3
-
4
- jQuery('a.order-comments-link, a.order-tracking-link').on('click', function (e) {
5
- e.preventDefault();
6
- jQuery(this).next('div').slideToggle();
7
- });
8
- });
 
 
 
 
 
 
 
 
trunk/assets/js/wcv-admin-quick-edit.js DELETED
@@ -1,34 +0,0 @@
1
- jQuery(function(){
2
- jQuery('#the-list').on('click', '.editinline', function(){
3
-
4
- if (jQuery('.inline-edit-author').length && jQuery('.inline-edit-author-new').length) {
5
- jQuery('.inline-edit-author').hide();
6
- jQuery('.inline-edit-author').attr('class', 'inline-edit-author-old');
7
- jQuery('select[name=post_author]').attr('name', 'post_author-old');
8
- jQuery('.inline-edit-author-new').attr('class', 'inline-edit-author');
9
- jQuery('select[name=post_author-new]').attr('name', 'post_author');
10
- }
11
-
12
- inlineEditPost.revert();
13
-
14
- var post_id = jQuery(this).closest('tr').attr('id');
15
-
16
- post_id = post_id.replace("post-", "");
17
-
18
- var wcv_inline_data = jQuery('#vendor_' + post_id),
19
- wc_inline_data = jQuery('#woocommerce_inline_' + post_id );
20
-
21
- var vendor = wcv_inline_data.find("#_vendor").text();
22
-
23
- jQuery('select[name="post_author"] option[value="' + vendor + '"]', '.inline-edit-row').attr('selected', 'selected');
24
-
25
- var product_type = wc_inline_data.find('.product_type').val();
26
-
27
- if (product_type=='simple' || product_type=='external') {
28
- jQuery('.vendor', '.inline-edit-row').show();
29
- } else {
30
- jQuery('.vendor', '.inline-edit-row').hide();
31
- }
32
-
33
- });
34
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/changelog.txt DELETED
@@ -1,417 +0,0 @@
1
- Changelog for WC Vendors
2
-
3
- Version 1.8.8
4
-
5
- * Fixed: Undefined variable error in commission class
6
- * Fixed: Pagination bug in wcv_vendorslist shortcode
7
-
8
- Version 1.8.7
9
-
10
- * Added: New qty argument to commission calculations
11
- * Added: Image uploader settings type
12
- * Added: New commission function for payment gateways
13
- * Fixed: Prefixed all btn css classes to stop theme collision
14
- * Fixed: Sold By:Name spaces issue #256
15
- * Fixed: Show extended fields for vendor and pending vendor roles
16
- * Fixed: Check if product is taxable
17
- * Fixed: Depreciated function calls in email templates
18
- * Fixed: Commission giving tax on none taxable items #251
19
- * Fixed: Sold by label issues with WC 2.5 #250
20
-
21
- Version 1.8.6
22
-
23
- * Fixed: Critical issue with paypal loading classes incorrectly
24
-
25
- Version 1.8.5
26
-
27
- * Fixed: Issue with PayPal on some sites - Rolled back issue #247
28
- * Fixed: Reverted ticket #216 for email conflicts
29
- * Added: New KnowledgeBase URL
30
-
31
- Version 1.8.4
32
-
33
- * Added: Removed fields from users that aren't vendors
34
- * Added: actions to hook into approve/deny vendor
35
- * Added: Ability to integrate with any order status for emails #216
36
- * Added: Terms & Conditions Opens in New Tab #246
37
- * Updated: Added trigger for on-hold to processing/completed for Notify Vendor Email #238
38
- * Updated: Settings page helper text and clarifications
39
- * Fixed: Sold by formatting issue #248
40
- * Fixed: wp_redirect caches with W3 Total Cache #237
41
- * Fixed: Bug in single page settings generator
42
- * Fixed: Category title missing bug #213
43
- * Fixed: Undefined index for non vendor users
44
- * Merge: pull request #247 from archonic/hotfix/oauth-class-exists
45
-
46
-
47
- Version 1.8.3
48
-
49
- * Fixed: Fatal Error on activation Merge pull request #235 from oleggen/patch-1
50
- * Added: Seller info label option
51
-
52
- Version 1.8.2
53
-
54
- * Added: Sold By label option
55
- * Added: New Vendor Commission Totals Report #234
56
- * Fixed: Added 'Shipped' if marked as shipped #233 can be found on WooCommerce > Reports > WC Vendors > Commission Totals
57
- * Fixed: Renamed internal function to stop theme and plugin clash
58
-
59
- Version 1.8.1
60
-
61
- * Added: New options updated action for settings
62
- * Added: New plugin activation hook for testing woocommerce active
63
- * Added: vendor id to get shipping due filter
64
- * Added: Warning on settings page if user registration in WooCommerce is not enabled
65
- * Added: Russian Translations thanks Natalia
66
-
67
- Version 1.8.0
68
-
69
- * Fixed: Mark $0.00 commissions as paid instead of due #205
70
- * Fixed: Email trigger should be filter not action - Thanks ontiuk #215
71
- * Updated: Read me with link to Pro and Updated Language List
72
- * Added: Portuguese Language (Thanks Renato) #212
73
- * Remove Forced HTTP Protocol on Sent IPN URL #207 from GoTeamScotch
74
-
75
- Version 1.7.9
76
-
77
- * Fixed: woocommerce filter and action issues on product edit page
78
-
79
- Version 1.7.8
80
-
81
- * Fixed: Vendors can not register #193
82
- * Fixed: Variation product image upload #194
83
- * Added: Order actions thanks GoTeamScotch
84
- * Updated: New item meta in WC 2.4+
85
- * Updated: WooCommerce Shipment Tracking v1.2.7+
86
- * Fixed: Paypal Logging thanks to GoTeamScotch
87
- * Updated: Templates now fully translatable #195
88
- * Fixed: Translations not loading bug
89
- * Fixed: vendors not defined error
90
- * Updated: Base translation files
91
-
92
- Version 1.7.7
93
-
94
- * Fixed: Terms and conditions processing #182
95
- * Added: filter to order note for overrides
96
- * Added: Order note for marked shipped #187
97
- * Fixed: order retrieval for wp-admin orders table for vendors
98
- * Fixed: pagination bug #179
99
- * Updated: styles for orders table in admin for vendors
100
- * Fixed: Vendor displaying issue #180
101
- * Updated: Admin Commission Report Column Names #183
102
- * Updated: Admin Commissions Page now shows times a product has sold in total #184
103
-
104
- Version 1.7.6
105
-
106
- * Added: Stock notifications go to vendors #114
107
- * Fixed: Instant Pay bug #174
108
- * Fixed: wcv_vendorslist paging #178
109
- * Added: Vendor display name now translatable
110
- * Depreciated: Dashboard vendor reports
111
- * Added: Chinese Language files thanks to SundayLau
112
- * Fixed: Added support for WPML #177
113
- * Update: default pot language file
114
-
115
- Version 1.7.5
116
-
117
- * Merged: Check product post type in vendor dashboard thanks simplementNat
118
- * Updated: Base language file
119
- * Updated: Compatibility for Shipment Tracking for v1.3.5 #167
120
- * Fixed: Shipping taxes
121
- * Fixed: Pending Products for Vendors #168
122
- * Added: Vendor shipping override #171
123
- * Added: Give Tax Per Vendor Override #56
124
- * Added: Hide duplicate product option
125
- * Fixed: Email firing for pending status only
126
- * Updated: Unified vendor-main/mini-header variables
127
- * Fixed: Email template paths to woocommerce paths
128
- * Merged: Updated Brazilian Portuguese thanks carlosramosweb
129
- * Added: Seller Info to header #161
130
- * Updated: Spanish Translations #160
131
- * Updated: Brazilian Portuguese Language #156
132
-
133
- Version 1.7.4
134
-
135
- * Added: Mark shipped filter #157
136
- * Fixed: Added Tax total to vendor email #146
137
- * Updated: Location of email templates in theme to wc-vendors/emails
138
- * Added: User email to Vendor Display Options #158
139
- * Fixed: Mass Pay Now Bug #159
140
- * Fixed: Mark as shipped for downloadable product #40
141
- * Added: Brazilian Portuguese language #156
142
- * Updated: Default Language file
143
- * Fixed: Translation issue for query test #155
144
- * Updated: Template base for emails
145
- * Fixed: Vendor email and renamed template #135
146
- * Fixed: Better CSV Output #63
147
- * Fixed: Made PayPal optional on Vendor Dashboard Shop Settings #144
148
- * Update: fixed return query var
149
- * Fixed: Test for product post types #149
150
- * Fixed: 2.1 Depreciated return call
151
- * Fixed: PHP Strict static call in commissions class
152
- * Merged: Is Vendor checks all user roles #147 thanks crabilld
153
-
154
- Version 1.7.3
155
-
156
- * Fixed: Paypal AP IPN url issue
157
-
158
- Version 1.7.2
159
-
160
- * Added: Filters for seller tab #141
161
- * Fixed: URI Too Large Error #143
162
- * Fixed: Give tax to vendors #142
163
- * Updated: Spanish Translations #140
164
- * Added: Persian Translation #139
165
-
166
- Version 1.7.1
167
-
168
- * Fixed: Invalid argument on new orders dashboard page #138
169
- * Updated: Base translation file
170
-
171
- Version 1.7.0
172
-
173
- * Fixed: add_query_arg/remove_query_arg XSS issue
174
- * Fixed: Hide Notice not working for admin settings
175
- * Added: Shop Settings page in WordPress dashboard
176
- * Added: Orders page in WordPress dashboard
177
-
178
- Version 1.6.2
179
-
180
- * Added: Option to change sold by vendor name #106
181
- * Fixed: Error notice in vendor dashboard #133
182
- * Fixed: Pagination in commissions admin screen #68
183
- * Added: Support for WooCommerce Order Status Manager
184
- * Fixed: Updated media filter method for vendors #132
185
- * Fixed: Commission not logged for variations #131
186
-
187
- Version 1.6.1
188
-
189
- * Fixed: Support for Per Product Shipping 2.2.x #126
190
- * Added: Filter to change commission label in vendor email #127
191
-
192
- Version 1.6.0
193
-
194
- * Added: Admin notices for vendor page slug & permalinks
195
- * Fixed: Plugin row meta links
196
- * Added: Upgrade notice
197
- * Fixed: Rounding issue #120
198
- * Fixed: Paypal https host check depreciated call
199
- * Added: show_products attribute #107
200
- * Updated: Text in denied template to make more sense when registration disabled #123
201
- * Updated: wcv_vendorslist shortcode now shows 3 column output #123
202
- * Fixed: Index issue #122
203
- * Updated: New plugin and template directory structure - IMPORTANT READ KB
204
-
205
- Version 1.5.0
206
-
207
- * Added: Spanish translation thanks Mauricio
208
- * Added: French translation thanks JP
209
- * Added: CSS class for sold by (classes same as filters in those files)
210
- * Fixed: Paypal return URL
211
- * Added: Vendor Dashboard UI Improvements
212
- * Added: WC Vendors Test Gateway
213
- * Updated: ToolTips to be more helpful
214
- * Added: Admin option for not giving shipping cost to vendor
215
- * Fixed: Disable notify admin
216
- * Fixed: Mark as shipped/unshipped
217
- * Fixed: Duplicate column name
218
-
219
- Version 1.4.5
220
-
221
- * Updated: select2 3.5.2 for settings api
222
- * Fixed: Replaced Chosen with Select2 #102
223
- * Fixed: Table Rate Shipping issue #103
224
- * Fixed: Featured column issue #100
225
- * Updated: Filter call for report
226
- * Fixed: Call to depreciated function #98
227
-
228
- Version 1.4.4
229
-
230
- * Fixed: Hardcoded table in wcv_vendorslist shortcode
231
-
232
- Version 1.4.3
233
-
234
- * Fixed: Placeholder on Product Reports
235
-
236
- Version 1.4.2
237
-
238
- * Added: Commission status sort to commissions page
239
- * Fixed: Recent Commissions limit of 20 now works on selected date range
240
- * Fixed: Report By product in WC2.3
241
- * Fixed: Vendor Report date selector in wp-admin
242
- * Fixed: Tracking plugin Order Meta
243
- * Added: New filter wcvendors_dashboard_google_maps_link
244
- * Fixed: Formatting error for Google maps link
245
- * Added: New actions in vendor-dashboard wcvendors_vendor_unship, wcvendors_vendor_ship (thanks Nathan H)
246
-
247
- Version 1.4.1
248
-
249
- * Fixed: Language file loading issue
250
- * Fixed: Static function calls in commision class for php 5.6
251
- * Fixed: Static call in Vendor Cart
252
- * Added: New language files for de_AT, de_DE (thanks to theHubi), it_IT (thanks to Nicole)
253
- * Added: New actions for main and mini headers (before and after see KB)
254
-
255
- Version 1.4.0
256
-
257
- * Added: product category + vendor shortcode [wcv_product_category category="category" vendor="vendorname"]
258
- * Added: Tracking number support via WooThemes Shipment Tracking plugin
259
- * Added: Google Maps for delivery address on front end
260
- * Fixed: woocommerce_wp_text_input via merged pull request from svenl77
261
- * Added: Vendor List shortcode [wcv_vendorlist] + template for styling see KB for full details
262
- * Fixed: Report not showing Commission by Product
263
- * Fixed: Paths in language files
264
-
265
- Version 1.3.1
266
-
267
- * Fixed: Sold by in invoices
268
-
269
- Version 1.3.0
270
-
271
- * Added: show vendor on all emails #29
272
- * Fixed: Critical issue #58
273
- * Added: Vendor header templates #65
274
- * Added: Vendor to QuickEdit #12
275
- * Fixed: Updating notices to use 2.1 Notice API #62
276
- * Added: wcvendors_registration_checkbox filter to denied.php template view
277
- * Added: wcvendors_vendor_registration_checkbox filter to filter "Apply to become a vendor?" at registration.
278
- * Added: wcvendors_vendor_registration_checkbox to filter "Apply to become a vendor?"
279
-
280
- Version 1.2.0
281
-
282
- * Added new filters to change sold by text see Knowledge base for details
283
- * Added sold by to product loop for archive-product.php, see knowledge base on how to disable or change this
284
- * Added new option to hide "Featured product" from vendors
285
- * Added Sold By Filter as per #3
286
- * Removing unused tag filter
287
- * Updated default.pot
288
- * Fixing attribute bug #48 - Thanks to gcskye
289
- * Removing legacy translations
290
- * Fixed Orders view errors
291
- * Fixing call to incorrect method #45
292
-
293
- Version 1.1.5
294
-
295
- * Fixed orders view to remove incorrect call to woocommerce print messages
296
-
297
- Version 1.1.4
298
-
299
- * Fixed called to incorrect notice method
300
- * Moved methods into parent class See #41
301
- * PHP Strict updates
302
- * Deprecated Class due to PHP strict issues
303
- * fixing static call
304
- * Tidying up and comments.
305
- * Renaming class to new standard
306
- * Removing deprecated wc methods.
307
- * Fixing incorrect method call
308
- * Problem with undefined variable.
309
- * fixing static call issues
310
- * fixing static call problems
311
- * Fixing more strict issues
312
- * fixing encoding issue
313
- * Fixing tax rounding issue #37
314
- * Fixing deprecated calls #42
315
- * Fixing strict standards
316
- * Fixing constant reference #36
317
- * Fixed reference to old plugin name
318
- * Fixing strict errors #27
319
- * New Default POT translations #26
320
- * Fixing translation strings #26
321
- * Updated description
322
- * Fix link to paypal adaptive payments #25
323
- * Fixing issue #22
324
- * Remove support for woo commerce 2.1 and below
325
- * Class rename
326
- * Fixed incorrect table name see #35
327
- * Fixed Class description
328
- * Added label on vendor email shipping line see #22
329
- * Fix issue #23 Notify vendor email problem
330
- * Fixing Issue #28 & removing WC2.0 support
331
- * Strict Standards in WCV_Vendors #32
332
- * Fixing Issue #31 PHP Strict Issues
333
- * Fixing Issue #30 PHP Strict Standards
334
- * Change Log added for release changes
335
- * WC Version Requirement changed
336
- * Updating author to include wc after modifications
337
- * Rename class
338
- * Fixing up link to documentation
339
- * Updated Readme
340
-
341
- Version 1.1.3
342
-
343
- * Fixing table names for compatibility
344
- * Rename class
345
- * Fixing Fatal error #18
346
- * Fatal error fixed, version bump
347
- * Fixing Class call
348
- * Fixing all references to incorrect class name
349
- * Commission and report fixes
350
- * Fixing spelling
351
- * Update readme.txt
352
- * Fixing author
353
- * Version bump
354
- * Check if shipping is enabled
355
- * Comment for future reference
356
-
357
- Version 1.1.1
358
-
359
- * Start of adding woocomerce short codes enhanced
360
- * Shortcodes class
361
- * Removing temp file
362
- * Adding short code support
363
- * Version Bump
364
- * PHP Strict Issue #5
365
- * Fatal Error: Class 'PV_Commission' #14
366
- * Fixing references to PV_Vendors
367
- * Renamed filters and actions
368
- * Rename Reports Submenu #15
369
- * "Mark Shipped" Icon #16
370
- * Version increased after bug fixes
371
-
372
- Version 1.0.2
373
-
374
- * Fix up admin settings notices
375
- * Renamed shortcodes
376
- * Version bump for short code rename
377
-
378
-
379
- Version 1.0.1
380
-
381
- * Initial Commit
382
- * First commit - no modifications to existing plugin
383
- * Updating README
384
- * Update README.md
385
- * Features added
386
- * Updated Details of plugin
387
- * Fixing up formatting
388
- * More fixes.
389
- * Updating readme
390
- * Updating more details
391
- * Update denied.php
392
- * Added mac file ignore
393
- * updated read me
394
- * Plugin Rename
395
- * Plugin rename
396
- * Rename plugin
397
- * Rename plugin
398
- * more updates
399
- * Plugin Updater removed
400
- * Updating text domain
401
- * Basic rename complete
402
- * Replacement includes classes
403
- * text domain updates
404
- * text domain updates
405
- * new change log for new fork
406
- * Rename main class
407
- * renaming constants
408
- * updated constants
409
- * plugin constant
410
- * Renaming queries class
411
- * constants updated
412
- * rename vendor shop class
413
- * rename vendor cart class
414
- * Renaming classes
415
- * Author updates
416
- * Class renaming
417
- * Version bump
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/class-wc-vendors.php DELETED
@@ -1,373 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Plugin Name: WC Vendors
5
- * Plugin URI: https://www.wcvendors.com
6
- * Description: Allow vendors to sell their own products and receive a commission for each sale.
7
- * Author: WC Vendors
8
- * Author URI: https://www.wcvendors.com
9
- *
10
- * Version: 1.8.8
11
- * Requires at least: 4.0.0
12
- * Tested up to: 4.4.1
13
- *
14
- * Text Domain: wcvendors
15
- * Domain Path: /languages/
16
- *
17
- * @category Plugin
18
- * @copyright Copyright © 2012 Matt Gates
19
- * @copyright Copyright © 2016 WC Vendors
20
- * @author Matt Gates, WC Vendors
21
- * @package WCVendors
22
- */
23
-
24
-
25
- /**
26
- * Plugin activation hook
27
- */
28
- function wcvendors_activate() {
29
-
30
- /**
31
- * Requires woocommerce to be installed and active
32
- */
33
- if ( !class_exists( 'WooCommerce' ) ) {
34
- deactivate_plugins( plugin_basename( __FILE__ ) );
35
- wp_die( __( 'WC Vendors requires WooCommerce to run. Please install WooCommerce and activate before attempting to activate again.', 'wcvendors' ) );
36
- }
37
- } // wcvendors_activate()
38
-
39
- register_activation_hook( __FILE__, 'wcvendors_activate' );
40
-
41
-
42
- /**
43
- * Required functions
44
- */
45
- require_once trailingslashit( dirname( __FILE__ ) ) . 'classes/includes/class-functions.php';
46
-
47
- /**
48
- * Check if WooCommerce is active
49
- */
50
- if ( wcv_is_woocommerce_activated() ) {
51
-
52
- /* Define an absolute path to our plugin directory. */
53
- if ( !defined( 'wcv_plugin_dir' ) ) define( 'wcv_plugin_dir', trailingslashit( dirname( __FILE__ ) ) . '/' );
54
- if ( !defined( 'wcv_assets_url' ) ) define( 'wcv_assets_url', trailingslashit( plugins_url( 'assets', __FILE__ ) ) );
55
- if ( !defined( 'wcv_plugin_base' ) ) define( 'wcv_plugin_base', plugin_basename( __FILE__ ) );
56
- if ( !defined( 'wcv_plugin_dir_path' ) ) define( 'wcv_plugin_dir_path', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
57
-
58
- /**
59
- * Main Product Vendor class
60
- *
61
- * @package WCVendors
62
- */
63
- class WC_Vendors
64
- {
65
-
66
- /**
67
- * @var
68
- */
69
- public static $pv_options;
70
- public static $id = 'wc_prd_vendor';
71
-
72
- /**
73
- * Constructor.
74
- */
75
- public function __construct()
76
- {
77
-
78
- // Load text domain
79
- add_action( 'plugins_loaded', array( $this, 'load_il8n' ) );
80
-
81
- $this->title = __( 'WC Vendors', 'wcvendors' );
82
-
83
- // Install & upgrade
84
- add_action( 'admin_init', array( $this, 'check_install' ) );
85
- add_action( 'admin_init', array( $this, 'maybe_flush_permalinks' ), 99 );
86
- add_action( 'admin_init', array( $this, 'wcv_required_ignore_notices' ) );
87
- add_action( 'admin_notices', array( $this, 'wcv_required_admin_notice') );
88
-
89
-
90
- add_action( 'plugins_loaded', array( $this, 'load_settings' ) );
91
- add_action( 'plugins_loaded', array( $this, 'include_gateways' ) );
92
- add_action( 'plugins_loaded', array( $this, 'include_core' ) );
93
- add_action( 'current_screen', array( $this, 'include_assets' ) );
94
-
95
- add_filter( 'plugin_row_meta', array($this, 'plugin_row_meta'), 10, 2 );
96
- add_action( self::$id . '_options_updated', array( $this, 'option_updates' ), 10, 2 );
97
-
98
- // Start a PHP session, if not yet started
99
- /* this line will initialize session to early and for each page
100
- if ( !session_id() ) session_start();*/
101
- }
102
-
103
-
104
- /**
105
- *
106
- */
107
- public function invalid_wc_version()
108
- {
109
- echo '<div class="error"><p>' . __( '<b>WC Vendors is disabled</b>. WC Vendors requires a minimum of WooCommerce v2.4.0.', 'wcvendors' ) . '</p></div>';
110
- }
111
-
112
-
113
- /**
114
- * Check whether install has ran before or not
115
- *
116
- * Run install if it hasn't.
117
- *
118
- * @return unknown
119
- */
120
- public function check_install()
121
- {
122
- global $woocommerce;
123
-
124
- // WC 2.0.1 is required
125
- if ( version_compare( $woocommerce->version, '2.4', '<' ) ) {
126
- add_action( 'admin_notices', array( $this, 'invalid_wc_version' ) );
127
- deactivate_plugins( plugin_basename( __FILE__ ) );
128
- return false;
129
- }
130
-
131
- require_once wcv_plugin_dir . 'classes/class-install.php';
132
-
133
- $this->load_settings();
134
- $install = new WCV_Install;
135
- $install->init();
136
- }
137
-
138
-
139
- /**
140
- * Set static $pv_options to hold options class
141
- */
142
- public function load_settings()
143
- {
144
- if ( empty( self::$pv_options ) ) {
145
- require_once wcv_plugin_dir . 'classes/admin/settings/classes/sf-class-settings.php';
146
- self::$pv_options = new SF_Settings_API( self::$id, $this->title, 'woocommerce', __FILE__ );
147
- self::$pv_options->load_options( wcv_plugin_dir . 'classes/admin/settings/sf-options.php' );
148
- }
149
- }
150
-
151
- public function load_il8n() {
152
-
153
- $domain = 'wcvendors';
154
-
155
- $locale = apply_filters( 'plugin_locale', get_locale(), $domain );
156
-
157
- //Place your custom translations into wp-content/languages/wc-vendors to be upgrade safe
158
- load_textdomain($domain, WP_LANG_DIR.'/wc-vendors/'.$domain.'-'.$locale.'.mo');
159
-
160
- load_plugin_textdomain( 'wcvendors', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
161
-
162
- }
163
-
164
-
165
- /**
166
- * Include core files
167
- */
168
- public function include_core()
169
- {
170
- require_once wcv_plugin_dir . 'classes/class-queries.php';
171
- require_once wcv_plugin_dir . 'classes/class-vendors.php';
172
- require_once wcv_plugin_dir . 'classes/class-cron.php';
173
- require_once wcv_plugin_dir . 'classes/class-commission.php';
174
- require_once wcv_plugin_dir . 'classes/class-shipping.php';
175
- require_once wcv_plugin_dir . 'classes/front/class-vendor-cart.php';
176
- require_once wcv_plugin_dir . 'classes/front/dashboard/class-vendor-dashboard.php';
177
- require_once wcv_plugin_dir . 'classes/front/class-vendor-shop.php';
178
- require_once wcv_plugin_dir . 'classes/front/signup/class-vendor-signup.php';
179
- require_once wcv_plugin_dir . 'classes/front/orders/class-orders.php';
180
- require_once wcv_plugin_dir . 'classes/admin/emails/class-emails.php';
181
- require_once wcv_plugin_dir . 'classes/admin/class-product-meta.php';
182
- require_once wcv_plugin_dir . 'classes/admin/class-vendor-applicants.php';
183
- require_once wcv_plugin_dir . 'classes/admin/class-vendor-reports.php';
184
- require_once wcv_plugin_dir . 'classes/admin/class-admin-reports.php';
185
- require_once wcv_plugin_dir . 'classes/admin/class-admin-users.php';
186
- require_once wcv_plugin_dir . 'classes/admin/class-admin-page.php';
187
- require_once wcv_plugin_dir . 'classes/admin/class-vendor-admin-dashboard.php';
188
- require_once wcv_plugin_dir . 'classes/includes/class-wcv-shortcodes.php';
189
-
190
-
191
- if ( !function_exists( 'woocommerce_wp_text_input' ) && !is_admin() ) {
192
- include_once(WC()->plugin_path() . '/includes/admin/wc-meta-box-functions.php');
193
- }
194
-
195
- new WCV_Vendor_Shop;
196
- new WCV_Vendor_Cart;
197
- new WCV_Commission;
198
- new WCV_Shipping;
199
- new WCV_Cron;
200
- new WCV_Orders;
201
- new WCV_Vendor_Dashboard;
202
- new WCV_Product_Meta;
203
- new WCV_Vendor_Reports;
204
- new WCV_Admin_Setup;
205
- new WCV_Vendor_Admin_Dashboard;
206
- new WCV_Admin_Reports;
207
- new WCV_Vendor_Applicants;
208
- new WCV_Admin_Users;
209
- new WCV_Emails;
210
- new WCV_Vendor_Signup;
211
- new WCV_Shortcodes;
212
- }
213
-
214
- /**
215
- * Load plugin assets
216
- */
217
- public function include_assets(){
218
-
219
- $screen = get_current_screen();
220
-
221
- if ( in_array( $screen->id, array( 'edit-product' ) ) ) {
222
- wp_enqueue_script( 'wcv_quick-edit', wcv_assets_url. 'js/wcv-admin-quick-edit.js', array('jquery') );
223
- }
224
-
225
- }
226
-
227
-
228
- /**
229
- * Include payment gateways
230
- */
231
- public function include_gateways()
232
- {
233
- require_once wcv_plugin_dir . 'classes/gateways/PayPal_AdvPayments/paypal_ap.php';
234
- require_once wcv_plugin_dir . 'classes/gateways/PayPal_Masspay/class-paypal-masspay.php';
235
- require_once wcv_plugin_dir . 'classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php';
236
- }
237
-
238
-
239
- /**
240
- * Do an action when options are updated
241
- *
242
- * @param array $options
243
- * @param unknown $tabname
244
- */
245
- public function option_updates( $options, $tabname )
246
- {
247
- // Change the vendor role capabilities
248
- if ( $tabname == sanitize_title(__( 'Capabilities', 'wcvendors' )) ) {
249
- $can_add = $options[ 'can_submit_products' ];
250
- $can_edit = $options[ 'can_edit_published_products' ];
251
- $can_submit_live = $options[ 'can_submit_live_products' ];
252
- $can_view_reports = $options[ 'can_view_backend_reports' ];
253
-
254
- $args = array(
255
- 'assign_product_terms' => $can_add,
256
- 'edit_products' => $can_add || $can_edit,
257
- 'edit_published_products' => $can_edit,
258
- 'delete_published_products' => $can_edit,
259
- 'delete_products' => $can_edit,
260
- 'manage_product' => $can_add,
261
- 'publish_products' => $can_submit_live,
262
- 'read' => true,
263
- 'read_products' => $can_edit || $can_add,
264
- 'upload_files' => true,
265
- 'import' => true,
266
- 'view_woocommerce_reports' => false,
267
- );
268
-
269
- remove_role( 'vendor' );
270
-
271
- add_role( 'vendor', __('Vendor', 'wcvendors'), $args );
272
- } // Update permalinks
273
- else if ( $tabname == sanitize_title(__( 'General', 'wcvendors' ) )) {
274
- $old_permalink = WC_Vendors::$pv_options->get_option( 'vendor_shop_permalink' );
275
- $new_permalink = $options[ 'vendor_shop_permalink' ];
276
-
277
- if ( $old_permalink != $new_permalink ) {
278
- update_option( WC_Vendors::$id . '_flush_rules', true );
279
- }
280
- }
281
-
282
- do_action( 'wcvendors_option_updates', $options, $tabname );
283
-
284
- }
285
-
286
-
287
- /**
288
- * If the settings are updated and the vendor page link has changed update permalinks
289
- * @access public
290
- *
291
- */
292
- public function maybe_flush_permalinks()
293
- {
294
- if ( get_option( WC_Vendors::$id . '_flush_rules' ) ) {
295
- flush_rewrite_rules();
296
- update_option( WC_Vendors::$id . '_flush_rules', false );
297
- }
298
- }
299
-
300
- /**
301
- * Add links to plugin page to our external help site.
302
- * @param $links - links array from action
303
- * @param $file - file reference for this plugin
304
- * @access public
305
- *
306
- */
307
- public static function plugin_row_meta( $links, $file ) {
308
- if ( $file == wcv_plugin_base ) {
309
-
310
- $row_meta = array(
311
- 'docs' => '<a href="http://www.wcvendors.com/kb/" target="_blank">'.__( 'Documentation/KB', 'wcvendors' ).'</a>',
312
- 'help' => '<a href="http://www.wcvendors.com/help/" target="_blank">'.__( 'Help Forums', 'wcvendors').'</a>',
313
- 'support' => '<a href="http://www.wcvendors.com/contact-us/" target="_blank">'.__( 'Paid Support', 'wcvendors' ).'</a>'
314
- );
315
-
316
- return array_merge( $links, $row_meta );
317
- }
318
-
319
- return (array) $links;
320
- }
321
-
322
- /**
323
- * Add admin notices to ensure users are saving the settings correctly
324
- * @access public
325
- *
326
- */
327
- public function wcv_required_admin_notice(){
328
- global $current_user;
329
-
330
- if ( current_user_can( 'manage_options' ) ) {
331
- $current_user_id = $current_user->ID;
332
-
333
- if ( WC_Vendors::$pv_options->get_option( 'vendor_shop_permalink' ) == null && ! get_user_meta( $current_user_id, 'wcv_shop_ignore_notice' ) ) {
334
- echo '<div class="updated">
335
- <p>'.sprintf (__('WC Vendors requires the Vendor shop page value be set <a href="%s">click here to set it.</a> | <a href="%s">Hide Notice</a>','wcvendors'), 'admin.php?page=wc_prd_vendor', esc_url( add_query_arg( 'wcv_shop_ignore_notice', '0' ) ) ).'</p>
336
- </div>';
337
- }
338
-
339
- $general_tab = ( isset( $_GET['tab'] ) && 'general' == $_GET['tab'] ) || !isset( $_GET['tab'] ) ? true : false;
340
-
341
- if ( isset( $_GET['page'] ) && 'wc_prd_vendor' == $_GET['page'] && isset( $_GET[ 'settings-updated' ] ) && $general_tab == true && ! get_user_meta( $current_user_id, 'wcv_pl_ignore_notice' ) ) {
342
- echo '<div class="updated">
343
- <p>'.sprintf (__('You must save your permalinks once you have modified your vendor page. <a href="%s">click here to save</a>. | <a href="%s">Hide Notice</a>','wcvendors'), 'options-permalink.php', esc_url( add_query_arg( 'wcv_pl_ignore_notice', '0' ) ) ).'</p>
344
- </div>';
345
- }
346
- }
347
- }
348
-
349
- /**
350
- * Add user meta to remember ignore notices
351
- * @access public
352
- *
353
- */
354
- public function wcv_required_ignore_notices(){
355
- global $current_user;
356
- $current_user_id = $current_user->ID;
357
-
358
- /* If user clicks to ignore the notice, add that to their user meta */
359
- if ( isset( $_GET[ 'wcv_shop_ignore_notice' ] ) && '0' == $_GET[ 'wcv_shop_ignore_notice' ] ) {
360
- add_user_meta( $current_user_id, 'wcv_shop_ignore_notice', 'true', true);
361
- }
362
- if ( isset($_GET['wcv_pl_ignore_notice']) && '0' == $_GET['wcv_pl_ignore_notice'] ) {
363
- add_user_meta( $current_user_id, 'wcv_pl_ignore_notice', 'true' , true);
364
- }
365
- }
366
-
367
-
368
- }
369
-
370
-
371
- new WC_Vendors;
372
-
373
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-admin-page.php DELETED
@@ -1,597 +0,0 @@
1
- <?php
2
-
3
- class WCV_Admin_Setup
4
- {
5
- /**
6
- * WC > Referrals menu
7
- */
8
-
9
- public function __construct()
10
- {
11
- add_filter( 'set-screen-option', array( 'WCV_Admin_Setup', 'set_table_option' ), 10, 3 );
12
- add_action( 'admin_menu', array( 'WCV_Admin_Setup', 'menu' ) );
13
-
14
- add_action( 'woocommerce_admin_order_data_after_shipping_address', array( $this, 'add_vendor_details' ), 10, 2 );
15
- add_action( 'woocommerce_admin_order_actions_end', array( $this, 'append_actions' ), 10, 1 );
16
- }
17
-
18
-
19
- public function add_vendor_details( $order )
20
- {
21
- $actions = $this->append_actions( $order, true );
22
-
23
- if (empty( $actions['wc_pv_shipped']['name'] )) {
24
- return;
25
- }
26
-
27
- echo '<h4>' . __('Vendors shipped', 'wcvendors') . '</h4><br/>';
28
- echo $actions['wc_pv_shipped']['name'];
29
- }
30
-
31
- public function append_actions( $order, $order_page = false )
32
- {
33
- global $woocommerce;
34
-
35
- $authors = WCV_Vendors::get_vendors_from_order( $order );
36
- $authors = $authors ? array_keys( $authors ) : array();
37
- if ( empty( $authors ) ) return false;
38
-
39
- $shipped = (array) get_post_meta( $order->id, 'wc_pv_shipped', true );
40
- $string = '</br></br>';
41
-
42
- foreach ($authors as $author ) {
43
- $string .= in_array( $author, $shipped ) ? '&#10004; ' : '&#10005; ';
44
- $string .= WCV_Vendors::get_vendor_shop_name( $author );
45
- $string .= '</br>';
46
- }
47
-
48
- $response = array(
49
- 'url' => '#',
50
- 'name' => __('Vendors Shipped', 'wcvendors') . $string,
51
- 'action' => 'wc_pv_shipped',
52
- 'image_url' => wcv_assets_url . '/images/icons/truck.png',
53
- );
54
-
55
- if ( ! $order_page ) {
56
- printf( '<a class="button tips %s" href="%s" data-tip="%s"><img style="width:16px;height:16px;" src="%s"></a>', $response['action'], $response['url'], $response['name'], $response['image_url'] );
57
- } else {
58
- echo $response['name'];
59
- }
60
-
61
- return $response;
62
- }
63
-
64
-
65
- /**
66
- *
67
- */
68
- public static function menu()
69
- {
70
- $hook = add_submenu_page(
71
- 'woocommerce',
72
- __( 'Commission', 'wcvendors' ), __( 'Commission', 'wcvendors' ),
73
- 'manage_woocommerce',
74
- 'pv_admin_commissions',
75
- array( 'WCV_Admin_Setup', 'commissions_page' )
76
- );
77
-
78
- add_action( "load-$hook", array( 'WCV_Admin_Setup', 'add_options' ) );
79
- }
80
-
81
-
82
- /**
83
- *
84
- *
85
- * @param unknown $status
86
- * @param unknown $option
87
- * @param unknown $value
88
- *
89
- * @return unknown
90
- */
91
- public static function set_table_option( $status, $option, $value )
92
- {
93
- if ( $option == 'commission_per_page' ) {
94
- return $value;
95
- }
96
- }
97
-
98
-
99
- /**
100
- *
101
- */
102
- public static function add_options()
103
- {
104
- global $PV_Admin_Page;
105
-
106
- $args = array(
107
- 'label' => 'Rows',
108
- 'default' => 10,
109
- 'option' => 'commission_per_page'
110
- );
111
- add_screen_option( 'per_page', $args );
112
-
113
- $PV_Admin_Page = new WCV_Admin_Page();
114
-
115
- }
116
-
117
-
118
- /**
119
- * HTML setup for the WC > Commission page
120
- */
121
- public static function commissions_page()
122
- {
123
- global $woocommerce, $PV_Admin_Page;
124
-
125
- $PV_Admin_Page->prepare_items();
126
-
127
- ?>
128
-
129
- <div class="wrap">
130
-
131
- <div id="icon-woocommerce" class="icon32 icon32-woocommerce-reports"><br/></div>
132
- <h2><?php _e( 'Commission', 'wcvendors' ); ?></h2>
133
-
134
- <form id="posts-filter" method="get">
135
-
136
- <input type="hidden" name="page" value="pv_admin_commissions"/>
137
- <?php $PV_Admin_Page->display() ?>
138
-
139
- </form>
140
- <div id="ajax-response"></div>
141
- <br class="clear"/>
142
- </div>
143
- <?php
144
- }
145
-
146
-
147
- }
148
-
149
-
150
- if ( !class_exists( 'WP_List_Table' ) ) require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
151
-
152
- /**
153
- * WC_Simple_Referral_Admin class.
154
- *
155
- * @extends WP_List_Table
156
- */
157
- class WCV_Admin_Page extends WP_List_Table
158
- {
159
-
160
- public $index;
161
-
162
-
163
- /**
164
- * __construct function.
165
- *
166
- * @access public
167
- */
168
- function __construct()
169
- {
170
- global $status, $page;
171
-
172
- $this->index = 0;
173
-
174
- //Set parent defaults
175
- parent::__construct( array(
176
- 'singular' => 'commission',
177
- 'plural' => 'commissions',
178
- 'ajax' => false
179
- ) );
180
- }
181
-
182
-
183
- /**
184
- * column_default function.
185
- *
186
- * @access public
187
- *
188
- * @param unknown $item
189
- * @param mixed $column_name
190
- *
191
- * @return unknown
192
- */
193
- function column_default( $item, $column_name )
194
- {
195
- global $wpdb;
196
-
197
- switch ( $column_name ) {
198
- case 'id' :
199
- return $item->id;
200
- case 'vendor_id' :
201
- $user = get_userdata( $item->vendor_id );
202
- return '<a href="' . admin_url( 'user-edit.php?user_id=' . $item->vendor_id ) . '">' . WCV_Vendors::get_vendor_shop_name( $item->vendor_id ) . '</a>';
203
- case 'total_due' :
204
- return woocommerce_price( $item->total_due + $item->total_shipping + $item->tax );
205
- case 'product_id' :
206
- $parent = get_post_ancestors( $item->product_id );
207
- $product_id = $parent ? $parent[ 0 ] : $item->product_id;
208
- $wcv_total_sales = get_post_meta( $product_id, 'total_sales', true );
209
- return '<a href="' . admin_url( 'post.php?post=' . $product_id . '&action=edit' ) . '">' . get_the_title( $item->product_id ) . '</a> (<span title="' . get_the_title( $item->product_id ) .' has sold ' . $wcv_total_sales . ' times total.">' . $wcv_total_sales . '</span>)';
210
- case 'order_id' :
211
- return '<a href="' . admin_url( 'post.php?post=' . $item->order_id . '&action=edit' ) . '">' . $item->order_id . '</a>';
212
- case 'status' :
213
- return $item->status;
214
- case 'time' :
215
- return date_i18n( get_option( 'date_format' ), strtotime( $item->time ) );
216
- }
217
- }
218
-
219
-
220
- /**
221
- * column_cb function.
222
- *
223
- * @access public
224
- *
225
- * @param mixed $item
226
- *
227
- * @return unknown
228
- */
229
- function column_cb( $item )
230
- {
231
- return sprintf(
232
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
233
- /*$1%s*/
234
- 'id',
235
- /*$2%s*/
236
- $item->id
237
- );
238
- }
239
-
240
-
241
- /**
242
- * get_columns function.
243
- *
244
- * @access public
245
- * @return unknown
246
- */
247
- function get_columns()
248
- {
249
- $columns = array(
250
- 'cb' => '<input type="checkbox" />',
251
- 'product_id' => __( 'Product', 'wcvendors' ),
252
- 'order_id' => __( 'Order ID', 'wcvendors' ),
253
- 'vendor_id' => __( 'Vendor', 'wcvendors' ),
254
- 'total_due' => __( 'Total', 'wcvendors' ),
255
- 'status' => __( 'Status', 'wcvendors' ),
256
- 'time' => __( 'Date', 'wcvendors' ),
257
- );
258
-
259
- return $columns;
260
- }
261
-
262
-
263
- /**
264
- * get_sortable_columns function.
265
- *
266
- * @access public
267
- * @return unknown
268
- */
269
- function get_sortable_columns()
270
- {
271
- $sortable_columns = array(
272
- 'time' => array( 'time', true ),
273
- 'product_id' => array( 'product_id', false ),
274
- 'order_id' => array( 'order_id', false ),
275
- 'total_due' => array( 'total_due', false ),
276
- 'status' => array( 'status', false ),
277
- 'vendor_id' => array( 'vendor_id', false ),
278
- 'status' => array( 'status', false ),
279
- );
280
-
281
- return $sortable_columns;
282
- }
283
-
284
-
285
- /**
286
- * Get bulk actions
287
- *
288
- * @return unknown
289
- */
290
- function get_bulk_actions()
291
- {
292
- $actions = array(
293
- 'mark_paid' => __( 'Mark paid', 'wcvendors' ),
294
- 'mark_due' => __( 'Mark due', 'wcvendors' ),
295
- 'mark_reversed' => __( 'Mark reversed', 'wcvendors' ),
296
- // 'delete' => __('Delete', 'wcvendors'),
297
- );
298
-
299
- return $actions;
300
- }
301
-
302
-
303
- /**
304
- *
305
- */
306
- function extra_tablenav( $which )
307
- {
308
- if ( $which == 'top' ) {
309
- ?>
310
- <div class="alignleft actions"><?php
311
- $this->months_dropdown( 'commission' );
312
- submit_button( __( 'Filter' ), false, false, false, array( 'id' => "post-query-submit", 'name' => 'do-filter' ) );
313
- ?></div>
314
- <div class="alignleft actions"><?php
315
- $this->status_dropdown( 'commission' );
316
- submit_button( __( 'Filter' ), false, false, false, array( 'id' => "post-query-submit", 'name' => 'do-filter' ) );
317
- ?></div>
318
- <?php
319
- }
320
- }
321
-
322
-
323
- /**
324
- * Display a monthly dropdown for filtering items
325
- *
326
- * @since 3.1.0
327
- * @access protected
328
- *
329
- * @param unknown $post_type
330
- */
331
- function months_dropdown( $post_type )
332
- {
333
- global $wpdb, $wp_locale;
334
-
335
- $table_name = $wpdb->prefix . "pv_commission";
336
-
337
- $months = $wpdb->get_results( "
338
- SELECT DISTINCT YEAR( time ) AS year, MONTH( time ) AS month
339
- FROM $table_name
340
- ORDER BY time DESC
341
- " );
342
-
343
- $month_count = count( $months );
344
-
345
- if ( !$month_count || ( 1 == $month_count && 0 == $months[ 0 ]->month ) )
346
- return;
347
-
348
- $m = isset( $_GET[ 'm' ] ) ? (int) $_GET[ 'm' ] : 0;
349
- ?>
350
- <select name="m" id="filter-by-date">
351
- <option<?php selected( $m, 0 ); ?> value='0'><?php _e( 'Show all dates' ); ?></option>
352
- <?php
353
- foreach ( $months as $arc_row ) {
354
- if ( 0 == $arc_row->year )
355
- continue;
356
-
357
- $month = zeroise( $arc_row->month, 2 );
358
- $year = $arc_row->year;
359
-
360
- printf( "<option %s value='%s'>%s</option>\n",
361
- selected( $m, $year . $month, false ),
362
- esc_attr( $arc_row->year . $month ),
363
- /* translators: 1: month name, 2: 4-digit year */
364
- sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
365
- );
366
- }
367
- ?>
368
- </select>
369
-
370
- <?php
371
- }
372
-
373
- /**
374
- * Display a status dropdown for filtering items
375
- *
376
- * @since 3.1.0
377
- * @access protected
378
- *
379
- * @param unknown $post_type
380
- */
381
- function status_dropdown( $post_type )
382
- {
383
- $com_status = isset( $_GET[ 'com_status' ] ) ? $_GET[ 'com_status' ] : '';
384
- ?>
385
- <select name="com_status">
386
- <option<?php selected( $com_status, '' ); ?> value=''><?php _e( 'Show all Statuses', 'wcvendors' ); ?></option>
387
- <option<?php selected( $com_status, 'due' ); ?> value="due">Due</option>
388
- <option<?php selected( $com_status, 'paid' ); ?> value="paid">Paid</option>
389
- <option<?php selected( $com_status, 'reversed' ); ?> value="reversed">Reversed</option>
390
- </select>
391
- <?php
392
- }
393
-
394
-
395
- /**
396
- * Process bulk actions
397
- *
398
- * @return unknown
399
- */
400
- function process_bulk_action()
401
- {
402
- if ( !isset( $_GET[ 'id' ] ) ) return;
403
-
404
- $items = array_map( 'intval', $_GET[ 'id' ] );
405
- $ids = implode( ',', $items );
406
-
407
- switch ( $this->current_action() ) {
408
- case 'mark_paid':
409
- $result = $this->mark_paid( $ids );
410
-
411
- if ( $result )
412
- echo '<div class="updated"><p>' . __( 'Commission marked paid.', 'wcvendors' ) . '</p></div>';
413
- break;
414
-
415
- case 'mark_due':
416
- $result = $this->mark_due( $ids );
417
-
418
- if ( $result )
419
- echo '<div class="updated"><p>' . __( 'Commission marked due.', 'wcvendors' ) . '</p></div>';
420
- break;
421
-
422
- case 'mark_reversed':
423
- $result = $this->mark_reversed( $ids );
424
-
425
- if ( $result )
426
- echo '<div class="updated"><p>' . __( 'Commission marked reversed.', 'wcvendors' ) . '</p></div>';
427
- break;
428
-
429
- default:
430
- // code...
431
- break;
432
- }
433
-
434
- }
435
-
436
-
437
- /**
438
- *
439
- *
440
- * @param unknown $ids (optional)
441
- *
442
- * @return unknown
443
- */
444
- public function mark_paid( $ids = array() )
445
- {
446
- global $wpdb;
447
-
448
- $table_name = $wpdb->prefix . "pv_commission";
449
-
450
- $query = "UPDATE `{$table_name}` SET `status` = 'paid' WHERE id IN ($ids) AND `status` = 'due'";
451
- $result = $wpdb->query( $query );
452
-
453
- return $result;
454
- }
455
-
456
-
457
- /**
458
- *
459
- *
460
- * @param unknown $ids (optional)
461
- *
462
- * @return unknown
463
- */
464
- public function mark_reversed( $ids = array() )
465
- {
466
- global $wpdb;
467
-
468
- $table_name = $wpdb->prefix . "pv_commission";
469
-
470
- $query = "UPDATE `{$table_name}` SET `status` = 'reversed' WHERE id IN ($ids) AND `status` = 'due'";
471
- $result = $wpdb->query( $query );
472
-
473
- return $result;
474
- }
475
-
476
-
477
- /**
478
- *
479
- *
480
- * @param unknown $ids (optional)
481
- *
482
- * @return unknown
483
- */
484
- public function mark_due( $ids = array() )
485
- {
486
- global $wpdb;
487
-
488
- $table_name = $wpdb->prefix . "pv_commission";
489
-
490
- $query = "UPDATE `{$table_name}` SET `status` = 'due' WHERE id IN ($ids)";
491
- $result = $wpdb->query( $query );
492
-
493
- return $result;
494
- }
495
-
496
-
497
- /**
498
- * prepare_items function.
499
- *
500
- * @access public
501
- */
502
- function prepare_items()
503
- {
504
- global $wpdb;
505
-
506
- $_SERVER['REQUEST_URI'] = remove_query_arg( '_wp_http_referer', $_SERVER['REQUEST_URI'] );
507
-
508
- $per_page = $this->get_items_per_page( 'commission_per_page', 10 );
509
- $current_page = $this->get_pagenum();
510
-
511
- $orderby = !empty( $_REQUEST[ 'orderby' ] ) ? esc_attr( $_REQUEST[ 'orderby' ] ) : 'time';
512
- $order = ( !empty( $_REQUEST[ 'order' ] ) && $_REQUEST[ 'order' ] == 'asc' ) ? 'ASC' : 'DESC';
513
- $com_status = !empty( $_REQUEST[ 'com_status' ] ) ? esc_attr( $_REQUEST[ 'com_status' ] ) : '';
514
- $status_sql = '';
515
- $time_sql = '';
516
-
517
- /**
518
- * Init column headers
519
- */
520
- $this->_column_headers = $this->get_column_info();
521
-
522
-
523
- /**
524
- * Process bulk actions
525
- */
526
- $this->process_bulk_action();
527
-
528
- /**
529
- * Get items
530
- */
531
- $sql = "SELECT COUNT(id) FROM {$wpdb->prefix}pv_commission";
532
-
533
- if ( !empty( $_GET[ 'm' ] ) ) {
534
-
535
- $year = substr( $_GET[ 'm' ], 0, 4 );
536
- $month = substr( $_GET[ 'm' ], 4, 2 );
537
-
538
- $time_sql = "
539
- WHERE MONTH(`time`) = '$month'
540
- AND YEAR(`time`) = '$year'
541
- ";
542
-
543
- $sql .= $time_sql;
544
- }
545
-
546
- if ( !empty( $_GET[ 'com_status' ] ) ) {
547
-
548
- if ( $time_sql == '' ) {
549
- $status_sql = "
550
- WHERE status = '$com_status'
551
- ";
552
- } else {
553
- $status_sql = "
554
- AND status = '$com_status'
555
- ";
556
- }
557
-
558
- $sql .= $status_sql;
559
- }
560
-
561
- $max = $wpdb->get_var( $sql );
562
-
563
- $sql = "
564
- SELECT * FROM {$wpdb->prefix}pv_commission
565
- ";
566
-
567
- if ( !empty( $_GET[ 'm' ] ) ) {
568
- $sql .= $time_sql;
569
- }
570
-
571
- if ( !empty( $_GET['com_status'] ) ) {
572
- $sql .= $status_sql;
573
- }
574
-
575
- $offset = ( $current_page - 1 ) * $per_page;
576
-
577
-
578
- $sql .= "
579
- ORDER BY `{$orderby}` {$order}
580
- LIMIT {$offset}, {$per_page}
581
- ";
582
-
583
- // $this->items = $wpdb->get_results( $wpdb->prepare( $sql, ( $current_page - 1 ) * $per_page, $per_page ) );
584
- $this->items = $wpdb->get_results( $sql );
585
-
586
- /**
587
- * Pagination
588
- */
589
- $this->set_pagination_args( array(
590
- 'total_items' => $max,
591
- 'per_page' => $per_page,
592
- 'total_pages' => ceil( $max / $per_page )
593
- ) );
594
- }
595
-
596
-
597
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-admin-reports.php DELETED
@@ -1,549 +0,0 @@
1
- <?php
2
- /**
3
- * WCV_Admin_Reports class.
4
- *
5
- * Shows reports related to software in the woocommerce backend
6
- *
7
- * @author Matt Gates <http://mgates.me>
8
- * @package
9
- */
10
-
11
-
12
- class WCV_Admin_Reports
13
- {
14
-
15
-
16
- /**
17
- * __construct function.
18
- *
19
- * @access public
20
- * @return void
21
- *
22
- * @param bool $debug (optional) (default: false)
23
- */
24
- function __construct( $debug = false )
25
- {
26
- add_filter( 'woocommerce_admin_reports', array( $this, 'reports_tab' ) );
27
- }
28
-
29
- /**
30
- * reports_tab function.
31
- *
32
- * @access public
33
- *
34
- * @param unknown $reports
35
- *
36
- * @return void
37
- */
38
- function reports_tab( $reports )
39
- {
40
- $reports[ 'vendors' ] = array(
41
- 'title' => __( 'WC Vendors', 'wcvendors' ),
42
- 'charts' => array(
43
- array(
44
- 'title' => __( 'Overview', 'wcvendors' ),
45
- 'description' => '',
46
- 'hide_title' => true,
47
- 'function' => array( $this, 'sales' ),
48
- ),
49
- array(
50
- 'title' => __( 'Commission by vendor', 'wcvendors' ),
51
- 'description' => '',
52
- 'hide_title' => true,
53
- 'function' => array( $this, 'commission' ),
54
- ),
55
- array(
56
- 'title' => __( 'Commission by product', 'wcvendors' ),
57
- 'description' => '',
58
- 'hide_title' => true,
59
- 'function' => array( $this, 'commission' ),
60
- ),
61
- array(
62
- 'title' => __( 'Commission Totals', 'wcvendors' ),
63
- 'description' => __( 'Commission totals for all vendors includes shipping and taxes. By default no date range is used and all due commissions are returned. Use the date range to filter.', 'wcvendors' ),
64
- 'hide_title' => true,
65
- 'function' => array( $this, 'commission_totals' ),
66
- ),
67
- ),
68
- );
69
-
70
- return $reports;
71
- }
72
-
73
- public function products()
74
- {
75
- # code...
76
- }
77
-
78
-
79
- /**
80
- *
81
- */
82
- function sales()
83
- {
84
- global $start_date, $end_date, $woocommerce, $wpdb;
85
-
86
- $start_date = !empty( $_POST[ 'start_date' ] ) ? $_POST[ 'start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
87
- $end_date = !empty( $_POST[ 'end_date' ] ) ? $_POST[ 'end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
88
-
89
- if ( !empty( $_POST[ 'start_date' ] ) ) {
90
- $start_date = strtotime( $_POST[ 'start_date' ] );
91
- }
92
-
93
- if ( !empty( $_POST[ 'end_date' ] ) ) {
94
- $end_date = strtotime( $_POST[ 'end_date' ] );
95
- }
96
-
97
- $after = date( 'Y-m-d', $start_date );
98
- $before = date( 'Y-m-d', strtotime( '+1 day', $end_date ) );
99
-
100
- $commission_due = $wpdb->get_var( "
101
- SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission WHERE status = 'due'
102
- AND time >= '" . $after . "'
103
- AND time <= '" . $before . "'
104
- " );
105
-
106
- $reversed = $wpdb->get_var( "
107
- SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission WHERE status = 'reversed'
108
- AND time >= '" . $after . "'
109
- AND time <= '" . $before . "'
110
- " );
111
-
112
- $paid = $wpdb->get_var( "
113
- SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission WHERE status = 'paid'
114
- AND time >= '" . $after . "'
115
- AND time <= '" . $before . "'
116
- " );
117
-
118
- ?>
119
-
120
- <form method="post" action="">
121
- <p><label for="from"><?php _e( 'From:', 'wcvendors' ); ?></label>
122
- <input type="text" size="9" placeholder="yyyy-mm-dd" value="<?php echo esc_attr( date( 'Y-m-d', $start_date ) ); ?>" name="start_date" class="range_datepicker from" id="from" />
123
- <label for="to"><?php _e( 'To:', 'wcvendors' ); ?></label>
124
- <input type="text" size="9" placeholder="yyyy-mm-dd" value="<?php echo esc_attr( date( 'Y-m-d', $end_date ) ); ?>" name="end_date" class="range_datepicker to" id="to" />
125
- <input type="submit" class="button" value="<?php _e( 'Show', 'wcvendors' ); ?>"/></p>
126
- </form>
127
-
128
- <div id="poststuff" class="woocommerce-reports-wrap">
129
- <div class="woocommerce-reports-sidebar">
130
- <div class="postbox">
131
- <h3><span><?php _e( 'Total paid in range', 'wcvendors' ); ?></span></h3>
132
-
133
- <div class="inside">
134
- <p class="stat"><?php if ( $paid > 0 ) echo woocommerce_price( $paid ); else _e( 'n/a', 'wcvendors' ); ?></p>
135
- </div>
136
- </div>
137
- <div class="postbox">
138
- <h3><span><?php _e( 'Total due in range', 'wcvendors' ); ?></span></h3>
139
-
140
- <div class="inside">
141
- <p class="stat"><?php if ( $commission_due > 0 ) echo woocommerce_price( $commission_due ); else _e( 'n/a', 'wcvendors' ); ?></p>
142
- </div>
143
- </div>
144
- <div class="postbox">
145
- <h3><span><?php _e( 'Total reversed in range', 'wcvendors' ); ?></span></h3>
146
-
147
- <div class="inside">
148
- <p class="stat"><?php if ( $reversed > 0 ) echo woocommerce_price( $reversed ); else _e( 'n/a', 'wcvendors' ); ?></p>
149
- </div>
150
- </div>
151
- </div>
152
-
153
- <div class="woocommerce-reports-main">
154
- <div class="postbox">
155
- <h3><span><?php _e( 'Recent Commission', 'wcvendors' ); ?></span></h3>
156
-
157
- <div>
158
- <?php
159
- $commission = $wpdb->get_results( "
160
- SELECT * FROM {$wpdb->prefix}pv_commission
161
- WHERE time >= '" . $after . "'
162
- AND time <= '" . $before . "'
163
- ORDER BY time DESC
164
- " );
165
-
166
- if ( sizeof( $commission ) > 0 ) {
167
-
168
- ?>
169
- <div class="woocommerce_order_items_wrapper">
170
- <table id="commission-table" class="woocommerce_order_items" cellspacing="0">
171
- <thead>
172
- <tr>
173
- <th><?php _e( 'Order', 'wcvendors' ) ?></th>
174
- <th><?php _e( 'Product', 'wcvendors' ) ?></th>
175
- <th><?php _e( 'Vendor', 'wcvendors' ) ?></th>
176
- <th><?php _e( 'Total', 'wcvendors' ) ?></th>
177
- <th><?php _e( 'Date &amp; Time', 'wcvendors' ) ?></th>
178
- <th><?php _e( 'Status', 'wcvendors' ) ?></th>
179
- </tr>
180
- </thead>
181
- <tbody>
182
- <?php $i = 1;
183
- foreach ( $commission as $row ) : $i++ ?>
184
- <tr<?php if ( $i % 2 == 1 ) echo ' class="alternate"' ?>>
185
- <td><?php if ( $row->order_id ) : ?><a
186
- href="<?php echo admin_url( 'post.php?post=' . $row->order_id . '&action=edit' ); ?>"><?php echo $row->order_id; ?></a><?php else : _e( 'N/A', 'wcvendors' ); endif; ?>
187
- </td>
188
- <td><?php echo get_the_title( $row->product_id ); ?></td>
189
- <td><?php echo WCV_Vendors::get_vendor_shop_name( $row->vendor_id ); ?></td>
190
- <td><?php echo woocommerce_price( $row->total_due + $row->total_shipping + $row->tax ) ?></td>
191
- <td><?php echo date( __( 'D j M Y \a\t h:ia', 'wcvendors' ), strtotime( $row->time ) ) ?></td>
192
- <td><?php echo $row->status ?></td>
193
- </tr>
194
- <?php endforeach; ?>
195
- </tbody>
196
- </table>
197
- </div>
198
- <?php
199
- } else {
200
- ?><p><?php _e( 'No commission yet', 'wcvendors' ) ?></p><?php
201
- }
202
- ?>
203
- </div>
204
- </div>
205
- </div>
206
- </div>
207
- <?php
208
-
209
- }
210
-
211
-
212
- /**
213
- *
214
- */
215
- function commission()
216
- {
217
- global $start_date, $end_date, $woocommerce, $wpdb;
218
-
219
- $latest_woo = version_compare( $woocommerce->version, '2.3', '>' );
220
-
221
- $first_year = $wpdb->get_var( "SELECT time FROM {$wpdb->prefix}pv_commission ORDER BY time ASC LIMIT 1;" );
222
- $first_year = $first_year ? date( 'Y', strtotime( $first_year ) ) : date( 'Y' );
223
- $current_year = isset( $_POST[ 'show_year' ] ) ? $_POST[ 'show_year' ] : date( 'Y', current_time( 'timestamp' ) );
224
- $start_date = strtotime( $current_year . '0101' );
225
-
226
- $vendors = get_users( array( 'role' => 'vendor' ) );
227
- $vendors = apply_filters( 'pv_commission_vendors_list', $vendors );
228
- $selected_vendor = !empty( $_POST[ 'show_vendor' ] ) ? (int) $_POST[ 'show_vendor' ] : false;
229
- $products = !empty( $_POST[ 'product_ids' ] ) ? (array) $_POST[ 'product_ids' ] : array();
230
-
231
- ?>
232
-
233
- <form method="post" action="" class="report_filters">
234
- <label for="show_year"><?php _e( 'Show:', 'wcvendors' ); ?></label>
235
- <select name="show_year" id="show_year">
236
- <?php
237
- for ( $i = $first_year; $i <= date( 'Y' ); $i++ )
238
- printf( '<option value="%s" %s>%s</option>', $i, selected( $current_year, $i, false ), $i );
239
- ?>
240
- </select>
241
- <?php if ( $_GET[ 'report' ] == 2 ) {
242
- if ($latest_woo) { ?>
243
- <input type="hidden" class="wc-product-search" style="width:203px;" name="product_ids[]" data-placeholder="<?php _e( 'Search for a product&hellip;', 'woocommerce' ); ?>" data-action="woocommerce_json_search_products_and_variations" />
244
- <?php } else { ?>
245
- <select id="product_ids" name="product_ids[]" class="ajax_chosen_select_products" multiple="multiple"
246
- data-placeholder="<?php _e( 'Type in a product name to start searching...', 'wcvendors' ); ?>"
247
- style="width: 400px;"></select>
248
- <script type="text/javascript">
249
- jQuery(function () {
250
-
251
- // Ajax Chosen Product Selectors
252
- jQuery("select.ajax_chosen_select_products").ajaxChosen({
253
- method: 'GET',
254
- url: '<?php echo admin_url('admin-ajax.php'); ?>',
255
- dataType: 'json',
256
- afterTypeDelay: 100,
257
- data: {
258
- action: 'woocommerce_json_search_products',
259
- security: '<?php echo wp_create_nonce("search-products"); ?>'
260
- }
261
- }, function (data) {
262
-
263
- var terms = {};
264
-
265
- jQuery.each(data, function (i, val) {
266
- terms[i] = val;
267
- });
268
-
269
- return terms;
270
- });
271
-
272
- });
273
- </script>
274
-
275
- <?php }
276
- } else { ?>
277
- <select class="chosen_select" id="show_vendor" name="show_vendor" style="width: 300px;"
278
- data-placeholder="<?php _e( 'Select a vendor&hellip;', 'wcvendors' ); ?>">
279
- <option></option>
280
- <?php foreach ( $vendors as $key => $vendor ) printf( '<option value="%s" %s>%s</option>', $vendor->ID, selected( $selected_vendor, $vendor->ID, false ), $vendor->display_name ); ?>
281
- </select>
282
- <?php } ?>
283
- <input type="submit" class="button" value="<?php _e( 'Show', 'wcvendors' ); ?>"/>
284
- </form>
285
-
286
- <?php
287
-
288
- if ( !empty( $selected_vendor ) || !empty( $products ) ) {
289
-
290
- foreach ($products as $key => $product_id) {
291
- $_product = get_product($product_id);
292
- $childs = $_product->get_children();
293
- $products = array_merge($childs, $products);
294
- }
295
-
296
- $commissions = array();
297
- $filter = !empty( $selected_vendor ) ? (" WHERE vendor_id = " . $selected_vendor) : (" WHERE product_id IN ( " . implode( ', ', $products ) ." )");
298
-
299
- $sql = "SELECT
300
- SUM(total_due + total_shipping + tax) as total,
301
- SUM(total_due) as commission,
302
- SUM(total_shipping) as shipping,
303
- SUM(tax) as tax
304
- FROM {$wpdb->prefix}pv_commission
305
- ";
306
-
307
- $paid_sql = "SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission " . $filter . " AND status = 'paid'";
308
- $reversed_sql = "SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission" . $filter . " AND status = 'reversed'";
309
- $date_sql = " AND date_format(`time`,'%%Y%%m') = %d";
310
-
311
- for ( $count = 0; $count < 12; $count++ ) {
312
- $time = strtotime( date( 'Ym', strtotime( '+ ' . $count . ' MONTH', $start_date ) ) . '01' );
313
- if ( $time > current_time( 'timestamp' ) ) continue;
314
-
315
- $month = date( 'Ym', strtotime( date( 'Ym', strtotime( '+ ' . $count . ' MONTH', $start_date ) ) . '01' ) );
316
-
317
- $fetch_results = $wpdb->prepare( $sql . $filter . $date_sql, $month );
318
-
319
- $results = $wpdb->get_results( $fetch_results );
320
- if ( !empty( $results[ 0 ] ) ) {
321
- extract( get_object_vars( $results[ 0 ] ) );
322
- }
323
-
324
- $paid = $wpdb->get_var( $wpdb->prepare( $paid_sql . $date_sql, $month ) );
325
- $reversed = $wpdb->get_var( $wpdb->prepare( $reversed_sql . $date_sql, $month ) );
326
-
327
- $commissions[ date( 'M', strtotime( $month . '01' ) ) ] = array(
328
- 'commission' => $commission,
329
- 'tax' => $tax,
330
- 'shipping' => $shipping,
331
- 'reversed' => $reversed,
332
- 'paid' => $paid,
333
- 'total' => $total - $reversed - $paid,
334
- );
335
-
336
- }
337
-
338
- ?>
339
-
340
- <div class="woocommerce-reports-main">
341
- <table class="widefat">
342
- <thead>
343
- <tr>
344
- <th><?php _e( 'Month', 'wcvendors' ); ?></th>
345
- <th class="total_row"><?php _e( 'Commission Totals', 'wcvendors' ); ?></th>
346
- <th class="total_row"><?php _e( 'Tax', 'wcvendors' ); ?></th>
347
- <th class="total_row"><?php _e( 'Shipping', 'wcvendors' ); ?></th>
348
- <th class="total_row"><?php _e( 'Reversed', 'wcvendors' ); ?></th>
349
- <th class="total_row"><?php _e( 'Paid', 'wcvendors' ); ?></th>
350
- <th class="total_row"><?php _e( 'Due', 'wcvendors' ); ?></th>
351
- </tr>
352
- </thead>
353
- <tfoot>
354
- <tr>
355
- <?php
356
- $total = array(
357
- 'commission' => 0,
358
- 'tax' => 0,
359
- 'shipping' => 0,
360
- 'reversed' => 0,
361
- 'paid' => 0,
362
- 'total' => 0,
363
- );
364
-
365
- foreach ( $commissions as $month => $commission ) {
366
- $total[ 'commission' ] += $commission[ 'commission' ];
367
- $total[ 'tax' ] += $commission[ 'tax' ];
368
- $total[ 'shipping' ] += $commission[ 'shipping' ];
369
- $total[ 'reversed' ] += $commission[ 'reversed' ];
370
- $total[ 'paid' ] += $commission[ 'paid' ];
371
- $total[ 'total' ] += $commission[ 'total' ];
372
- }
373
-
374
- echo '<td>' . __( 'Total', 'wcvendors' ) . '</td>';
375
-
376
- foreach ( $total as $value ) {
377
- echo '<td class="total_row">' . woocommerce_price( $value ) . '</td>';
378
- }
379
- ?>
380
- </tr>
381
- </tfoot>
382
- <tbody>
383
- <?php
384
- foreach ( $commissions as $month => $commission ) {
385
- $alt = ( isset( $alt ) && $alt == 'alt' ) ? '' : 'alt';
386
-
387
- echo '<tr class="' . $alt . '"><td>' . $month . '</td>';
388
-
389
- foreach ( $commission as $value ) {
390
- echo '<td class="total_row">' . woocommerce_price( $value ) . '</td>';
391
- }
392
-
393
- echo '</tr>';
394
- }
395
- ?>
396
- </tbody>
397
- </table>
398
- </div>
399
-
400
- <?php } ?>
401
- <?php
402
-
403
- }
404
-
405
-
406
- /**
407
- * Commission Totals for vendors reports
408
- *
409
- * @since 1.8.4
410
- */
411
- function commission_totals(){
412
-
413
- global $wpdb;
414
-
415
- $total_start_date = !empty( $_POST[ 'total_start_date' ] ) ? $_POST[ 'total_start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
416
- $total_end_date = !empty( $_POST[ 'total_end_date' ] ) ? $_POST[ 'total_end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
417
- $commission_status = !empty( $_POST[ 'commission_status' ] ) ? $_POST[ 'commission_status' ] : 'due';
418
- $date_sql = ( !empty( $_POST[ 'total_start_date' ] ) && !empty( $_POST[ 'total_end_date' ] ) ) ? " time >= '$total_start_date' AND time <= '$total_end_date' AND" : "";
419
-
420
- $status_sql = " status='$commission_status'";
421
-
422
- $sql = "SELECT vendor_id, total_due, total_shipping, tax, status FROM {$wpdb->prefix}pv_commission WHERE";
423
-
424
- $commissions = $wpdb->get_results( $sql . $date_sql . $status_sql );
425
-
426
- if ( !empty( $_POST[ 'total_start_date' ] ) ) {
427
- $total_start_date = strtotime( $_POST[ 'total_start_date' ] );
428
- }
429
-
430
- if ( !empty( $_POST[ 'total_end_date' ] ) ) {
431
- $total_end_date = strtotime( $_POST[ 'total_end_date' ] );
432
- }
433
-
434
- $totals = $this->calculate_totals( $commissions );
435
-
436
- ?><form method="post" action="">
437
- <p><label for="from"><?php _e( 'From:', 'wcvendors' ); ?></label>
438
- <input type="text" size="9" placeholder="yyyy-mm-dd" value="<?php echo esc_attr( date( 'Y-m-d', $total_start_date ) ); ?>" name="total_start_date" class="range_datepicker from" id="from" />
439
- <label for="to"><?php _e( 'To:', 'wcvendors' ); ?></label>
440
- <input type="text" size="9" placeholder="yyyy-mm-dd" value="<?php echo esc_attr( date( 'Y-m-d', $total_end_date ) ); ?>" name="total_end_date" class="range_datepicker to" id="to" />
441
-
442
- <select name="commission_status">
443
- <option value="due"><?php _e( 'Due', 'wcvendors' ); ?></option>
444
- <option value="paid"><?php _e( 'Paid', 'wcvendors' ); ?></option>
445
- <option value="reversed"><?php _e( 'Reversed', 'wcvendors' ); ?></option>
446
- </select>
447
-
448
- <input type="submit" class="button" value="<?php _e( 'Show', 'wcvendors' ); ?>"/></p>
449
- </form>
450
-
451
- <div class="woocommerce-reports-main">
452
- <table class="widefat">
453
- <thead>
454
- <tr>
455
- <th class="total_row"><?php _e( 'Vendor', 'wcvendors' ); ?></th>
456
- <th class="total_row"><?php _e( 'Tax Total', 'wcvendors' ); ?></th>
457
- <th class="total_row"><?php _e( 'Shipping Total', 'wcvendors' ); ?></th>
458
- <th class="total_row"><?php _e( 'Status', 'wcvendors' ); ?></th>
459
- <th class="total_row"><?php _e( 'Commission Total', 'wcvendors' ); ?></th>
460
- </tr>
461
- </thead>
462
- <tbody>
463
- <?php
464
-
465
- if ( !empty( $commissions ) ){
466
-
467
- foreach ( $totals as $totals ) {
468
-
469
- echo '<tr>';
470
- echo '<td>' . $totals[ 'user_login' ]. '</td>';
471
- echo '<td>' . woocommerce_price( $totals[ 'tax' ] ). '</td>';
472
- echo '<td>' . woocommerce_price( $totals[ 'total_shipping' ] ). '</td>';
473
- echo '<td>' . $totals[ 'status' ] . '</td>';
474
- echo '<td>' . woocommerce_price( $totals[ 'total_due' ] ). '</td>';
475
- echo '</tr>';
476
-
477
- }
478
-
479
- } else {
480
- echo '<tr>';
481
- echo '<td colspan="5">'. __( 'No commissions found.', 'wcvendors' ) . '</td>';
482
- echo '</tr>';
483
-
484
- }
485
- ?>
486
- </tbody>
487
- </table>
488
-
489
- <?php
490
-
491
-
492
- } // commission_totals()
493
-
494
- /**
495
- * Calculate the totals of the commissions return an array with vendor id as the key with the totals
496
- *
497
- * @param array $commissions total commissions array
498
- * @return array $totals calculated totals
499
- */
500
- function calculate_totals( $commissions ){
501
-
502
- $totals = array();
503
-
504
- $vendors = get_users( array( 'role' => 'vendor', 'fields' => array( 'ID', 'user_login' ) ) );
505
- $vendor_names = wp_list_pluck( $vendors, 'user_login', 'ID' );
506
-
507
- foreach ($commissions as $commission ) {
508
-
509
- if ( array_key_exists( $commission->vendor_id, $totals ) ){
510
-
511
- $totals[ $commission->vendor_id ][ 'total_due' ] += $commission->total_due + $commission->tax + $commission->total_shipping;
512
- $totals[ $commission->vendor_id ][ 'tax' ] += $commission->tax;
513
- $totals[ $commission->vendor_id ][ 'total_shipping' ] += $commission->total_shipping;
514
-
515
- } else {
516
-
517
- if ( array_key_exists( $commission->vendor_id, $vendor_names) ){
518
-
519
- $temp_array = array(
520
- 'user_login' => $vendor_names[ $commission->vendor_id ],
521
- 'total_due' => $commission->total_due,
522
- 'tax' => $commission->tax,
523
- 'total_shipping' => $commission->total_shipping,
524
- 'status' => $commission->status,
525
- );
526
-
527
- $totals[ $commission->vendor_id ] = $temp_array ;
528
-
529
- }
530
-
531
- }
532
-
533
- }
534
-
535
- usort( $totals, function( $a, $b ) {
536
- if ($a['user_login'] < $b['user_login']) {
537
- return -1;
538
- } else if ($a['user_login'] > $b['user_login']) {
539
- return 1;
540
- } else {
541
- return 0;
542
- }
543
- });
544
-
545
- return $totals;
546
-
547
- } // calculate_totals()
548
-
549
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-admin-users.php DELETED
@@ -1,493 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * WP-Admin users page
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package WC_Vendors
8
- */
9
-
10
-
11
- class WCV_Admin_Users
12
- {
13
-
14
-
15
- /**
16
- * Constructor
17
- */
18
- function __construct()
19
- {
20
- if ( !is_admin() ) return;
21
-
22
- add_action( 'edit_user_profile', array( $this, 'show_extra_profile_fields' ) );
23
- add_action( 'edit_user_profile_update', array( $this, 'save_extra_profile_fields' ) );
24
-
25
- add_filter( 'add_menu_classes', array( $this, 'show_pending_number' ) );
26
-
27
- // Disabling non-vendor related items on the admin screens
28
- if ( WCV_Vendors::is_vendor( get_current_user_id() ) ) {
29
- add_filter( 'woocommerce_csv_product_role', array( $this, 'csv_import_suite_compatibility' ) );
30
- add_filter( 'woocommerce_csv_product_export_args', array( $this, 'csv_import_suite_compatibility_export' ) );
31
-
32
- // Admin page lockdown
33
- remove_action( 'admin_init', 'woocommerce_prevent_admin_access' );
34
- add_action( 'admin_init', array( $this, 'prevent_admin_access' ) );
35
-
36
- add_filter( 'woocommerce_prevent_admin_access', array( $this, 'deny_admin_access' ) );
37
-
38
- // WC > Product page fixes
39
- add_action( 'load-post-new.php', array( $this, 'confirm_access_to_add' ) );
40
- add_action( 'load-edit.php', array( $this, 'edit_nonvendors' ) );
41
- add_filter( 'views_edit-product', array( $this, 'hide_nonvendor_links' ) );
42
-
43
- // Filter user attachments so they only see their own attachements
44
- add_action( 'ajax_query_attachments_args', array( $this, 'show_user_attachment_ajax' ) );
45
- add_filter( 'parse_query', array( $this, 'show_user_attachment_page' ) );
46
-
47
- add_action( 'admin_menu', array( $this, 'remove_menu_page' ), 99 );
48
- add_action( 'add_meta_boxes', array( $this, 'remove_meta_boxes' ), 99 );
49
- add_filter( 'product_type_selector', array( $this, 'filter_product_types' ), 99, 2 );
50
- add_filter( 'product_type_options', array( $this, 'filter_product_type_options' ), 99 );
51
-
52
- add_filter( 'woocommerce_duplicate_product_capability', array( $this, 'add_duplicate_capability' ) );
53
-
54
- // WC > Product featured
55
- $product_misc = (array) WC_Vendors::$pv_options->get_option( 'hide_product_misc' );
56
-
57
- if ( isset( $product_misc['featured'] ) ) {
58
- add_filter( 'manage_product_posts_columns', array($this, 'manage_product_columns'), 99);
59
- }
60
- // WC > Product Hide duplicate
61
- if ( isset( $product_misc['duplicate'] ) ) {
62
- add_filter( 'post_row_actions', array( $this, 'remove_dupe_link' ), 99, 2 );
63
- }
64
- }
65
-
66
- }
67
-
68
- public function confirm_access_to_add()
69
- {
70
- if ( empty( $_GET['post_type'] ) || $_GET['post_type'] != 'product' ) {
71
- return;
72
- }
73
-
74
- $can_submit = WC_Vendors::$pv_options->get_option( 'can_submit_products' );
75
- if ( !$can_submit ) {
76
- wp_die( 'You are not allowed to submit products.' );
77
- }
78
- }
79
-
80
- // public function get_terms_filter( $terms, $tax, $args )
81
- // {
82
- // if ( $tax[0] != 'product_type' || ( $tax[0] == 'product_type' && ! empty( $args['include'] ) ) ) {
83
- // return $terms;
84
- // }
85
-
86
- // $products = WCV_Vendors::get_vendor_products( get_current_user_id() );
87
- // $ids = array();
88
- // foreach ( $products as $product ) {
89
- // $ids[ ] = ( $product->ID );
90
- // $product = get_product( $product )->product_type;
91
- // var_dump($product);exit;
92
- // }
93
-
94
- // $args['include'] = $ids;
95
-
96
- // var_dump($terms);exit;
97
-
98
- // $terms = get_terms( $tax[0], $args);
99
-
100
-
101
- // return $terms;
102
- // }
103
-
104
- public function csv_import_suite_compatibility( $capability )
105
- {
106
- return 'manage_product';
107
- }
108
-
109
- public function csv_import_suite_compatibility_export( $args )
110
- {
111
- $args[ 'author' ] = get_current_user_id();
112
-
113
- return $args;
114
- }
115
-
116
- public function add_duplicate_capability( $capability )
117
- {
118
- return 'manage_product';
119
- }
120
-
121
-
122
- /**
123
- *
124
- *
125
- * @param unknown $menu
126
- *
127
- * @return unknown
128
- */
129
- public function show_pending_number( $menu )
130
- {
131
-
132
- $args = array(
133
- 'post_type' => 'product',
134
- 'author' => get_current_user_id(),
135
- 'post_status' => 'pending'
136
- );
137
-
138
- if (!WCV_Vendors::is_vendor( get_current_user_id() ) ) unset( $args['author'] );
139
-
140
- $pending_posts = get_posts( $args );
141
-
142
- $pending_count = is_array( $pending_posts ) ? count( $pending_posts ) : 0;
143
-
144
- $menu_str = 'edit.php?post_type=product';
145
-
146
- foreach ( $menu as $menu_key => $menu_data ) {
147
-
148
- if ( $menu_str != $menu_data[ 2 ] ) continue;
149
-
150
- if ($pending_count > 0 ) {
151
- $menu[ $menu_key ][ 0 ] .= " <span class='update-plugins counting-$pending_count'><span class='plugin-count'>" . number_format_i18n( $pending_count ) . '</span></span>';
152
- }
153
- }
154
-
155
- return $menu;
156
- }
157
-
158
-
159
- /**
160
- *
161
- *
162
- * @param unknown $types
163
- * @param unknown $product_type
164
- *
165
- * @return unknown
166
- */
167
- function filter_product_types( $types, $product_type )
168
- {
169
- $product_panel = (array) WC_Vendors::$pv_options->get_option( 'hide_product_panel' );
170
- $product_misc = (array) WC_Vendors::$pv_options->get_option( 'hide_product_misc' );
171
- $product_types = (array) WC_Vendors::$pv_options->get_option( 'hide_product_types' );
172
- $css = WC_Vendors::$pv_options->get_option( 'product_page_css' );
173
- $count = 0;
174
-
175
- foreach ( $product_panel as $key => $value ) {
176
- if ( $value ) $css .= sprintf( '.%s_tab{display:none !important;}', $key );
177
- }
178
-
179
- if ( !empty( $product_misc[ 'taxes' ] ) ) {
180
- $css .= '.form-field._tax_status_field, .form-field._tax_class_field{display:none !important;}';
181
- }
182
-
183
- unset( $product_misc[ 'taxes' ] );
184
-
185
- foreach ( $product_misc as $key => $value ) {
186
- if ( $value ) $css .= sprintf( '._%s_field{display:none !important;}', $key );
187
- }
188
-
189
- foreach ( $product_types as $value ) {
190
- if ( !$value ) $count++;
191
- }
192
-
193
- if ( $count === 1 ) {
194
- $css .= '#product-type{display:none !important;}';
195
- }
196
-
197
- echo '<style>';
198
- echo $css;
199
- echo '</style>';
200
-
201
- foreach ( $types as $key => $value ) {
202
- if ( !empty( $product_types[ $key ] ) ) {
203
- unset( $types[ $key ] );
204
- }
205
- }
206
-
207
- return $types;
208
- }
209
-
210
-
211
- /**
212
- *
213
- *
214
- * @param unknown $types
215
- *
216
- * @return unknown
217
- */
218
- function filter_product_type_options( $types )
219
- {
220
- $product_options = WC_Vendors::$pv_options->get_option( 'hide_product_type_options' );
221
-
222
- if ( !$product_options ) return $types;
223
-
224
- foreach ( $types as $key => $value ) {
225
- if ( !empty( $product_options[ $key ] ) ) {
226
- unset( $types[ $key ] );
227
- }
228
- }
229
-
230
- return $types;
231
- }
232
-
233
-
234
- /**
235
- * Show attachments only belonging to vendor
236
- *
237
- * @param object $query
238
- */
239
- function show_user_attachment_ajax ( $query ) {
240
-
241
- $user_id = get_current_user_id();
242
- if ( $user_id ) {
243
- $query['author'] = $user_id;
244
- }
245
- return $query;
246
- }
247
-
248
- /**
249
- * Show attachments only belonging to vendor
250
- *
251
- * @param object $query
252
- */
253
- function show_user_attachment_page ( $query ) {
254
-
255
- global $current_user, $pagenow;
256
-
257
- if ( !is_a( $current_user, 'WP_User') )
258
- return;
259
-
260
- if ( 'upload.php' != $pagenow && 'media-upload.php' != $pagenow)
261
- return;
262
-
263
- if ( !current_user_can('delete_pages') )
264
- $query->set('author', $current_user->ID );
265
-
266
- return;
267
- }
268
-
269
- /**
270
- * Allow vendors to access admin when disabled
271
- */
272
- public function prevent_admin_access()
273
- {
274
- $permitted_user = ( current_user_can( 'edit_posts' ) || current_user_can( 'manage_woocommerce' ) || current_user_can( 'vendor' ) );
275
-
276
- if ( get_option( 'woocommerce_lock_down_admin' ) == 'yes' && !is_ajax() && !$permitted_user ) {
277
- wp_safe_redirect( get_permalink( woocommerce_get_page_id( 'myaccount' ) ) );
278
- exit;
279
- }
280
- }
281
-
282
- public function deny_admin_access()
283
- {
284
- return false;
285
- }
286
-
287
-
288
- /**
289
- * Request when load-edit.php
290
- */
291
- public function edit_nonvendors()
292
- {
293
- add_action( 'request', array( $this, 'hide_nonvendor_products' ) );
294
- }
295
-
296
-
297
- /**
298
- * Hide links that don't matter anymore from vendors
299
- *
300
- * @param array $views
301
- *
302
- * @return array
303
- */
304
- public function hide_nonvendor_links( $views )
305
- {
306
- return array();
307
- }
308
-
309
-
310
- /**
311
- * Hide products that don't belong to the vendor
312
- *
313
- * @param array $query_vars
314
- *
315
- * @return array
316
- */
317
- public function hide_nonvendor_products( $query_vars )
318
- {
319
- if (array_key_exists('post_type', $query_vars) && ($query_vars['post_type'] == 'product')) {
320
- $query_vars[ 'author' ] = get_current_user_id();
321
- }
322
-
323
- return $query_vars;
324
- }
325
-
326
-
327
- /**
328
- * Remove the media library menu
329
- */
330
- public function remove_menu_page()
331
- {
332
- global $pagenow, $woocommerce;
333
-
334
- remove_menu_page( 'index.php' ); /* Hides Dashboard menu */
335
- remove_menu_page( 'separator1' ); /* Hides separator under Dashboard menu*/
336
- remove_all_actions( 'admin_notices' );
337
-
338
- if ( $pagenow == 'index.php' ) {
339
- wp_redirect( admin_url( 'profile.php' ) );
340
- }
341
- }
342
-
343
-
344
- /**
345
- *
346
- */
347
- public function remove_meta_boxes()
348
- {
349
- remove_meta_box( 'postcustom', 'product', 'normal' );
350
- remove_meta_box( 'wpseo_meta', 'product', 'normal' );
351
- remove_meta_box( 'expirationdatediv', 'product', 'side' );
352
- }
353
-
354
-
355
- /**
356
- * Update the vendor PayPal email
357
- *
358
- * @param int $vendor_id
359
- *
360
- * @return bool
361
- */
362
- public function save_extra_profile_fields( $vendor_id )
363
- {
364
- if ( !current_user_can( 'edit_user', $vendor_id ) ) return false;
365
-
366
- if ( ! WCV_Vendors::is_vendor( $vendor_id ) ) { return; }
367
-
368
- $users = get_users( array( 'meta_key' => 'pv_shop_slug', 'meta_value' => sanitize_title( $_POST[ 'pv_shop_name' ] ) ) );
369
- if ( empty( $users ) || $users[ 0 ]->ID == $vendor_id ) {
370
- update_user_meta( $vendor_id, 'pv_shop_name', $_POST[ 'pv_shop_name' ] );
371
- update_user_meta( $vendor_id, 'pv_shop_slug', sanitize_title( $_POST[ 'pv_shop_name' ] ) );
372
- }
373
-
374
- update_user_meta( $vendor_id, 'pv_paypal', $_POST[ 'pv_paypal' ] );
375
- update_user_meta( $vendor_id, 'pv_shop_html_enabled', isset( $_POST[ 'pv_shop_html_enabled' ] ) );
376
- update_user_meta( $vendor_id, 'pv_custom_commission_rate', $_POST[ 'pv_custom_commission_rate' ] );
377
- update_user_meta( $vendor_id, 'pv_shop_description', $_POST[ 'pv_shop_description' ] );
378
- update_user_meta( $vendor_id, 'pv_seller_info', $_POST[ 'pv_seller_info' ] );
379
- update_user_meta( $vendor_id, 'wcv_give_vendor_tax', isset( $_POST[ 'wcv_give_vendor_tax' ] ) );
380
- update_user_meta( $vendor_id, 'wcv_give_vendor_shipping', isset( $_POST[ 'wcv_give_vendor_shipping' ] ) );
381
-
382
- do_action( 'wcvendors_update_admin_user', $vendor_id );
383
- }
384
-
385
-
386
- /**
387
- * Show the PayPal field and commision due table
388
- *
389
- * @param unknown $user
390
- */
391
- public function show_extra_profile_fields( $user )
392
- {
393
-
394
- if ( ! WCV_Vendors::is_vendor( $user->ID ) && ! WCV_Vendors::is_pending( $user->ID ) ) {
395
- return;
396
- }
397
-
398
- ?>
399
- <h3><?php _e( 'WC Vendors', 'wcvendors' ); ?></h3>
400
- <table class="form-table">
401
- <tbody>
402
- <?php do_action( 'wcvendors_admin_before_shop_html', $user ); ?>
403
- <tr>
404
- <th scope="row">Shop HTML</th>
405
- <td>
406
- <label for="pv_shop_html_enabled">
407
- <input name="pv_shop_html_enabled" type="checkbox"
408
- id="pv_shop_html_enabled" <?php checked( true, get_user_meta( $user->ID, 'pv_shop_html_enabled', true ), $echo = true ) ?>/>
409
- <?php _e( 'Enable HTML for the shop description', 'wcvendors' ); ?>
410
- </label>
411
- </td>
412
- </tr>
413
- <?php do_action( 'wcvendors_admin_after_shop_html', $user ); ?>
414
- <tr>
415
- <th><label for="pv_shop_name"><?php _e( 'Shop name', 'wcvendors' ); ?></label></th>
416
- <td><input type="text" name="pv_shop_name" id="pv_shop_name"
417
- value="<?php echo get_user_meta( $user->ID, 'pv_shop_name', true ); ?>" class="regular-text">
418
- </td>
419
- </tr>
420
- <?php do_action( 'wcvendors_admin_after_shop_name', $user ); ?>
421
- <tr>
422
- <th><label for="pv_paypal"><?php _e( 'PayPal E-mail', 'wcvendors' ); ?> <span
423
- class="description">(<?php _e( 'required', 'wcvendors' ); ?>)</span></label></th>
424
- <td><input type="email" name="pv_paypal" id="pv_paypal"
425
- value="<?php echo get_user_meta( $user->ID, 'pv_paypal', true ); ?>" class="regular-text">
426
- </td>
427
- </tr>
428
- <?php do_action( 'wcvendors_admin_after_paypal', $user ); ?>
429
- <tr>
430
- <th><label for="pv_custom_commission_rate"><?php _e( 'Commission rate', 'wcvendors' ); ?> (%)</label></th>
431
- <td><input type="number" step="0.01" max="100" min="0" name="pv_custom_commission_rate" placeholder="<?php _e( 'Leave blank for default', 'wcvendors' ); ?>" id="pv_custom_commission_rate"
432
- value="<?php echo get_user_meta( $user->ID, 'pv_custom_commission_rate', true ); ?>" class="regular-text">
433
- </td>
434
- </tr>
435
- <?php do_action( 'wcvendors_admin_after_commission_due', $user ); ?>
436
- <tr>
437
- <th><label for="wcv_give_vendor_tax"><?php _e( 'Give Tax', 'wcvendors' ); ?> (%)</label></th>
438
- <td>
439
- <label for="wcv_give_vendor_tax">
440
- <input name="wcv_give_vendor_tax" type="checkbox"
441
- id="wcv_give_vendor_tax" <?php checked( true, get_user_meta( $user->ID, 'wcv_give_vendor_tax', true ), $echo = true ) ?>/>
442
- <?php _e( 'Tax override for vendor', 'wcvendors' ); ?>
443
- </label>
444
- </td>
445
- </tr>
446
- <?php do_action( 'wcvendors_admin_after_give_tax', $user ); ?>
447
- <tr>
448
- <th><label for="wcv_give_vendor_shipping"><?php _e( 'Give Shipping', 'wcvendors' ); ?> (%)</label></th>
449
- <td>
450
- <label for="wcv_give_vendor_shipping">
451
- <input name="wcv_give_vendor_shipping" type="checkbox"
452
- id="wcv_give_vendor_shipping" <?php checked( true, get_user_meta( $user->ID, 'wcv_give_vendor_shipping', true ), $echo = true ) ?>/>
453
- <?php _e( 'Shipping override for vendor', 'wcvendors' ); ?>
454
- </label>
455
- </td>
456
- </tr>
457
- <?php do_action( 'wcvendors_admin_after_give_shipping', $user ); ?>
458
- <tr>
459
- <th><label for="pv_seller_info"><?php _e( 'Seller info', 'wcvendors' ); ?></label></th>
460
- <td><?php wp_editor( get_user_meta( $user->ID, 'pv_seller_info', true ), 'pv_seller_info' ); ?></td>
461
- </tr>
462
- <?php do_action( 'wcvendors_admin_after_seller_info', $user ); ?>
463
- <tr>
464
- <th><label for="pv_shop_description"><?php _e( 'Shop description', 'wcvendors' ); ?></label>
465
- </th>
466
- <td><?php wp_editor( get_user_meta( $user->ID, 'pv_shop_description', true ), 'pv_shop_description' ); ?></td>
467
- </tr>
468
- <?php do_action( 'wcvendors_admin_after_shop_description', $user ); ?>
469
- </tbody>
470
- </table>
471
- <?php
472
- }
473
-
474
- /*
475
- Remove featured check box from the product listing
476
- */
477
- public function manage_product_columns( $columns ){
478
- global $woocommerce;
479
- unset($columns['featured']);
480
- return $columns;
481
- }
482
-
483
-
484
- /**
485
- * Hide the duplicate product link by removing it from the row actions
486
- */
487
- public function remove_dupe_link( $actions, $post ) {
488
- unset($actions['duplicate']);
489
- return $actions;
490
- }
491
-
492
-
493
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-product-meta.php DELETED
@@ -1,267 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Product meta configurations
5
- *
6
- * @package ProductVendor
7
- */
8
-
9
-
10
- class WCV_Product_Meta
11
- {
12
-
13
-
14
- /**
15
- * Constructor
16
- */
17
- function __construct()
18
- {
19
- if ( !current_user_can( 'manage_woocommerce' ) ) return;
20
-
21
- // Allow products to have authors
22
- add_post_type_support( 'product', 'author' );
23
-
24
- add_action( 'add_meta_boxes', array( $this, 'change_author_meta_box_title' ) );
25
- add_action( 'wp_dropdown_users', array( $this, 'author_vendor_roles' ), 0, 1 );
26
- if ( apply_filters( 'wcv_product_commission_tab', true ) ) {
27
- add_action( 'woocommerce_product_write_panel_tabs', array( $this, 'add_tab' ) );
28
- add_action( 'woocommerce_product_write_panels', array( $this, 'add_panel' ) );
29
- add_action( 'woocommerce_process_product_meta', array( $this, 'save_panel' ) );
30
- }
31
-
32
- add_action( 'woocommerce_product_quick_edit_end', array($this, 'display_vendor_dd_quick_edit') );
33
- add_action( 'woocommerce_product_quick_edit_save', array($this, 'save_vendor_quick_edit'), 2, 99 );
34
- add_action( 'manage_product_posts_custom_column', array($this, 'display_vendor_column'), 2, 99 );
35
- add_filter( 'manage_product_posts_columns', array($this, 'vendor_column_quickedit') );
36
-
37
- }
38
-
39
-
40
- /**
41
- * Change the "Author" metabox to "Vendor"
42
- */
43
- public function change_author_meta_box_title()
44
- {
45
- global $wp_meta_boxes;
46
- $wp_meta_boxes[ 'product' ][ 'normal' ][ 'core' ][ 'authordiv' ][ 'title' ] = __( 'Vendor', 'wcvendors' );;
47
- }
48
-
49
-
50
- /**
51
- * Override the authors selectbox with +vendor roles
52
- *
53
- * @param html $output
54
- *
55
- * @return html
56
- */
57
- public function author_vendor_roles( $output )
58
- {
59
- global $post;
60
-
61
- if ( empty( $post ) ) return $output;
62
-
63
- // Return if this isn't a WooCommerce product post type
64
- if ( $post->post_type != 'product' ) return $output;
65
-
66
- // Return if this isn't the vendor author override dropdown
67
- if ( !strpos( $output, 'post_author_override' ) ) return $output;
68
-
69
- $args = array(
70
- 'selected' => $post->post_author,
71
- 'id' => 'post_author_override',
72
- );
73
-
74
- $output = $this->vendor_selectbox( $args );
75
-
76
- return $output;
77
- }
78
-
79
-
80
- /**
81
- * Create a selectbox to display vendor & administrator roles
82
- *
83
- * @param array $args
84
- *
85
- * @return html
86
- */
87
- public function vendor_selectbox( $args )
88
- {
89
- $default_args = array(
90
- 'placeholder',
91
- 'id',
92
- 'class',
93
- );
94
-
95
- foreach ( $default_args as $key ) {
96
- if ( !is_array( $key ) && empty( $args[ $key ] ) ) $args[ $key ] = '';
97
- else if ( is_array( $key ) ) foreach ( $key as $val ) $args[ $key ][ $val ] = esc_attr( $args[ $key ][ $val ] );
98
- }
99
- extract( $args );
100
-
101
- $roles = array( 'vendor', 'administrator' );
102
- $user_args = array( 'fields' => array( 'ID', 'user_login' ) );
103
-
104
- $output = "<select style='width:200px;' name='$id' id='$id' class='$class' data-placeholder='$placeholder'>\n";
105
- $output .= "\t<option value=''></option>\n";
106
-
107
- foreach ( $roles as $role ) {
108
-
109
- $new_args = $user_args;
110
- $new_args[ 'role' ] = $role;
111
- $users = get_users( $new_args );
112
-
113
- if ( empty( $users ) ) continue;
114
- foreach ( (array) $users as $user ) {
115
- $select = selected( $user->ID, $selected, false );
116
- $output .= "\t<option value='$user->ID' $select>$user->user_login</option>\n";
117
- }
118
-
119
- }
120
- $output .= "</select>";
121
-
122
- // Convert this selectbox with select2
123
- $output .= '
124
- <script type="text/javascript">jQuery(function() { jQuery("#' . $id . '").select2().focus(); } );</script>';
125
-
126
- return $output;
127
- }
128
-
129
-
130
- /**
131
- * Save commission rate of a product
132
- *
133
- * @param int $post_id
134
- */
135
- public function save_panel( $post_id )
136
- {
137
- if ( isset( $_POST[ 'pv_commission_rate' ] ) ) {
138
- update_post_meta( $post_id, 'pv_commission_rate', is_numeric( $_POST[ 'pv_commission_rate' ] ) ? (float) $_POST[ 'pv_commission_rate' ] : false );
139
- }
140
-
141
- }
142
-
143
-
144
- /**
145
- * Add the Commission tab to a product
146
- */
147
- public function add_tab()
148
- {
149
- ?>
150
- <li class="commission_tab">
151
- <a href="#commission"><?php _e( 'Commission', 'wcvendors' ) ?></a>
152
- </li> <?php
153
- }
154
-
155
-
156
- /**
157
- * Add the Commission panel to a product
158
- */
159
- public function add_panel()
160
- {
161
- global $post; ?>
162
-
163
- <div id="commission" class="panel woocommerce_options_panel">
164
- <fieldset>
165
-
166
- <p class='form-field commission_rate_field'>
167
- <label for='pv_commission_rate'><?php _e( 'Commission', 'wcvendors' ); ?> (%)</label>
168
- <input type='number' id='pv_commission_rate'
169
- name='pv_commission_rate'
170
- class='short'
171
- max="100"
172
- min="0"
173
- step='any'
174
- placeholder='<?php _e( 'Leave blank for default', 'wcvendors' ); ?>'
175
- value="<?php echo get_post_meta( $post->ID, 'pv_commission_rate', true ); ?>"/>
176
- </p>
177
-
178
- </fieldset>
179
- </div> <?php
180
-
181
- }
182
-
183
- /*
184
- * Rename the Authors column to Vendor on products page
185
- */
186
- public function vendor_column_quickedit($posts_columns) {
187
- $posts_columns['author'] = __( 'Vendor', 'wcvendors' );
188
-
189
- return $posts_columns;
190
- }
191
-
192
- /*
193
- * Display the vendor drop down on the quick edit screen
194
- */
195
- public function display_vendor_dd_quick_edit() {
196
-
197
- global $post;
198
- $selected = $post->post_author;
199
-
200
- $roles = array( 'vendor', 'administrator' );
201
- $user_args = array( 'fields' => array( 'ID', 'display_name' ) );
202
-
203
- $output = "<select style='width:200px;' name='post_author-new' class='select'>\n";
204
-
205
- foreach ( $roles as $role ) {
206
-
207
- $new_args = $user_args;
208
- $new_args[ 'role' ] = $role;
209
- $users = get_users( $new_args );
210
-
211
- if ( empty( $users ) ) continue;
212
- foreach ( (array) $users as $user ) {
213
- $select = selected( $user->ID, $selected, false );
214
- $output .= "\t<option value='$user->ID' $select>$user->display_name</option>\n";
215
- }
216
-
217
- }
218
- $output .= "</select>";
219
-
220
- ?>
221
- <br class="clear" />
222
- <label class="inline-edit-author-new">
223
- <span class="title"><?php _e('Vendor', 'wcvendors' ); ?></span>
224
- <?php echo $output; ?>
225
- </label>
226
- <?php
227
- }
228
-
229
-
230
- /*
231
- * Save the vendor on the quick edit screen
232
- */
233
- public function save_vendor_quick_edit( $product ) {
234
-
235
- if ( $product->is_type('simple') || $product->is_type('external') ) {
236
- if ( isset( $_REQUEST['_vendor'] ) ) {
237
- $vendor = wc_clean($_REQUEST['_vendor']);
238
- $product->post->post_author = $vendor;
239
- }
240
- }
241
- return $product;
242
- }
243
-
244
- /*
245
- * Display hidden column data for js
246
- */
247
- public function display_vendor_column( $column, $post_id ){
248
-
249
- $vendor = get_post_field( 'post_author', $post_id );
250
-
251
- switch ( $column ) {
252
- case 'name' :
253
-
254
- ?>
255
- <div class="hidden vendor" id="vendor_<?php echo $post_id; ?>">
256
- <div id="post_author"><?php echo $vendor; ?></div>
257
- </div>
258
- <?php
259
-
260
- break;
261
-
262
- default :
263
- break;
264
- }
265
-
266
- }
267
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-vendor-admin-dashboard.php DELETED
@@ -1,634 +0,0 @@
1
- <?php
2
- /**
3
- * WC Vendor Admin Dashboard - Vendor WP-Admin Dashboard Pages
4
- *
5
- * @author Jamie Madden <http://wcvendors.com / https://github.com/digitalchild>
6
- * @package WCVendors
7
- */
8
-
9
- Class WCV_Vendor_Admin_Dashboard {
10
-
11
- function __construct(){
12
- // Add Shop Settings page
13
- add_action( 'admin_menu', array( $this, 'vendor_dashboard_pages') );
14
- // Hook into init for form processing
15
- add_action( 'init', array( $this, 'save_shop_settings' ) );
16
- add_action( 'admin_head', array( $this, 'admin_enqueue_order_style') );
17
- }
18
-
19
- function vendor_dashboard_pages(){
20
- add_menu_page( __('Shop Settings', 'wcvendors'), __('Shop Settings', 'wcvendors'), 'manage_product', 'wcv-vendor-shopsettings', array( $this, 'settings_page' ) );
21
- $hook = add_menu_page( __( 'Orders', 'wcvendors' ), __( 'Orders', 'wcvendors' ), 'manage_product', 'wcv-vendor-orders', array( 'WCV_Vendor_Admin_Dashboard', 'orders_page' ) );
22
- add_action( "load-$hook", array( 'WCV_Vendor_Admin_Dashboard', 'add_options' ) );
23
- }
24
-
25
- function settings_page() {
26
- $user_id = get_current_user_id();
27
- $paypal_address = true;
28
- $shop_description = true;
29
- $description = get_user_meta( $user_id, 'pv_shop_description', true );
30
- $seller_info = get_user_meta( $user_id, 'pv_seller_info', true );
31
- $has_html = get_user_meta( $user_id, 'pv_shop_html_enabled', true );
32
- $shop_page = WCV_Vendors::get_vendor_shop_page( wp_get_current_user()->user_login );
33
- $global_html = WC_Vendors::$pv_options->get_option( 'shop_html_enabled' );
34
- include('views/html-vendor-settings-page.php');
35
- }
36
-
37
- function admin_enqueue_order_style() {
38
- add_thickbox();
39
- wp_enqueue_style( 'admin_order_styles', wcv_assets_url . 'css/admin-orders.css' );
40
- }
41
-
42
- /**
43
- * Save shop settings
44
- */
45
- public function save_shop_settings()
46
- {
47
- $user_id = get_current_user_id();
48
- $error = false;
49
- $error_msg = '';
50
-
51
- if (isset ( $_POST[ 'wc-vendors-nonce' ] ) ) {
52
-
53
- if ( !wp_verify_nonce( $_POST[ 'wc-vendors-nonce' ], 'save-shop-settings-admin' ) ) {
54
- return false;
55
- }
56
-
57
- if ( !is_email( $_POST[ 'pv_paypal' ] ) ) {
58
- $error_msg .= __( 'Your PayPal address is not a valid email address.', 'wcvendors' );
59
- $error = true;
60
- } else {
61
- update_user_meta( $user_id, 'pv_paypal', $_POST[ 'pv_paypal' ] );
62
- }
63
-
64
- if ( !empty( $_POST[ 'pv_shop_name' ] ) ) {
65
- $users = get_users( array( 'meta_key' => 'pv_shop_slug', 'meta_value' => sanitize_title( $_POST[ 'pv_shop_name' ] ) ) );
66
- if ( !empty( $users ) && $users[ 0 ]->ID != $user_id ) {
67
- $error_msg .= __( 'That shop name is already taken. Your shop name must be unique.', 'wcvendors' );
68
- $error = true;
69
- } else {
70
- update_user_meta( $user_id, 'pv_shop_name', $_POST[ 'pv_shop_name' ] );
71
- update_user_meta( $user_id, 'pv_shop_slug', sanitize_title( $_POST[ 'pv_shop_name' ] ) );
72
- }
73
- }
74
-
75
- if ( isset( $_POST[ 'pv_shop_description' ] ) ) {
76
- update_user_meta( $user_id, 'pv_shop_description', $_POST[ 'pv_shop_description' ] );
77
- }
78
-
79
- if ( isset( $_POST[ 'pv_seller_info' ] ) ) {
80
- update_user_meta( $user_id, 'pv_seller_info', $_POST[ 'pv_seller_info' ] );
81
- }
82
-
83
- do_action( 'wcvendors_shop_settings_admin_saved', $user_id );
84
-
85
- if ( ! $error ) {
86
- echo '<div class="updated"><p>';
87
- echo __( 'Settings saved.', 'wcvendors' );
88
- echo '</p></div>';
89
- } else {
90
- echo '<div class="error"><p>';
91
- echo $error_msg;
92
- echo '</p></div>';
93
- }
94
- }
95
- }
96
-
97
- /**
98
- *
99
- *
100
- * @param unknown $status
101
- * @param unknown $option
102
- * @param unknown $value
103
- *
104
- * @return unknown
105
- */
106
- public static function set_table_option( $status, $option, $value )
107
- {
108
- if ( $option == 'orders_per_page' ) {
109
- return $value;
110
- }
111
- }
112
-
113
-
114
- /**
115
- *
116
- */
117
- public static function add_options()
118
- {
119
- global $WCV_Vendor_Order_Page;
120
-
121
- $args = array(
122
- 'label' => 'Rows',
123
- 'default' => 10,
124
- 'option' => 'orders_per_page'
125
- );
126
- add_screen_option( 'per_page', $args );
127
-
128
- $WCV_Vendor_Order_Page = new WCV_Vendor_Order_Page();
129
-
130
- }
131
-
132
-
133
- /**
134
- * HTML setup for the Orders Page
135
- */
136
- public static function orders_page()
137
- {
138
- global $woocommerce, $WCV_Vendor_Order_Page;
139
-
140
- $WCV_Vendor_Order_Page->prepare_items();
141
-
142
- ?>
143
- <div class="wrap">
144
-
145
- <div id="icon-woocommerce" class="icon32 icon32-woocommerce-reports"><br/></div>
146
- <h2><?php _e( 'Orders', 'wcvendors' ); ?></h2>
147
-
148
- <form id="posts-filter" method="get">
149
-
150
- <input type="hidden" name="page" value="wcv-vendor-orders"/>
151
- <?php $WCV_Vendor_Order_Page->display() ?>
152
-
153
- </form>
154
- <div id="ajax-response"></div>
155
- <br class="clear"/>
156
- </div>
157
-
158
- <?php }
159
-
160
- } // End WCV_Vendor_Admin_Dashboard
161
-
162
- if ( !class_exists( 'WP_List_Table' ) ) require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
163
-
164
- /**
165
- * WCV Vendor Order Page
166
- *
167
- * @author Jamie Madden <http://wcvendors.com / https://github.com/digitalchild>
168
- * @package WCVendors
169
- * @extends WP_List_Table
170
- */
171
- class WCV_Vendor_Order_Page extends WP_List_Table
172
- {
173
-
174
- public $index;
175
-
176
- /**
177
- * can_view_comments
178
- *
179
- * @since 1.0.0
180
- * @access public
181
- * @var string $can_view_comments permission check for view comments
182
- */
183
- public $can_view_comments;
184
-
185
-
186
- /**
187
- * can_add_comments
188
- *
189
- * @since 1.0.0
190
- * @access public
191
- * @var string $can_add_comments permission check for add comments
192
- */
193
- public $can_add_comments;
194
-
195
-
196
- /**
197
- * __construct function.
198
- *
199
- * @access public
200
- */
201
- function __construct()
202
- {
203
- global $status, $page;
204
-
205
- $this->index = 0;
206
-
207
- //Set parent defaults
208
- parent::__construct( array(
209
- 'singular' => 'order',
210
- 'plural' => 'orders',
211
- 'ajax' => false
212
- ) );
213
-
214
- $this->can_view_comments = WC_Vendors::$pv_options->get_option( 'can_view_order_comments' );
215
- $this->can_add_comments = WC_Vendors::$pv_options->get_option( 'can_submit_order_comments' );
216
- }
217
-
218
-
219
- /**
220
- * column_default function.
221
- *
222
- * @access public
223
- *
224
- * @param unknown $item
225
- * @param mixed $column_name
226
- *
227
- * @return unknown
228
- */
229
- function column_default( $item, $column_name )
230
- {
231
- global $wpdb;
232
-
233
- switch ( $column_name ) {
234
- case 'order_id' :
235
- return $item->order_id;
236
- case 'customer' :
237
- return $item->customer;
238
- case 'products' :
239
- return $item->products;
240
- case 'total' :
241
- return $item->total;
242
- // case 'comments' :
243
- // return $item->comments;
244
- case 'date' :
245
- return $item->date;
246
- case 'status' :
247
- return $item->status;
248
- }
249
- }
250
-
251
-
252
- /**
253
- * column_cb function.
254
- *
255
- * @access public
256
- *
257
- * @param mixed $item
258
- *
259
- * @return unknown
260
- */
261
- function column_cb( $item )
262
- {
263
- return sprintf(
264
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
265
- /*$1%s*/
266
- 'order_id',
267
- /*$2%s*/
268
- $item->order_id
269
- );
270
- }
271
-
272
-
273
- /**
274
- * get_columns function.
275
- *
276
- * @access public
277
- * @return unknown
278
- */
279
- function get_columns()
280
- {
281
- $columns = array(
282
- 'cb' => '<input type="checkbox" />',
283
- 'order_id' => __( 'Order ID', 'wcvendors' ),
284
- 'customer' => __( 'Customer', 'wcvendors' ),
285
- 'products' => __( 'Products', 'wcvendors' ),
286
- 'total' => __( 'Total', 'wcvendors' ),
287
- // 'comments' => __( 'Comments to Customer', 'wcvendors' ),
288
- 'date' => __( 'Date', 'wcvendors' ),
289
- 'status' => __( 'Shipped', 'wcvendors' ),
290
- );
291
-
292
- if ( !$this->can_view_comments ) unset( $columns['comments'] );
293
-
294
- return $columns;
295
- }
296
-
297
-
298
- /**
299
- * get_sortable_columns function.
300
- *
301
- * @access public
302
- * @return unknown
303
- */
304
- function get_sortable_columns()
305
- {
306
- $sortable_columns = array(
307
- 'order_id' => array( 'order_id', false ),
308
- 'total' => array( 'total', false ),
309
- 'status' => array( 'status', false ),
310
- );
311
-
312
- return $sortable_columns;
313
- }
314
-
315
-
316
- /**
317
- * Get bulk actions
318
- *
319
- * @return unknown
320
- */
321
- function get_bulk_actions()
322
- {
323
- $actions = array(
324
- 'mark_shipped' => apply_filters( 'wcvendors_mark_shipped_label', __( 'Mark shipped', 'wcvendors' ) ),
325
- );
326
-
327
- return $actions;
328
- }
329
-
330
-
331
- /**
332
- * Process bulk actions
333
- *
334
- * @return unknown
335
- */
336
- function process_bulk_action()
337
- {
338
- if ( !isset( $_GET[ 'order_id' ] ) ) return;
339
-
340
- if (is_array( $_GET[ 'order_id' ] ) ) {
341
-
342
- $items = array_map( 'intval', $_GET[ 'order_id' ] );
343
- switch ( $this->current_action() ) {
344
- case 'mark_shipped':
345
-
346
- $result = $this->mark_shipped( $items );
347
-
348
- if ( $result )
349
- echo '<div class="updated"><p>' . __( 'Orders marked shipped.', 'wcvendors' ) . '</p></div>';
350
- break;
351
-
352
- default:
353
- // code...
354
- break;
355
- }
356
-
357
- } else {
358
-
359
- if ( !isset( $_GET[ 'action' ] ) ) return;
360
- }
361
-
362
-
363
- }
364
-
365
-
366
- /**
367
- * Mark orders as shipped
368
- *
369
- * @param unknown $ids (optional)
370
- *
371
- * @return unknown
372
- */
373
- public function mark_shipped( $ids = array() )
374
- {
375
- global $woocommerce;
376
-
377
- $user_id = get_current_user_id();
378
-
379
- if ( !empty( $ids ) ) {
380
- foreach ($ids as $order_id ) {
381
- $shippers = (array) get_post_meta( $order_id, 'wc_pv_shipped', true );
382
- if( !in_array($user_id, $shippers)) {
383
- $shippers[] = $user_id;
384
- $mails = $woocommerce->mailer()->get_emails();
385
- if ( !empty( $mails ) ) {
386
- $mails[ 'WC_Email_Notify_Shipped' ]->trigger( $order_id, $user_id );
387
- }
388
- do_action('wcvendors_vendor_ship', $order_id, $user_id);
389
- }
390
- update_post_meta( $order_id, 'wc_pv_shipped', $shippers );
391
- }
392
- return true;
393
- }
394
- return false;
395
- }
396
-
397
-
398
-
399
- /**
400
- * Get Orders to display in admin
401
- *
402
- * @return $orders
403
- */
404
- function get_orders() {
405
-
406
- $user_id = get_current_user_id();
407
-
408
- $orders = array();
409
-
410
- $vendor_products = $this->get_vendor_products( $user_id );
411
-
412
- $products = array();
413
-
414
- foreach ($vendor_products as $_product) {
415
- $products[] = $_product->ID;
416
- }
417
-
418
- $_orders = $this->get_orders_for_vendor_products( $products );
419
-
420
- $model_id = 0;
421
-
422
- if (!empty( $_orders ) ) {
423
- foreach ( $_orders as $order ) {
424
-
425
- $order = new WC_Order( $order->order_id );
426
- $valid_items = WCV_Queries::get_products_for_order( $order->id );
427
- $valid = array();
428
-
429
- $items = $order->get_items();
430
-
431
- foreach ($items as $key => $value) {
432
- if ( in_array($value['variation_id'], $valid_items) || in_array($value['product_id'], $valid_items)) {
433
- $valid[] = $value;
434
- }
435
- }
436
-
437
- $products = '';
438
-
439
- foreach ($valid as $key => $item) {
440
- $item_meta = new WC_Order_Item_Meta( $item[ 'item_meta' ] );
441
- // $item_meta = $item_meta->display( false, true );
442
- $item_meta = $item_meta->get_formatted( );
443
- $products .= '<strong>'. $item['qty'] . ' x ' . $item['name'] . '</strong><br />';
444
- foreach ($item_meta as $key => $meta) {
445
- // Remove the sold by meta key for display
446
- if (strtolower($key) != 'sold by' ) $products .= $meta[ 'label' ] .' : ' . $meta[ 'value' ]. '<br />';
447
- }
448
- }
449
-
450
- $shippers = (array) get_post_meta( $order->id, 'wc_pv_shipped', true );
451
- $shipped = in_array($user_id, $shippers) ? 'Yes' : 'No' ;
452
-
453
- $sum = WCV_Queries::sum_for_orders( array( $order->id ), array('vendor_id' =>get_current_user_id() ) );
454
- $total = $sum[0]->line_total;
455
-
456
- $comment_output = '';
457
-
458
- // Need to fix how form is submitted for adding comments if at all possible.
459
-
460
- if ( $this->can_view_comments) {
461
-
462
- $order_notes = $order->get_customer_order_notes();
463
-
464
- $comment_output .= '<a href="#TB_inline?width=600&height=550&inlineId=order-comment-window-'.$model_id.'" class="thickbox">';
465
- $comment_output .= sprintf( __( 'Comments (%s)', 'wcvendors' ), count( $order_notes ) );
466
- $comment_output .= '</a>';
467
- $comment_output .= '<div id="order-comment-window-'.$model_id.'" style="display:none;">';
468
- $comment_output .= '<h3>'.__('Comments to Customer', 'wcvendors' ). '</h3>';
469
-
470
- if ( !empty( $order_notes ) ) {
471
-
472
- foreach ($order_notes as $order_note) {
473
- $last_added = human_time_diff( strtotime( $order_note->comment_date_gmt ), current_time( 'timestamp', 1 ) );
474
- $comment_output .= '<p>';
475
- $comment_output .= $order_note->comment_content;
476
- $comment_output .= '<br />';
477
- $comment_output .= sprintf(__( 'added %s ago', 'wcvendors' ), $last_added );
478
- $comment_output .= '<br />';
479
- $comment_output .= '</p>';
480
- }
481
-
482
- } else {
483
- $comment_output .= '<p>'.__('No comments currently to customer.', 'wcvendors' ). '</p>';
484
- }
485
-
486
- if ( $this->can_add_comments ) {
487
- $comment_output .= wp_nonce_field( 'add-comment' );
488
- $comment_output .= '
489
- <textarea name="comment_text" style="width:97%"></textarea>
490
- <input type="hidden" name="order_id" value="'. $order->id .'">
491
- <input type="hidden" name="action" value="add_comment">
492
- <input class="btn btn-large btn-block" type="submit" name="submit_comment" value="'.__( 'Add comment', 'wcvendors' ).'">';
493
- }
494
-
495
- $comment_output .= '</div>';
496
-
497
- }
498
-
499
- $order_items = array();
500
- $order_items[ 'order_id' ] = $order->id;
501
- $order_items[ 'customer' ] = $order->get_formatted_shipping_address();
502
- $order_items[ 'products' ] = $products;
503
- $order_items[ 'total' ] = woocommerce_price( $total );
504
- $order_items[ 'date' ] = date_i18n( wc_date_format(), strtotime( $order->order_date ) );
505
- // $order_items[ 'comments' ] = $comment_output;
506
- $order_items[ 'status' ] = $shipped;
507
-
508
- $orders[] = (object) $order_items;
509
-
510
- $model_id++;
511
- }
512
- }
513
- return $orders;
514
-
515
- }
516
-
517
-
518
- /**
519
- * Get the vendor products sold
520
- *
521
- * @param $user_id - the user_id to get the products of
522
- *
523
- * @return unknown
524
- */
525
- public function get_vendor_products( $user_id )
526
- {
527
- global $wpdb;
528
-
529
- $vendor_products = array();
530
- $sql = '';
531
-
532
- $sql .= "SELECT product_id FROM {$wpdb->prefix}pv_commission WHERE vendor_id = {$user_id} AND status != 'reversed' GROUP BY product_id";
533
-
534
- $results = $wpdb->get_results( $sql );
535
-
536
- foreach ( $results as $value ) {
537
- $ids[ ] = $value->product_id;
538
- }
539
-
540
- if ( !empty( $ids ) ) {
541
- $vendor_products = get_posts(
542
- array(
543
- 'numberposts' => -1,
544
- 'orderby' => 'post_date',
545
- 'post_type' => array( 'product', 'product_variation' ),
546
- 'order' => 'DESC',
547
- 'include' => $ids
548
- )
549
- );
550
- }
551
-
552
- return $vendor_products;
553
- }
554
-
555
-
556
- /**
557
- * All orders for a specific product
558
- *
559
- * @param array $product_ids
560
- * @param array $args (optional)
561
- *
562
- * @return object
563
- */
564
- public function get_orders_for_vendor_products( array $product_ids, array $args = array() )
565
- {
566
- global $wpdb;
567
-
568
- if ( empty( $product_ids ) ) return false;
569
-
570
- $defaults = array(
571
- 'status' => apply_filters( 'wcvendors_completed_statuses', array( 'completed', 'processing' ) ),
572
- );
573
-
574
- $args = wp_parse_args( $args, $defaults );
575
-
576
-
577
- $sql = "
578
- SELECT order_id
579
- FROM {$wpdb->prefix}pv_commission as order_items
580
- WHERE product_id IN ('" . implode( "','", $product_ids ) . "')
581
- AND status != 'reversed'
582
- ";
583
-
584
- if ( !empty( $args[ 'vendor_id' ] ) ) {
585
- $sql .= "
586
- AND vendor_id = {$args['vendor_id']}
587
- ";
588
- }
589
-
590
- $sql .= "
591
- GROUP BY order_id
592
- ORDER BY time DESC
593
- ";
594
-
595
- $orders = $wpdb->get_results( $sql );
596
-
597
- return $orders;
598
- }
599
-
600
-
601
-
602
- /**
603
- * prepare_items function.
604
- *
605
- * @access public
606
- */
607
- function prepare_items()
608
- {
609
-
610
-
611
- /**
612
- * Init column headers
613
- */
614
- $this->_column_headers = $this->get_column_info();
615
-
616
-
617
- /**
618
- * Process bulk actions
619
- */
620
- $this->process_bulk_action();
621
-
622
- /**
623
- * Get items
624
- */
625
-
626
- $this->items = $this->get_orders();
627
-
628
- /**
629
- * Pagination
630
- */
631
- }
632
-
633
-
634
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-vendor-applicants.php DELETED
@@ -1,103 +0,0 @@
1
- <?php
2
-
3
- /**
4
- *
5
- */
6
- class WCV_Vendor_Applicants
7
- {
8
-
9
- function __construct()
10
- {
11
- add_filter( 'user_row_actions', array( $this, 'user_row_actions' ), 10, 2 );
12
- add_filter( 'load-users.php', array( $this, 'user_row_actions_commit' ) );
13
- }
14
-
15
- /**
16
- *
17
- *
18
- * @param unknown $actions
19
- * @param unknown $user_object
20
- *
21
- * @return unknown
22
- */
23
- function user_row_actions( $actions, $user_object )
24
- {
25
- if ( !empty( $_GET[ 'role' ] ) && $_GET[ 'role' ] == 'pending_vendor' ) {
26
- $actions[ 'approve_vendor' ] = "<a href='?role=pending_vendor&action=approve_vendor&user_id=" . $user_object->ID . "'>" . __( 'Approve', 'cgc_ub' ) . "</a>";
27
- $actions[ 'deny_vendor' ] = "<a href='?role=pending_vendor&action=deny_vendor&user_id=" . $user_object->ID . "'>" . __( 'Deny', 'cgc_ub' ) . "</a>";
28
- }
29
-
30
- return $actions;
31
- }
32
-
33
-
34
- /**
35
- *
36
- */
37
- public function user_row_actions_commit()
38
- {
39
- if ( !empty( $_GET[ 'action' ] ) && !empty( $_GET[ 'user_id' ] ) ) {
40
-
41
- $wp_user_object = new WP_User( (int) $_GET[ 'user_id' ] );
42
-
43
- switch ( $_GET[ 'action' ] ) {
44
- case 'approve_vendor':
45
- $role = 'vendor';
46
- add_action( 'admin_notices', array( $this, 'approved' ) );
47
- do_action( 'wcvendors_approve_vendor', $wp_user_object );
48
- break;
49
-
50
- case 'deny_vendor':
51
- $role = 'subscriber';
52
- add_action( 'admin_notices', array( $this, 'denied' ) );
53
- do_action( 'wcvendors_deny_vendor', $wp_user_object );
54
- break;
55
-
56
- default:
57
- // code...
58
- break;
59
- }
60
-
61
- $wp_user_object->set_role( $role );
62
-
63
- }
64
- }
65
-
66
-
67
- /**
68
- *
69
- */
70
- public function denied()
71
- {
72
- echo '<div class="updated">';
73
- echo '<p>' . __( 'Vendor has been <b>denied</b>.', 'wcvendors' ) . '</p>';
74
- echo '</div>';
75
- }
76
-
77
-
78
- /**
79
- *
80
- */
81
- public function approved()
82
- {
83
- echo '<div class="updated">';
84
- echo '<p>' . __( 'Vendor has been <b>approved</b>.', 'wcvendors' ) . '</p>';
85
- echo '</div>';
86
- }
87
-
88
-
89
- /**
90
- *
91
- *
92
- * @param unknown $values
93
- *
94
- * @return unknown
95
- */
96
- public function show_pending_vendors_link( $values )
97
- {
98
- $values[ 'pending_vendors' ] = '<a href="?role=asd">' . __( 'Pending Vendors', 'wcvendors' ) . ' <span class="count">(3)</span></a>';
99
-
100
- return $values;
101
- }
102
-
103
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-vendor-reports.php DELETED
@@ -1,121 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Report views
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package ProductVendor
8
- */
9
-
10
-
11
- class WCV_Vendor_Reports
12
- {
13
-
14
-
15
- /**
16
- * Constructor
17
- */
18
- function __construct()
19
- {
20
- $this->vendor_id = !current_user_can( 'manage_woocommerce' ) ? wp_get_current_user()->ID : '';
21
- if ( !empty ( $this->vendor_id ) ) {
22
- add_filter( 'woocommerce_reports_charts', array( $this, 'filter_tabs' ), 99 );
23
- add_filter( 'woocommerce_json_search_found_products', array( $this, 'filter_products_json' ) );
24
- add_filter( 'woocommerce_reports_product_sales_order_items', array( $this, 'filter_products' ) );
25
- add_filter( 'woocommerce_reports_top_sellers_order_items', array( $this, 'filter_products' ) );
26
- add_filter( 'woocommerce_reports_top_earners_order_items', array( $this, 'filter_products' ) );
27
- }
28
-
29
- }
30
-
31
- /**
32
- * Show only reports that are useful to a vendor
33
- *
34
- * @param array $tabs
35
- *
36
- * @return array
37
- */
38
- public function filter_tabs( $tabs )
39
- {
40
- global $woocommerce;
41
-
42
- $remove = array(
43
- 'woocommerce_sales_overview',
44
- 'woocommerce_daily_sales',
45
- 'woocommerce_monthly_sales',
46
- 'woocommerce_monthly_taxes',
47
- 'woocommerce_category_sales',
48
- 'woocommerce_coupon_sales',
49
- );
50
-
51
- $reports = $tabs[ 'orders' ][ 'reports' ];
52
-
53
- foreach ( $reports as $key => $chart ) {
54
- if ( $key == 'coupon_usage' ) {
55
- unset( $tabs[ 'orders' ][ 'reports' ][ $key ] );
56
- }
57
- }
58
-
59
- // These are admin tabs
60
- $return = array(
61
- 'orders' => $tabs[ 'orders' ]
62
- );
63
-
64
- return $return;
65
- }
66
-
67
-
68
- /**
69
- * Filter products based on current vendor
70
- *
71
- * @param unknown $orders
72
- *
73
- * @return unknown
74
- */
75
- public function filter_products( $orders )
76
- {
77
- $products = WCV_Vendors::get_vendor_products( $this->vendor_id );
78
-
79
- $ids = array();
80
- foreach ( $products as $product ) {
81
- $ids[ ] = ( $product->ID );
82
- }
83
-
84
- foreach ( $orders as $key => $order ) {
85
-
86
- if ( !in_array( $order->product_id, $ids ) ) {
87
- unset( $orders[ $key ] );
88
- continue;
89
- } else {
90
- if ( !empty( $order->line_total ) ) {
91
- $orders[ $key ]->line_total = WCV_Commission::calculate_commission( $order->line_total, $order->product_id, $order, $order->qty );
92
- }
93
- }
94
-
95
- }
96
-
97
- return $orders;
98
- }
99
-
100
-
101
- /**
102
- *
103
- *
104
- * @param unknown $products
105
- *
106
- * @return unknown
107
- */
108
- public function filter_products_json( $products )
109
- {
110
- $vendor_products = WCV_Vendors::get_vendor_products( $this->vendor_id );
111
-
112
- $ids = array();
113
- foreach ( $vendor_products as $vendor_product ) {
114
- $ids[ $vendor_product->ID ] = $vendor_product->post_title;
115
- }
116
-
117
- return array_intersect_key( $products, $ids );
118
- }
119
-
120
-
121
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-emails.php DELETED
@@ -1,151 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- *
7
- *
8
- * @author Matt Gates <http://mgates.me>
9
- * @package
10
- */
11
-
12
-
13
- class WCV_Emails
14
- {
15
-
16
-
17
- /**
18
- *
19
- */
20
- function __construct()
21
- {
22
- add_filter( 'woocommerce_email_classes', array( $this, 'check_items' ) );
23
- add_filter( 'woocommerce_resend_order_emails_available', array( $this, 'order_action' ) );
24
- add_filter( 'woocommerce_order_product_title', array( 'WCV_Emails', 'show_vendor_in_email' ), 10, 2 );
25
- add_action( 'set_user_role', array( $this, 'application_status_email' ), 10, 2 );
26
- add_action( 'transition_post_status', array( $this, 'trigger_new_product' ), 10, 3 );
27
-
28
- add_filter( 'woocommerce_email_recipient_low_stock', array( $this, 'vendor_stock_email'), 10, 2 );
29
- add_filter( 'woocommerce_email_recipient_no_stock', array( $this, 'vendor_stock_email'), 10, 2 );
30
- add_filter( 'woocommerce_email_recipient_backorder', array( $this, 'vendor_stock_email'), 10, 2 );
31
- }
32
-
33
- public function trigger_new_product( $from, $to, $post )
34
- {
35
- global $woocommerce;
36
-
37
- if ( $from != $to && $post->post_status == 'pending' && WCV_Vendors::is_vendor( $post->post_author ) ) {
38
- $mails = $woocommerce->mailer()->get_emails();
39
- if ( !empty( $mails ) ) {
40
- $mails[ 'WC_Email_Notify_Admin' ]->trigger( $post->post_id, $post );
41
- }
42
- }
43
- }
44
-
45
-
46
- /**
47
- *
48
- *
49
- * @param unknown $user_id
50
- * @param unknown $role
51
- */
52
- function application_status_email( $user_id, $role )
53
- {
54
- global $woocommerce;
55
-
56
- if ( !empty( $_POST[ 'apply_for_vendor' ] ) || ( !empty( $_GET[ 'action' ] ) && ( $_GET[ 'action' ] == 'approve_vendor' || $_GET[ 'action' ] == 'deny_vendor' ) ) ) {
57
-
58
- if ( $role == 'pending_vendor' ) {
59
- $status = __( 'pending', 'wcvendors' );
60
- } else if ( $role == 'vendor' ) {
61
- $status = __( 'approved', 'wcvendors' );
62
- } else if ( !empty( $_GET[ 'action' ] ) && $_GET[ 'action' ] == 'deny_vendor' ) {
63
- $status = __( 'denied', 'wcvendors' );
64
- }
65
-
66
- $mails = $woocommerce->mailer()->get_emails();
67
-
68
- if ( isset( $status ) && !empty( $mails ) ) {
69
- $mails[ 'WC_Email_Approve_Vendor' ]->trigger( $user_id, $status );
70
- }
71
- }
72
- }
73
-
74
-
75
- /**
76
- *
77
- *
78
- * @param unknown $name
79
- * @param unknown $_product
80
- *
81
- * @return unknown
82
- */
83
- function show_vendor_in_email( $name, $_product )
84
- {
85
- $product = get_post( $_product->id );
86
- $sold_by_label = WC_Vendors::$pv_options->get_option( 'sold_by_label' );
87
- $sold_by = WCV_Vendors::is_vendor( $product->post_author )
88
- ? sprintf( '<a href="%s">%s</a>', WCV_Vendors::get_vendor_shop_page( $product->post_author ), WCV_Vendors::get_vendor_sold_by( $product->post_author ) )
89
- : get_bloginfo( 'name' );
90
-
91
- $name .= '<small class="wcvendors_sold_by_in_email"><br />' . apply_filters('wcvendors_sold_by_in_email', $sold_by_label ). $sold_by . '</small><br />';
92
-
93
- return $name;
94
- }
95
-
96
-
97
- /**
98
- *
99
- *
100
- * @param unknown $available_emails
101
- *
102
- * @return unknown
103
- */
104
- public function order_action( $available_emails )
105
- {
106
- $available_emails[ ] = 'vendor_new_order';
107
-
108
- return $available_emails;
109
- }
110
-
111
-
112
- /**
113
- *
114
- *
115
- * @param unknown $emails
116
- *
117
- * @return unknown
118
- */
119
- public function check_items( $emails )
120
- {
121
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wc-notify-admin.php';
122
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wc-notify-vendor.php';
123
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wc-approve-vendor.php';
124
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wc-notify-shipped.php';
125
-
126
- $emails[ 'WC_Email_Notify_Vendor' ] = new WC_Email_Notify_Vendor();
127
- $emails[ 'WC_Email_Approve_Vendor' ] = new WC_Email_Approve_Vendor();
128
- $emails[ 'WC_Email_Notify_Admin' ] = new WC_Email_Notify_Admin();
129
- $emails[ 'WC_Email_Notify_Shipped' ] = new WC_Email_Notify_Shipped();
130
-
131
- return $emails;
132
- }
133
-
134
- /**
135
- * Add the vendor email to the low stock emails.
136
- *
137
- */
138
- public function vendor_stock_email( $emails, $product ) {
139
-
140
- if ( WCV_Vendors::is_vendor( $product->post->post_author ) ) {
141
- $vendor_data = get_userdata( $product->post->post_author );
142
- $vendor_email = $vendor_data->user_email;
143
- $emails .= ','.$vendor_email;
144
- }
145
-
146
- return $emails;
147
-
148
- }
149
-
150
-
151
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wc-approve-vendor.php DELETED
@@ -1,165 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- * New Order Email
7
- *
8
- * An email sent to the admin when a new order is received/paid for.
9
- *
10
- * @class WC_Email_Approve_Vendor
11
- * @version 2.0.0
12
- * @extends WC_Email
13
- * @author WooThemes
14
- * @package WooCommerce/Classes/Emails
15
- */
16
-
17
-
18
- class WC_Email_Approve_Vendor extends WC_Email
19
- {
20
-
21
-
22
- /**
23
- * Constructor
24
- */
25
- function __construct()
26
- {
27
- $this->id = 'vendor_application';
28
- $this->title = __( 'Vendor Application', 'wcvendors' );
29
- $this->description = __( 'Vendor application will either be approved, denied, or pending.', 'wcvendors' );
30
-
31
- $this->heading = __( 'Application {status}', 'wcvendors' );
32
- $this->subject = __( '[{blogname}] Your vendor application has been {status}', 'wcvendors' );
33
-
34
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/emails/';
35
- $this->template_html = 'application-status.php';
36
- $this->template_plain = 'application-status.php';
37
-
38
- // Call parent constuctor
39
- parent::__construct();
40
-
41
- // Other settings
42
- $this->recipient = $this->get_option( 'recipient' );
43
-
44
- if ( !$this->recipient )
45
- $this->recipient = get_option( 'admin_email' );
46
- }
47
-
48
- /**
49
- * trigger function.
50
- *
51
- * @access public
52
- * @return void
53
- *
54
- * @param unknown $order_id
55
- */
56
- function trigger( $user_id, $status )
57
- {
58
- if ( !$this->is_enabled() ) return;
59
-
60
- $this->find[ ] = '{status}';
61
- $this->replace[ ] = $status;
62
-
63
- $this->status = $status;
64
-
65
- $this->user = get_userdata( $user_id );
66
- $user_email = $this->user->user_email;
67
-
68
- $this->send( $user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
69
-
70
- if ( $status == __( 'pending', 'wcvendors' ) ) {
71
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
72
- }
73
- }
74
-
75
- /**
76
- * get_content_html function.
77
- *
78
- * @access public
79
- * @return string
80
- */
81
- function get_content_html()
82
- {
83
- ob_start();
84
- wc_get_template( $this->template_html, array(
85
- 'status' => $this->status,
86
- 'user' => $this->user,
87
- 'email_heading' => $this->get_heading()
88
- ), 'woocommerce/emails', $this->template_base );
89
-
90
- return ob_get_clean();
91
- }
92
-
93
-
94
- /**
95
- * get_content_plain function.
96
- *
97
- * @access public
98
- * @return string
99
- */
100
- function get_content_plain()
101
- {
102
- ob_start();
103
- wc_get_template( $this->template_plain, array(
104
- 'status' => $this->status,
105
- 'user' => $this->user,
106
- 'email_heading' => $this->get_heading()
107
- ), 'woocommerce/emails', $this->template_base );
108
-
109
- return ob_get_clean();
110
- }
111
-
112
-
113
- /**
114
- * Initialise Settings Form Fields
115
- *
116
- * @access public
117
- * @return void
118
- */
119
- function init_form_fields()
120
- {
121
- $this->form_fields = array(
122
- 'enabled' => array(
123
- 'title' => __( 'Enable/Disable', 'wcvendors' ),
124
- 'type' => 'checkbox',
125
- 'label' => __( 'Enable this email notification', 'wcvendors' ),
126
- 'default' => 'yes'
127
- ),
128
- 'recipient' => array(
129
- 'title' => __( 'Recipient(s)', 'woocommerce' ),
130
- 'type' => 'text',
131
- 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to <code>%s</code>.', 'wcvendors' ), esc_attr( get_option( 'admin_email' ) ) ),
132
- 'placeholder' => '',
133
- 'default' => ''
134
- ),
135
- 'subject' => array(
136
- 'title' => __( 'Subject', 'wcvendors' ),
137
- 'type' => 'text',
138
- 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'wcvendors' ), $this->subject ),
139
- 'placeholder' => '',
140
- 'default' => ''
141
- ),
142
- 'heading' => array(
143
- 'title' => __( 'Email Heading', 'wcvendors' ),
144
- 'type' => 'text',
145
- 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'wcvendors' ), $this->heading ),
146
- 'placeholder' => '',
147
- 'default' => ''
148
- ),
149
- 'email_type' => array(
150
- 'title' => __( 'Email type', 'wcvendors' ),
151
- 'type' => 'select',
152
- 'description' => __( 'Choose which format of email to send.', 'wcvendors' ),
153
- 'default' => 'html',
154
- 'class' => 'email_type',
155
- 'options' => array(
156
- 'plain' => __( 'Plain text', 'wcvendors' ),
157
- 'html' => __( 'HTML', 'wcvendors' ),
158
- 'multipart' => __( 'Multipart', 'wcvendors' ),
159
- )
160
- )
161
- );
162
- }
163
-
164
-
165
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wc-notify-admin.php DELETED
@@ -1,176 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- * New Order Email
7
- *
8
- * An email sent to the admin when a new product is created.
9
- *
10
- * @class WC_Email_Notify_Admin
11
- * @version 2.0.0
12
- * @extends WC_Email
13
- * @author WooThemes
14
- * @package WooCommerce/Classes/Emails
15
- */
16
-
17
-
18
- class WC_Email_Notify_Admin extends WC_Email
19
- {
20
-
21
-
22
- /**
23
- * Constructor
24
- */
25
- function __construct()
26
- {
27
- $this->id = 'admin_new_vendor_product';
28
- $this->title = __( 'New Vendor Product', 'wcvendors' );
29
- $this->description = __( 'New order emails are sent when a new product is submitted by a vendor', 'wcvendors' );
30
-
31
- $this->heading = __( 'New product submitted: {product_name}', 'wcvendors' );
32
- $this->subject = __( '[{blogname}] New product submitted by {vendor_name} - {product_name}', 'wcvendors' );
33
-
34
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/emails/';
35
- $this->template_html = 'new-product.php';
36
- $this->template_plain = 'new-product.php';
37
-
38
- // Triggers for this email
39
- add_action( 'pending_product', array( $this, 'trigger' ), 10, 2 );
40
- add_action( 'pending_product_variation', array( $this, 'trigger' ), 10, 2 );
41
-
42
- // Call parent constuctor
43
- parent::__construct();
44
-
45
- // Other settings
46
- $this->recipient = $this->get_option( 'recipient' );
47
-
48
- if ( !$this->recipient )
49
- $this->recipient = get_option( 'admin_email' );
50
- }
51
-
52
-
53
- /**
54
- * trigger function.
55
- *
56
- * @access public
57
- * @return void
58
- *
59
- * @param unknown $order_id
60
- */
61
- function trigger( $id, $post )
62
- {
63
-
64
- // Ensure that the post author is a vendor
65
- if ( !WCV_Vendors::is_vendor( $post->post_author ) ) {
66
- return;
67
- }
68
-
69
- if ( !$this->is_enabled() ) return;
70
-
71
- $this->find[ ] = '{product_name}';
72
- $this->product_name = $post->post_title;
73
- $this->replace[ ] = $this->product_name;
74
-
75
- $this->find[ ] = '{vendor_name}';
76
- $this->vendor_name = WCV_Vendors::get_vendor_shop_name( $post->post_author );
77
- $this->replace[ ] = $this->vendor_name;
78
-
79
- $this->post_id = $post->ID;
80
-
81
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
82
- }
83
-
84
- /**
85
- * get_content_html function.
86
- *
87
- * @access public
88
- * @return string
89
- */
90
- function get_content_html()
91
- {
92
- ob_start();
93
- wc_get_template( $this->template_html, array(
94
- 'product_name' => $this->product_name,
95
- 'vendor_name' => $this->vendor_name,
96
- 'post_id' => $this->post_id,
97
- 'email_heading' => $this->get_heading()
98
- ), 'woocommerce/emails', $this->template_base );
99
-
100
- return ob_get_clean();
101
- }
102
-
103
-
104
- /**
105
- * get_content_plain function.
106
- *
107
- * @access public
108
- * @return string
109
- */
110
- function get_content_plain()
111
- {
112
- ob_start();
113
- wc_get_template( $this->template_plain, array(
114
- 'product_name' => $this->product_name,
115
- 'vendor_name' => $this->vendor_name,
116
- 'post_id' => $this->post_id,
117
- 'email_heading' => $this->get_heading()
118
- ), 'woocommerce/emails', $this->template_base );
119
-
120
- return ob_get_clean();
121
- }
122
-
123
-
124
- /**
125
- * Initialise Settings Form Fields
126
- *
127
- * @access public
128
- * @return void
129
- */
130
- function init_form_fields()
131
- {
132
- $this->form_fields = array(
133
- 'enabled' => array(
134
- 'title' => __( 'Enable/Disable', 'wcvendors' ),
135
- 'type' => 'checkbox',
136
- 'label' => __( 'Enable this email notification', 'wcvendors' ),
137
- 'default' => 'yes'
138
- ),
139
- 'recipient' => array(
140
- 'title' => __( 'Recipient(s)', 'woocommerce' ),
141
- 'type' => 'text',
142
- 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to <code>%s</code>.', 'woocommerce' ), esc_attr( get_option( 'admin_email' ) ) ),
143
- 'placeholder' => '',
144
- 'default' => ''
145
- ),
146
- 'subject' => array(
147
- 'title' => __( 'Subject', 'wcvendors' ),
148
- 'type' => 'text',
149
- 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'wcvendors' ), $this->subject ),
150
- 'placeholder' => '',
151
- 'default' => ''
152
- ),
153
- 'heading' => array(
154
- 'title' => __( 'Email Heading', 'wcvendors' ),
155
- 'type' => 'text',
156
- 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'wcvendors' ), $this->heading ),
157
- 'placeholder' => '',
158
- 'default' => ''
159
- ),
160
- 'email_type' => array(
161
- 'title' => __( 'Email type', 'wcvendors' ),
162
- 'type' => 'select',
163
- 'description' => __( 'Choose which format of email to send.', 'wcvendors' ),
164
- 'default' => 'html',
165
- 'class' => 'email_type',
166
- 'options' => array(
167
- 'plain' => __( 'Plain text', 'wcvendors' ),
168
- 'html' => __( 'HTML', 'wcvendors' ),
169
- 'multipart' => __( 'Multipart', 'wcvendors' ),
170
- )
171
- )
172
- );
173
- }
174
-
175
-
176
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wc-notify-shipped.php DELETED
@@ -1,198 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- * New Order Email
7
- *
8
- * An email sent to the admin when a new product is created.
9
- *
10
- * @class WC_Email_Notify_Shipped
11
- * @version 2.0.0
12
- * @extends WC_Email
13
- * @author WooThemes
14
- * @package WooCommerce/Classes/Emails
15
- */
16
-
17
-
18
- class WC_Email_Notify_Shipped extends WC_Email
19
- {
20
-
21
-
22
- /**
23
- * Constructor
24
- */
25
- function __construct()
26
- {
27
- $this->id = 'vendor_notify_shipped';
28
- $this->title = __( 'Vendor has shipped', 'wcvendors' );
29
- $this->description = __( 'An email is sent when a vendor has marked one of their orders as shipped.', 'wcvendors' );
30
-
31
- $this->heading = __( 'Your order has been shipped', 'wcvendors' );
32
- $this->subject = __( '[{blogname}] Your order has been shipped ({order_number}) - {order_date}', 'wcvendors' );
33
-
34
- $this->template_html = 'notify-vendor-shipped.php';
35
- $this->template_plain = 'notify-vendor-shipped.php';
36
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/emails/';
37
-
38
- // Call parent constuctor
39
- parent::__construct();
40
- }
41
-
42
-
43
- /**
44
- * trigger function.
45
- *
46
- * @access public
47
- * @return void
48
- *
49
- * @param unknown $order_id
50
- */
51
- function trigger( $order_id, $vendor_id )
52
- {
53
- $this->object = new WC_Order( $order_id );
54
- $this->current_vendor = $vendor_id;
55
-
56
- $this->find[ ] = '{order_date}';
57
- $this->replace[ ] = date_i18n( woocommerce_date_format(), strtotime( $this->object->order_date ) );
58
-
59
- $this->find[ ] = '{order_number}';
60
- $this->replace[ ] = $this->object->get_order_number();
61
-
62
- if ( !$this->is_enabled() ) return;
63
-
64
- add_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );
65
- add_filter( 'woocommerce_get_order_item_totals', array( $this, 'check_order_totals' ), 10, 2 );
66
- $this->send( $this->object->billing_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
67
- remove_filter( 'woocommerce_get_order_item_totals', array( $this, 'check_order_totals' ), 10, 2 );
68
- remove_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );
69
- }
70
-
71
-
72
- /**
73
- *
74
- *
75
- * @param unknown $items
76
- * @param unknown $order
77
- *
78
- * @return unknown
79
- */
80
- public function check_items( $items, $order )
81
- {
82
- foreach ( $items as $key => $product ) {
83
-
84
- if ( empty( $product[ 'product_id' ] ) ) {
85
- unset( $items[ $key ] );
86
- continue;
87
- }
88
-
89
- $author = WCV_Vendors::get_vendor_from_product( $product[ 'product_id' ] );
90
-
91
- if ( $this->current_vendor != $author ) {
92
- unset( $items[ $key ] );
93
- continue;
94
- }
95
-
96
- }
97
-
98
- return $items;
99
- }
100
-
101
- /**
102
- *
103
- *
104
- * @param unknown $total_rows
105
- * @param unknown $order
106
- *
107
- * @return unknown
108
- */
109
- public function check_order_totals( $total_rows, $order )
110
- {
111
- $return[ 'cart_subtotal' ] = $total_rows[ 'cart_subtotal' ];
112
- $return[ 'cart_subtotal' ][ 'label' ] = __( 'Subtotal:', 'wcvendors' );
113
-
114
- return $return;
115
- }
116
-
117
- /**
118
- * get_content_html function.
119
- *
120
- * @access public
121
- * @return string
122
- */
123
- function get_content_html()
124
- {
125
- ob_start();
126
- wc_get_template( $this->template_html, array(
127
- 'order' => $this->object,
128
- 'email_heading' => $this->get_heading()
129
- ), 'woocommerce/emails', $this->template_base );
130
-
131
- return ob_get_clean();
132
- }
133
-
134
-
135
- /**
136
- * get_content_plain function.
137
- *
138
- * @access public
139
- * @return string
140
- */
141
- function get_content_plain()
142
- {
143
- ob_start();
144
- wc_get_template( $this->template_plain, array(
145
- 'order' => $this->object,
146
- 'email_heading' => $this->get_heading()
147
- ), 'woocommerce/emails', $this->template_base );
148
-
149
- return ob_get_clean();
150
- }
151
-
152
-
153
- /**
154
- * Initialise Settings Form Fields
155
- *
156
- * @access public
157
- * @return void
158
- */
159
- function init_form_fields()
160
- {
161
- $this->form_fields = array(
162
- 'enabled' => array(
163
- 'title' => __( 'Enable/Disable', 'wcvendors' ),
164
- 'type' => 'checkbox',
165
- 'label' => __( 'Enable this email notification', 'wcvendors' ),
166
- 'default' => 'yes'
167
- ),
168
- 'subject' => array(
169
- 'title' => __( 'Subject', 'wcvendors' ),
170
- 'type' => 'text',
171
- 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'wcvendors' ), $this->subject ),
172
- 'placeholder' => '',
173
- 'default' => ''
174
- ),
175
- 'heading' => array(
176
- 'title' => __( 'Email Heading', 'wcvendors' ),
177
- 'type' => 'text',
178
- 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'wcvendors' ), $this->heading ),
179
- 'placeholder' => '',
180
- 'default' => ''
181
- ),
182
- 'email_type' => array(
183
- 'title' => __( 'Email type', 'wcvendors' ),
184
- 'type' => 'select',
185
- 'description' => __( 'Choose which format of email to send.', 'wcvendors' ),
186
- 'default' => 'html',
187
- 'class' => 'email_type',
188
- 'options' => array(
189
- 'plain' => __( 'Plain text', 'wcvendors' ),
190
- 'html' => __( 'HTML', 'wcvendors' ),
191
- 'multipart' => __( 'Multipart', 'wcvendors' ),
192
- )
193
- )
194
- );
195
- }
196
-
197
-
198
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wc-notify-vendor.php DELETED
@@ -1,293 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- * New Order Email
7
- *
8
- * An email sent to the vendor when a new order is received/paid for.
9
- *
10
- * @class WC_Email_Notify_Vendor
11
- * @version 2.0.0
12
- * @extends WC_Email
13
- * @author WooThemes
14
- * @package WooCommerce/Classes/Emails
15
- */
16
-
17
-
18
- class WC_Email_Notify_Vendor extends WC_Email
19
- {
20
-
21
- /**
22
- * Constructor
23
- */
24
- function __construct()
25
- {
26
- $this->id = 'vendor_new_order';
27
- $this->title = __( 'Notify vendors', 'wcvendors' );
28
- $this->description = __( 'New order emails are sent when an order is received/paid by a customer.', 'wcvendors' );
29
-
30
- $this->heading = __( 'New customer order', 'wcvendors' );
31
- $this->subject = __( '[{blogname}] New customer order ({order_number}) - {order_date}', 'wcvendors' );
32
-
33
- $this->template_html = 'vendor-new-order.php';
34
- $this->template_plain = 'vendor-new-order.php';
35
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/emails/';
36
-
37
- // #216 is broken. Code below is from that. The filter is probably the culprit.
38
- //$completed_statuses = apply_filters( 'wcvendors_completed_statuses', array( 'completed', 'processing' ) ); // #216
39
- //foreach ( $completed_statuses as $status ) {
40
- //add_action( 'woocommerce_order_status_pending_to_{$status}_notification', array( $this, 'trigger' ) );
41
- //add_action( 'woocommerce_order_status_failed_to_{$status}_notification', array( $this, 'trigger' ) );
42
- //add_action( 'woocommerce_order_status_on-hold_to_{$status}_notification', array( $this, 'trigger' ) );
43
- //}
44
- // end #216
45
-
46
- // Triggers for this email
47
- add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ) );
48
- add_action( 'woocommerce_order_status_pending_to_completed_notification', array( $this, 'trigger' ) );
49
- add_action( 'woocommerce_order_status_failed_to_processing_notification', array( $this, 'trigger' ) );
50
- add_action( 'woocommerce_order_status_failed_to_completed_notification', array( $this, 'trigger' ) );
51
- add_action( 'woocommerce_order_status_on-hold_to_processing_notification', array( $this, 'trigger' ) ); // Added in 1.8.4
52
- add_action( 'woocommerce_order_status_on-hold_to_completed_notification', array( $this, 'trigger' ) ); // Added in 1.8.4
53
- $this->recipient = get_option( 'admin_email' );
54
-
55
- // Call parent constuctor
56
- parent::__construct();
57
-
58
- }
59
-
60
-
61
- /**
62
- * trigger function.
63
- *
64
- * @access public
65
- * @return void
66
- *
67
- * @param unknown $order_id
68
- */
69
- function trigger( $order_id )
70
- {
71
- global $woocommerce;
72
-
73
- if ( $order_id ) {
74
- $this->object = new WC_Order( $order_id );
75
-
76
- $this->find[ ] = '{order_date}';
77
- $this->replace[ ] = date_i18n( woocommerce_date_format(), strtotime( $this->object->order_date ) );
78
-
79
- $this->find[ ] = '{order_number}';
80
- $this->replace[ ] = $this->object->get_order_number();
81
-
82
- }
83
-
84
- if ( !$this->is_enabled() ) return;
85
-
86
- $vendors = $this->get_vendors( $this->object );
87
-
88
- if ( empty( $vendors ) ) return;
89
-
90
- add_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );
91
- add_filter( 'woocommerce_get_order_item_totals', array( $this, 'check_order_totals' ), 10, 2 );
92
- foreach ( $vendors as $user_id => $user_email ) {
93
- $this->current_vendor = $user_id;
94
- $this->send( $user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
95
- }
96
- remove_filter( 'woocommerce_get_order_item_totals', array( $this, 'check_order_totals' ), 10, 2 );
97
- remove_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );
98
-
99
- }
100
-
101
-
102
- /**
103
- *
104
- *
105
- * @param unknown $total_rows
106
- * @param unknown $order
107
- *
108
- * @return unknown
109
- */
110
- function check_order_totals( $total_rows, $order )
111
- {
112
-
113
- $commission_label = apply_filters('wcv_notify_vendor_commission_label', __( 'Commission Subtotal:', 'wcvendors' ) ) ;
114
- $return[ 'cart_subtotal' ] = $total_rows[ 'cart_subtotal' ];
115
- $return[ 'cart_subtotal' ][ 'label' ] = $commission_label;
116
-
117
- if ( WC_Vendors::$pv_options->get_option( 'give_tax' ) ) {
118
- $return['tax_subtotal'] = array( 'label' => '', 'value' => '');
119
- $return[ 'tax_subtotal']['label'] = apply_filters('wcv_notify_vendor_tax_label', __( 'Tax Subtotal:', 'wcvendors' ) ) ;
120
- }
121
-
122
- $dues = WCV_Vendors::get_vendor_dues_from_order( $order );
123
-
124
- foreach ( $dues as $due ) {
125
- if ( $this->current_vendor == $due['vendor_id'] ) {
126
- if (!empty($return[ 'shipping' ])) $return[ 'shipping' ] = $total_rows[ 'shipping' ];
127
- $return[ 'shipping' ]['label'] = __( 'Shipping Subtotal:', 'wcvendors' );
128
- $return[ 'shipping' ][ 'value' ] = woocommerce_price( $due['shipping'] );
129
- if ( WC_Vendors::$pv_options->get_option( 'give_tax' ) ) {
130
- $return[ 'tax_subtotal']['value'] += $due['tax'];
131
- }
132
- break;
133
- }
134
- }
135
- // Format tax price
136
- if ( WC_Vendors::$pv_options->get_option( 'give_tax' ) ) {
137
- $return[ 'tax_subtotal']['value'] = woocommerce_price( $return[ 'tax_subtotal']['value'] );
138
- }
139
-
140
- return $return;
141
- }
142
-
143
-
144
- /**
145
- *
146
- *
147
- * @param unknown $order
148
- *
149
- * @return unknown
150
- */
151
- public function get_vendors( $order )
152
- {
153
- $items = $order->get_items();
154
- $vendors = array();
155
-
156
- foreach ( $items as $key => $product ) {
157
-
158
- if ( empty( $product[ 'product_id' ] ) ) continue;
159
- $author = WCV_Vendors::get_vendor_from_product( $product[ 'product_id' ] );
160
-
161
- // Only store the vendor authors
162
- if ( !WCV_Vendors::is_vendor( $author ) ) {
163
- unset( $items[ $key ] );
164
- continue;
165
- }
166
-
167
- $vendors[ $author ] = get_userdata( $author )->user_email;
168
- }
169
-
170
- return $vendors;
171
- }
172
-
173
- /**
174
- *
175
- *
176
- * @param unknown $items
177
- * @param unknown $order
178
- *
179
- * @return unknown
180
- */
181
- function check_items( $items, $order )
182
- {
183
- foreach ( $items as $key => $product ) {
184
-
185
- // If this is a line item
186
- if ($product['type'] == 'line_item') {
187
-
188
- $author = WCV_Vendors::get_vendor_from_product( $product[ 'product_id' ] );
189
-
190
- if ( $this->current_vendor != $author) {
191
- unset( $items[ $key ] );
192
- continue;
193
- } else {
194
- $commission_due = WCV_Commission::calculate_commission( $product[ 'line_subtotal' ], $product[ 'product_id' ], $order, $product[ 'qty' ] );
195
-
196
- $items[ $key ][ 'line_subtotal' ] = $commission_due;
197
- $items[ $key ][ 'line_total' ] = $commission_due;
198
- // Don't display tax if give tax is not enabled.
199
- // if ( !WC_Vendors::$pv_options->get_option( 'give_tax' ) ) {
200
- // unset($items[ $key ][ 'line_tax' ]) ;
201
- // }
202
- }
203
- }
204
-
205
- }
206
-
207
-
208
- return $items;
209
- }
210
-
211
-
212
- /**
213
- * get_content_html function.
214
- *
215
- * @access public
216
- * @return string
217
- */
218
- function get_content_html()
219
- {
220
- ob_start();
221
- wc_get_template( $this->template_html, array(
222
- 'order' => $this->object,
223
- 'email_heading' => $this->get_heading()
224
- ), 'woocommerce/emails', $this->template_base );
225
-
226
- return ob_get_clean();
227
- }
228
-
229
-
230
- /**
231
- * get_content_plain function.
232
- *
233
- * @access public
234
- * @return string
235
- */
236
- function get_content_plain()
237
- {
238
- ob_start();
239
- wc_get_template( $this->template_plain, array(
240
- 'order' => $this->object,
241
- 'email_heading' => $this->get_heading()
242
- ), 'woocommerce/emails', $this->template_base );
243
-
244
- return ob_get_clean();
245
- }
246
-
247
-
248
- /**
249
- * Initialise Settings Form Fields
250
- *
251
- * @access public
252
- * @return void
253
- */
254
- function init_form_fields()
255
- {
256
- $this->form_fields = array(
257
- 'enabled' => array(
258
- 'title' => __( 'Enable/Disable', 'wcvendors' ),
259
- 'type' => 'checkbox',
260
- 'label' => __( 'Enable this email notification', 'wcvendors' ),
261
- 'default' => 'yes'
262
- ),
263
- 'subject' => array(
264
- 'title' => __( 'Subject', 'wcvendors' ),
265
- 'type' => 'text',
266
- 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'wcvendors' ), $this->subject ),
267
- 'placeholder' => '',
268
- 'default' => ''
269
- ),
270
- 'heading' => array(
271
- 'title' => __( 'Email Heading', 'wcvendors' ),
272
- 'type' => 'text',
273
- 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'wcvendors' ), $this->heading ),
274
- 'placeholder' => '',
275
- 'default' => ''
276
- ),
277
- 'email_type' => array(
278
- 'title' => __( 'Email type', 'wcvendors' ),
279
- 'type' => 'select',
280
- 'description' => __( 'Choose which format of email to send.', 'wcvendors' ),
281
- 'default' => 'html',
282
- 'class' => 'email_type',
283
- 'options' => array(
284
- 'plain' => __( 'Plain text', 'wcvendors' ),
285
- 'html' => __( 'HTML', 'wcvendors' ),
286
- 'multipart' => __( 'Multipart', 'wcvendors' ),
287
- )
288
- )
289
- );
290
- }
291
-
292
-
293
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/README.md DELETED
@@ -1,126 +0,0 @@
1
- WP Simple Settings Framework
2
- ================================
3
-
4
- A minimalistic framework for Wordpress Settings API.
5
-
6
- Quick start
7
- ------------
8
-
9
- * [Download the latest release](https://github.com/Geczy/WP-Simple-Settings-Framework/zipball/master) (zip)
10
-
11
- * Or, clone the repo, `git clone git://github.com/Geczy/WP-Simple-Settings-Framework.git`
12
-
13
- Installation
14
- ------------
15
- 1. Include the framework in your Wordpress plugin by using:
16
-
17
- ```php
18
- <?php
19
- add_action( 'init', 'sf_load_settings' );
20
- function sf_load_settings() {
21
- require 'classes/sf-class-settings.php';
22
- $settings_framework = new SF_Settings_API($id = 'my_plugin_name', $title = 'My Plugin Title', $menu = 'plugins.php', __FILE__);
23
- }
24
- ```
25
-
26
- Optionally, you might want to make `$settings_framework` a global variable so that you can use the [helper functions](#helpers).
27
-
28
- 2. Open `sf-options.php` to begin configuring your options.
29
-
30
- Features
31
- ------------
32
-
33
- ### Automatic settings page
34
- Don't want it under the Plugins tab like in the screenshot? No problem, you can choose where you want it!
35
-
36
- You can also change "Simple Settings" submenu to be anything you'd like.
37
-
38
- ![settings page example](http://i.imgur.com/aEGUD.png)
39
-
40
- ---
41
-
42
- ### Tooltips
43
- ![tooltips example](http://i.imgur.com/Z3Pnk.png)
44
-
45
- Optional tooltips using [Twitter Bootstrap](http://twitter.github.com/bootstrap/javascript.html#tooltips)!
46
-
47
- ---
48
-
49
- ### Select box replacement
50
- ![select box replacement](http://i.imgur.com/ikOXH.png)
51
-
52
- Utilizing [Select2](http://ivaynberg.github.com/select2/) to display select boxes. It's pretty cool!
53
-
54
- ---
55
-
56
- ### Multiple tabs
57
- ![multiple tabs example](http://i.imgur.com/OUM4i.png)
58
-
59
- Create multiple tabs for your options.
60
-
61
- ---
62
-
63
- ### Input types
64
-
65
- * Text
66
- * Number
67
- * Textarea
68
- * Checkbox
69
- * Radio
70
- * Select
71
- * WP Pages
72
-
73
- Helpers
74
- ------------
75
-
76
- Update or add a new option
77
-
78
- ```php
79
- <?php
80
- $settings_framework->update_option('your_option', 'new_value');
81
- ```
82
-
83
- Get an existing option's value
84
-
85
- ```php
86
- <?php
87
- $settings_framework->get_option('your_option');
88
- ```
89
-
90
- Example configuration
91
- ------------
92
-
93
- Check out the [example config](https://github.com/Geczy/WP-Simple-Settings-Framework/blob/master/sf-options.php) for an idea of how to use every input type.
94
-
95
- Here's an example of one type, though:
96
-
97
- ```php
98
- <?php
99
- $options[] = array(
100
- 'name' => __( 'Name', 'geczy' ),
101
- 'desc' => __( 'Please tell me who you are.', 'geczy' ),
102
- 'id' => 'text_sample',
103
- 'type' => 'text',
104
- );
105
- ```
106
-
107
-
108
- Bug tracker
109
- -----------
110
-
111
- Have a bug? Please create an issue here on GitHub!
112
-
113
- https://github.com/Geczy/WP-Simple-Settings-Framework/issues/
114
-
115
- Copyright and License
116
- ---------------------
117
-
118
- Copyright 2012 Matthew Gates
119
-
120
- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
121
-
122
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
123
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
124
- * Neither the names of the copyright holders nor the names of the contributors may be used to endorse or promote products derived from this software without specific prior written permission.
125
-
126
- http://www.opensource.org/licenses/bsd-license.php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/css/sf-styles.css DELETED
@@ -1,167 +0,0 @@
1
- a.sf-tips {
2
- height: 16px;
3
- width: 16px;
4
- margin-top: 0.2em;
5
- float: right;
6
- background: url(../img/tip.png) no-repeat top left;
7
- }
8
-
9
- /*!
10
- * Bootstrap v2.3.1 [Styles for Tooltips]
11
- *
12
- * Copyright 2012 Twitter, Inc
13
- * Licensed under the Apache License v2.0
14
- * http://www.apache.org/licenses/LICENSE-2.0
15
- *
16
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
17
- */
18
- .clearfix {
19
- *zoom: 1;
20
- }
21
-
22
- .clearfix:before, .clearfix:after {
23
- display: table;
24
- content: "";
25
- line-height: 0;
26
- }
27
-
28
- .clearfix:after {
29
- clear: both;
30
- }
31
-
32
- .hide-text {
33
- font: 0/0 a;
34
- color: transparent;
35
- text-shadow: none;
36
- background-color: transparent;
37
- border: 0;
38
- }
39
-
40
- .input-block-level {
41
- display: block;
42
- width: 100%;
43
- min-height: 30px;
44
- -webkit-box-sizing: border-box;
45
- -moz-box-sizing: border-box;
46
- box-sizing: border-box;
47
- }
48
-
49
- /* Tooltips */
50
- .tooltip {
51
- text-shadow: none;
52
- }
53
-
54
- .tooltip {
55
- position: absolute;
56
- z-index: 1030;
57
- display: block;
58
- visibility: visible;
59
- font-size: 11px;
60
- line-height: 1.4;
61
- opacity: 0;
62
- filter: alpha(opacity=0);
63
- }
64
-
65
- .tooltip.in {
66
- opacity: 0.8;
67
- filter: alpha(opacity=80);
68
- }
69
-
70
- .tooltip.top {
71
- margin-top: -3px;
72
- padding: 5px 0;
73
- }
74
-
75
- .tooltip.right {
76
- margin-left: 3px;
77
- padding: 0 5px;
78
- }
79
-
80
- .tooltip.bottom {
81
- margin-top: 3px;
82
- padding: 5px 0;
83
- }
84
-
85
- .tooltip.left {
86
- margin-left: -3px;
87
- padding: 0 5px;
88
- }
89
-
90
- .tooltip-inner {
91
- max-width: 200px;
92
- padding: 8px;
93
- color: #ffffff;
94
- text-align: center;
95
- text-decoration: none;
96
- background-color: #000000;
97
- -webkit-border-radius: 4px;
98
- -moz-border-radius: 4px;
99
- border-radius: 4px;
100
- }
101
-
102
- .tooltip-arrow {
103
- position: absolute;
104
- width: 0;
105
- height: 0;
106
- border-color: transparent;
107
- border-style: solid;
108
- }
109
-
110
- .tooltip.top .tooltip-arrow {
111
- bottom: 0;
112
- left: 50%;
113
- margin-left: -5px;
114
- border-width: 5px 5px 0;
115
- border-top-color: #000000;
116
- }
117
-
118
- .tooltip.right .tooltip-arrow {
119
- top: 50%;
120
- left: 0;
121
- margin-top: -5px;
122
- border-width: 5px 5px 5px 0;
123
- border-right-color: #000000;
124
- }
125
-
126
- .tooltip.left .tooltip-arrow {
127
- top: 50%;
128
- right: 0;
129
- margin-top: -5px;
130
- border-width: 5px 0 5px 5px;
131
- border-left-color: #000000;
132
- }
133
-
134
- .tooltip.bottom .tooltip-arrow {
135
- top: 0;
136
- left: 50%;
137
- margin-left: -5px;
138
- border-width: 0 5px 5px;
139
- border-bottom-color: #000000;
140
- }
141
-
142
- /* Animation */
143
- .fade {
144
- opacity: 0;
145
- -webkit-transition: opacity 0.15s linear;
146
- -moz-transition: opacity 0.15s linear;
147
- -o-transition: opacity 0.15s linear;
148
- transition: opacity 0.15s linear;
149
- }
150
-
151
- .fade.in {
152
- opacity: 1;
153
- }
154
-
155
- .collapse {
156
- position: relative;
157
- height: 0;
158
- overflow: hidden;
159
- -webkit-transition: height 0.35s ease;
160
- -moz-transition: height 0.35s ease;
161
- -o-transition: height 0.35s ease;
162
- transition: height 0.35s ease;
163
- }
164
-
165
- .collapse.in {
166
- height: auto;
167
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/img/tip.png DELETED
Binary file
trunk/classes/admin/settings/assets/js/bootstrap-tooltip.js DELETED
@@ -1,126 +0,0 @@
1
- /**
2
- * Bootstrap.js by @fat & @mdo
3
- * plugins: bootstrap-transition.js, bootstrap-tooltip.js
4
- * 2.3.1
5
- * Copyright 2012 Twitter, Inc.
6
- * http://www.apache.org/licenses/LICENSE-2.0.txt
7
- */
8
- !function (a) {
9
- a(function () {
10
- a.support.transition = function () {
11
- var a = function () {
12
- var a = document.createElement("bootstrap"), b = {WebkitTransition: "webkitTransitionEnd", MozTransition: "transitionend", OTransition: "oTransitionEnd otransitionend", transition: "transitionend"}, c;
13
- for (c in b)if (a.style[c] !== undefined)return b[c]
14
- }();
15
- return a && {end: a}
16
- }()
17
- })
18
- }(window.jQuery), !function (a) {
19
- var b = function (a, b) {
20
- this.init("tooltip", a, b)
21
- };
22
- b.prototype = {constructor: b, init: function (b, c, d) {
23
- var e, f, g, h, i;
24
- this.type = b, this.$element = a(c), this.options = this.getOptions(d), this.enabled = !0, g = this.options.trigger.split(" ");
25
- for (i = g.length; i--;)h = g[i], h == "click" ? this.$element.on("click." + this.type, this.options.selector, a.proxy(this.toggle, this)) : h != "manual" && (e = h == "hover" ? "mouseenter" : "focus", f = h == "hover" ? "mouseleave" : "blur", this.$element.on(e + "." + this.type, this.options.selector, a.proxy(this.enter, this)), this.$element.on(f + "." + this.type, this.options.selector, a.proxy(this.leave, this)));
26
- this.options.selector ? this._options = a.extend({}, this.options, {trigger: "manual", selector: ""}) : this.fixTitle()
27
- }, getOptions: function (b) {
28
- return b = a.extend({}, a.fn[this.type].defaults, this.$element.data(), b), b.delay && typeof b.delay == "number" && (b.delay = {show: b.delay, hide: b.delay}), b
29
- }, enter: function (b) {
30
- var c = a.fn[this.type].defaults, d = {}, e;
31
- this._options && a.each(this._options, function (a, b) {
32
- c[a] != b && (d[a] = b)
33
- }, this), e = a(b.currentTarget)[this.type](d).data(this.type);
34
- if (!e.options.delay || !e.options.delay.show)return e.show();
35
- clearTimeout(this.timeout), e.hoverState = "in", this.timeout = setTimeout(function () {
36
- e.hoverState == "in" && e.show()
37
- }, e.options.delay.show)
38
- }, leave: function (b) {
39
- var c = a(b.currentTarget)[this.type](this._options).data(this.type);
40
- this.timeout && clearTimeout(this.timeout);
41
- if (!c.options.delay || !c.options.delay.hide)return c.hide();
42
- c.hoverState = "out", this.timeout = setTimeout(function () {
43
- c.hoverState == "out" && c.hide()
44
- }, c.options.delay.hide)
45
- }, show: function () {
46
- var b, c, d, e, f, g, h = a.Event("show");
47
- if (this.hasContent() && this.enabled) {
48
- this.$element.trigger(h);
49
- if (h.isDefaultPrevented())return;
50
- b = this.tip(), this.setContent(), this.options.animation && b.addClass("fade"), f = typeof this.options.placement == "function" ? this.options.placement.call(this, b[0], this.$element[0]) : this.options.placement, b.detach().css({top: 0, left: 0, display: "block"}), this.options.container ? b.appendTo(this.options.container) : b.insertAfter(this.$element), c = this.getPosition(), d = b[0].offsetWidth, e = b[0].offsetHeight;
51
- switch (f) {
52
- case"bottom":
53
- g = {top: c.top + c.height, left: c.left + c.width / 2 - d / 2};
54
- break;
55
- case"top":
56
- g = {top: c.top - e, left: c.left + c.width / 2 - d / 2};
57
- break;
58
- case"left":
59
- g = {top: c.top + c.height / 2 - e / 2, left: c.left - d};
60
- break;
61
- case"right":
62
- g = {top: c.top + c.height / 2 - e / 2, left: c.left + c.width}
63
- }
64
- this.applyPlacement(g, f), this.$element.trigger("shown")
65
- }
66
- }, applyPlacement: function (a, b) {
67
- var c = this.tip(), d = c[0].offsetWidth, e = c[0].offsetHeight, f, g, h, i;
68
- c.offset(a).addClass(b).addClass("in"), f = c[0].offsetWidth, g = c[0].offsetHeight, b == "top" && g != e && (a.top = a.top + e - g, i = !0), b == "bottom" || b == "top" ? (h = 0, a.left < 0 && (h = a.left * -2, a.left = 0, c.offset(a), f = c[0].offsetWidth, g = c[0].offsetHeight), this.replaceArrow(h - d + f, f, "left")) : this.replaceArrow(g - e, g, "top"), i && c.offset(a)
69
- }, replaceArrow: function (a, b, c) {
70
- this.arrow().css(c, a ? 50 * (1 - a / b) + "%" : "")
71
- }, setContent: function () {
72
- var a = this.tip(), b = this.getTitle();
73
- a.find(".tooltip-inner")[this.options.html ? "html" : "text"](b), a.removeClass("fade in top bottom left right")
74
- }, hide: function () {
75
- function e() {
76
- var b = setTimeout(function () {
77
- c.off(a.support.transition.end).detach()
78
- }, 500);
79
- c.one(a.support.transition.end, function () {
80
- clearTimeout(b), c.detach()
81
- })
82
- }
83
-
84
- var b = this, c = this.tip(), d = a.Event("hide");
85
- this.$element.trigger(d);
86
- if (d.isDefaultPrevented())return;
87
- return c.removeClass("in"), a.support.transition && this.$tip.hasClass("fade") ? e() : c.detach(), this.$element.trigger("hidden"), this
88
- }, fixTitle: function () {
89
- var a = this.$element;
90
- (a.attr("title") || typeof a.attr("data-original-title") != "string") && a.attr("data-original-title", a.attr("title") || "").attr("title", "")
91
- }, hasContent: function () {
92
- return this.getTitle()
93
- }, getPosition: function () {
94
- var b = this.$element[0];
95
- return a.extend({}, typeof b.getBoundingClientRect == "function" ? b.getBoundingClientRect() : {width: b.offsetWidth, height: b.offsetHeight}, this.$element.offset())
96
- }, getTitle: function () {
97
- var a, b = this.$element, c = this.options;
98
- return a = b.attr("data-original-title") || (typeof c.title == "function" ? c.title.call(b[0]) : c.title), a
99
- }, tip: function () {
100
- return this.$tip = this.$tip || a(this.options.template)
101
- }, arrow: function () {
102
- return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
103
- }, validate: function () {
104
- this.$element[0].parentNode || (this.hide(), this.$element = null, this.options = null)
105
- }, enable: function () {
106
- this.enabled = !0
107
- }, disable: function () {
108
- this.enabled = !1
109
- }, toggleEnabled: function () {
110
- this.enabled = !this.enabled
111
- }, toggle: function (b) {
112
- var c = b ? a(b.currentTarget)[this.type](this._options).data(this.type) : this;
113
- c.tip().hasClass("in") ? c.hide() : c.show()
114
- }, destroy: function () {
115
- this.hide().$element.off("." + this.type).removeData(this.type)
116
- }};
117
- var c = a.fn.tooltip;
118
- a.fn.tooltip = function (c) {
119
- return this.each(function () {
120
- var d = a(this), e = d.data("tooltip"), f = typeof c == "object" && c;
121
- e || d.data("tooltip", e = new b(this, f)), typeof c == "string" && e[c]()
122
- })
123
- }, a.fn.tooltip.Constructor = b, a.fn.tooltip.defaults = {animation: !0, placement: "top", selector: !1, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', trigger: "hover focus", title: "", delay: 0, html: !1, container: !1}, a.fn.tooltip.noConflict = function () {
124
- return a.fn.tooltip = c, this
125
- }
126
- }(window.jQuery)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/js.iml DELETED
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="WEB_MODULE" version="4">
3
- <component name="NewModuleRootManager" inherit-compiler-output="true">
4
- <exclude-output />
5
- <content url="file://$MODULE_DIR$" />
6
- <orderEntry type="inheritedJdk" />
7
- <orderEntry type="sourceFolder" forTests="false" />
8
- </component>
9
- </module>
10
-
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2-bootstrap.css DELETED
@@ -1,87 +0,0 @@
1
- .form-control .select2-choice {
2
- border: 0;
3
- border-radius: 2px;
4
- }
5
-
6
- .form-control .select2-choice .select2-arrow {
7
- border-radius: 0 2px 2px 0;
8
- }
9
-
10
- .form-control.select2-container {
11
- height: auto !important;
12
- padding: 0;
13
- }
14
-
15
- .form-control.select2-container.select2-dropdown-open {
16
- border-color: #5897FB;
17
- border-radius: 3px 3px 0 0;
18
- }
19
-
20
- .form-control .select2-container.select2-dropdown-open .select2-choices {
21
- border-radius: 3px 3px 0 0;
22
- }
23
-
24
- .form-control.select2-container .select2-choices {
25
- border: 0 !important;
26
- border-radius: 3px;
27
- }
28
-
29
- .control-group.warning .select2-container .select2-choice,
30
- .control-group.warning .select2-container .select2-choices,
31
- .control-group.warning .select2-container-active .select2-choice,
32
- .control-group.warning .select2-container-active .select2-choices,
33
- .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
34
- .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
35
- .control-group.warning .select2-container-multi.select2-container-active .select2-choices {
36
- border: 1px solid #C09853 !important;
37
- }
38
-
39
- .control-group.warning .select2-container .select2-choice div {
40
- border-left: 1px solid #C09853 !important;
41
- background: #FCF8E3 !important;
42
- }
43
-
44
- .control-group.error .select2-container .select2-choice,
45
- .control-group.error .select2-container .select2-choices,
46
- .control-group.error .select2-container-active .select2-choice,
47
- .control-group.error .select2-container-active .select2-choices,
48
- .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
49
- .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
50
- .control-group.error .select2-container-multi.select2-container-active .select2-choices {
51
- border: 1px solid #B94A48 !important;
52
- }
53
-
54
- .control-group.error .select2-container .select2-choice div {
55
- border-left: 1px solid #B94A48 !important;
56
- background: #F2DEDE !important;
57
- }
58
-
59
- .control-group.info .select2-container .select2-choice,
60
- .control-group.info .select2-container .select2-choices,
61
- .control-group.info .select2-container-active .select2-choice,
62
- .control-group.info .select2-container-active .select2-choices,
63
- .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
64
- .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
65
- .control-group.info .select2-container-multi.select2-container-active .select2-choices {
66
- border: 1px solid #3A87AD !important;
67
- }
68
-
69
- .control-group.info .select2-container .select2-choice div {
70
- border-left: 1px solid #3A87AD !important;
71
- background: #D9EDF7 !important;
72
- }
73
-
74
- .control-group.success .select2-container .select2-choice,
75
- .control-group.success .select2-container .select2-choices,
76
- .control-group.success .select2-container-active .select2-choice,
77
- .control-group.success .select2-container-active .select2-choices,
78
- .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
79
- .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
80
- .control-group.success .select2-container-multi.select2-container-active .select2-choices {
81
- border: 1px solid #468847 !important;
82
- }
83
-
84
- .control-group.success .select2-container .select2-choice div {
85
- border-left: 1px solid #468847 !important;
86
- background: #DFF0D8 !important;
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2-spinner.gif DELETED
Binary file
trunk/classes/admin/settings/assets/js/select2/select2.css DELETED
@@ -1,704 +0,0 @@
1
- /*
2
- Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
3
- */
4
- .select2-container {
5
- margin: 0;
6
- position: relative;
7
- display: inline-block;
8
- /* inline-block for ie7 */
9
- zoom: 1;
10
- *display: inline;
11
- vertical-align: middle;
12
- }
13
-
14
- .select2-container,
15
- .select2-drop,
16
- .select2-search,
17
- .select2-search input {
18
- /*
19
- Force border-box so that % widths fit the parent
20
- container without overlap because of margin/padding.
21
- More Info : http://www.quirksmode.org/css/box.html
22
- */
23
- -webkit-box-sizing: border-box; /* webkit */
24
- -moz-box-sizing: border-box; /* firefox */
25
- box-sizing: border-box; /* css3 */
26
- }
27
-
28
- .select2-container .select2-choice {
29
- display: block;
30
- height: 26px;
31
- padding: 0 0 0 8px;
32
- overflow: hidden;
33
- position: relative;
34
-
35
- border: 1px solid #aaa;
36
- white-space: nowrap;
37
- line-height: 26px;
38
- color: #444;
39
- text-decoration: none;
40
-
41
- border-radius: 4px;
42
-
43
- background-clip: padding-box;
44
-
45
- -webkit-touch-callout: none;
46
- -webkit-user-select: none;
47
- -moz-user-select: none;
48
- -ms-user-select: none;
49
- user-select: none;
50
-
51
- background-color: #fff;
52
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
53
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
54
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
55
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
56
- background-image: linear-gradient(to top, #eee 0%, #fff 50%);
57
- }
58
-
59
- html[dir="rtl"] .select2-container .select2-choice {
60
- padding: 0 8px 0 0;
61
- }
62
-
63
- .select2-container.select2-drop-above .select2-choice {
64
- border-bottom-color: #aaa;
65
-
66
- border-radius: 0 0 4px 4px;
67
-
68
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
69
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
70
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
71
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
72
- background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
73
- }
74
-
75
- .select2-container.select2-allowclear .select2-choice .select2-chosen {
76
- margin-right: 42px;
77
- }
78
-
79
- .select2-container .select2-choice > .select2-chosen {
80
- margin-right: 26px;
81
- display: block;
82
- overflow: hidden;
83
-
84
- white-space: nowrap;
85
-
86
- text-overflow: ellipsis;
87
- float: none;
88
- width: auto;
89
- }
90
-
91
- html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
92
- margin-left: 26px;
93
- margin-right: 0;
94
- }
95
-
96
- .select2-container .select2-choice abbr {
97
- display: none;
98
- width: 12px;
99
- height: 12px;
100
- position: absolute;
101
- right: 24px;
102
- top: 8px;
103
-
104
- font-size: 1px;
105
- text-decoration: none;
106
-
107
- border: 0;
108
- background: url('select2.png') right top no-repeat;
109
- cursor: pointer;
110
- outline: 0;
111
- }
112
-
113
- .select2-container.select2-allowclear .select2-choice abbr {
114
- display: inline-block;
115
- }
116
-
117
- .select2-container .select2-choice abbr:hover {
118
- background-position: right -11px;
119
- cursor: pointer;
120
- }
121
-
122
- .select2-drop-mask {
123
- border: 0;
124
- margin: 0;
125
- padding: 0;
126
- position: fixed;
127
- left: 0;
128
- top: 0;
129
- min-height: 100%;
130
- min-width: 100%;
131
- height: auto;
132
- width: auto;
133
- opacity: 0;
134
- z-index: 9998;
135
- /* styles required for IE to work */
136
- background-color: #fff;
137
- filter: alpha(opacity=0);
138
- }
139
-
140
- .select2-drop {
141
- width: 100%;
142
- margin-top: -1px;
143
- position: absolute;
144
- z-index: 9999;
145
- top: 100%;
146
-
147
- background: #fff;
148
- color: #000;
149
- border: 1px solid #aaa;
150
- border-top: 0;
151
-
152
- border-radius: 0 0 4px 4px;
153
-
154
- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
155
- box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
156
- }
157
-
158
- .select2-drop.select2-drop-above {
159
- margin-top: 1px;
160
- border-top: 1px solid #aaa;
161
- border-bottom: 0;
162
-
163
- border-radius: 4px 4px 0 0;
164
-
165
- -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
166
- box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
167
- }
168
-
169
- .select2-drop-active {
170
- border: 1px solid #5897fb;
171
- border-top: none;
172
- }
173
-
174
- .select2-drop.select2-drop-above.select2-drop-active {
175
- border-top: 1px solid #5897fb;
176
- }
177
-
178
- .select2-drop-auto-width {
179
- border-top: 1px solid #aaa;
180
- width: auto;
181
- }
182
-
183
- .select2-drop-auto-width .select2-search {
184
- padding-top: 4px;
185
- }
186
-
187
- .select2-container .select2-choice .select2-arrow {
188
- display: inline-block;
189
- width: 18px;
190
- height: 100%;
191
- position: absolute;
192
- right: 0;
193
- top: 0;
194
-
195
- border-left: 1px solid #aaa;
196
- border-radius: 0 4px 4px 0;
197
-
198
- background-clip: padding-box;
199
-
200
- background: #ccc;
201
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
202
- background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
203
- background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
204
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
205
- background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
206
- }
207
-
208
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
209
- left: 0;
210
- right: auto;
211
-
212
- border-left: none;
213
- border-right: 1px solid #aaa;
214
- border-radius: 4px 0 0 4px;
215
- }
216
-
217
- .select2-container .select2-choice .select2-arrow b {
218
- display: block;
219
- width: 100%;
220
- height: 100%;
221
- background: url('select2.png') no-repeat 0 1px;
222
- }
223
-
224
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
225
- background-position: 2px 1px;
226
- }
227
-
228
- .select2-search {
229
- display: inline-block;
230
- width: 100%;
231
- min-height: 26px;
232
- margin: 0;
233
- padding-left: 4px;
234
- padding-right: 4px;
235
-
236
- position: relative;
237
- z-index: 10000;
238
-
239
- white-space: nowrap;
240
- }
241
-
242
- .select2-search input {
243
- width: 100%;
244
- height: auto !important;
245
- min-height: 26px;
246
- padding: 4px 20px 4px 5px;
247
- margin: 0;
248
-
249
- outline: 0;
250
- font-family: sans-serif;
251
- font-size: 1em;
252
-
253
- border: 1px solid #aaa;
254
- border-radius: 0;
255
-
256
- -webkit-box-shadow: none;
257
- box-shadow: none;
258
-
259
- background: #fff url('select2.png') no-repeat 100% -22px;
260
- background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
261
- background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
262
- background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
263
- background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
264
- }
265
-
266
- html[dir="rtl"] .select2-search input {
267
- padding: 4px 5px 4px 20px;
268
-
269
- background: #fff url('select2.png') no-repeat -37px -22px;
270
- background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
271
- background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
272
- background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
273
- background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
274
- }
275
-
276
- .select2-drop.select2-drop-above .select2-search input {
277
- margin-top: 4px;
278
- }
279
-
280
- .select2-search input.select2-active {
281
- background: #fff url('select2-spinner.gif') no-repeat 100%;
282
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
283
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
284
- background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
285
- background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
286
- }
287
-
288
- .select2-container-active .select2-choice,
289
- .select2-container-active .select2-choices {
290
- border: 1px solid #5897fb;
291
- outline: none;
292
-
293
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
294
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
295
- }
296
-
297
- .select2-dropdown-open .select2-choice {
298
- border-bottom-color: transparent;
299
- -webkit-box-shadow: 0 1px 0 #fff inset;
300
- box-shadow: 0 1px 0 #fff inset;
301
-
302
- border-bottom-left-radius: 0;
303
- border-bottom-right-radius: 0;
304
-
305
- background-color: #eee;
306
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
307
- background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
308
- background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
309
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
310
- background-image: linear-gradient(to top, #fff 0%, #eee 50%);
311
- }
312
-
313
- .select2-dropdown-open.select2-drop-above .select2-choice,
314
- .select2-dropdown-open.select2-drop-above .select2-choices {
315
- border: 1px solid #5897fb;
316
- border-top-color: transparent;
317
-
318
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
319
- background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
320
- background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
321
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
322
- background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
323
- }
324
-
325
- .select2-dropdown-open .select2-choice .select2-arrow {
326
- background: transparent;
327
- border-left: none;
328
- filter: none;
329
- }
330
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
331
- border-right: none;
332
- }
333
-
334
- .select2-dropdown-open .select2-choice .select2-arrow b {
335
- background-position: -18px 1px;
336
- }
337
-
338
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
339
- background-position: -16px 1px;
340
- }
341
-
342
- .select2-hidden-accessible {
343
- border: 0;
344
- clip: rect(0 0 0 0);
345
- height: 1px;
346
- margin: -1px;
347
- overflow: hidden;
348
- padding: 0;
349
- position: absolute;
350
- width: 1px;
351
- }
352
-
353
- /* results */
354
- .select2-results {
355
- max-height: 200px;
356
- padding: 0 0 0 4px;
357
- margin: 4px 4px 4px 0;
358
- position: relative;
359
- overflow-x: hidden;
360
- overflow-y: auto;
361
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
362
- }
363
-
364
- html[dir="rtl"] .select2-results {
365
- padding: 0 4px 0 0;
366
- margin: 4px 0 4px 4px;
367
- }
368
-
369
- .select2-results ul.select2-result-sub {
370
- margin: 0;
371
- padding-left: 0;
372
- }
373
-
374
- .select2-results li {
375
- list-style: none;
376
- display: list-item;
377
- background-image: none;
378
- }
379
-
380
- .select2-results li.select2-result-with-children > .select2-result-label {
381
- font-weight: bold;
382
- }
383
-
384
- .select2-results .select2-result-label {
385
- padding: 3px 7px 4px;
386
- margin: 0;
387
- cursor: pointer;
388
-
389
- min-height: 1em;
390
-
391
- -webkit-touch-callout: none;
392
- -webkit-user-select: none;
393
- -moz-user-select: none;
394
- -ms-user-select: none;
395
- user-select: none;
396
- }
397
-
398
- .select2-results-dept-1 .select2-result-label { padding-left: 20px }
399
- .select2-results-dept-2 .select2-result-label { padding-left: 40px }
400
- .select2-results-dept-3 .select2-result-label { padding-left: 60px }
401
- .select2-results-dept-4 .select2-result-label { padding-left: 80px }
402
- .select2-results-dept-5 .select2-result-label { padding-left: 100px }
403
- .select2-results-dept-6 .select2-result-label { padding-left: 110px }
404
- .select2-results-dept-7 .select2-result-label { padding-left: 120px }
405
-
406
- .select2-results .select2-highlighted {
407
- background: #3875d7;
408
- color: #fff;
409
- }
410
-
411
- .select2-results li em {
412
- background: #feffde;
413
- font-style: normal;
414
- }
415
-
416
- .select2-results .select2-highlighted em {
417
- background: transparent;
418
- }
419
-
420
- .select2-results .select2-highlighted ul {
421
- background: #fff;
422
- color: #000;
423
- }
424
-
425
- .select2-results .select2-no-results,
426
- .select2-results .select2-searching,
427
- .select2-results .select2-ajax-error,
428
- .select2-results .select2-selection-limit {
429
- background: #f4f4f4;
430
- display: list-item;
431
- padding-left: 5px;
432
- }
433
-
434
- /*
435
- disabled look for disabled choices in the results dropdown
436
- */
437
- .select2-results .select2-disabled.select2-highlighted {
438
- color: #666;
439
- background: #f4f4f4;
440
- display: list-item;
441
- cursor: default;
442
- }
443
- .select2-results .select2-disabled {
444
- background: #f4f4f4;
445
- display: list-item;
446
- cursor: default;
447
- }
448
-
449
- .select2-results .select2-selected {
450
- display: none;
451
- }
452
-
453
- .select2-more-results.select2-active {
454
- background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
455
- }
456
-
457
- .select2-results .select2-ajax-error {
458
- background: rgba(255, 50, 50, .2);
459
- }
460
-
461
- .select2-more-results {
462
- background: #f4f4f4;
463
- display: list-item;
464
- }
465
-
466
- /* disabled styles */
467
-
468
- .select2-container.select2-container-disabled .select2-choice {
469
- background-color: #f4f4f4;
470
- background-image: none;
471
- border: 1px solid #ddd;
472
- cursor: default;
473
- }
474
-
475
- .select2-container.select2-container-disabled .select2-choice .select2-arrow {
476
- background-color: #f4f4f4;
477
- background-image: none;
478
- border-left: 0;
479
- }
480
-
481
- .select2-container.select2-container-disabled .select2-choice abbr {
482
- display: none;
483
- }
484
-
485
-
486
- /* multiselect */
487
-
488
- .select2-container-multi .select2-choices {
489
- height: auto !important;
490
- height: 1%;
491
- margin: 0;
492
- padding: 0 5px 0 0;
493
- position: relative;
494
-
495
- border: 1px solid #aaa;
496
- cursor: text;
497
- overflow: hidden;
498
-
499
- background-color: #fff;
500
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
501
- background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
502
- background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
503
- background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
504
- }
505
-
506
- html[dir="rtl"] .select2-container-multi .select2-choices {
507
- padding: 0 0 0 5px;
508
- }
509
-
510
- .select2-locked {
511
- padding: 3px 5px 3px 5px !important;
512
- }
513
-
514
- .select2-container-multi .select2-choices {
515
- min-height: 26px;
516
- }
517
-
518
- .select2-container-multi.select2-container-active .select2-choices {
519
- border: 1px solid #5897fb;
520
- outline: none;
521
-
522
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
523
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
524
- }
525
- .select2-container-multi .select2-choices li {
526
- float: left;
527
- list-style: none;
528
- }
529
- html[dir="rtl"] .select2-container-multi .select2-choices li
530
- {
531
- float: right;
532
- }
533
- .select2-container-multi .select2-choices .select2-search-field {
534
- margin: 0;
535
- padding: 0;
536
- white-space: nowrap;
537
- }
538
-
539
- .select2-container-multi .select2-choices .select2-search-field input {
540
- padding: 5px;
541
- margin: 1px 0;
542
-
543
- font-family: sans-serif;
544
- font-size: 100%;
545
- color: #666;
546
- outline: 0;
547
- border: 0;
548
- -webkit-box-shadow: none;
549
- box-shadow: none;
550
- background: transparent !important;
551
- }
552
-
553
- .select2-container-multi .select2-choices .select2-search-field input.select2-active {
554
- background: #fff url('select2-spinner.gif') no-repeat 100% !important;
555
- }
556
-
557
- .select2-default {
558
- color: #999 !important;
559
- }
560
-
561
- .select2-container-multi .select2-choices .select2-search-choice {
562
- padding: 3px 5px 3px 18px;
563
- margin: 3px 0 3px 5px;
564
- position: relative;
565
-
566
- line-height: 13px;
567
- color: #333;
568
- cursor: default;
569
- border: 1px solid #aaaaaa;
570
-
571
- border-radius: 3px;
572
-
573
- -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
574
- box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
575
-
576
- background-clip: padding-box;
577
-
578
- -webkit-touch-callout: none;
579
- -webkit-user-select: none;
580
- -moz-user-select: none;
581
- -ms-user-select: none;
582
- user-select: none;
583
-
584
- background-color: #e4e4e4;
585
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
586
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
587
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
588
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
589
- background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
590
- }
591
- html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
592
- {
593
- margin: 3px 5px 3px 0;
594
- padding: 3px 18px 3px 5px;
595
- }
596
- .select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
597
- cursor: default;
598
- }
599
- .select2-container-multi .select2-choices .select2-search-choice-focus {
600
- background: #d4d4d4;
601
- }
602
-
603
- .select2-search-choice-close {
604
- display: block;
605
- width: 12px;
606
- height: 13px;
607
- position: absolute;
608
- right: 3px;
609
- top: 4px;
610
-
611
- font-size: 1px;
612
- outline: none;
613
- background: url('select2.png') right top no-repeat;
614
- }
615
- html[dir="rtl"] .select2-search-choice-close {
616
- right: auto;
617
- left: 3px;
618
- }
619
-
620
- .select2-container-multi .select2-search-choice-close {
621
- left: 3px;
622
- }
623
-
624
- html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
625
- left: auto;
626
- right: 2px;
627
- }
628
-
629
- .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
630
- background-position: right -11px;
631
- }
632
- .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
633
- background-position: right -11px;
634
- }
635
-
636
- /* disabled styles */
637
- .select2-container-multi.select2-container-disabled .select2-choices {
638
- background-color: #f4f4f4;
639
- background-image: none;
640
- border: 1px solid #ddd;
641
- cursor: default;
642
- }
643
-
644
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
645
- padding: 3px 5px 3px 5px;
646
- border: 1px solid #ddd;
647
- background-image: none;
648
- background-color: #f4f4f4;
649
- }
650
-
651
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
652
- background: none;
653
- }
654
- /* end multiselect */
655
-
656
-
657
- .select2-result-selectable .select2-match,
658
- .select2-result-unselectable .select2-match {
659
- text-decoration: underline;
660
- }
661
-
662
- .select2-offscreen, .select2-offscreen:focus {
663
- clip: rect(0 0 0 0) !important;
664
- width: 1px !important;
665
- height: 1px !important;
666
- border: 0 !important;
667
- margin: 0 !important;
668
- padding: 0 !important;
669
- overflow: hidden !important;
670
- position: absolute !important;
671
- outline: 0 !important;
672
- left: 0px !important;
673
- top: 0px !important;
674
- }
675
-
676
- .select2-display-none {
677
- display: none;
678
- }
679
-
680
- .select2-measure-scrollbar {
681
- position: absolute;
682
- top: -10000px;
683
- left: -10000px;
684
- width: 100px;
685
- height: 100px;
686
- overflow: scroll;
687
- }
688
-
689
- /* Retina-ize icons */
690
-
691
- @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
692
- .select2-search input,
693
- .select2-search-choice-close,
694
- .select2-container .select2-choice abbr,
695
- .select2-container .select2-choice .select2-arrow b {
696
- background-image: url('select2x2.png') !important;
697
- background-repeat: no-repeat !important;
698
- background-size: 60px 40px !important;
699
- }
700
-
701
- .select2-search input {
702
- background-position: 100% -21px !important;
703
- }
704
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2.js DELETED
@@ -1,3541 +0,0 @@
1
- /*
2
- Copyright 2012 Igor Vaynberg
3
-
4
- Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
5
-
6
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
- use of this software only upon the condition that you accept all of the terms of either the Apache
9
- License or the GPL License.
10
-
11
- You may obtain a copy of the Apache License and the GPL License at:
12
-
13
- http://www.apache.org/licenses/LICENSE-2.0
14
- http://www.gnu.org/licenses/gpl-2.0.html
15
-
16
- Unless required by applicable law or agreed to in writing, software distributed under the
17
- Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
18
- CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
19
- the specific language governing permissions and limitations under the Apache License and the GPL License.
20
- */
21
- (function ($) {
22
- if(typeof $.fn.each2 == "undefined") {
23
- $.extend($.fn, {
24
- /*
25
- * 4-10 times faster .each replacement
26
- * use it carefully, as it overrides jQuery context of element on each iteration
27
- */
28
- each2 : function (c) {
29
- var j = $([0]), i = -1, l = this.length;
30
- while (
31
- ++i < l
32
- && (j.context = j[0] = this[i])
33
- && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
34
- );
35
- return this;
36
- }
37
- });
38
- }
39
- })(jQuery);
40
-
41
- (function ($, undefined) {
42
- "use strict";
43
- /*global document, window, jQuery, console */
44
-
45
- if (window.Select2 !== undefined) {
46
- return;
47
- }
48
-
49
- var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
50
- lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
51
-
52
- KEY = {
53
- TAB: 9,
54
- ENTER: 13,
55
- ESC: 27,
56
- SPACE: 32,
57
- LEFT: 37,
58
- UP: 38,
59
- RIGHT: 39,
60
- DOWN: 40,
61
- SHIFT: 16,
62
- CTRL: 17,
63
- ALT: 18,
64
- PAGE_UP: 33,
65
- PAGE_DOWN: 34,
66
- HOME: 36,
67
- END: 35,
68
- BACKSPACE: 8,
69
- DELETE: 46,
70
- isArrow: function (k) {
71
- k = k.which ? k.which : k;
72
- switch (k) {
73
- case KEY.LEFT:
74
- case KEY.RIGHT:
75
- case KEY.UP:
76
- case KEY.DOWN:
77
- return true;
78
- }
79
- return false;
80
- },
81
- isControl: function (e) {
82
- var k = e.which;
83
- switch (k) {
84
- case KEY.SHIFT:
85
- case KEY.CTRL:
86
- case KEY.ALT:
87
- return true;
88
- }
89
-
90
- if (e.metaKey) return true;
91
-
92
- return false;
93
- },
94
- isFunctionKey: function (k) {
95
- k = k.which ? k.which : k;
96
- return k >= 112 && k <= 123;
97
- }
98
- },
99
- MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",
100
-
101
- DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"};
102
-
103
- $document = $(document);
104
-
105
- nextUid=(function() { var counter=1; return function() { return counter++; }; }());
106
-
107
-
108
- function reinsertElement(element) {
109
- var placeholder = $(document.createTextNode(''));
110
-
111
- element.before(placeholder);
112
- placeholder.before(element);
113
- placeholder.remove();
114
- }
115
-
116
- function stripDiacritics(str) {
117
- // Used 'uni range + named function' from http://jsperf.com/diacritics/18
118
- function match(a) {
119
- return DIACRITICS[a] || a;
120
- }
121
-
122
- return str.replace(/[^\u0000-\u007E]/g, match);
123
- }
124
-
125
- function indexOf(value, array) {
126
- var i = 0, l = array.length;
127
- for (; i < l; i = i + 1) {
128
- if (equal(value, array[i])) return i;
129
- }
130
- return -1;
131
- }
132
-
133
- function measureScrollbar () {
134
- var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
135
- $template.appendTo(document.body);
136
-
137
- var dim = {
138
- width: $template.width() - $template[0].clientWidth,
139
- height: $template.height() - $template[0].clientHeight
140
- };
141
- $template.remove();
142
-
143
- return dim;
144
- }
145
-
146
- /**
147
- * Compares equality of a and b
148
- * @param a
149
- * @param b
150
- */
151
- function equal(a, b) {
152
- if (a === b) return true;
153
- if (a === undefined || b === undefined) return false;
154
- if (a === null || b === null) return false;
155
- // Check whether 'a' or 'b' is a string (primitive or object).
156
- // The concatenation of an empty string (+'') converts its argument to a string's primitive.
157
- if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
158
- if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
159
- return false;
160
- }
161
-
162
- /**
163
- * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty
164
- * strings
165
- * @param string
166
- * @param separator
167
- */
168
- function splitVal(string, separator, transform) {
169
- var val, i, l;
170
- if (string === null || string.length < 1) return [];
171
- val = string.split(separator);
172
- for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]);
173
- return val;
174
- }
175
-
176
- function getSideBorderPadding(element) {
177
- return element.outerWidth(false) - element.width();
178
- }
179
-
180
- function installKeyUpChangeEvent(element) {
181
- var key="keyup-change-value";
182
- element.on("keydown", function () {
183
- if ($.data(element, key) === undefined) {
184
- $.data(element, key, element.val());
185
- }
186
- });
187
- element.on("keyup", function () {
188
- var val= $.data(element, key);
189
- if (val !== undefined && element.val() !== val) {
190
- $.removeData(element, key);
191
- element.trigger("keyup-change");
192
- }
193
- });
194
- }
195
-
196
-
197
- /**
198
- * filters mouse events so an event is fired only if the mouse moved.
199
- *
200
- * filters out mouse events that occur when mouse is stationary but
201
- * the elements under the pointer are scrolled.
202
- */
203
- function installFilteredMouseMove(element) {
204
- element.on("mousemove", function (e) {
205
- var lastpos = lastMousePosition;
206
- if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
207
- $(e.target).trigger("mousemove-filtered", e);
208
- }
209
- });
210
- }
211
-
212
- /**
213
- * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
214
- * within the last quietMillis milliseconds.
215
- *
216
- * @param quietMillis number of milliseconds to wait before invoking fn
217
- * @param fn function to be debounced
218
- * @param ctx object to be used as this reference within fn
219
- * @return debounced version of fn
220
- */
221
- function debounce(quietMillis, fn, ctx) {
222
- ctx = ctx || undefined;
223
- var timeout;
224
- return function () {
225
- var args = arguments;
226
- window.clearTimeout(timeout);
227
- timeout = window.setTimeout(function() {
228
- fn.apply(ctx, args);
229
- }, quietMillis);
230
- };
231
- }
232
-
233
- function installDebouncedScroll(threshold, element) {
234
- var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
235
- element.on("scroll", function (e) {
236
- if (indexOf(e.target, element.get()) >= 0) notify(e);
237
- });
238
- }
239
-
240
- function focus($el) {
241
- if ($el[0] === document.activeElement) return;
242
-
243
- /* set the focus in a 0 timeout - that way the focus is set after the processing
244
- of the current event has finished - which seems like the only reliable way
245
- to set focus */
246
- window.setTimeout(function() {
247
- var el=$el[0], pos=$el.val().length, range;
248
-
249
- $el.focus();
250
-
251
- /* make sure el received focus so we do not error out when trying to manipulate the caret.
252
- sometimes modals or others listeners may steal it after its set */
253
- var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
254
- if (isVisible && el === document.activeElement) {
255
-
256
- /* after the focus is set move the caret to the end, necessary when we val()
257
- just before setting focus */
258
- if(el.setSelectionRange)
259
- {
260
- el.setSelectionRange(pos, pos);
261
- }
262
- else if (el.createTextRange) {
263
- range = el.createTextRange();
264
- range.collapse(false);
265
- range.select();
266
- }
267
- }
268
- }, 0);
269
- }
270
-
271
- function getCursorInfo(el) {
272
- el = $(el)[0];
273
- var offset = 0;
274
- var length = 0;
275
- if ('selectionStart' in el) {
276
- offset = el.selectionStart;
277
- length = el.selectionEnd - offset;
278
- } else if ('selection' in document) {
279
- el.focus();
280
- var sel = document.selection.createRange();
281
- length = document.selection.createRange().text.length;
282
- sel.moveStart('character', -el.value.length);
283
- offset = sel.text.length - length;
284
- }
285
- return { offset: offset, length: length };
286
- }
287
-
288
- function killEvent(event) {
289
- event.preventDefault();
290
- event.stopPropagation();
291
- }
292
- function killEventImmediately(event) {
293
- event.preventDefault();
294
- event.stopImmediatePropagation();
295
- }
296
-
297
- function measureTextWidth(e) {
298
- if (!sizer){
299
- var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
300
- sizer = $(document.createElement("div")).css({
301
- position: "absolute",
302
- left: "-10000px",
303
- top: "-10000px",
304
- display: "none",
305
- fontSize: style.fontSize,
306
- fontFamily: style.fontFamily,
307
- fontStyle: style.fontStyle,
308
- fontWeight: style.fontWeight,
309
- letterSpacing: style.letterSpacing,
310
- textTransform: style.textTransform,
311
- whiteSpace: "nowrap"
312
- });
313
- sizer.attr("class","select2-sizer");
314
- $(document.body).append(sizer);
315
- }
316
- sizer.text(e.val());
317
- return sizer.width();
318
- }
319
-
320
- function syncCssClasses(dest, src, adapter) {
321
- var classes, replacements = [], adapted;
322
-
323
- classes = $.trim(dest.attr("class"));
324
-
325
- if (classes) {
326
- classes = '' + classes; // for IE which returns object
327
-
328
- $(classes.split(/\s+/)).each2(function() {
329
- if (this.indexOf("select2-") === 0) {
330
- replacements.push(this);
331
- }
332
- });
333
- }
334
-
335
- classes = $.trim(src.attr("class"));
336
-
337
- if (classes) {
338
- classes = '' + classes; // for IE which returns object
339
-
340
- $(classes.split(/\s+/)).each2(function() {
341
- if (this.indexOf("select2-") !== 0) {
342
- adapted = adapter(this);
343
-
344
- if (adapted) {
345
- replacements.push(adapted);
346
- }
347
- }
348
- });
349
- }
350
-
351
- dest.attr("class", replacements.join(" "));
352
- }
353
-
354
-
355
- function markMatch(text, term, markup, escapeMarkup) {
356
- var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
357
- tl=term.length;
358
-
359
- if (match<0) {
360
- markup.push(escapeMarkup(text));
361
- return;
362
- }
363
-
364
- markup.push(escapeMarkup(text.substring(0, match)));
365
- markup.push("<span class='select2-match'>");
366
- markup.push(escapeMarkup(text.substring(match, match + tl)));
367
- markup.push("</span>");
368
- markup.push(escapeMarkup(text.substring(match + tl, text.length)));
369
- }
370
-
371
- function defaultEscapeMarkup(markup) {
372
- var replace_map = {
373
- '\\': '&#92;',
374
- '&': '&amp;',
375
- '<': '&lt;',
376
- '>': '&gt;',
377
- '"': '&quot;',
378
- "'": '&#39;',
379
- "/": '&#47;'
380
- };
381
-
382
- return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
383
- return replace_map[match];
384
- });
385
- }
386
-
387
- /**
388
- * Produces an ajax-based query function
389
- *
390
- * @param options object containing configuration parameters
391
- * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
392
- * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
393
- * @param options.url url for the data
394
- * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
395
- * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified
396
- * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
397
- * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.
398
- * The expected format is an object containing the following keys:
399
- * results array of objects that will be used as choices
400
- * more (optional) boolean indicating whether there are more results available
401
- * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
402
- */
403
- function ajax(options) {
404
- var timeout, // current scheduled but not yet executed request
405
- handler = null,
406
- quietMillis = options.quietMillis || 100,
407
- ajaxUrl = options.url,
408
- self = this;
409
-
410
- return function (query) {
411
- window.clearTimeout(timeout);
412
- timeout = window.setTimeout(function () {
413
- var data = options.data, // ajax data function
414
- url = ajaxUrl, // ajax url string or function
415
- transport = options.transport || $.fn.select2.ajaxDefaults.transport,
416
- // deprecated - to be removed in 4.0 - use params instead
417
- deprecated = {
418
- type: options.type || 'GET', // set type of request (GET or POST)
419
- cache: options.cache || false,
420
- jsonpCallback: options.jsonpCallback||undefined,
421
- dataType: options.dataType||"json"
422
- },
423
- params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
424
-
425
- data = data ? data.call(self, query.term, query.page, query.context) : null;
426
- url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
427
-
428
- if (handler && typeof handler.abort === "function") { handler.abort(); }
429
-
430
- if (options.params) {
431
- if ($.isFunction(options.params)) {
432
- $.extend(params, options.params.call(self));
433
- } else {
434
- $.extend(params, options.params);
435
- }
436
- }
437
-
438
- $.extend(params, {
439
- url: url,
440
- dataType: options.dataType,
441
- data: data,
442
- success: function (data) {
443
- // TODO - replace query.page with query so users have access to term, page, etc.
444
- // added query as third paramter to keep backwards compatibility
445
- var results = options.results(data, query.page, query);
446
- query.callback(results);
447
- },
448
- error: function(jqXHR, textStatus, errorThrown){
449
- var results = {
450
- hasError: true,
451
- jqXHR: jqXHR,
452
- textStatus: textStatus,
453
- errorThrown: errorThrown
454
- };
455
-
456
- query.callback(results);
457
- }
458
- });
459
- handler = transport.call(self, params);
460
- }, quietMillis);
461
- };
462
- }
463
-
464
- /**
465
- * Produces a query function that works with a local array
466
- *
467
- * @param options object containing configuration parameters. The options parameter can either be an array or an
468
- * object.
469
- *
470
- * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
471
- *
472
- * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
473
- * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
474
- * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
475
- * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
476
- * the text.
477
- */
478
- function local(options) {
479
- var data = options, // data elements
480
- dataText,
481
- tmp,
482
- text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
483
-
484
- if ($.isArray(data)) {
485
- tmp = data;
486
- data = { results: tmp };
487
- }
488
-
489
- if ($.isFunction(data) === false) {
490
- tmp = data;
491
- data = function() { return tmp; };
492
- }
493
-
494
- var dataItem = data();
495
- if (dataItem.text) {
496
- text = dataItem.text;
497
- // if text is not a function we assume it to be a key name
498
- if (!$.isFunction(text)) {
499
- dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
500
- text = function (item) { return item[dataText]; };
501
- }
502
- }
503
-
504
- return function (query) {
505
- var t = query.term, filtered = { results: [] }, process;
506
- if (t === "") {
507
- query.callback(data());
508
- return;
509
- }
510
-
511
- process = function(datum, collection) {
512
- var group, attr;
513
- datum = datum[0];
514
- if (datum.children) {
515
- group = {};
516
- for (attr in datum) {
517
- if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
518
- }
519
- group.children=[];
520
- $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
521
- if (group.children.length || query.matcher(t, text(group), datum)) {
522
- collection.push(group);
523
- }
524
- } else {
525
- if (query.matcher(t, text(datum), datum)) {
526
- collection.push(datum);
527
- }
528
- }
529
- };
530
-
531
- $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
532
- query.callback(filtered);
533
- };
534
- }
535
-
536
- // TODO javadoc
537
- function tags(data) {
538
- var isFunc = $.isFunction(data);
539
- return function (query) {
540
- var t = query.term, filtered = {results: []};
541
- var result = isFunc ? data(query) : data;
542
- if ($.isArray(result)) {
543
- $(result).each(function () {
544
- var isObject = this.text !== undefined,
545
- text = isObject ? this.text : this;
546
- if (t === "" || query.matcher(t, text)) {
547
- filtered.results.push(isObject ? this : {id: this, text: this});
548
- }
549
- });
550
- query.callback(filtered);
551
- }
552
- };
553
- }
554
-
555
- /**
556
- * Checks if the formatter function should be used.
557
- *
558
- * Throws an error if it is not a function. Returns true if it should be used,
559
- * false if no formatting should be performed.
560
- *
561
- * @param formatter
562
- */
563
- function checkFormatter(formatter, formatterName) {
564
- if ($.isFunction(formatter)) return true;
565
- if (!formatter) return false;
566
- if (typeof(formatter) === 'string') return true;
567
- throw new Error(formatterName +" must be a string, function, or falsy value");
568
- }
569
-
570
- /**
571
- * Returns a given value
572
- * If given a function, returns its output
573
- *
574
- * @param val string|function
575
- * @param context value of "this" to be passed to function
576
- * @returns {*}
577
- */
578
- function evaluate(val, context) {
579
- if ($.isFunction(val)) {
580
- var args = Array.prototype.slice.call(arguments, 2);
581
- return val.apply(context, args);
582
- }
583
- return val;
584
- }
585
-
586
- function countResults(results) {
587
- var count = 0;
588
- $.each(results, function(i, item) {
589
- if (item.children) {
590
- count += countResults(item.children);
591
- } else {
592
- count++;
593
- }
594
- });
595
- return count;
596
- }
597
-
598
- /**
599
- * Default tokenizer. This function uses breaks the input on substring match of any string from the
600
- * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
601
- * two options have to be defined in order for the tokenizer to work.
602
- *
603
- * @param input text user has typed so far or pasted into the search field
604
- * @param selection currently selected choices
605
- * @param selectCallback function(choice) callback tho add the choice to selection
606
- * @param opts select2's opts
607
- * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
608
- */
609
- function defaultTokenizer(input, selection, selectCallback, opts) {
610
- var original = input, // store the original so we can compare and know if we need to tell the search to update its text
611
- dupe = false, // check for whether a token we extracted represents a duplicate selected choice
612
- token, // token
613
- index, // position at which the separator was found
614
- i, l, // looping variables
615
- separator; // the matched separator
616
-
617
- if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
618
-
619
- while (true) {
620
- index = -1;
621
-
622
- for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
623
- separator = opts.tokenSeparators[i];
624
- index = input.indexOf(separator);
625
- if (index >= 0) break;
626
- }
627
-
628
- if (index < 0) break; // did not find any token separator in the input string, bail
629
-
630
- token = input.substring(0, index);
631
- input = input.substring(index + separator.length);
632
-
633
- if (token.length > 0) {
634
- token = opts.createSearchChoice.call(this, token, selection);
635
- if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
636
- dupe = false;
637
- for (i = 0, l = selection.length; i < l; i++) {
638
- if (equal(opts.id(token), opts.id(selection[i]))) {
639
- dupe = true; break;
640
- }
641
- }
642
-
643
- if (!dupe) selectCallback(token);
644
- }
645
- }
646
- }
647
-
648
- if (original!==input) return input;
649
- }
650
-
651
- function cleanupJQueryElements() {
652
- var self = this;
653
-
654
- $.each(arguments, function (i, element) {
655
- self[element].remove();
656
- self[element] = null;
657
- });
658
- }
659
-
660
- /**
661
- * Creates a new class
662
- *
663
- * @param superClass
664
- * @param methods
665
- */
666
- function clazz(SuperClass, methods) {
667
- var constructor = function () {};
668
- constructor.prototype = new SuperClass;
669
- constructor.prototype.constructor = constructor;
670
- constructor.prototype.parent = SuperClass.prototype;
671
- constructor.prototype = $.extend(constructor.prototype, methods);
672
- return constructor;
673
- }
674
-
675
- AbstractSelect2 = clazz(Object, {
676
-
677
- // abstract
678
- bind: function (func) {
679
- var self = this;
680
- return function () {
681
- func.apply(self, arguments);
682
- };
683
- },
684
-
685
- // abstract
686
- init: function (opts) {
687
- var results, search, resultsSelector = ".select2-results";
688
-
689
- // prepare options
690
- this.opts = opts = this.prepareOpts(opts);
691
-
692
- this.id=opts.id;
693
-
694
- // destroy if called on an existing component
695
- if (opts.element.data("select2") !== undefined &&
696
- opts.element.data("select2") !== null) {
697
- opts.element.data("select2").destroy();
698
- }
699
-
700
- this.container = this.createContainer();
701
-
702
- this.liveRegion = $('.select2-hidden-accessible');
703
- if (this.liveRegion.length == 0) {
704
- this.liveRegion = $("<span>", {
705
- role: "status",
706
- "aria-live": "polite"
707
- })
708
- .addClass("select2-hidden-accessible")
709
- .appendTo(document.body);
710
- }
711
-
712
- this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
713
- this.containerEventName= this.containerId
714
- .replace(/([.])/g, '_')
715
- .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
716
- this.container.attr("id", this.containerId);
717
-
718
- this.container.attr("title", opts.element.attr("title"));
719
-
720
- this.body = $(document.body);
721
-
722
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
723
-
724
- this.container.attr("style", opts.element.attr("style"));
725
- this.container.css(evaluate(opts.containerCss, this.opts.element));
726
- this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));
727
-
728
- this.elementTabIndex = this.opts.element.attr("tabindex");
729
-
730
- // swap container for the element
731
- this.opts.element
732
- .data("select2", this)
733
- .attr("tabindex", "-1")
734
- .before(this.container)
735
- .on("click.select2", killEvent); // do not leak click events
736
-
737
- this.container.data("select2", this);
738
-
739
- this.dropdown = this.container.find(".select2-drop");
740
-
741
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
742
-
743
- this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));
744
- this.dropdown.data("select2", this);
745
- this.dropdown.on("click", killEvent);
746
-
747
- this.results = results = this.container.find(resultsSelector);
748
- this.search = search = this.container.find("input.select2-input");
749
-
750
- this.queryCount = 0;
751
- this.resultsPage = 0;
752
- this.context = null;
753
-
754
- // initialize the container
755
- this.initContainer();
756
-
757
- this.container.on("click", killEvent);
758
-
759
- installFilteredMouseMove(this.results);
760
-
761
- this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
762
- this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
763
- this._touchEvent = true;
764
- this.highlightUnderEvent(event);
765
- }));
766
- this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
767
- this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
768
-
769
- // Waiting for a click event on touch devices to select option and hide dropdown
770
- // otherwise click will be triggered on an underlying element
771
- this.dropdown.on('click', this.bind(function (event) {
772
- if (this._touchEvent) {
773
- this._touchEvent = false;
774
- this.selectHighlighted();
775
- }
776
- }));
777
-
778
- installDebouncedScroll(80, this.results);
779
- this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
780
-
781
- // do not propagate change event from the search field out of the component
782
- $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
783
- $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
784
-
785
- // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
786
- if ($.fn.mousewheel) {
787
- results.mousewheel(function (e, delta, deltaX, deltaY) {
788
- var top = results.scrollTop();
789
- if (deltaY > 0 && top - deltaY <= 0) {
790
- results.scrollTop(0);
791
- killEvent(e);
792
- } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
793
- results.scrollTop(results.get(0).scrollHeight - results.height());
794
- killEvent(e);
795
- }
796
- });
797
- }
798
-
799
- installKeyUpChangeEvent(search);
800
- search.on("keyup-change input paste", this.bind(this.updateResults));
801
- search.on("focus", function () { search.addClass("select2-focused"); });
802
- search.on("blur", function () { search.removeClass("select2-focused");});
803
-
804
- this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
805
- if ($(e.target).closest(".select2-result-selectable").length > 0) {
806
- this.highlightUnderEvent(e);
807
- this.selectHighlighted(e);
808
- }
809
- }));
810
-
811
- // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
812
- // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
813
- // dom it will trigger the popup close, which is not what we want
814
- // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
815
- this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); });
816
-
817
- this.nextSearchTerm = undefined;
818
-
819
- if ($.isFunction(this.opts.initSelection)) {
820
- // initialize selection based on the current value of the source element
821
- this.initSelection();
822
-
823
- // if the user has provided a function that can set selection based on the value of the source element
824
- // we monitor the change event on the element and trigger it, allowing for two way synchronization
825
- this.monitorSource();
826
- }
827
-
828
- if (opts.maximumInputLength !== null) {
829
- this.search.attr("maxlength", opts.maximumInputLength);
830
- }
831
-
832
- var disabled = opts.element.prop("disabled");
833
- if (disabled === undefined) disabled = false;
834
- this.enable(!disabled);
835
-
836
- var readonly = opts.element.prop("readonly");
837
- if (readonly === undefined) readonly = false;
838
- this.readonly(readonly);
839
-
840
- // Calculate size of scrollbar
841
- scrollBarDimensions = scrollBarDimensions || measureScrollbar();
842
-
843
- this.autofocus = opts.element.prop("autofocus");
844
- opts.element.prop("autofocus", false);
845
- if (this.autofocus) this.focus();
846
-
847
- this.search.attr("placeholder", opts.searchInputPlaceholder);
848
- },
849
-
850
- // abstract
851
- destroy: function () {
852
- var element=this.opts.element, select2 = element.data("select2"), self = this;
853
-
854
- this.close();
855
-
856
- if (element.length && element[0].detachEvent && self._sync) {
857
- element.each(function () {
858
- if (self._sync) {
859
- this.detachEvent("onpropertychange", self._sync);
860
- }
861
- });
862
- }
863
- if (this.propertyObserver) {
864
- this.propertyObserver.disconnect();
865
- this.propertyObserver = null;
866
- }
867
- this._sync = null;
868
-
869
- if (select2 !== undefined) {
870
- select2.container.remove();
871
- select2.liveRegion.remove();
872
- select2.dropdown.remove();
873
- element
874
- .show()
875
- .removeData("select2")
876
- .off(".select2")
877
- .prop("autofocus", this.autofocus || false);
878
- if (this.elementTabIndex) {
879
- element.attr({tabindex: this.elementTabIndex});
880
- } else {
881
- element.removeAttr("tabindex");
882
- }
883
- element.show();
884
- }
885
-
886
- cleanupJQueryElements.call(this,
887
- "container",
888
- "liveRegion",
889
- "dropdown",
890
- "results",
891
- "search"
892
- );
893
- },
894
-
895
- // abstract
896
- optionToData: function(element) {
897
- if (element.is("option")) {
898
- return {
899
- id:element.prop("value"),
900
- text:element.text(),
901
- element: element.get(),
902
- css: element.attr("class"),
903
- disabled: element.prop("disabled"),
904
- locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
905
- };
906
- } else if (element.is("optgroup")) {
907
- return {
908
- text:element.attr("label"),
909
- children:[],
910
- element: element.get(),
911
- css: element.attr("class")
912
- };
913
- }
914
- },
915
-
916
- // abstract
917
- prepareOpts: function (opts) {
918
- var element, select, idKey, ajaxUrl, self = this;
919
-
920
- element = opts.element;
921
-
922
- if (element.get(0).tagName.toLowerCase() === "select") {
923
- this.select = select = opts.element;
924
- }
925
-
926
- if (select) {
927
- // these options are not allowed when attached to a select because they are picked up off the element itself
928
- $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
929
- if (this in opts) {
930
- throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
931
- }
932
- });
933
- }
934
-
935
- opts = $.extend({}, {
936
- populateResults: function(container, results, query) {
937
- var populate, id=this.opts.id, liveRegion=this.liveRegion;
938
-
939
- populate=function(results, container, depth) {
940
-
941
- var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
942
-
943
- results = opts.sortResults(results, container, query);
944
-
945
- // collect the created nodes for bulk append
946
- var nodes = [];
947
- for (i = 0, l = results.length; i < l; i = i + 1) {
948
-
949
- result=results[i];
950
-
951
- disabled = (result.disabled === true);
952
- selectable = (!disabled) && (id(result) !== undefined);
953
-
954
- compound=result.children && result.children.length > 0;
955
-
956
- node=$("<li></li>");
957
- node.addClass("select2-results-dept-"+depth);
958
- node.addClass("select2-result");
959
- node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
960
- if (disabled) { node.addClass("select2-disabled"); }
961
- if (compound) { node.addClass("select2-result-with-children"); }
962
- node.addClass(self.opts.formatResultCssClass(result));
963
- node.attr("role", "presentation");
964
-
965
- label=$(document.createElement("div"));
966
- label.addClass("select2-result-label");
967
- label.attr("id", "select2-result-label-" + nextUid());
968
- label.attr("role", "option");
969
-
970
- formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
971
- if (formatted!==undefined) {
972
- label.html(formatted);
973
- node.append(label);
974
- }
975
-
976
-
977
- if (compound) {
978
-
979
- innerContainer=$("<ul></ul>");
980
- innerContainer.addClass("select2-result-sub");
981
- populate(result.children, innerContainer, depth+1);
982
- node.append(innerContainer);
983
- }
984
-
985
- node.data("select2-data", result);
986
- nodes.push(node[0]);
987
- }
988
-
989
- // bulk append the created nodes
990
- container.append(nodes);
991
- liveRegion.text(opts.formatMatches(results.length));
992
- };
993
-
994
- populate(results, container, 0);
995
- }
996
- }, $.fn.select2.defaults, opts);
997
-
998
- if (typeof(opts.id) !== "function") {
999
- idKey = opts.id;
1000
- opts.id = function (e) { return e[idKey]; };
1001
- }
1002
-
1003
- if ($.isArray(opts.element.data("select2Tags"))) {
1004
- if ("tags" in opts) {
1005
- throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
1006
- }
1007
- opts.tags=opts.element.data("select2Tags");
1008
- }
1009
-
1010
- if (select) {
1011
- opts.query = this.bind(function (query) {
1012
- var data = { results: [], more: false },
1013
- term = query.term,
1014
- children, placeholderOption, process;
1015
-
1016
- process=function(element, collection) {
1017
- var group;
1018
- if (element.is("option")) {
1019
- if (query.matcher(term, element.text(), element)) {
1020
- collection.push(self.optionToData(element));
1021
- }
1022
- } else if (element.is("optgroup")) {
1023
- group=self.optionToData(element);
1024
- element.children().each2(function(i, elm) { process(elm, group.children); });
1025
- if (group.children.length>0) {
1026
- collection.push(group);
1027
- }
1028
- }
1029
- };
1030
-
1031
- children=element.children();
1032
-
1033
- // ignore the placeholder option if there is one
1034
- if (this.getPlaceholder() !== undefined && children.length > 0) {
1035
- placeholderOption = this.getPlaceholderOption();
1036
- if (placeholderOption) {
1037
- children=children.not(placeholderOption);
1038
- }
1039
- }
1040
-
1041
- children.each2(function(i, elm) { process(elm, data.results); });
1042
-
1043
- query.callback(data);
1044
- });
1045
- // this is needed because inside val() we construct choices from options and their id is hardcoded
1046
- opts.id=function(e) { return e.id; };
1047
- } else {
1048
- if (!("query" in opts)) {
1049
-
1050
- if ("ajax" in opts) {
1051
- ajaxUrl = opts.element.data("ajax-url");
1052
- if (ajaxUrl && ajaxUrl.length > 0) {
1053
- opts.ajax.url = ajaxUrl;
1054
- }
1055
- opts.query = ajax.call(opts.element, opts.ajax);
1056
- } else if ("data" in opts) {
1057
- opts.query = local(opts.data);
1058
- } else if ("tags" in opts) {
1059
- opts.query = tags(opts.tags);
1060
- if (opts.createSearchChoice === undefined) {
1061
- opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
1062
- }
1063
- if (opts.initSelection === undefined) {
1064
- opts.initSelection = function (element, callback) {
1065
- var data = [];
1066
- $(splitVal(element.val(), opts.separator, opts.transformVal)).each(function () {
1067
- var obj = { id: this, text: this },
1068
- tags = opts.tags;
1069
- if ($.isFunction(tags)) tags=tags();
1070
- $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
1071
- data.push(obj);
1072
- });
1073
-
1074
- callback(data);
1075
- };
1076
- }
1077
- }
1078
- }
1079
- }
1080
- if (typeof(opts.query) !== "function") {
1081
- throw "query function not defined for Select2 " + opts.element.attr("id");
1082
- }
1083
-
1084
- if (opts.createSearchChoicePosition === 'top') {
1085
- opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
1086
- }
1087
- else if (opts.createSearchChoicePosition === 'bottom') {
1088
- opts.createSearchChoicePosition = function(list, item) { list.push(item); };
1089
- }
1090
- else if (typeof(opts.createSearchChoicePosition) !== "function") {
1091
- throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
1092
- }
1093
-
1094
- return opts;
1095
- },
1096
-
1097
- /**
1098
- * Monitor the original element for changes and update select2 accordingly
1099
- */
1100
- // abstract
1101
- monitorSource: function () {
1102
- var el = this.opts.element, observer, self = this;
1103
-
1104
- el.on("change.select2", this.bind(function (e) {
1105
- if (this.opts.element.data("select2-change-triggered") !== true) {
1106
- this.initSelection();
1107
- }
1108
- }));
1109
-
1110
- this._sync = this.bind(function () {
1111
-
1112
- // sync enabled state
1113
- var disabled = el.prop("disabled");
1114
- if (disabled === undefined) disabled = false;
1115
- this.enable(!disabled);
1116
-
1117
- var readonly = el.prop("readonly");
1118
- if (readonly === undefined) readonly = false;
1119
- this.readonly(readonly);
1120
-
1121
- if (this.container) {
1122
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
1123
- this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));
1124
- }
1125
-
1126
- if (this.dropdown) {
1127
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
1128
- this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));
1129
- }
1130
-
1131
- });
1132
-
1133
- // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
1134
- if (el.length && el[0].attachEvent) {
1135
- el.each(function() {
1136
- this.attachEvent("onpropertychange", self._sync);
1137
- });
1138
- }
1139
-
1140
- // safari, chrome, firefox, IE11
1141
- observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
1142
- if (observer !== undefined) {
1143
- if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
1144
- this.propertyObserver = new observer(function (mutations) {
1145
- $.each(mutations, self._sync);
1146
- });
1147
- this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
1148
- }
1149
- },
1150
-
1151
- // abstract
1152
- triggerSelect: function(data) {
1153
- var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data });
1154
- this.opts.element.trigger(evt);
1155
- return !evt.isDefaultPrevented();
1156
- },
1157
-
1158
- /**
1159
- * Triggers the change event on the source element
1160
- */
1161
- // abstract
1162
- triggerChange: function (details) {
1163
-
1164
- details = details || {};
1165
- details= $.extend({}, details, { type: "change", val: this.val() });
1166
- // prevents recursive triggering
1167
- this.opts.element.data("select2-change-triggered", true);
1168
- this.opts.element.trigger(details);
1169
- this.opts.element.data("select2-change-triggered", false);
1170
-
1171
- // some validation frameworks ignore the change event and listen instead to keyup, click for selects
1172
- // so here we trigger the click event manually
1173
- this.opts.element.click();
1174
-
1175
- // ValidationEngine ignores the change event and listens instead to blur
1176
- // so here we trigger the blur event manually if so desired
1177
- if (this.opts.blurOnChange)
1178
- this.opts.element.blur();
1179
- },
1180
-
1181
- //abstract
1182
- isInterfaceEnabled: function()
1183
- {
1184
- return this.enabledInterface === true;
1185
- },
1186
-
1187
- // abstract
1188
- enableInterface: function() {
1189
- var enabled = this._enabled && !this._readonly,
1190
- disabled = !enabled;
1191
-
1192
- if (enabled === this.enabledInterface) return false;
1193
-
1194
- this.container.toggleClass("select2-container-disabled", disabled);
1195
- this.close();
1196
- this.enabledInterface = enabled;
1197
-
1198
- return true;
1199
- },
1200
-
1201
- // abstract
1202
- enable: function(enabled) {
1203
- if (enabled === undefined) enabled = true;
1204
- if (this._enabled === enabled) return;
1205
- this._enabled = enabled;
1206
-
1207
- this.opts.element.prop("disabled", !enabled);
1208
- this.enableInterface();
1209
- },
1210
-
1211
- // abstract
1212
- disable: function() {
1213
- this.enable(false);
1214
- },
1215
-
1216
- // abstract
1217
- readonly: function(enabled) {
1218
- if (enabled === undefined) enabled = false;
1219
- if (this._readonly === enabled) return;
1220
- this._readonly = enabled;
1221
-
1222
- this.opts.element.prop("readonly", enabled);
1223
- this.enableInterface();
1224
- },
1225
-
1226
- // abstract
1227
- opened: function () {
1228
- return (this.container) ? this.container.hasClass("select2-dropdown-open") : false;
1229
- },
1230
-
1231
- // abstract
1232
- positionDropdown: function() {
1233
- var $dropdown = this.dropdown,
1234
- container = this.container,
1235
- offset = container.offset(),
1236
- height = container.outerHeight(false),
1237
- width = container.outerWidth(false),
1238
- dropHeight = $dropdown.outerHeight(false),
1239
- $window = $(window),
1240
- windowWidth = $window.width(),
1241
- windowHeight = $window.height(),
1242
- viewPortRight = $window.scrollLeft() + windowWidth,
1243
- viewportBottom = $window.scrollTop() + windowHeight,
1244
- dropTop = offset.top + height,
1245
- dropLeft = offset.left,
1246
- enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
1247
- enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
1248
- dropWidth = $dropdown.outerWidth(false),
1249
- enoughRoomOnRight = function() {
1250
- return dropLeft + dropWidth <= viewPortRight;
1251
- },
1252
- enoughRoomOnLeft = function() {
1253
- return offset.left + viewPortRight + container.outerWidth(false) > dropWidth;
1254
- },
1255
- aboveNow = $dropdown.hasClass("select2-drop-above"),
1256
- bodyOffset,
1257
- above,
1258
- changeDirection,
1259
- css,
1260
- resultsListNode;
1261
-
1262
- // always prefer the current above/below alignment, unless there is not enough room
1263
- if (aboveNow) {
1264
- above = true;
1265
- if (!enoughRoomAbove && enoughRoomBelow) {
1266
- changeDirection = true;
1267
- above = false;
1268
- }
1269
- } else {
1270
- above = false;
1271
- if (!enoughRoomBelow && enoughRoomAbove) {
1272
- changeDirection = true;
1273
- above = true;
1274
- }
1275
- }
1276
-
1277
- //if we are changing direction we need to get positions when dropdown is hidden;
1278
- if (changeDirection) {
1279
- $dropdown.hide();
1280
- offset = this.container.offset();
1281
- height = this.container.outerHeight(false);
1282
- width = this.container.outerWidth(false);
1283
- dropHeight = $dropdown.outerHeight(false);
1284
- viewPortRight = $window.scrollLeft() + windowWidth;
1285
- viewportBottom = $window.scrollTop() + windowHeight;
1286
- dropTop = offset.top + height;
1287
- dropLeft = offset.left;
1288
- dropWidth = $dropdown.outerWidth(false);
1289
- $dropdown.show();
1290
-
1291
- // fix so the cursor does not move to the left within the search-textbox in IE
1292
- this.focusSearch();
1293
- }
1294
-
1295
- if (this.opts.dropdownAutoWidth) {
1296
- resultsListNode = $('.select2-results', $dropdown)[0];
1297
- $dropdown.addClass('select2-drop-auto-width');
1298
- $dropdown.css('width', '');
1299
- // Add scrollbar width to dropdown if vertical scrollbar is present
1300
- dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
1301
- dropWidth > width ? width = dropWidth : dropWidth = width;
1302
- dropHeight = $dropdown.outerHeight(false);
1303
- }
1304
- else {
1305
- this.container.removeClass('select2-drop-auto-width');
1306
- }
1307
-
1308
- //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
1309
- //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
1310
-
1311
- // fix positioning when body has an offset and is not position: static
1312
- if (this.body.css('position') !== 'static') {
1313
- bodyOffset = this.body.offset();
1314
- dropTop -= bodyOffset.top;
1315
- dropLeft -= bodyOffset.left;
1316
- }
1317
-
1318
- if (!enoughRoomOnRight() && enoughRoomOnLeft()) {
1319
- dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
1320
- }
1321
-
1322
- css = {
1323
- left: dropLeft,
1324
- width: width
1325
- };
1326
-
1327
- if (above) {
1328
- css.top = offset.top - dropHeight;
1329
- css.bottom = 'auto';
1330
- this.container.addClass("select2-drop-above");
1331
- $dropdown.addClass("select2-drop-above");
1332
- }
1333
- else {
1334
- css.top = dropTop;
1335
- css.bottom = 'auto';
1336
- this.container.removeClass("select2-drop-above");
1337
- $dropdown.removeClass("select2-drop-above");
1338
- }
1339
- css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));
1340
-
1341
- $dropdown.css(css);
1342
- },
1343
-
1344
- // abstract
1345
- shouldOpen: function() {
1346
- var event;
1347
-
1348
- if (this.opened()) return false;
1349
-
1350
- if (this._enabled === false || this._readonly === true) return false;
1351
-
1352
- event = $.Event("select2-opening");
1353
- this.opts.element.trigger(event);
1354
- return !event.isDefaultPrevented();
1355
- },
1356
-
1357
- // abstract
1358
- clearDropdownAlignmentPreference: function() {
1359
- // clear the classes used to figure out the preference of where the dropdown should be opened
1360
- this.container.removeClass("select2-drop-above");
1361
- this.dropdown.removeClass("select2-drop-above");
1362
- },
1363
-
1364
- /**
1365
- * Opens the dropdown
1366
- *
1367
- * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
1368
- * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
1369
- */
1370
- // abstract
1371
- open: function () {
1372
-
1373
- if (!this.shouldOpen()) return false;
1374
-
1375
- this.opening();
1376
-
1377
- // Only bind the document mousemove when the dropdown is visible
1378
- $document.on("mousemove.select2Event", function (e) {
1379
- lastMousePosition.x = e.pageX;
1380
- lastMousePosition.y = e.pageY;
1381
- });
1382
-
1383
- return true;
1384
- },
1385
-
1386
- /**
1387
- * Performs the opening of the dropdown
1388
- */
1389
- // abstract
1390
- opening: function() {
1391
- var cid = this.containerEventName,
1392
- scroll = "scroll." + cid,
1393
- resize = "resize."+cid,
1394
- orient = "orientationchange."+cid,
1395
- mask;
1396
-
1397
- this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
1398
-
1399
- this.clearDropdownAlignmentPreference();
1400
-
1401
- if(this.dropdown[0] !== this.body.children().last()[0]) {
1402
- this.dropdown.detach().appendTo(this.body);
1403
- }
1404
-
1405
- // create the dropdown mask if doesn't already exist
1406
- mask = $("#select2-drop-mask");
1407
- if (mask.length === 0) {
1408
- mask = $(document.createElement("div"));
1409
- mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
1410
- mask.hide();
1411
- mask.appendTo(this.body);
1412
- mask.on("mousedown touchstart click", function (e) {
1413
- // Prevent IE from generating a click event on the body
1414
- reinsertElement(mask);
1415
-
1416
- var dropdown = $("#select2-drop"), self;
1417
- if (dropdown.length > 0) {
1418
- self=dropdown.data("select2");
1419
- if (self.opts.selectOnBlur) {
1420
- self.selectHighlighted({noFocus: true});
1421
- }
1422
- self.close();
1423
- e.preventDefault();
1424
- e.stopPropagation();
1425
- }
1426
- });
1427
- }
1428
-
1429
- // ensure the mask is always right before the dropdown
1430
- if (this.dropdown.prev()[0] !== mask[0]) {
1431
- this.dropdown.before(mask);
1432
- }
1433
-
1434
- // move the global id to the correct dropdown
1435
- $("#select2-drop").removeAttr("id");
1436
- this.dropdown.attr("id", "select2-drop");
1437
-
1438
- // show the elements
1439
- mask.show();
1440
-
1441
- this.positionDropdown();
1442
- this.dropdown.show();
1443
- this.positionDropdown();
1444
-
1445
- this.dropdown.addClass("select2-drop-active");
1446
-
1447
- // attach listeners to events that can change the position of the container and thus require
1448
- // the position of the dropdown to be updated as well so it does not come unglued from the container
1449
- var that = this;
1450
- this.container.parents().add(window).each(function () {
1451
- $(this).on(resize+" "+scroll+" "+orient, function (e) {
1452
- if (that.opened()) that.positionDropdown();
1453
- });
1454
- });
1455
-
1456
-
1457
- },
1458
-
1459
- // abstract
1460
- close: function () {
1461
- if (!this.opened()) return;
1462
-
1463
- var cid = this.containerEventName,
1464
- scroll = "scroll." + cid,
1465
- resize = "resize."+cid,
1466
- orient = "orientationchange."+cid;
1467
-
1468
- // unbind event listeners
1469
- this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
1470
-
1471
- this.clearDropdownAlignmentPreference();
1472
-
1473
- $("#select2-drop-mask").hide();
1474
- this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
1475
- this.dropdown.hide();
1476
- this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
1477
- this.results.empty();
1478
-
1479
- // Now that the dropdown is closed, unbind the global document mousemove event
1480
- $document.off("mousemove.select2Event");
1481
-
1482
- this.clearSearch();
1483
- this.search.removeClass("select2-active");
1484
- this.opts.element.trigger($.Event("select2-close"));
1485
- },
1486
-
1487
- /**
1488
- * Opens control, sets input value, and updates results.
1489
- */
1490
- // abstract
1491
- externalSearch: function (term) {
1492
- this.open();
1493
- this.search.val(term);
1494
- this.updateResults(false);
1495
- },
1496
-
1497
- // abstract
1498
- clearSearch: function () {
1499
-
1500
- },
1501
-
1502
- //abstract
1503
- getMaximumSelectionSize: function() {
1504
- return evaluate(this.opts.maximumSelectionSize, this.opts.element);
1505
- },
1506
-
1507
- // abstract
1508
- ensureHighlightVisible: function () {
1509
- var results = this.results, children, index, child, hb, rb, y, more, topOffset;
1510
-
1511
- index = this.highlight();
1512
-
1513
- if (index < 0) return;
1514
-
1515
- if (index == 0) {
1516
-
1517
- // if the first element is highlighted scroll all the way to the top,
1518
- // that way any unselectable headers above it will also be scrolled
1519
- // into view
1520
-
1521
- results.scrollTop(0);
1522
- return;
1523
- }
1524
-
1525
- children = this.findHighlightableChoices().find('.select2-result-label');
1526
-
1527
- child = $(children[index]);
1528
-
1529
- topOffset = (child.offset() || {}).top || 0;
1530
-
1531
- hb = topOffset + child.outerHeight(true);
1532
-
1533
- // if this is the last child lets also make sure select2-more-results is visible
1534
- if (index === children.length - 1) {
1535
- more = results.find("li.select2-more-results");
1536
- if (more.length > 0) {
1537
- hb = more.offset().top + more.outerHeight(true);
1538
- }
1539
- }
1540
-
1541
- rb = results.offset().top + results.outerHeight(false);
1542
- if (hb > rb) {
1543
- results.scrollTop(results.scrollTop() + (hb - rb));
1544
- }
1545
- y = topOffset - results.offset().top;
1546
-
1547
- // make sure the top of the element is visible
1548
- if (y < 0 && child.css('display') != 'none' ) {
1549
- results.scrollTop(results.scrollTop() + y); // y is negative
1550
- }
1551
- },
1552
-
1553
- // abstract
1554
- findHighlightableChoices: function() {
1555
- return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
1556
- },
1557
-
1558
- // abstract
1559
- moveHighlight: function (delta) {
1560
- var choices = this.findHighlightableChoices(),
1561
- index = this.highlight();
1562
-
1563
- while (index > -1 && index < choices.length) {
1564
- index += delta;
1565
- var choice = $(choices[index]);
1566
- if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
1567
- this.highlight(index);
1568
- break;
1569
- }
1570
- }
1571
- },
1572
-
1573
- // abstract
1574
- highlight: function (index) {
1575
- var choices = this.findHighlightableChoices(),
1576
- choice,
1577
- data;
1578
-
1579
- if (arguments.length === 0) {
1580
- return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
1581
- }
1582
-
1583
- if (index >= choices.length) index = choices.length - 1;
1584
- if (index < 0) index = 0;
1585
-
1586
- this.removeHighlight();
1587
-
1588
- choice = $(choices[index]);
1589
- choice.addClass("select2-highlighted");
1590
-
1591
- // ensure assistive technology can determine the active choice
1592
- this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
1593
-
1594
- this.ensureHighlightVisible();
1595
-
1596
- this.liveRegion.text(choice.text());
1597
-
1598
- data = choice.data("select2-data");
1599
- if (data) {
1600
- this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
1601
- }
1602
- },
1603
-
1604
- removeHighlight: function() {
1605
- this.results.find(".select2-highlighted").removeClass("select2-highlighted");
1606
- },
1607
-
1608
- touchMoved: function() {
1609
- this._touchMoved = true;
1610
- },
1611
-
1612
- clearTouchMoved: function() {
1613
- this._touchMoved = false;
1614
- },
1615
-
1616
- // abstract
1617
- countSelectableResults: function() {
1618
- return this.findHighlightableChoices().length;
1619
- },
1620
-
1621
- // abstract
1622
- highlightUnderEvent: function (event) {
1623
- var el = $(event.target).closest(".select2-result-selectable");
1624
- if (el.length > 0 && !el.is(".select2-highlighted")) {
1625
- var choices = this.findHighlightableChoices();
1626
- this.highlight(choices.index(el));
1627
- } else if (el.length == 0) {
1628
- // if we are over an unselectable item remove all highlights
1629
- this.removeHighlight();
1630
- }
1631
- },
1632
-
1633
- // abstract
1634
- loadMoreIfNeeded: function () {
1635
- var results = this.results,
1636
- more = results.find("li.select2-more-results"),
1637
- below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
1638
- page = this.resultsPage + 1,
1639
- self=this,
1640
- term=this.search.val(),
1641
- context=this.context;
1642
-
1643
- if (more.length === 0) return;
1644
- below = more.offset().top - results.offset().top - results.height();
1645
-
1646
- if (below <= this.opts.loadMorePadding) {
1647
- more.addClass("select2-active");
1648
- this.opts.query({
1649
- element: this.opts.element,
1650
- term: term,
1651
- page: page,
1652
- context: context,
1653
- matcher: this.opts.matcher,
1654
- callback: this.bind(function (data) {
1655
-
1656
- // ignore a response if the select2 has been closed before it was received
1657
- if (!self.opened()) return;
1658
-
1659
-
1660
- self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
1661
- self.postprocessResults(data, false, false);
1662
-
1663
- if (data.more===true) {
1664
- more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1)));
1665
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1666
- } else {
1667
- more.remove();
1668
- }
1669
- self.positionDropdown();
1670
- self.resultsPage = page;
1671
- self.context = data.context;
1672
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1673
- })});
1674
- }
1675
- },
1676
-
1677
- /**
1678
- * Default tokenizer function which does nothing
1679
- */
1680
- tokenize: function() {
1681
-
1682
- },
1683
-
1684
- /**
1685
- * @param initial whether or not this is the call to this method right after the dropdown has been opened
1686
- */
1687
- // abstract
1688
- updateResults: function (initial) {
1689
- var search = this.search,
1690
- results = this.results,
1691
- opts = this.opts,
1692
- data,
1693
- self = this,
1694
- input,
1695
- term = search.val(),
1696
- lastTerm = $.data(this.container, "select2-last-term"),
1697
- // sequence number used to drop out-of-order responses
1698
- queryNumber;
1699
-
1700
- // prevent duplicate queries against the same term
1701
- if (initial !== true && lastTerm && equal(term, lastTerm)) return;
1702
-
1703
- $.data(this.container, "select2-last-term", term);
1704
-
1705
- // if the search is currently hidden we do not alter the results
1706
- if (initial !== true && (this.showSearchInput === false || !this.opened())) {
1707
- return;
1708
- }
1709
-
1710
- function postRender() {
1711
- search.removeClass("select2-active");
1712
- self.positionDropdown();
1713
- if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
1714
- self.liveRegion.text(results.text());
1715
- }
1716
- else {
1717
- self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(".select2-selected")').length));
1718
- }
1719
- }
1720
-
1721
- function render(html) {
1722
- results.html(html);
1723
- postRender();
1724
- }
1725
-
1726
- queryNumber = ++this.queryCount;
1727
-
1728
- var maxSelSize = this.getMaximumSelectionSize();
1729
- if (maxSelSize >=1) {
1730
- data = this.data();
1731
- if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
1732
- render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "</li>");
1733
- return;
1734
- }
1735
- }
1736
-
1737
- if (search.val().length < opts.minimumInputLength) {
1738
- if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
1739
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "</li>");
1740
- } else {
1741
- render("");
1742
- }
1743
- if (initial && this.showSearch) this.showSearch(true);
1744
- return;
1745
- }
1746
-
1747
- if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
1748
- if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
1749
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "</li>");
1750
- } else {
1751
- render("");
1752
- }
1753
- return;
1754
- }
1755
-
1756
- if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
1757
- render("<li class='select2-searching'>" + evaluate(opts.formatSearching, opts.element) + "</li>");
1758
- }
1759
-
1760
- search.addClass("select2-active");
1761
-
1762
- this.removeHighlight();
1763
-
1764
- // give the tokenizer a chance to pre-process the input
1765
- input = this.tokenize();
1766
- if (input != undefined && input != null) {
1767
- search.val(input);
1768
- }
1769
-
1770
- this.resultsPage = 1;
1771
-
1772
- opts.query({
1773
- element: opts.element,
1774
- term: search.val(),
1775
- page: this.resultsPage,
1776
- context: null,
1777
- matcher: opts.matcher,
1778
- callback: this.bind(function (data) {
1779
- var def; // default choice
1780
-
1781
- // ignore old responses
1782
- if (queryNumber != this.queryCount) {
1783
- return;
1784
- }
1785
-
1786
- // ignore a response if the select2 has been closed before it was received
1787
- if (!this.opened()) {
1788
- this.search.removeClass("select2-active");
1789
- return;
1790
- }
1791
-
1792
- // handle ajax error
1793
- if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) {
1794
- render("<li class='select2-ajax-error'>" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "</li>");
1795
- return;
1796
- }
1797
-
1798
- // save context, if any
1799
- this.context = (data.context===undefined) ? null : data.context;
1800
- // create a default choice and prepend it to the list
1801
- if (this.opts.createSearchChoice && search.val() !== "") {
1802
- def = this.opts.createSearchChoice.call(self, search.val(), data.results);
1803
- if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
1804
- if ($(data.results).filter(
1805
- function () {
1806
- return equal(self.id(this), self.id(def));
1807
- }).length === 0) {
1808
- this.opts.createSearchChoicePosition(data.results, def);
1809
- }
1810
- }
1811
- }
1812
-
1813
- if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
1814
- render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, opts.element, search.val()) + "</li>");
1815
- return;
1816
- }
1817
-
1818
- results.empty();
1819
- self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
1820
-
1821
- if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
1822
- results.append("<li class='select2-more-results'>" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "</li>");
1823
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1824
- }
1825
-
1826
- this.postprocessResults(data, initial);
1827
-
1828
- postRender();
1829
-
1830
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1831
- })});
1832
- },
1833
-
1834
- // abstract
1835
- cancel: function () {
1836
- this.close();
1837
- },
1838
-
1839
- // abstract
1840
- blur: function () {
1841
- // if selectOnBlur == true, select the currently highlighted option
1842
- if (this.opts.selectOnBlur)
1843
- this.selectHighlighted({noFocus: true});
1844
-
1845
- this.close();
1846
- this.container.removeClass("select2-container-active");
1847
- // synonymous to .is(':focus'), which is available in jquery >= 1.6
1848
- if (this.search[0] === document.activeElement) { this.search.blur(); }
1849
- this.clearSearch();
1850
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
1851
- },
1852
-
1853
- // abstract
1854
- focusSearch: function () {
1855
- focus(this.search);
1856
- },
1857
-
1858
- // abstract
1859
- selectHighlighted: function (options) {
1860
- if (this._touchMoved) {
1861
- this.clearTouchMoved();
1862
- return;
1863
- }
1864
- var index=this.highlight(),
1865
- highlighted=this.results.find(".select2-highlighted"),
1866
- data = highlighted.closest('.select2-result').data("select2-data");
1867
-
1868
- if (data) {
1869
- this.highlight(index);
1870
- this.onSelect(data, options);
1871
- } else if (options && options.noFocus) {
1872
- this.close();
1873
- }
1874
- },
1875
-
1876
- // abstract
1877
- getPlaceholder: function () {
1878
- var placeholderOption;
1879
- return this.opts.element.attr("placeholder") ||
1880
- this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
1881
- this.opts.element.data("placeholder") ||
1882
- this.opts.placeholder ||
1883
- ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
1884
- },
1885
-
1886
- // abstract
1887
- getPlaceholderOption: function() {
1888
- if (this.select) {
1889
- var firstOption = this.select.children('option').first();
1890
- if (this.opts.placeholderOption !== undefined ) {
1891
- //Determine the placeholder option based on the specified placeholderOption setting
1892
- return (this.opts.placeholderOption === "first" && firstOption) ||
1893
- (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
1894
- } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
1895
- //No explicit placeholder option specified, use the first if it's blank
1896
- return firstOption;
1897
- }
1898
- }
1899
- },
1900
-
1901
- /**
1902
- * Get the desired width for the container element. This is
1903
- * derived first from option `width` passed to select2, then
1904
- * the inline 'style' on the original element, and finally
1905
- * falls back to the jQuery calculated element width.
1906
- */
1907
- // abstract
1908
- initContainerWidth: function () {
1909
- function resolveContainerWidth() {
1910
- var style, attrs, matches, i, l, attr;
1911
-
1912
- if (this.opts.width === "off") {
1913
- return null;
1914
- } else if (this.opts.width === "element"){
1915
- return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
1916
- } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
1917
- // check if there is inline style on the element that contains width
1918
- style = this.opts.element.attr('style');
1919
- if (style !== undefined) {
1920
- attrs = style.split(';');
1921
- for (i = 0, l = attrs.length; i < l; i = i + 1) {
1922
- attr = attrs[i].replace(/\s/g, '');
1923
- matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
1924
- if (matches !== null && matches.length >= 1)
1925
- return matches[1];
1926
- }
1927
- }
1928
-
1929
- if (this.opts.width === "resolve") {
1930
- // next check if css('width') can resolve a width that is percent based, this is sometimes possible
1931
- // when attached to input type=hidden or elements hidden via css
1932
- style = this.opts.element.css('width');
1933
- if (style.indexOf("%") > 0) return style;
1934
-
1935
- // finally, fallback on the calculated width of the element
1936
- return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
1937
- }
1938
-
1939
- return null;
1940
- } else if ($.isFunction(this.opts.width)) {
1941
- return this.opts.width();
1942
- } else {
1943
- return this.opts.width;
1944
- }
1945
- };
1946
-
1947
- var width = resolveContainerWidth.call(this);
1948
- if (width !== null) {
1949
- this.container.css("width", width);
1950
- }
1951
- }
1952
- });
1953
-
1954
- SingleSelect2 = clazz(AbstractSelect2, {
1955
-
1956
- // single
1957
-
1958
- createContainer: function () {
1959
- var container = $(document.createElement("div")).attr({
1960
- "class": "select2-container"
1961
- }).html([
1962
- "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
1963
- " <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>",
1964
- " <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
1965
- "</a>",
1966
- "<label for='' class='select2-offscreen'></label>",
1967
- "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
1968
- "<div class='select2-drop select2-display-none'>",
1969
- " <div class='select2-search'>",
1970
- " <label for='' class='select2-offscreen'></label>",
1971
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
1972
- " aria-autocomplete='list' />",
1973
- " </div>",
1974
- " <ul class='select2-results' role='listbox'>",
1975
- " </ul>",
1976
- "</div>"].join(""));
1977
- return container;
1978
- },
1979
-
1980
- // single
1981
- enableInterface: function() {
1982
- if (this.parent.enableInterface.apply(this, arguments)) {
1983
- this.focusser.prop("disabled", !this.isInterfaceEnabled());
1984
- }
1985
- },
1986
-
1987
- // single
1988
- opening: function () {
1989
- var el, range, len;
1990
-
1991
- if (this.opts.minimumResultsForSearch >= 0) {
1992
- this.showSearch(true);
1993
- }
1994
-
1995
- this.parent.opening.apply(this, arguments);
1996
-
1997
- if (this.showSearchInput !== false) {
1998
- // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
1999
- // all other browsers handle this just fine
2000
-
2001
- this.search.val(this.focusser.val());
2002
- }
2003
- if (this.opts.shouldFocusInput(this)) {
2004
- this.search.focus();
2005
- // move the cursor to the end after focussing, otherwise it will be at the beginning and
2006
- // new text will appear *before* focusser.val()
2007
- el = this.search.get(0);
2008
- if (el.createTextRange) {
2009
- range = el.createTextRange();
2010
- range.collapse(false);
2011
- range.select();
2012
- } else if (el.setSelectionRange) {
2013
- len = this.search.val().length;
2014
- el.setSelectionRange(len, len);
2015
- }
2016
- }
2017
-
2018
- // initializes search's value with nextSearchTerm (if defined by user)
2019
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
2020
- if(this.search.val() === "") {
2021
- if(this.nextSearchTerm != undefined){
2022
- this.search.val(this.nextSearchTerm);
2023
- this.search.select();
2024
- }
2025
- }
2026
-
2027
- this.focusser.prop("disabled", true).val("");
2028
- this.updateResults(true);
2029
- this.opts.element.trigger($.Event("select2-open"));
2030
- },
2031
-
2032
- // single
2033
- close: function () {
2034
- if (!this.opened()) return;
2035
- this.parent.close.apply(this, arguments);
2036
-
2037
- this.focusser.prop("disabled", false);
2038
-
2039
- if (this.opts.shouldFocusInput(this)) {
2040
- this.focusser.focus();
2041
- }
2042
- },
2043
-
2044
- // single
2045
- focus: function () {
2046
- if (this.opened()) {
2047
- this.close();
2048
- } else {
2049
- this.focusser.prop("disabled", false);
2050
- if (this.opts.shouldFocusInput(this)) {
2051
- this.focusser.focus();
2052
- }
2053
- }
2054
- },
2055
-
2056
- // single
2057
- isFocused: function () {
2058
- return this.container.hasClass("select2-container-active");
2059
- },
2060
-
2061
- // single
2062
- cancel: function () {
2063
- this.parent.cancel.apply(this, arguments);
2064
- this.focusser.prop("disabled", false);
2065
-
2066
- if (this.opts.shouldFocusInput(this)) {
2067
- this.focusser.focus();
2068
- }
2069
- },
2070
-
2071
- // single
2072
- destroy: function() {
2073
- $("label[for='" + this.focusser.attr('id') + "']")
2074
- .attr('for', this.opts.element.attr("id"));
2075
- this.parent.destroy.apply(this, arguments);
2076
-
2077
- cleanupJQueryElements.call(this,
2078
- "selection",
2079
- "focusser"
2080
- );
2081
- },
2082
-
2083
- // single
2084
- initContainer: function () {
2085
-
2086
- var selection,
2087
- container = this.container,
2088
- dropdown = this.dropdown,
2089
- idSuffix = nextUid(),
2090
- elementLabel;
2091
-
2092
- if (this.opts.minimumResultsForSearch < 0) {
2093
- this.showSearch(false);
2094
- } else {
2095
- this.showSearch(true);
2096
- }
2097
-
2098
- this.selection = selection = container.find(".select2-choice");
2099
-
2100
- this.focusser = container.find(".select2-focusser");
2101
-
2102
- // add aria associations
2103
- selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
2104
- this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
2105
- this.results.attr("id", "select2-results-"+idSuffix);
2106
- this.search.attr("aria-owns", "select2-results-"+idSuffix);
2107
-
2108
- // rewrite labels from original element to focusser
2109
- this.focusser.attr("id", "s2id_autogen"+idSuffix);
2110
-
2111
- elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
2112
- this.opts.element.focus(this.bind(function () { this.focus(); }));
2113
-
2114
- this.focusser.prev()
2115
- .text(elementLabel.text())
2116
- .attr('for', this.focusser.attr('id'));
2117
-
2118
- // Ensure the original element retains an accessible name
2119
- var originalTitle = this.opts.element.attr("title");
2120
- this.opts.element.attr("title", (originalTitle || elementLabel.text()));
2121
-
2122
- this.focusser.attr("tabindex", this.elementTabIndex);
2123
-
2124
- // write label for search field using the label from the focusser element
2125
- this.search.attr("id", this.focusser.attr('id') + '_search');
2126
-
2127
- this.search.prev()
2128
- .text($("label[for='" + this.focusser.attr('id') + "']").text())
2129
- .attr('for', this.search.attr('id'));
2130
-
2131
- this.search.on("keydown", this.bind(function (e) {
2132
- if (!this.isInterfaceEnabled()) return;
2133
-
2134
- // filter 229 keyCodes (input method editor is processing key input)
2135
- if (229 == e.keyCode) return;
2136
-
2137
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2138
- // prevent the page from scrolling
2139
- killEvent(e);
2140
- return;
2141
- }
2142
-
2143
- switch (e.which) {
2144
- case KEY.UP:
2145
- case KEY.DOWN:
2146
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2147
- killEvent(e);
2148
- return;
2149
- case KEY.ENTER:
2150
- this.selectHighlighted();
2151
- killEvent(e);
2152
- return;
2153
- case KEY.TAB:
2154
- this.selectHighlighted({noFocus: true});
2155
- return;
2156
- case KEY.ESC:
2157
- this.cancel(e);
2158
- killEvent(e);
2159
- return;
2160
- }
2161
- }));
2162
-
2163
- this.search.on("blur", this.bind(function(e) {
2164
- // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
2165
- // without this the search field loses focus which is annoying
2166
- if (document.activeElement === this.body.get(0)) {
2167
- window.setTimeout(this.bind(function() {
2168
- if (this.opened()) {
2169
- this.search.focus();
2170
- }
2171
- }), 0);
2172
- }
2173
- }));
2174
-
2175
- this.focusser.on("keydown", this.bind(function (e) {
2176
- if (!this.isInterfaceEnabled()) return;
2177
-
2178
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
2179
- return;
2180
- }
2181
-
2182
- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
2183
- killEvent(e);
2184
- return;
2185
- }
2186
-
2187
- if (e.which == KEY.DOWN || e.which == KEY.UP
2188
- || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
2189
-
2190
- if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
2191
-
2192
- this.open();
2193
- killEvent(e);
2194
- return;
2195
- }
2196
-
2197
- if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
2198
- if (this.opts.allowClear) {
2199
- this.clear();
2200
- }
2201
- killEvent(e);
2202
- return;
2203
- }
2204
- }));
2205
-
2206
-
2207
- installKeyUpChangeEvent(this.focusser);
2208
- this.focusser.on("keyup-change input", this.bind(function(e) {
2209
- if (this.opts.minimumResultsForSearch >= 0) {
2210
- e.stopPropagation();
2211
- if (this.opened()) return;
2212
- this.open();
2213
- }
2214
- }));
2215
-
2216
- selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
2217
- if (!this.isInterfaceEnabled()) {
2218
- return;
2219
- }
2220
-
2221
- this.clear();
2222
- killEventImmediately(e);
2223
- this.close();
2224
-
2225
- if (this.selection) {
2226
- this.selection.focus();
2227
- }
2228
- }));
2229
-
2230
- selection.on("mousedown touchstart", this.bind(function (e) {
2231
- // Prevent IE from generating a click event on the body
2232
- reinsertElement(selection);
2233
-
2234
- if (!this.container.hasClass("select2-container-active")) {
2235
- this.opts.element.trigger($.Event("select2-focus"));
2236
- }
2237
-
2238
- if (this.opened()) {
2239
- this.close();
2240
- } else if (this.isInterfaceEnabled()) {
2241
- this.open();
2242
- }
2243
-
2244
- killEvent(e);
2245
- }));
2246
-
2247
- dropdown.on("mousedown touchstart", this.bind(function() {
2248
- if (this.opts.shouldFocusInput(this)) {
2249
- this.search.focus();
2250
- }
2251
- }));
2252
-
2253
- selection.on("focus", this.bind(function(e) {
2254
- killEvent(e);
2255
- }));
2256
-
2257
- this.focusser.on("focus", this.bind(function(){
2258
- if (!this.container.hasClass("select2-container-active")) {
2259
- this.opts.element.trigger($.Event("select2-focus"));
2260
- }
2261
- this.container.addClass("select2-container-active");
2262
- })).on("blur", this.bind(function() {
2263
- if (!this.opened()) {
2264
- this.container.removeClass("select2-container-active");
2265
- this.opts.element.trigger($.Event("select2-blur"));
2266
- }
2267
- }));
2268
- this.search.on("focus", this.bind(function(){
2269
- if (!this.container.hasClass("select2-container-active")) {
2270
- this.opts.element.trigger($.Event("select2-focus"));
2271
- }
2272
- this.container.addClass("select2-container-active");
2273
- }));
2274
-
2275
- this.initContainerWidth();
2276
- this.opts.element.hide();
2277
- this.setPlaceholder();
2278
-
2279
- },
2280
-
2281
- // single
2282
- clear: function(triggerChange) {
2283
- var data=this.selection.data("select2-data");
2284
- if (data) { // guard against queued quick consecutive clicks
2285
- var evt = $.Event("select2-clearing");
2286
- this.opts.element.trigger(evt);
2287
- if (evt.isDefaultPrevented()) {
2288
- return;
2289
- }
2290
- var placeholderOption = this.getPlaceholderOption();
2291
- this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
2292
- this.selection.find(".select2-chosen").empty();
2293
- this.selection.removeData("select2-data");
2294
- this.setPlaceholder();
2295
-
2296
- if (triggerChange !== false){
2297
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
2298
- this.triggerChange({removed:data});
2299
- }
2300
- }
2301
- },
2302
-
2303
- /**
2304
- * Sets selection based on source element's value
2305
- */
2306
- // single
2307
- initSelection: function () {
2308
- var selected;
2309
- if (this.isPlaceholderOptionSelected()) {
2310
- this.updateSelection(null);
2311
- this.close();
2312
- this.setPlaceholder();
2313
- } else {
2314
- var self = this;
2315
- this.opts.initSelection.call(null, this.opts.element, function(selected){
2316
- if (selected !== undefined && selected !== null) {
2317
- self.updateSelection(selected);
2318
- self.close();
2319
- self.setPlaceholder();
2320
- self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());
2321
- }
2322
- });
2323
- }
2324
- },
2325
-
2326
- isPlaceholderOptionSelected: function() {
2327
- var placeholderOption;
2328
- if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
2329
- return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
2330
- || (this.opts.element.val() === "")
2331
- || (this.opts.element.val() === undefined)
2332
- || (this.opts.element.val() === null);
2333
- },
2334
-
2335
- // single
2336
- prepareOpts: function () {
2337
- var opts = this.parent.prepareOpts.apply(this, arguments),
2338
- self=this;
2339
-
2340
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2341
- // install the selection initializer
2342
- opts.initSelection = function (element, callback) {
2343
- var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
2344
- // a single select box always has a value, no need to null check 'selected'
2345
- callback(self.optionToData(selected));
2346
- };
2347
- } else if ("data" in opts) {
2348
- // install default initSelection when applied to hidden input and data is local
2349
- opts.initSelection = opts.initSelection || function (element, callback) {
2350
- var id = element.val();
2351
- //search in data by id, storing the actual matching item
2352
- var match = null;
2353
- opts.query({
2354
- matcher: function(term, text, el){
2355
- var is_match = equal(id, opts.id(el));
2356
- if (is_match) {
2357
- match = el;
2358
- }
2359
- return is_match;
2360
- },
2361
- callback: !$.isFunction(callback) ? $.noop : function() {
2362
- callback(match);
2363
- }
2364
- });
2365
- };
2366
- }
2367
-
2368
- return opts;
2369
- },
2370
-
2371
- // single
2372
- getPlaceholder: function() {
2373
- // if a placeholder is specified on a single select without a valid placeholder option ignore it
2374
- if (this.select) {
2375
- if (this.getPlaceholderOption() === undefined) {
2376
- return undefined;
2377
- }
2378
- }
2379
-
2380
- return this.parent.getPlaceholder.apply(this, arguments);
2381
- },
2382
-
2383
- // single
2384
- setPlaceholder: function () {
2385
- var placeholder = this.getPlaceholder();
2386
-
2387
- if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
2388
-
2389
- // check for a placeholder option if attached to a select
2390
- if (this.select && this.getPlaceholderOption() === undefined) return;
2391
-
2392
- this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
2393
-
2394
- this.selection.addClass("select2-default");
2395
-
2396
- this.container.removeClass("select2-allowclear");
2397
- }
2398
- },
2399
-
2400
- // single
2401
- postprocessResults: function (data, initial, noHighlightUpdate) {
2402
- var selected = 0, self = this, showSearchInput = true;
2403
-
2404
- // find the selected element in the result list
2405
-
2406
- this.findHighlightableChoices().each2(function (i, elm) {
2407
- if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
2408
- selected = i;
2409
- return false;
2410
- }
2411
- });
2412
-
2413
- // and highlight it
2414
- if (noHighlightUpdate !== false) {
2415
- if (initial === true && selected >= 0) {
2416
- this.highlight(selected);
2417
- } else {
2418
- this.highlight(0);
2419
- }
2420
- }
2421
-
2422
- // hide the search box if this is the first we got the results and there are enough of them for search
2423
-
2424
- if (initial === true) {
2425
- var min = this.opts.minimumResultsForSearch;
2426
- if (min >= 0) {
2427
- this.showSearch(countResults(data.results) >= min);
2428
- }
2429
- }
2430
- },
2431
-
2432
- // single
2433
- showSearch: function(showSearchInput) {
2434
- if (this.showSearchInput === showSearchInput) return;
2435
-
2436
- this.showSearchInput = showSearchInput;
2437
-
2438
- this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
2439
- this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
2440
- //add "select2-with-searchbox" to the container if search box is shown
2441
- $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
2442
- },
2443
-
2444
- // single
2445
- onSelect: function (data, options) {
2446
-
2447
- if (!this.triggerSelect(data)) { return; }
2448
-
2449
- var old = this.opts.element.val(),
2450
- oldData = this.data();
2451
-
2452
- this.opts.element.val(this.id(data));
2453
- this.updateSelection(data);
2454
-
2455
- this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
2456
-
2457
- this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
2458
- this.close();
2459
-
2460
- if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
2461
- this.focusser.focus();
2462
- }
2463
-
2464
- if (!equal(old, this.id(data))) {
2465
- this.triggerChange({ added: data, removed: oldData });
2466
- }
2467
- },
2468
-
2469
- // single
2470
- updateSelection: function (data) {
2471
-
2472
- var container=this.selection.find(".select2-chosen"), formatted, cssClass;
2473
-
2474
- this.selection.data("select2-data", data);
2475
-
2476
- container.empty();
2477
- if (data !== null) {
2478
- formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
2479
- }
2480
- if (formatted !== undefined) {
2481
- container.append(formatted);
2482
- }
2483
- cssClass=this.opts.formatSelectionCssClass(data, container);
2484
- if (cssClass !== undefined) {
2485
- container.addClass(cssClass);
2486
- }
2487
-
2488
- this.selection.removeClass("select2-default");
2489
-
2490
- if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
2491
- this.container.addClass("select2-allowclear");
2492
- }
2493
- },
2494
-
2495
- // single
2496
- val: function () {
2497
- var val,
2498
- triggerChange = false,
2499
- data = null,
2500
- self = this,
2501
- oldData = this.data();
2502
-
2503
- if (arguments.length === 0) {
2504
- return this.opts.element.val();
2505
- }
2506
-
2507
- val = arguments[0];
2508
-
2509
- if (arguments.length > 1) {
2510
- triggerChange = arguments[1];
2511
- }
2512
-
2513
- if (this.select) {
2514
- this.select
2515
- .val(val)
2516
- .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
2517
- data = self.optionToData(elm);
2518
- return false;
2519
- });
2520
- this.updateSelection(data);
2521
- this.setPlaceholder();
2522
- if (triggerChange) {
2523
- this.triggerChange({added: data, removed:oldData});
2524
- }
2525
- } else {
2526
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
2527
- if (!val && val !== 0) {
2528
- this.clear(triggerChange);
2529
- return;
2530
- }
2531
- if (this.opts.initSelection === undefined) {
2532
- throw new Error("cannot call val() if initSelection() is not defined");
2533
- }
2534
- this.opts.element.val(val);
2535
- this.opts.initSelection(this.opts.element, function(data){
2536
- self.opts.element.val(!data ? "" : self.id(data));
2537
- self.updateSelection(data);
2538
- self.setPlaceholder();
2539
- if (triggerChange) {
2540
- self.triggerChange({added: data, removed:oldData});
2541
- }
2542
- });
2543
- }
2544
- },
2545
-
2546
- // single
2547
- clearSearch: function () {
2548
- this.search.val("");
2549
- this.focusser.val("");
2550
- },
2551
-
2552
- // single
2553
- data: function(value) {
2554
- var data,
2555
- triggerChange = false;
2556
-
2557
- if (arguments.length === 0) {
2558
- data = this.selection.data("select2-data");
2559
- if (data == undefined) data = null;
2560
- return data;
2561
- } else {
2562
- if (arguments.length > 1) {
2563
- triggerChange = arguments[1];
2564
- }
2565
- if (!value) {
2566
- this.clear(triggerChange);
2567
- } else {
2568
- data = this.data();
2569
- this.opts.element.val(!value ? "" : this.id(value));
2570
- this.updateSelection(value);
2571
- if (triggerChange) {
2572
- this.triggerChange({added: value, removed:data});
2573
- }
2574
- }
2575
- }
2576
- }
2577
- });
2578
-
2579
- MultiSelect2 = clazz(AbstractSelect2, {
2580
-
2581
- // multi
2582
- createContainer: function () {
2583
- var container = $(document.createElement("div")).attr({
2584
- "class": "select2-container select2-container-multi"
2585
- }).html([
2586
- "<ul class='select2-choices'>",
2587
- " <li class='select2-search-field'>",
2588
- " <label for='' class='select2-offscreen'></label>",
2589
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
2590
- " </li>",
2591
- "</ul>",
2592
- "<div class='select2-drop select2-drop-multi select2-display-none'>",
2593
- " <ul class='select2-results'>",
2594
- " </ul>",
2595
- "</div>"].join(""));
2596
- return container;
2597
- },
2598
-
2599
- // multi
2600
- prepareOpts: function () {
2601
- var opts = this.parent.prepareOpts.apply(this, arguments),
2602
- self=this;
2603
-
2604
- // TODO validate placeholder is a string if specified
2605
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2606
- // install the selection initializer
2607
- opts.initSelection = function (element, callback) {
2608
-
2609
- var data = [];
2610
-
2611
- element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
2612
- data.push(self.optionToData(elm));
2613
- });
2614
- callback(data);
2615
- };
2616
- } else if ("data" in opts) {
2617
- // install default initSelection when applied to hidden input and data is local
2618
- opts.initSelection = opts.initSelection || function (element, callback) {
2619
- var ids = splitVal(element.val(), opts.separator, opts.transformVal);
2620
- //search in data by array of ids, storing matching items in a list
2621
- var matches = [];
2622
- opts.query({
2623
- matcher: function(term, text, el){
2624
- var is_match = $.grep(ids, function(id) {
2625
- return equal(id, opts.id(el));
2626
- }).length;
2627
- if (is_match) {
2628
- matches.push(el);
2629
- }
2630
- return is_match;
2631
- },
2632
- callback: !$.isFunction(callback) ? $.noop : function() {
2633
- // reorder matches based on the order they appear in the ids array because right now
2634
- // they are in the order in which they appear in data array
2635
- var ordered = [];
2636
- for (var i = 0; i < ids.length; i++) {
2637
- var id = ids[i];
2638
- for (var j = 0; j < matches.length; j++) {
2639
- var match = matches[j];
2640
- if (equal(id, opts.id(match))) {
2641
- ordered.push(match);
2642
- matches.splice(j, 1);
2643
- break;
2644
- }
2645
- }
2646
- }
2647
- callback(ordered);
2648
- }
2649
- });
2650
- };
2651
- }
2652
-
2653
- return opts;
2654
- },
2655
-
2656
- // multi
2657
- selectChoice: function (choice) {
2658
-
2659
- var selected = this.container.find(".select2-search-choice-focus");
2660
- if (selected.length && choice && choice[0] == selected[0]) {
2661
-
2662
- } else {
2663
- if (selected.length) {
2664
- this.opts.element.trigger("choice-deselected", selected);
2665
- }
2666
- selected.removeClass("select2-search-choice-focus");
2667
- if (choice && choice.length) {
2668
- this.close();
2669
- choice.addClass("select2-search-choice-focus");
2670
- this.opts.element.trigger("choice-selected", choice);
2671
- }
2672
- }
2673
- },
2674
-
2675
- // multi
2676
- destroy: function() {
2677
- $("label[for='" + this.search.attr('id') + "']")
2678
- .attr('for', this.opts.element.attr("id"));
2679
- this.parent.destroy.apply(this, arguments);
2680
-
2681
- cleanupJQueryElements.call(this,
2682
- "searchContainer",
2683
- "selection"
2684
- );
2685
- },
2686
-
2687
- // multi
2688
- initContainer: function () {
2689
-
2690
- var selector = ".select2-choices", selection;
2691
-
2692
- this.searchContainer = this.container.find(".select2-search-field");
2693
- this.selection = selection = this.container.find(selector);
2694
-
2695
- var _this = this;
2696
- this.selection.on("click", ".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)", function (e) {
2697
- _this.search[0].focus();
2698
- _this.selectChoice($(this));
2699
- });
2700
-
2701
- // rewrite labels from original element to focusser
2702
- this.search.attr("id", "s2id_autogen"+nextUid());
2703
-
2704
- this.search.prev()
2705
- .text($("label[for='" + this.opts.element.attr("id") + "']").text())
2706
- .attr('for', this.search.attr('id'));
2707
- this.opts.element.focus(this.bind(function () { this.focus(); }));
2708
-
2709
- this.search.on("input paste", this.bind(function() {
2710
- if (this.search.attr('placeholder') && this.search.val().length == 0) return;
2711
- if (!this.isInterfaceEnabled()) return;
2712
- if (!this.opened()) {
2713
- this.open();
2714
- }
2715
- }));
2716
-
2717
- this.search.attr("tabindex", this.elementTabIndex);
2718
-
2719
- this.keydowns = 0;
2720
- this.search.on("keydown", this.bind(function (e) {
2721
- if (!this.isInterfaceEnabled()) return;
2722
-
2723
- ++this.keydowns;
2724
- var selected = selection.find(".select2-search-choice-focus");
2725
- var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
2726
- var next = selected.next(".select2-search-choice:not(.select2-locked)");
2727
- var pos = getCursorInfo(this.search);
2728
-
2729
- if (selected.length &&
2730
- (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
2731
- var selectedChoice = selected;
2732
- if (e.which == KEY.LEFT && prev.length) {
2733
- selectedChoice = prev;
2734
- }
2735
- else if (e.which == KEY.RIGHT) {
2736
- selectedChoice = next.length ? next : null;
2737
- }
2738
- else if (e.which === KEY.BACKSPACE) {
2739
- if (this.unselect(selected.first())) {
2740
- this.search.width(10);
2741
- selectedChoice = prev.length ? prev : next;
2742
- }
2743
- } else if (e.which == KEY.DELETE) {
2744
- if (this.unselect(selected.first())) {
2745
- this.search.width(10);
2746
- selectedChoice = next.length ? next : null;
2747
- }
2748
- } else if (e.which == KEY.ENTER) {
2749
- selectedChoice = null;
2750
- }
2751
-
2752
- this.selectChoice(selectedChoice);
2753
- killEvent(e);
2754
- if (!selectedChoice || !selectedChoice.length) {
2755
- this.open();
2756
- }
2757
- return;
2758
- } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
2759
- || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
2760
-
2761
- this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
2762
- killEvent(e);
2763
- return;
2764
- } else {
2765
- this.selectChoice(null);
2766
- }
2767
-
2768
- if (this.opened()) {
2769
- switch (e.which) {
2770
- case KEY.UP:
2771
- case KEY.DOWN:
2772
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2773
- killEvent(e);
2774
- return;
2775
- case KEY.ENTER:
2776
- this.selectHighlighted();
2777
- killEvent(e);
2778
- return;
2779
- case KEY.TAB:
2780
- this.selectHighlighted({noFocus:true});
2781
- this.close();
2782
- return;
2783
- case KEY.ESC:
2784
- this.cancel(e);
2785
- killEvent(e);
2786
- return;
2787
- }
2788
- }
2789
-
2790
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
2791
- || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
2792
- return;
2793
- }
2794
-
2795
- if (e.which === KEY.ENTER) {
2796
- if (this.opts.openOnEnter === false) {
2797
- return;
2798
- } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
2799
- return;
2800
- }
2801
- }
2802
-
2803
- this.open();
2804
-
2805
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2806
- // prevent the page from scrolling
2807
- killEvent(e);
2808
- }
2809
-
2810
- if (e.which === KEY.ENTER) {
2811
- // prevent form from being submitted
2812
- killEvent(e);
2813
- }
2814
-
2815
- }));
2816
-
2817
- this.search.on("keyup", this.bind(function (e) {
2818
- this.keydowns = 0;
2819
- this.resizeSearch();
2820
- })
2821
- );
2822
-
2823
- this.search.on("blur", this.bind(function(e) {
2824
- this.container.removeClass("select2-container-active");
2825
- this.search.removeClass("select2-focused");
2826
- this.selectChoice(null);
2827
- if (!this.opened()) this.clearSearch();
2828
- e.stopImmediatePropagation();
2829
- this.opts.element.trigger($.Event("select2-blur"));
2830
- }));
2831
-
2832
- this.container.on("click", selector, this.bind(function (e) {
2833
- if (!this.isInterfaceEnabled()) return;
2834
- if ($(e.target).closest(".select2-search-choice").length > 0) {
2835
- // clicked inside a select2 search choice, do not open
2836
- return;
2837
- }
2838
- this.selectChoice(null);
2839
- this.clearPlaceholder();
2840
- if (!this.container.hasClass("select2-container-active")) {
2841
- this.opts.element.trigger($.Event("select2-focus"));
2842
- }
2843
- this.open();
2844
- this.focusSearch();
2845
- e.preventDefault();
2846
- }));
2847
-
2848
- this.container.on("focus", selector, this.bind(function () {
2849
- if (!this.isInterfaceEnabled()) return;
2850
- if (!this.container.hasClass("select2-container-active")) {
2851
- this.opts.element.trigger($.Event("select2-focus"));
2852
- }
2853
- this.container.addClass("select2-container-active");
2854
- this.dropdown.addClass("select2-drop-active");
2855
- this.clearPlaceholder();
2856
- }));
2857
-
2858
- this.initContainerWidth();
2859
- this.opts.element.hide();
2860
-
2861
- // set the placeholder if necessary
2862
- this.clearSearch();
2863
- },
2864
-
2865
- // multi
2866
- enableInterface: function() {
2867
- if (this.parent.enableInterface.apply(this, arguments)) {
2868
- this.search.prop("disabled", !this.isInterfaceEnabled());
2869
- }
2870
- },
2871
-
2872
- // multi
2873
- initSelection: function () {
2874
- var data;
2875
- if (this.opts.element.val() === "" && this.opts.element.text() === "") {
2876
- this.updateSelection([]);
2877
- this.close();
2878
- // set the placeholder if necessary
2879
- this.clearSearch();
2880
- }
2881
- if (this.select || this.opts.element.val() !== "") {
2882
- var self = this;
2883
- this.opts.initSelection.call(null, this.opts.element, function(data){
2884
- if (data !== undefined && data !== null) {
2885
- self.updateSelection(data);
2886
- self.close();
2887
- // set the placeholder if necessary
2888
- self.clearSearch();
2889
- }
2890
- });
2891
- }
2892
- },
2893
-
2894
- // multi
2895
- clearSearch: function () {
2896
- var placeholder = this.getPlaceholder(),
2897
- maxWidth = this.getMaxSearchWidth();
2898
-
2899
- if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
2900
- this.search.val(placeholder).addClass("select2-default");
2901
- // stretch the search box to full width of the container so as much of the placeholder is visible as possible
2902
- // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
2903
- this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
2904
- } else {
2905
- this.search.val("").width(10);
2906
- }
2907
- },
2908
-
2909
- // multi
2910
- clearPlaceholder: function () {
2911
- if (this.search.hasClass("select2-default")) {
2912
- this.search.val("").removeClass("select2-default");
2913
- }
2914
- },
2915
-
2916
- // multi
2917
- opening: function () {
2918
- this.clearPlaceholder(); // should be done before super so placeholder is not used to search
2919
- this.resizeSearch();
2920
-
2921
- this.parent.opening.apply(this, arguments);
2922
-
2923
- this.focusSearch();
2924
-
2925
- // initializes search's value with nextSearchTerm (if defined by user)
2926
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
2927
- if(this.search.val() === "") {
2928
- if(this.nextSearchTerm != undefined){
2929
- this.search.val(this.nextSearchTerm);
2930
- this.search.select();
2931
- }
2932
- }
2933
-
2934
- this.updateResults(true);
2935
- if (this.opts.shouldFocusInput(this)) {
2936
- this.search.focus();
2937
- }
2938
- this.opts.element.trigger($.Event("select2-open"));
2939
- },
2940
-
2941
- // multi
2942
- close: function () {
2943
- if (!this.opened()) return;
2944
- this.parent.close.apply(this, arguments);
2945
- },
2946
-
2947
- // multi
2948
- focus: function () {
2949
- this.close();
2950
- this.search.focus();
2951
- },
2952
-
2953
- // multi
2954
- isFocused: function () {
2955
- return this.search.hasClass("select2-focused");
2956
- },
2957
-
2958
- // multi
2959
- updateSelection: function (data) {
2960
- var ids = [], filtered = [], self = this;
2961
-
2962
- // filter out duplicates
2963
- $(data).each(function () {
2964
- if (indexOf(self.id(this), ids) < 0) {
2965
- ids.push(self.id(this));
2966
- filtered.push(this);
2967
- }
2968
- });
2969
- data = filtered;
2970
-
2971
- this.selection.find(".select2-search-choice").remove();
2972
- $(data).each(function () {
2973
- self.addSelectedChoice(this);
2974
- });
2975
- self.postprocessResults();
2976
- },
2977
-
2978
- // multi
2979
- tokenize: function() {
2980
- var input = this.search.val();
2981
- input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
2982
- if (input != null && input != undefined) {
2983
- this.search.val(input);
2984
- if (input.length > 0) {
2985
- this.open();
2986
- }
2987
- }
2988
-
2989
- },
2990
-
2991
- // multi
2992
- onSelect: function (data, options) {
2993
-
2994
- if (!this.triggerSelect(data) || data.text === "") { return; }
2995
-
2996
- this.addSelectedChoice(data);
2997
-
2998
- this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
2999
-
3000
- // keep track of the search's value before it gets cleared
3001
- this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
3002
-
3003
- this.clearSearch();
3004
- this.updateResults();
3005
-
3006
- if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
3007
-
3008
- if (this.opts.closeOnSelect) {
3009
- this.close();
3010
- this.search.width(10);
3011
- } else {
3012
- if (this.countSelectableResults()>0) {
3013
- this.search.width(10);
3014
- this.resizeSearch();
3015
- if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
3016
- // if we reached max selection size repaint the results so choices
3017
- // are replaced with the max selection reached message
3018
- this.updateResults(true);
3019
- } else {
3020
- // initializes search's value with nextSearchTerm and update search result
3021
- if(this.nextSearchTerm != undefined){
3022
- this.search.val(this.nextSearchTerm);
3023
- this.updateResults();
3024
- this.search.select();
3025
- }
3026
- }
3027
- this.positionDropdown();
3028
- } else {
3029
- // if nothing left to select close
3030
- this.close();
3031
- this.search.width(10);
3032
- }
3033
- }
3034
-
3035
- // since its not possible to select an element that has already been
3036
- // added we do not need to check if this is a new element before firing change
3037
- this.triggerChange({ added: data });
3038
-
3039
- if (!options || !options.noFocus)
3040
- this.focusSearch();
3041
- },
3042
-
3043
- // multi
3044
- cancel: function () {
3045
- this.close();
3046
- this.focusSearch();
3047
- },
3048
-
3049
- addSelectedChoice: function (data) {
3050
- var enableChoice = !data.locked,
3051
- enabledItem = $(
3052
- "<li class='select2-search-choice'>" +
3053
- " <div></div>" +
3054
- " <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
3055
- "</li>"),
3056
- disabledItem = $(
3057
- "<li class='select2-search-choice select2-locked'>" +
3058
- "<div></div>" +
3059
- "</li>");
3060
- var choice = enableChoice ? enabledItem : disabledItem,
3061
- id = this.id(data),
3062
- val = this.getVal(),
3063
- formatted,
3064
- cssClass;
3065
-
3066
- formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
3067
- if (formatted != undefined) {
3068
- choice.find("div").replaceWith($("<div></div>").html(formatted));
3069
- }
3070
- cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
3071
- if (cssClass != undefined) {
3072
- choice.addClass(cssClass);
3073
- }
3074
-
3075
- if(enableChoice){
3076
- choice.find(".select2-search-choice-close")
3077
- .on("mousedown", killEvent)
3078
- .on("click dblclick", this.bind(function (e) {
3079
- if (!this.isInterfaceEnabled()) return;
3080
-
3081
- this.unselect($(e.target));
3082
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
3083
- killEvent(e);
3084
- this.close();
3085
- this.focusSearch();
3086
- })).on("focus", this.bind(function () {
3087
- if (!this.isInterfaceEnabled()) return;
3088
- this.container.addClass("select2-container-active");
3089
- this.dropdown.addClass("select2-drop-active");
3090
- }));
3091
- }
3092
-
3093
- choice.data("select2-data", data);
3094
- choice.insertBefore(this.searchContainer);
3095
-
3096
- val.push(id);
3097
- this.setVal(val);
3098
- },
3099
-
3100
- // multi
3101
- unselect: function (selected) {
3102
- var val = this.getVal(),
3103
- data,
3104
- index;
3105
- selected = selected.closest(".select2-search-choice");
3106
-
3107
- if (selected.length === 0) {
3108
- throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
3109
- }
3110
-
3111
- data = selected.data("select2-data");
3112
-
3113
- if (!data) {
3114
- // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
3115
- // and invoked on an element already removed
3116
- return;
3117
- }
3118
-
3119
- var evt = $.Event("select2-removing");
3120
- evt.val = this.id(data);
3121
- evt.choice = data;
3122
- this.opts.element.trigger(evt);
3123
-
3124
- if (evt.isDefaultPrevented()) {
3125
- return false;
3126
- }
3127
-
3128
- while((index = indexOf(this.id(data), val)) >= 0) {
3129
- val.splice(index, 1);
3130
- this.setVal(val);
3131
- if (this.select) this.postprocessResults();
3132
- }
3133
-
3134
- selected.remove();
3135
-
3136
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
3137
- this.triggerChange({ removed: data });
3138
-
3139
- return true;
3140
- },
3141
-
3142
- // multi
3143
- postprocessResults: function (data, initial, noHighlightUpdate) {
3144
- var val = this.getVal(),
3145
- choices = this.results.find(".select2-result"),
3146
- compound = this.results.find(".select2-result-with-children"),
3147
- self = this;
3148
-
3149
- choices.each2(function (i, choice) {
3150
- var id = self.id(choice.data("select2-data"));
3151
- if (indexOf(id, val) >= 0) {
3152
- choice.addClass("select2-selected");
3153
- // mark all children of the selected parent as selected
3154
- choice.find(".select2-result-selectable").addClass("select2-selected");
3155
- }
3156
- });
3157
-
3158
- compound.each2(function(i, choice) {
3159
- // hide an optgroup if it doesn't have any selectable children
3160
- if (!choice.is('.select2-result-selectable')
3161
- && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
3162
- choice.addClass("select2-selected");
3163
- }
3164
- });
3165
-
3166
- if (this.highlight() == -1 && noHighlightUpdate !== false && this.opts.closeOnSelect === true){
3167
- self.highlight(0);
3168
- }
3169
-
3170
- //If all results are chosen render formatNoMatches
3171
- if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
3172
- if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
3173
- if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
3174
- this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + "</li>");
3175
- }
3176
- }
3177
- }
3178
-
3179
- },
3180
-
3181
- // multi
3182
- getMaxSearchWidth: function() {
3183
- return this.selection.width() - getSideBorderPadding(this.search);
3184
- },
3185
-
3186
- // multi
3187
- resizeSearch: function () {
3188
- var minimumWidth, left, maxWidth, containerLeft, searchWidth,
3189
- sideBorderPadding = getSideBorderPadding(this.search);
3190
-
3191
- minimumWidth = measureTextWidth(this.search) + 10;
3192
-
3193
- left = this.search.offset().left;
3194
-
3195
- maxWidth = this.selection.width();
3196
- containerLeft = this.selection.offset().left;
3197
-
3198
- searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
3199
-
3200
- if (searchWidth < minimumWidth) {
3201
- searchWidth = maxWidth - sideBorderPadding;
3202
- }
3203
-
3204
- if (searchWidth < 40) {
3205
- searchWidth = maxWidth - sideBorderPadding;
3206
- }
3207
-
3208
- if (searchWidth <= 0) {
3209
- searchWidth = minimumWidth;
3210
- }
3211
-
3212
- this.search.width(Math.floor(searchWidth));
3213
- },
3214
-
3215
- // multi
3216
- getVal: function () {
3217
- var val;
3218
- if (this.select) {
3219
- val = this.select.val();
3220
- return val === null ? [] : val;
3221
- } else {
3222
- val = this.opts.element.val();
3223
- return splitVal(val, this.opts.separator, this.opts.transformVal);
3224
- }
3225
- },
3226
-
3227
- // multi
3228
- setVal: function (val) {
3229
- var unique;
3230
- if (this.select) {
3231
- this.select.val(val);
3232
- } else {
3233
- unique = [];
3234
- // filter out duplicates
3235
- $(val).each(function () {
3236
- if (indexOf(this, unique) < 0) unique.push(this);
3237
- });
3238
- this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
3239
- }
3240
- },
3241
-
3242
- // multi
3243
- buildChangeDetails: function (old, current) {
3244
- var current = current.slice(0),
3245
- old = old.slice(0);
3246
-
3247
- // remove intersection from each array
3248
- for (var i = 0; i < current.length; i++) {
3249
- for (var j = 0; j < old.length; j++) {
3250
- if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
3251
- current.splice(i, 1);
3252
- if(i>0){
3253
- i--;
3254
- }
3255
- old.splice(j, 1);
3256
- j--;
3257
- }
3258
- }
3259
- }
3260
-
3261
- return {added: current, removed: old};
3262
- },
3263
-
3264
-
3265
- // multi
3266
- val: function (val, triggerChange) {
3267
- var oldData, self=this;
3268
-
3269
- if (arguments.length === 0) {
3270
- return this.getVal();
3271
- }
3272
-
3273
- oldData=this.data();
3274
- if (!oldData.length) oldData=[];
3275
-
3276
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
3277
- if (!val && val !== 0) {
3278
- this.opts.element.val("");
3279
- this.updateSelection([]);
3280
- this.clearSearch();
3281
- if (triggerChange) {
3282
- this.triggerChange({added: this.data(), removed: oldData});
3283
- }
3284
- return;
3285
- }
3286
-
3287
- // val is a list of ids
3288
- this.setVal(val);
3289
-
3290
- if (this.select) {
3291
- this.opts.initSelection(this.select, this.bind(this.updateSelection));
3292
- if (triggerChange) {
3293
- this.triggerChange(this.buildChangeDetails(oldData, this.data()));
3294
- }
3295
- } else {
3296
- if (this.opts.initSelection === undefined) {
3297
- throw new Error("val() cannot be called if initSelection() is not defined");
3298
- }
3299
-
3300
- this.opts.initSelection(this.opts.element, function(data){
3301
- var ids=$.map(data, self.id);
3302
- self.setVal(ids);
3303
- self.updateSelection(data);
3304
- self.clearSearch();
3305
- if (triggerChange) {
3306
- self.triggerChange(self.buildChangeDetails(oldData, self.data()));
3307
- }
3308
- });
3309
- }
3310
- this.clearSearch();
3311
- },
3312
-
3313
- // multi
3314
- onSortStart: function() {
3315
- if (this.select) {
3316
- throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
3317
- }
3318
-
3319
- // collapse search field into 0 width so its container can be collapsed as well
3320
- this.search.width(0);
3321
- // hide the container
3322
- this.searchContainer.hide();
3323
- },
3324
-
3325
- // multi
3326
- onSortEnd:function() {
3327
-
3328
- var val=[], self=this;
3329
-
3330
- // show search and move it to the end of the list
3331
- this.searchContainer.show();
3332
- // make sure the search container is the last item in the list
3333
- this.searchContainer.appendTo(this.searchContainer.parent());
3334
- // since we collapsed the width in dragStarted, we resize it here
3335
- this.resizeSearch();
3336
-
3337
- // update selection
3338
- this.selection.find(".select2-search-choice").each(function() {
3339
- val.push(self.opts.id($(this).data("select2-data")));
3340
- });
3341
- this.setVal(val);
3342
- this.triggerChange();
3343
- },
3344
-
3345
- // multi
3346
- data: function(values, triggerChange) {
3347
- var self=this, ids, old;
3348
- if (arguments.length === 0) {
3349
- return this.selection
3350
- .children(".select2-search-choice")
3351
- .map(function() { return $(this).data("select2-data"); })
3352
- .get();
3353
- } else {
3354
- old = this.data();
3355
- if (!values) { values = []; }
3356
- ids = $.map(values, function(e) { return self.opts.id(e); });
3357
- this.setVal(ids);
3358
- this.updateSelection(values);
3359
- this.clearSearch();
3360
- if (triggerChange) {
3361
- this.triggerChange(this.buildChangeDetails(old, this.data()));
3362
- }
3363
- }
3364
- }
3365
- });
3366
-
3367
- $.fn.select2 = function () {
3368
-
3369
- var args = Array.prototype.slice.call(arguments, 0),
3370
- opts,
3371
- select2,
3372
- method, value, multiple,
3373
- allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
3374
- valueMethods = ["opened", "isFocused", "container", "dropdown"],
3375
- propertyMethods = ["val", "data"],
3376
- methodsMap = { search: "externalSearch" };
3377
-
3378
- this.each(function () {
3379
- if (args.length === 0 || typeof(args[0]) === "object") {
3380
- opts = args.length === 0 ? {} : $.extend({}, args[0]);
3381
- opts.element = $(this);
3382
-
3383
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
3384
- multiple = opts.element.prop("multiple");
3385
- } else {
3386
- multiple = opts.multiple || false;
3387
- if ("tags" in opts) {opts.multiple = multiple = true;}
3388
- }
3389
-
3390
- select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
3391
- select2.init(opts);
3392
- } else if (typeof(args[0]) === "string") {
3393
-
3394
- if (indexOf(args[0], allowedMethods) < 0) {
3395
- throw "Unknown method: " + args[0];
3396
- }
3397
-
3398
- value = undefined;
3399
- select2 = $(this).data("select2");
3400
- if (select2 === undefined) return;
3401
-
3402
- method=args[0];
3403
-
3404
- if (method === "container") {
3405
- value = select2.container;
3406
- } else if (method === "dropdown") {
3407
- value = select2.dropdown;
3408
- } else {
3409
- if (methodsMap[method]) method = methodsMap[method];
3410
-
3411
- value = select2[method].apply(select2, args.slice(1));
3412
- }
3413
- if (indexOf(args[0], valueMethods) >= 0
3414
- || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
3415
- return false; // abort the iteration, ready to return first matched value
3416
- }
3417
- } else {
3418
- throw "Invalid arguments to select2 plugin: " + args;
3419
- }
3420
- });
3421
- return (value === undefined) ? this : value;
3422
- };
3423
-
3424
- // plugin defaults, accessible to users
3425
- $.fn.select2.defaults = {
3426
- width: "copy",
3427
- loadMorePadding: 0,
3428
- closeOnSelect: true,
3429
- openOnEnter: true,
3430
- containerCss: {},
3431
- dropdownCss: {},
3432
- containerCssClass: "",
3433
- dropdownCssClass: "",
3434
- formatResult: function(result, container, query, escapeMarkup) {
3435
- var markup=[];
3436
- markMatch(this.text(result), query.term, markup, escapeMarkup);
3437
- return markup.join("");
3438
- },
3439
- transformVal: function(val) {
3440
- return $.trim(val);
3441
- },
3442
- formatSelection: function (data, container, escapeMarkup) {
3443
- return data ? escapeMarkup(this.text(data)) : undefined;
3444
- },
3445
- sortResults: function (results, container, query) {
3446
- return results;
3447
- },
3448
- formatResultCssClass: function(data) {return data.css;},
3449
- formatSelectionCssClass: function(data, container) {return undefined;},
3450
- minimumResultsForSearch: 0,
3451
- minimumInputLength: 0,
3452
- maximumInputLength: null,
3453
- maximumSelectionSize: 0,
3454
- id: function (e) { return e == undefined ? null : e.id; },
3455
- text: function (e) {
3456
- if (e && this.data && this.data.text) {
3457
- if ($.isFunction(this.data.text)) {
3458
- return this.data.text(e);
3459
- } else {
3460
- return e[this.data.text];
3461
- }
3462
- } else {
3463
- return e.text;
3464
- }
3465
- },
3466
- matcher: function(term, text) {
3467
- return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
3468
- },
3469
- separator: ",",
3470
- tokenSeparators: [],
3471
- tokenizer: defaultTokenizer,
3472
- escapeMarkup: defaultEscapeMarkup,
3473
- blurOnChange: false,
3474
- selectOnBlur: false,
3475
- adaptContainerCssClass: function(c) { return c; },
3476
- adaptDropdownCssClass: function(c) { return null; },
3477
- nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
3478
- searchInputPlaceholder: '',
3479
- createSearchChoicePosition: 'top',
3480
- shouldFocusInput: function (instance) {
3481
- // Attempt to detect touch devices
3482
- var supportsTouchEvents = (('ontouchstart' in window) ||
3483
- (navigator.msMaxTouchPoints > 0));
3484
-
3485
- // Only devices which support touch events should be special cased
3486
- if (!supportsTouchEvents) {
3487
- return true;
3488
- }
3489
-
3490
- // Never focus the input if search is disabled
3491
- if (instance.opts.minimumResultsForSearch < 0) {
3492
- return false;
3493
- }
3494
-
3495
- return true;
3496
- }
3497
- };
3498
-
3499
- $.fn.select2.locales = [];
3500
-
3501
- $.fn.select2.locales['en'] = {
3502
- formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
3503
- formatNoMatches: function () { return "No matches found"; },
3504
- formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; },
3505
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
3506
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
3507
- formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
3508
- formatLoadMore: function (pageNumber) { return "Loading more results…"; },
3509
- formatSearching: function () { return "Searching…"; }
3510
- };
3511
-
3512
- $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
3513
-
3514
- $.fn.select2.ajaxDefaults = {
3515
- transport: $.ajax,
3516
- params: {
3517
- type: "GET",
3518
- cache: false,
3519
- dataType: "json"
3520
- }
3521
- };
3522
-
3523
- // exports
3524
- window.Select2 = {
3525
- query: {
3526
- ajax: ajax,
3527
- local: local,
3528
- tags: tags
3529
- }, util: {
3530
- debounce: debounce,
3531
- markMatch: markMatch,
3532
- escapeMarkup: defaultEscapeMarkup,
3533
- stripDiacritics: stripDiacritics
3534
- }, "class": {
3535
- "abstract": AbstractSelect2,
3536
- "single": SingleSelect2,
3537
- "multi": MultiSelect2
3538
- }
3539
- };
3540
-
3541
- }(jQuery));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2.min.js DELETED
@@ -1,23 +0,0 @@
1
- /*
2
- Copyright 2014 Igor Vaynberg
3
-
4
- Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
5
-
6
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
- use of this software only upon the condition that you accept all of the terms of either the Apache
9
- License or the GPL License.
10
-
11
- You may obtain a copy of the Apache License and the GPL License at:
12
-
13
- http://www.apache.org/licenses/LICENSE-2.0
14
- http://www.gnu.org/licenses/gpl-2.0.html
15
-
16
- Unless required by applicable law or agreed to in writing, software distributed under the Apache License
17
- or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
18
- either express or implied. See the Apache License and the GPL License for the specific language governing
19
- permissions and limitations under the Apache License and the GPL License.
20
- */
21
- !function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++d<e&&(c.context=c[0]=this[d])&&b.call(c[0],d,c)!==!1;);return this}})}(jQuery),function(a,b){"use strict";function n(b){var c=a(document.createTextNode(""));b.before(c),c.before(b),c.remove()}function o(a){function b(a){return m[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function p(a,b){for(var c=0,d=b.length;d>c;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l);b.appendTo(document.body);var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function r(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function s(a,b,c){var d,e,f;if(null===a||a.length<1)return[];for(d=a.split(b),e=0,f=d.length;f>e;e+=1)d[e]=c(d[e]);return d}function t(a){return a.outerWidth(!1)-a.width()}function u(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function v(c){c.on("mousemove",function(c){var d=h;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function w(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function x(a,b){var c=w(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){p(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus();var e=b.offsetWidth>0||b.offsetHeight>0;e&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!g){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);g=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),g.attr("class","select2-sizer"),a(document.body).append(g)}return g.text(b.val()),g.width()}function D(b,c,d){var e,g,f=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(g))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=o(a.toUpperCase()).indexOf(o(b.toUpperCase())),f=b.length;return 0>e?(c.push(d(a)),void 0):(c.push(d(a.substring(0,e))),c.push("<span class='select2-match'>"),c.push(d(a.substring(e,e+f))),c.push("</span>"),c.push(d(a.substring(e+f,a.length))),void 0)}function F(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&"function"==typeof e.abort&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page,i);i.callback(b)},error:function(a,b,c){var d={hasError:!0,jqXHR:a,textStatus:b,errorThrown:c};i.callback(d)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?(b.callback(c()),void 0):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),b.callback(e),void 0)}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]},h=d?c(e):c;a.isArray(h)&&(a(h).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g))}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;if("string"==typeof b)return!0;throw new Error(c+" must be a string, function, or falsy value")}function K(b,c){if(a.isFunction(b)){var d=Array.prototype.slice.call(arguments,2);return b.apply(c,d)}return b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(r(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(){var b=this;a.each(arguments,function(a,c){b[c].remove(),b[c]=null})}function O(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,i,j,h={x:0,y:0},k={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case k.LEFT:case k.RIGHT:case k.UP:case k.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case k.SHIFT:case k.CTRL:case k.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="<div class='select2-measure-scrollbar'></div>",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"A","\u01fa":"A","\u01cd":"A","\u0200":"A","\u0202":"A","\u1ea0":"A","\u1eac":"A","\u1eb6":"A","\u1e00":"A","\u0104":"A","\u023a":"A","\u2c6f":"A","\ua732":"AA","\xc6":"AE","\u01fc":"AE","\u01e2":"AE","\ua734":"AO","\ua736":"AU","\ua738":"AV","\ua73a":"AV","\ua73c":"AY","\u24b7":"B","\uff22":"B","\u1e02":"B","\u1e04":"B","\u1e06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24b8":"C","\uff23":"C","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\xc7":"C","\u1e08":"C","\u0187":"C","\u023b":"C","\ua73e":"C","\u24b9":"D","\uff24":"D","\u1e0a":"D","\u010e":"D","\u1e0c":"D","\u1e10":"D","\u1e12":"D","\u1e0e":"D","\u0110":"D","\u018b":"D","\u018a":"D","\u0189":"D","\ua779":"D","\u01f1":"DZ","\u01c4":"DZ","\u01f2":"Dz","\u01c5":"Dz","\u24ba":"E","\uff25":"E","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"E","\u1eba":"E","\u011a":"E","\u0204":"E","\u0206":"E","\u1eb8":"E","\u1ec6":"E","\u0228":"E","\u1e1c":"E","\u0118":"E","\u1e18":"E","\u1e1a":"E","\u0190":"E","\u018e":"E","\u24bb":"F","\uff26":"F","\u1e1e":"F","\u0191":"F","\ua77b":"F","\u24bc":"G","\uff27":"G","\u01f4":"G","\u011c":"G","\u1e20":"G","\u011e":"G","\u0120":"G","\u01e6":"G","\u0122":"G","\u01e4":"G","\u0193":"G","\ua7a0":"G","\ua77d":"G","\ua77e":"G","\u24bd":"H","\uff28":"H","\u0124":"H","\u1e22":"H","\u1e26":"H","\u021e":"H","\u1e24":"H","\u1e28":"H","\u1e2a":"H","\u0126":"H","\u2c67":"H","\u2c75":"H","\ua78d":"H","\u24be":"I","\uff29":"I","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"I","\u1e2e":"I","\u1ec8":"I","\u01cf":"I","\u0208":"I","\u020a":"I","\u1eca":"I","\u012e":"I","\u1e2c":"I","\u0197":"I","\u24bf":"J","\uff2a":"J","\u0134":"J","\u0248":"J","\u24c0":"K","\uff2b":"K","\u1e30":"K","\u01e8":"K","\u1e32":"K","\u0136":"K","\u1e34":"K","\u0198":"K","\u2c69":"K","\ua740":"K","\ua742":"K","\ua744":"K","\ua7a2":"K","\u24c1":"L","\uff2c":"L","\u013f":"L","\u0139":"L","\u013d":"L","\u1e36":"L","\u1e38":"L","\u013b":"L","\u1e3c":"L","\u1e3a":"L","\u0141":"L","\u023d":"L","\u2c62":"L","\u2c60":"L","\ua748":"L","\ua746":"L","\ua780":"L","\u01c7":"LJ","\u01c8":"Lj","\u24c2":"M","\uff2d":"M","\u1e3e":"M","\u1e40":"M","\u1e42":"M","\u2c6e":"M","\u019c":"M","\u24c3":"N","\uff2e":"N","\u01f8":"N","\u0143":"N","\xd1":"N","\u1e44":"N","\u0147":"N","\u1e46":"N","\u0145":"N","\u1e4a":"N","\u1e48":"N","\u0220":"N","\u019d":"N","\ua790":"N","\ua7a4":"N","\u01ca":"NJ","\u01cb":"Nj","\u24c4":"O","\uff2f":"O","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"O","\u022a":"O","\u1ece":"O","\u0150":"O","\u01d1":"O","\u020c":"O","\u020e":"O","\u01a0":"O","\u1edc":"O","\u1eda":"O","\u1ee0":"O","\u1ede":"O","\u1ee2":"O","\u1ecc":"O","\u1ed8":"O","\u01ea":"O","\u01ec":"O","\xd8":"O","\u01fe":"O","\u0186":"O","\u019f":"O","\ua74a":"O","\ua74c":"O","\u01a2":"OI","\ua74e":"OO","\u0222":"OU","\u24c5":"P","\uff30":"P","\u1e54":"P","\u1e56":"P","\u01a4":"P","\u2c63":"P","\ua750":"P","\ua752":"P","\ua754":"P","\u24c6":"Q","\uff31":"Q","\ua756":"Q","\ua758":"Q","\u024a":"Q","\u24c7":"R","\uff32":"R","\u0154":"R","\u1e58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1e5a":"R","\u1e5c":"R","\u0156":"R","\u1e5e":"R","\u024c":"R","\u2c64":"R","\ua75a":"R","\ua7a6":"R","\ua782":"R","\u24c8":"S","\uff33":"S","\u1e9e":"S","\u015a":"S","\u1e64":"S","\u015c":"S","\u1e60":"S","\u0160":"S","\u1e66":"S","\u1e62":"S","\u1e68":"S","\u0218":"S","\u015e":"S","\u2c7e":"S","\ua7a8":"S","\ua784":"S","\u24c9":"T","\uff34":"T","\u1e6a":"T","\u0164":"T","\u1e6c":"T","\u021a":"T","\u0162":"T","\u1e70":"T","\u1e6e":"T","\u0166":"T","\u01ac":"T","\u01ae":"T","\u023e":"T","\ua786":"T","\ua728":"TZ","\u24ca":"U","\uff35":"U","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"U","\u01db":"U","\u01d7":"U","\u01d5":"U","\u01d9":"U","\u1ee6":"U","\u016e":"U","\u0170":"U","\u01d3":"U","\u0214":"U","\u0216":"U","\u01af":"U","\u1eea":"U","\u1ee8":"U","\u1eee":"U","\u1eec":"U","\u1ef0":"U","\u1ee4":"U","\u1e72":"U","\u0172":"U","\u1e76":"U","\u1e74":"U","\u0244":"U","\u24cb":"V","\uff36":"V","\u1e7c":"V","\u1e7e":"V","\u01b2":"V","\ua75e":"V","\u0245":"V","\ua760":"VY","\u24cc":"W","\uff37":"W","\u1e80":"W","\u1e82":"W","\u0174":"W","\u1e86":"W","\u1e84":"W","\u1e88":"W","\u2c72":"W","\u24cd":"X","\uff38":"X","\u1e8a":"X","\u1e8c":"X","\u24ce":"Y","\uff39":"Y","\u1ef2":"Y","\xdd":"Y","\u0176":"Y","\u1ef8":"Y","\u0232":"Y","\u1e8e":"Y","\u0178":"Y","\u1ef6":"Y","\u1ef4":"Y","\u01b3":"Y","\u024e":"Y","\u1efe":"Y","\u24cf":"Z","\uff3a":"Z","\u0179":"Z","\u1e90":"Z","\u017b":"Z","\u017d":"Z","\u1e92":"Z","\u1e94":"Z","\u01b5":"Z","\u0224":"Z","\u2c7f":"Z","\u2c6b":"Z","\ua762":"Z","\u24d0":"a","\uff41":"a","\u1e9a":"a","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"a","\u01fb":"a","\u01ce":"a","\u0201":"a","\u0203":"a","\u1ea1":"a","\u1ead":"a","\u1eb7":"a","\u1e01":"a","\u0105":"a","\u2c65":"a","\u0250":"a","\ua733":"aa","\xe6":"ae","\u01fd":"ae","\u01e3":"ae","\ua735":"ao","\ua737":"au","\ua739":"av","\ua73b":"av","\ua73d":"ay","\u24d1":"b","\uff42":"b","\u1e03":"b","\u1e05":"b","\u1e07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24d2":"c","\uff43":"c","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\xe7":"c","\u1e09":"c","\u0188":"c","\u023c":"c","\ua73f":"c","\u2184":"c","\u24d3":"d","\uff44":"d","\u1e0b":"d","\u010f":"d","\u1e0d":"d","\u1e11":"d","\u1e13":"d","\u1e0f":"d","\u0111":"d","\u018c":"d","\u0256":"d","\u0257":"d","\ua77a":"d","\u01f3":"dz","\u01c6":"dz","\u24d4":"e","\uff45":"e","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"e","\u1ebb":"e","\u011b":"e","\u0205":"e","\u0207":"e","\u1eb9":"e","\u1ec7":"e","\u0229":"e","\u1e1d":"e","\u0119":"e","\u1e19":"e","\u1e1b":"e","\u0247":"e","\u025b":"e","\u01dd":"e","\u24d5":"f","\uff46":"f","\u1e1f":"f","\u0192":"f","\ua77c":"f","\u24d6":"g","\uff47":"g","\u01f5":"g","\u011d":"g","\u1e21":"g","\u011f":"g","\u0121":"g","\u01e7":"g","\u0123":"g","\u01e5":"g","\u0260":"g","\ua7a1":"g","\u1d79":"g","\ua77f":"g","\u24d7":"h","\uff48":"h","\u0125":"h","\u1e23":"h","\u1e27":"h","\u021f":"h","\u1e25":"h","\u1e29":"h","\u1e2b":"h","\u1e96":"h","\u0127":"h","\u2c68":"h","\u2c76":"h","\u0265":"h","\u0195":"hv","\u24d8":"i","\uff49":"i","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"i","\u1e2f":"i","\u1ec9":"i","\u01d0":"i","\u0209":"i","\u020b":"i","\u1ecb":"i","\u012f":"i","\u1e2d":"i","\u0268":"i","\u0131":"i","\u24d9":"j","\uff4a":"j","\u0135":"j","\u01f0":"j","\u0249":"j","\u24da":"k","\uff4b":"k","\u1e31":"k","\u01e9":"k","\u1e33":"k","\u0137":"k","\u1e35":"k","\u0199":"k","\u2c6a":"k","\ua741":"k","\ua743":"k","\ua745":"k","\ua7a3":"k","\u24db":"l","\uff4c":"l","\u0140":"l","\u013a":"l","\u013e":"l","\u1e37":"l","\u1e39":"l","\u013c":"l","\u1e3d":"l","\u1e3b":"l","\u017f":"l","\u0142":"l","\u019a":"l","\u026b":"l","\u2c61":"l","\ua749":"l","\ua781":"l","\ua747":"l","\u01c9":"lj","\u24dc":"m","\uff4d":"m","\u1e3f":"m","\u1e41":"m","\u1e43":"m","\u0271":"m","\u026f":"m","\u24dd":"n","\uff4e":"n","\u01f9":"n","\u0144":"n","\xf1":"n","\u1e45":"n","\u0148":"n","\u1e47":"n","\u0146":"n","\u1e4b":"n","\u1e49":"n","\u019e":"n","\u0272":"n","\u0149":"n","\ua791":"n","\ua7a5":"n","\u01cc":"nj","\u24de":"o","\uff4f":"o","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"o","\u022b":"o","\u1ecf":"o","\u0151":"o","\u01d2":"o","\u020d":"o","\u020f":"o","\u01a1":"o","\u1edd":"o","\u1edb":"o","\u1ee1":"o","\u1edf":"o","\u1ee3":"o","\u1ecd":"o","\u1ed9":"o","\u01eb":"o","\u01ed":"o","\xf8":"o","\u01ff":"o","\u0254":"o","\ua74b":"o","\ua74d":"o","\u0275":"o","\u01a3":"oi","\u0223":"ou","\ua74f":"oo","\u24df":"p","\uff50":"p","\u1e55":"p","\u1e57":"p","\u01a5":"p","\u1d7d":"p","\ua751":"p","\ua753":"p","\ua755":"p","\u24e0":"q","\uff51":"q","\u024b":"q","\ua757":"q","\ua759":"q","\u24e1":"r","\uff52":"r","\u0155":"r","\u1e59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1e5b":"r","\u1e5d":"r","\u0157":"r","\u1e5f":"r","\u024d":"r","\u027d":"r","\ua75b":"r","\ua7a7":"r","\ua783":"r","\u24e2":"s","\uff53":"s","\xdf":"s","\u015b":"s","\u1e65":"s","\u015d":"s","\u1e61":"s","\u0161":"s","\u1e67":"s","\u1e63":"s","\u1e69":"s","\u0219":"s","\u015f":"s","\u023f":"s","\ua7a9":"s","\ua785":"s","\u1e9b":"s","\u24e3":"t","\uff54":"t","\u1e6b":"t","\u1e97":"t","\u0165":"t","\u1e6d":"t","\u021b":"t","\u0163":"t","\u1e71":"t","\u1e6f":"t","\u0167":"t","\u01ad":"t","\u0288":"t","\u2c66":"t","\ua787":"t","\ua729":"tz","\u24e4":"u","\uff55":"u","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"u","\u01dc":"u","\u01d8":"u","\u01d6":"u","\u01da":"u","\u1ee7":"u","\u016f":"u","\u0171":"u","\u01d4":"u","\u0215":"u","\u0217":"u","\u01b0":"u","\u1eeb":"u","\u1ee9":"u","\u1eef":"u","\u1eed":"u","\u1ef1":"u","\u1ee5":"u","\u1e73":"u","\u0173":"u","\u1e77":"u","\u1e75":"u","\u0289":"u","\u24e5":"v","\uff56":"v","\u1e7d":"v","\u1e7f":"v","\u028b":"v","\ua75f":"v","\u028c":"v","\ua761":"vy","\u24e6":"w","\uff57":"w","\u1e81":"w","\u1e83":"w","\u0175":"w","\u1e87":"w","\u1e85":"w","\u1e98":"w","\u1e89":"w","\u2c73":"w","\u24e7":"x","\uff58":"x","\u1e8b":"x","\u1e8d":"x","\u24e8":"y","\uff59":"y","\u1ef3":"y","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"y","\u1ef7":"y","\u1e99":"y","\u1ef5":"y","\u01b4":"y","\u024f":"y","\u1eff":"y","\u24e9":"z","\uff5a":"z","\u017a":"z","\u1e91":"z","\u017c":"z","\u017e":"z","\u1e93":"z","\u1e95":"z","\u01b6":"z","\u0225":"z","\u0240":"z","\u2c6c":"z","\ua763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038a":"\u0399","\u03aa":"\u0399","\u038c":"\u039f","\u038e":"\u03a5","\u03ab":"\u03a5","\u038f":"\u03a9","\u03ac":"\u03b1","\u03ad":"\u03b5","\u03ae":"\u03b7","\u03af":"\u03b9","\u03ca":"\u03b9","\u0390":"\u03b9","\u03cc":"\u03bf","\u03cd":"\u03c5","\u03cb":"\u03c5","\u03b0":"\u03c5","\u03c9":"\u03c9","\u03c2":"\u03c3"};i=a(document),f=function(){var a=1;return function(){return a++}}(),c=O(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,g=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.liveRegion=a(".select2-hidden-accessible"),0==this.liveRegion.length&&(this.liveRegion=a("<span>",{role:"status","aria-live":"polite"}).addClass("select2-hidden-accessible").appendTo(document.body)),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+f()),this.containerEventName=this.containerId.replace(/([.])/g,"_").replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.container.attr("title",c.element.attr("title")),this.body=a(document.body),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss,this.opts.element)),this.container.addClass(K(c.containerCssClass,this.opts.element)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass,this.opts.element)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(g),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),v(this.results),this.dropdown.on("mousemove-filtered",g,this.bind(this.highlightUnderEvent)),this.dropdown.on("touchstart touchmove touchend",g,this.bind(function(a){this._touchEvent=!0,this.highlightUnderEvent(a)})),this.dropdown.on("touchmove",g,this.bind(this.touchMoved)),this.dropdown.on("touchstart touchend",g,this.bind(this.clearTouchMoved)),this.dropdown.on("click",this.bind(function(){this._touchEvent&&(this._touchEvent=!1,this.selectHighlighted())})),x(80,this.results),this.dropdown.on("scroll-debounced",g,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),u(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",g,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown touchstart touchend focusin",function(a){a.stopPropagation()}),this.nextSearchTerm=b,a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),j=j||q(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.search.attr("placeholder",c.searchInputPlaceholder)},destroy:function(){var a=this.opts.element,c=a.data("select2"),d=this;this.close(),a.length&&a[0].detachEvent&&d._sync&&a.each(function(){d._sync&&this.detachEvent("onpropertychange",d._sync)}),this.propertyObserver&&(this.propertyObserver.disconnect(),this.propertyObserver=null),this._sync=null,c!==b&&(c.container.remove(),c.liveRegion.remove(),c.dropdown.remove(),a.show().removeData("select2").off(".select2").prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show()),N.call(this,"container","liveRegion","dropdown","results","search")},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:r(a.attr("locked"),"locked")||r(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,g,h,i=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a <select> element.")}),c=a.extend({},{populateResults:function(d,e,g){var h,j=this.opts.id,k=this.liveRegion;h=function(d,e,l){var m,n,o,p,q,r,s,t,u,v;d=c.sortResults(d,e,g);var w=[];for(m=0,n=d.length;n>m;m+=1)o=d[m],q=o.disabled===!0,p=!q&&j(o)!==b,r=o.children&&o.children.length>0,s=a("<li></li>"),s.addClass("select2-results-dept-"+l),s.addClass("select2-result"),s.addClass(p?"select2-result-selectable":"select2-result-unselectable"),q&&s.addClass("select2-disabled"),r&&s.addClass("select2-result-with-children"),s.addClass(i.opts.formatResultCssClass(o)),s.attr("role","presentation"),t=a(document.createElement("div")),t.addClass("select2-result-label"),t.attr("id","select2-result-label-"+f()),t.attr("role","option"),v=c.formatResult(o,t,g,i.opts.escapeMarkup),v!==b&&(t.html(v),s.append(t)),r&&(u=a("<ul></ul>"),u.addClass("select2-result-sub"),h(o.children,u,l+1),s.append(u)),s.data("select2-data",o),w.push(s[0]);e.append(w),k.text(c.formatMatches(d.length))},h(e,d,0)}},a.fn.select2.defaults,c),"function"!=typeof c.id&&(g=c.id,c.id=function(a){return a[g]}),a.isArray(c.element.data("select2Tags"))){if("tags"in c)throw"tags specified as both an attribute 'data-select2-tags' and in options of Select2 "+c.element.attr("id");c.tags=c.element.data("select2Tags")}if(e?(c.query=this.bind(function(a){var f,g,h,c={results:[],more:!1},e=a.term;h=function(b,c){var d;b.is("option")?a.matcher(e,b.text(),b)&&c.push(i.optionToData(b)):b.is("optgroup")&&(d=i.optionToData(b),b.children().each2(function(a,b){h(b,d.children)}),d.children.length>0&&c.push(d))},f=d.children(),this.getPlaceholder()!==b&&f.length>0&&(g=this.getPlaceholderOption(),g&&(f=f.not(g))),f.each2(function(a,b){h(b,c.results)}),a.callback(c)}),c.id=function(a){return a.id}):"query"in c||("ajax"in c?(h=c.element.data("ajax-url"),h&&h.length>0&&(c.ajax.url=h),c.query=G.call(c.element,c.ajax)):"data"in c?c.query=H(c.data):"tags"in c&&(c.query=I(c.tags),c.createSearchChoice===b&&(c.createSearchChoice=function(b){return{id:a.trim(b),text:a.trim(b)}}),c.initSelection===b&&(c.initSelection=function(b,d){var e=[];a(s(b.val(),c.separator,c.transformVal)).each(function(){var b={id:this,text:this},d=c.tags;a.isFunction(d)&&(d=d()),a(d).each(function(){return r(this.id,b.id)?(b=this,!1):void 0}),e.push(b)}),d(e)}))),"function"!=typeof c.query)throw"query function not defined for Select2 "+c.element.attr("id");if("top"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.unshift(b)};else if("bottom"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.push(b)};else if("function"!=typeof c.createSearchChoicePosition)throw"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";return c},monitorSource:function(){var d,c=this.opts.element,e=this;c.on("change.select2",this.bind(function(){this.opts.element.data("select2-change-triggered")!==!0&&this.initSelection()})),this._sync=this.bind(function(){var a=c.prop("disabled");a===b&&(a=!1),this.enable(!a);var d=c.prop("readonly");d===b&&(d=!1),this.readonly(d),this.container&&(D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.addClass(K(this.opts.containerCssClass,this.opts.element))),this.dropdown&&(D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(this.opts.dropdownCssClass,this.opts.element)))}),c.length&&c[0].attachEvent&&c.each(function(){this.attachEvent("onpropertychange",e._sync)}),d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,d!==b&&(this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),this.propertyObserver=new d(function(b){a.each(b,e._sync)}),this.propertyObserver.observe(c.get(0),{attributes:!0,subtree:!1}))},triggerSelect:function(b){var c=a.Event("select2-selecting",{val:this.id(b),object:b,choice:b});return this.opts.element.trigger(c),!c.isDefaultPrevented()},triggerChange:function(b){b=b||{},b=a.extend({},b,{type:"change",val:this.val()}),this.opts.element.data("select2-change-triggered",!0),this.opts.element.trigger(b),this.opts.element.data("select2-change-triggered",!1),this.opts.element.click(),this.opts.blurOnChange&&this.opts.element.blur()},isInterfaceEnabled:function(){return this.enabledInterface===!0},enableInterface:function(){var a=this._enabled&&!this._readonly,b=!a;return a===this.enabledInterface?!1:(this.container.toggleClass("select2-container-disabled",b),this.close(),this.enabledInterface=a,!0)},enable:function(a){a===b&&(a=!0),this._enabled!==a&&(this._enabled=a,this.opts.element.prop("disabled",!a),this.enableInterface())},disable:function(){this.enable(!1)},readonly:function(a){a===b&&(a=!1),this._readonly!==a&&(this._readonly=a,this.opts.element.prop("readonly",a),this.enableInterface())},opened:function(){return this.container?this.container.hasClass("select2-dropdown-open"):!1},positionDropdown:function(){var v,w,x,y,z,b=this.dropdown,c=this.container,d=c.offset(),e=c.outerHeight(!1),f=c.outerWidth(!1),g=b.outerHeight(!1),h=a(window),i=h.width(),k=h.height(),l=h.scrollLeft()+i,m=h.scrollTop()+k,n=d.top+e,o=d.left,p=m>=n+g,q=d.top-g>=h.scrollTop(),r=b.outerWidth(!1),s=function(){return l>=o+r},t=function(){return d.left+l+c.outerWidth(!1)>r},u=b.hasClass("select2-drop-above");u?(w=!0,!q&&p&&(x=!0,w=!1)):(w=!1,!p&&q&&(x=!0,w=!0)),x&&(b.hide(),d=this.container.offset(),e=this.container.outerHeight(!1),f=this.container.outerWidth(!1),g=b.outerHeight(!1),l=h.scrollLeft()+i,m=h.scrollTop()+k,n=d.top+e,o=d.left,r=b.outerWidth(!1),b.show(),this.focusSearch()),this.opts.dropdownAutoWidth?(z=a(".select2-results",b)[0],b.addClass("select2-drop-auto-width"),b.css("width",""),r=b.outerWidth(!1)+(z.scrollHeight===z.clientHeight?0:j.width),r>f?f=r:r=f,g=b.outerHeight(!1)):this.container.removeClass("select2-drop-auto-width"),"static"!==this.body.css("position")&&(v=this.body.offset(),n-=v.top,o-=v.left),!s()&&t()&&(o=d.left+this.container.outerWidth(!1)-r),y={left:o,width:f},w?(y.top=d.top-g,y.bottom="auto",this.container.addClass("select2-drop-above"),b.addClass("select2-drop-above")):(y.top=n,y.bottom="auto",this.container.removeClass("select2-drop-above"),b.removeClass("select2-drop-above")),y=a.extend(y,K(this.opts.dropdownCss,this.opts.element)),b.css(y)},shouldOpen:function(){var b;return this.opened()?!1:this._enabled===!1||this._readonly===!0?!1:(b=a.Event("select2-opening"),this.opts.element.trigger(b),!b.isDefaultPrevented())},clearDropdownAlignmentPreference:function(){this.container.removeClass("select2-drop-above"),this.dropdown.removeClass("select2-drop-above")},open:function(){return this.shouldOpen()?(this.opening(),i.on("mousemove.select2Event",function(a){h.x=a.pageX,h.y=a.pageY}),!0):!1},opening:function(){var f,b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.addClass("select2-dropdown-open").addClass("select2-container-active"),this.clearDropdownAlignmentPreference(),this.dropdown[0]!==this.body.children().last()[0]&&this.dropdown.detach().appendTo(this.body),f=a("#select2-drop-mask"),0===f.length&&(f=a(document.createElement("div")),f.attr("id","select2-drop-mask").attr("class","select2-drop-mask"),f.hide(),f.appendTo(this.body),f.on("mousedown touchstart click",function(b){n(f);var d,c=a("#select2-drop");c.length>0&&(d=c.data("select2"),d.opts.selectOnBlur&&d.selectHighlighted({noFocus:!0}),d.close(),b.preventDefault(),b.stopPropagation())})),this.dropdown.prev()[0]!==f[0]&&this.dropdown.before(f),a("#select2-drop").removeAttr("id"),this.dropdown.attr("id","select2-drop"),f.show(),this.positionDropdown(),this.dropdown.show(),this.positionDropdown(),this.dropdown.addClass("select2-drop-active");var g=this;this.container.parents().add(window).each(function(){a(this).on(d+" "+c+" "+e,function(){g.opened()&&g.positionDropdown()})})},close:function(){if(this.opened()){var b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.parents().add(window).each(function(){a(this).off(c).off(d).off(e)}),this.clearDropdownAlignmentPreference(),a("#select2-drop-mask").hide(),this.dropdown.removeAttr("id"),this.dropdown.hide(),this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"),this.results.empty(),i.off("mousemove.select2Event"),this.clearSearch(),this.search.removeClass("select2-active"),this.opts.element.trigger(a.Event("select2-close"))}},externalSearch:function(a){this.open(),this.search.val(a),this.updateResults(!1)},clearSearch:function(){},getMaximumSelectionSize:function(){return K(this.opts.maximumSelectionSize,this.opts.element)},ensureHighlightVisible:function(){var c,d,e,f,g,h,i,j,b=this.results;if(d=this.highlight(),!(0>d)){if(0==d)return b.scrollTop(0),void 0;c=this.findHighlightableChoices().find(".select2-result-label"),e=a(c[d]),j=(e.offset()||{}).top||0,f=j+e.outerHeight(!0),d===c.length-1&&(i=b.find("li.select2-more-results"),i.length>0&&(f=i.offset().top+i.outerHeight(!0))),g=b.offset().top+b.outerHeight(!1),f>g&&b.scrollTop(b.scrollTop()+(f-g)),h=j-b.offset().top,0>h&&"none"!=e.css("display")&&b.scrollTop(b.scrollTop()+h)}},findHighlightableChoices:function(){return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)")},moveHighlight:function(b){for(var c=this.findHighlightableChoices(),d=this.highlight();d>-1&&d<c.length;){d+=b;
22
- var e=a(c[d]);if(e.hasClass("select2-result-selectable")&&!e.hasClass("select2-disabled")&&!e.hasClass("select2-selected")){this.highlight(d);break}}},highlight:function(b){var d,e,c=this.findHighlightableChoices();return 0===arguments.length?p(c.filter(".select2-highlighted")[0],c.get()):(b>=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),e&&this.opts.element.trigger({type:"select2-highlight",val:this.id(e),choice:e}),void 0)},removeHighlight:function(){this.results.find(".select2-highlighted").removeClass("select2-highlighted")},touchMoved:function(){this._touchMoved=!0},clearTouchMoved:function(){this._touchMoved=!1},countSelectableResults:function(){return this.findHighlightableChoices().length},highlightUnderEvent:function(b){var c=a(b.target).closest(".select2-result-selectable");if(c.length>0&&!c.is(".select2-highlighted")){var d=this.findHighlightableChoices();this.highlight(d.index(c))}else 0==c.length&&this.removeHighlight()},loadMoreIfNeeded:function(){var c,a=this.results,b=a.find("li.select2-more-results"),d=this.resultsPage+1,e=this,f=this.search.val(),g=this.context;0!==b.length&&(c=b.offset().top-a.offset().top-a.height(),c<=this.opts.loadMorePadding&&(b.addClass("select2-active"),this.opts.query({element:this.opts.element,term:f,page:d,context:g,matcher:this.opts.matcher,callback:this.bind(function(c){e.opened()&&(e.opts.populateResults.call(this,a,c.results,{term:f,page:d,context:g}),e.postprocessResults(c,!1,!1),c.more===!0?(b.detach().appendTo(a).html(e.opts.escapeMarkup(K(e.opts.formatLoadMore,e.opts.element,d+1))),window.setTimeout(function(){e.loadMoreIfNeeded()},10)):b.remove(),e.positionDropdown(),e.resultsPage=d,e.context=c.context,this.opts.element.trigger({type:"select2-loaded",items:c}))})})))},tokenize:function(){},updateResults:function(c){function m(){d.removeClass("select2-active"),h.positionDropdown(),e.find(".select2-no-results,.select2-selection-limit,.select2-searching").length?h.liveRegion.text(e.text()):h.liveRegion.text(h.opts.formatMatches(e.find('.select2-result-selectable:not(".select2-selected")').length))}function n(a){e.html(a),m()}var g,i,l,d=this.search,e=this.results,f=this.opts,h=this,j=d.val(),k=a.data(this.container,"select2-last-term");if((c===!0||!k||!r(j,k))&&(a.data(this.container,"select2-last-term",j),c===!0||this.showSearchInput!==!1&&this.opened())){l=++this.queryCount;var o=this.getMaximumSelectionSize();if(o>=1&&(g=this.data(),a.isArray(g)&&g.length>=o&&J(f.formatSelectionTooBig,"formatSelectionTooBig")))return n("<li class='select2-selection-limit'>"+K(f.formatSelectionTooBig,f.element,o)+"</li>"),void 0;if(d.val().length<f.minimumInputLength)return J(f.formatInputTooShort,"formatInputTooShort")?n("<li class='select2-no-results'>"+K(f.formatInputTooShort,f.element,d.val(),f.minimumInputLength)+"</li>"):n(""),c&&this.showSearch&&this.showSearch(!0),void 0;if(f.maximumInputLength&&d.val().length>f.maximumInputLength)return J(f.formatInputTooLong,"formatInputTooLong")?n("<li class='select2-no-results'>"+K(f.formatInputTooLong,f.element,d.val(),f.maximumInputLength)+"</li>"):n(""),void 0;f.formatSearching&&0===this.findHighlightableChoices().length&&n("<li class='select2-searching'>"+K(f.formatSearching,f.element)+"</li>"),d.addClass("select2-active"),this.removeHighlight(),i=this.tokenize(),i!=b&&null!=i&&d.val(i),this.resultsPage=1,f.query({element:f.element,term:d.val(),page:this.resultsPage,context:null,matcher:f.matcher,callback:this.bind(function(g){var i;if(l==this.queryCount){if(!this.opened())return this.search.removeClass("select2-active"),void 0;if(g.hasError!==b&&J(f.formatAjaxError,"formatAjaxError"))return n("<li class='select2-ajax-error'>"+K(f.formatAjaxError,f.element,g.jqXHR,g.textStatus,g.errorThrown)+"</li>"),void 0;if(this.context=g.context===b?null:g.context,this.opts.createSearchChoice&&""!==d.val()&&(i=this.opts.createSearchChoice.call(h,d.val(),g.results),i!==b&&null!==i&&h.id(i)!==b&&null!==h.id(i)&&0===a(g.results).filter(function(){return r(h.id(this),h.id(i))}).length&&this.opts.createSearchChoicePosition(g.results,i)),0===g.results.length&&J(f.formatNoMatches,"formatNoMatches"))return n("<li class='select2-no-results'>"+K(f.formatNoMatches,f.element,d.val())+"</li>"),void 0;e.empty(),h.opts.populateResults.call(this,e,g.results,{term:d.val(),page:this.resultsPage,context:null}),g.more===!0&&J(f.formatLoadMore,"formatLoadMore")&&(e.append("<li class='select2-more-results'>"+f.escapeMarkup(K(f.formatLoadMore,f.element,this.resultsPage))+"</li>"),window.setTimeout(function(){h.loadMoreIfNeeded()},10)),this.postprocessResults(g,c),m(),this.opts.element.trigger({type:"select2-loaded",items:g})}})})}},cancel:function(){this.close()},blur:function(){this.opts.selectOnBlur&&this.selectHighlighted({noFocus:!0}),this.close(),this.container.removeClass("select2-container-active"),this.search[0]===document.activeElement&&this.search.blur(),this.clearSearch(),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")},focusSearch:function(){y(this.search)},selectHighlighted:function(a){if(this._touchMoved)return this.clearTouchMoved(),void 0;var b=this.highlight(),c=this.results.find(".select2-highlighted"),d=c.closest(".select2-result").data("select2-data");d?(this.highlight(b),this.onSelect(d,a)):a&&a.noFocus&&this.close()},getPlaceholder:function(){var a;return this.opts.element.attr("placeholder")||this.opts.element.attr("data-placeholder")||this.opts.element.data("placeholder")||this.opts.placeholder||((a=this.getPlaceholderOption())!==b?a.text():b)},getPlaceholderOption:function(){if(this.select){var c=this.select.children("option").first();if(this.opts.placeholderOption!==b)return"first"===this.opts.placeholderOption&&c||"function"==typeof this.opts.placeholderOption&&this.opts.placeholderOption(this.select);if(""===a.trim(c.text())&&""===c.val())return c}},initContainerWidth:function(){function c(){var c,d,e,f,g,h;if("off"===this.opts.width)return null;if("element"===this.opts.width)return 0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px";if("copy"===this.opts.width||"resolve"===this.opts.width){if(c=this.opts.element.attr("style"),c!==b)for(d=c.split(";"),f=0,g=d.length;g>f;f+=1)if(h=d[f].replace(/\s/g,""),e=h.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i),null!==e&&e.length>=1)return e[1];return"resolve"===this.opts.width?(c=this.opts.element.css("width"),c.indexOf("%")>0?c:0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px"):null}return a.isFunction(this.opts.width)?this.opts.width():this.opts.width}var d=c.call(this);null!==d&&this.container.css("width",d)}}),d=O(c,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container"}).html(["<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>"," <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>"," <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>","</a>","<label for='' class='select2-offscreen'></label>","<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />","<div class='select2-drop select2-display-none'>"," <div class='select2-search'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'"," aria-autocomplete='list' />"," </div>"," <ul class='select2-results' role='listbox'>"," </ul>","</div>"].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var c,d,e;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),c=this.search.get(0),c.createTextRange?(d=c.createTextRange(),d.collapse(!1),d.select()):c.setSelectionRange&&(e=this.search.val().length,c.setSelectionRange(e,e))),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,g,c=this.container,d=this.dropdown,e=f();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=c.find(".select2-choice"),this.focusser=c.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+e),this.focusser.attr("aria-labelledby","select2-chosen-"+e),this.results.attr("id","select2-results-"+e),this.search.attr("aria-owns","select2-results-"+e),this.focusser.attr("id","s2id_autogen"+e),g=a("label[for='"+this.opts.element.attr("id")+"']"),this.opts.element.focus(this.bind(function(){this.focus()})),this.focusser.prev().text(g.text()).attr("for",this.focusser.attr("id"));var h=this.opts.element.attr("title");this.opts.element.attr("title",h||g.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&229!=a.keyCode){if(a.which===k.PAGE_UP||a.which===k.PAGE_DOWN)return A(a),void 0;switch(a.which){case k.UP:case k.DOWN:return this.moveHighlight(a.which===k.UP?-1:1),A(a),void 0;case k.ENTER:return this.selectHighlighted(),A(a),void 0;case k.TAB:return this.selectHighlighted({noFocus:!0}),void 0;case k.ESC:return this.cancel(a),A(a),void 0}}})),this.search.on("blur",this.bind(function(){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==k.TAB&&!k.isControl(a)&&!k.isFunctionKey(a)&&a.which!==k.ESC){if(this.opts.openOnEnter===!1&&a.which===k.ENTER)return A(a),void 0;if(a.which==k.DOWN||a.which==k.UP||a.which==k.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),A(a),void 0}return a.which==k.DELETE||a.which==k.BACKSPACE?(this.opts.allowClear&&this.clear(),A(a),void 0):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection&&this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),d.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.hide(),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.nextSearchTerm=c.opts.nextSearchTerm(a,c.search.val()))})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1]),this.select)this.select.val(a).find("option").filter(function(){return this.selected}).each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return this.clear(c),void 0;if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),e=O(c,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["<ul class='select2-choices'>"," <li class='select2-search-field'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>"," </li>","</ul>","<div class='select2-drop select2-drop-multi select2-display-none'>"," <ul class='select2-results'>"," </ul>","</div>"].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator,b.transformVal),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c<e.length;c++)for(var g=e[c],h=0;h<f.length;h++){var i=f[h];if(r(g,b.id(i))){a.push(i),f.splice(h,1);break}}d(a)}:a.noop})}),b},selectChoice:function(a){var b=this.container.find(".select2-search-choice-focus");b.length&&a&&a[0]==b[0]||(b.length&&this.opts.element.trigger("choice-deselected",b),b.removeClass("select2-search-choice-focus"),a&&a.length&&(this.close(),a.addClass("select2-search-choice-focus"),this.opts.element.trigger("choice-selected",a)))},destroy:function(){a("label[for='"+this.search.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"searchContainer","selection")},initContainer:function(){var c,b=".select2-choices";this.searchContainer=this.container.find(".select2-search-field"),this.selection=c=this.container.find(b);var d=this;this.selection.on("click",".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)",function(){d.search[0].focus(),d.selectChoice(a(this))}),this.search.attr("id","s2id_autogen"+f()),this.search.prev().text(a("label[for='"+this.opts.element.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.opts.element.focus(this.bind(function(){this.focus()})),this.search.on("input paste",this.bind(function(){this.search.attr("placeholder")&&0==this.search.val().length||this.isInterfaceEnabled()&&(this.opened()||this.open())})),this.search.attr("tabindex",this.elementTabIndex),this.keydowns=0,this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()){++this.keydowns;var b=c.find(".select2-search-choice-focus"),d=b.prev(".select2-search-choice:not(.select2-locked)"),e=b.next(".select2-search-choice:not(.select2-locked)"),f=z(this.search);if(b.length&&(a.which==k.LEFT||a.which==k.RIGHT||a.which==k.BACKSPACE||a.which==k.DELETE||a.which==k.ENTER)){var g=b;return a.which==k.LEFT&&d.length?g=d:a.which==k.RIGHT?g=e.length?e:null:a.which===k.BACKSPACE?this.unselect(b.first())&&(this.search.width(10),g=d.length?d:e):a.which==k.DELETE?this.unselect(b.first())&&(this.search.width(10),g=e.length?e:null):a.which==k.ENTER&&(g=null),this.selectChoice(g),A(a),g&&g.length||this.open(),void 0}if((a.which===k.BACKSPACE&&1==this.keydowns||a.which==k.LEFT)&&0==f.offset&&!f.length)return this.selectChoice(c.find(".select2-search-choice:not(.select2-locked)").last()),A(a),void 0;if(this.selectChoice(null),this.opened())switch(a.which){case k.UP:case k.DOWN:return this.moveHighlight(a.which===k.UP?-1:1),A(a),void 0;case k.ENTER:return this.selectHighlighted(),A(a),void 0;case k.TAB:return this.selectHighlighted({noFocus:!0}),this.close(),void 0;case k.ESC:return this.cancel(a),A(a),void 0}if(a.which!==k.TAB&&!k.isControl(a)&&!k.isFunctionKey(a)&&a.which!==k.BACKSPACE&&a.which!==k.ESC){if(a.which===k.ENTER){if(this.opts.openOnEnter===!1)return;if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return}this.open(),(a.which===k.PAGE_UP||a.which===k.PAGE_DOWN)&&A(a),a.which===k.ENTER&&A(a)}}})),this.search.on("keyup",this.bind(function(){this.keydowns=0,this.resizeSearch()})),this.search.on("blur",this.bind(function(b){this.container.removeClass("select2-container-active"),this.search.removeClass("select2-focused"),this.selectChoice(null),this.opened()||this.clearSearch(),b.stopImmediatePropagation(),this.opts.element.trigger(a.Event("select2-blur"))})),this.container.on("click",b,this.bind(function(b){this.isInterfaceEnabled()&&(a(b.target).closest(".select2-search-choice").length>0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.hide(),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c=[],d=[],e=this;a(b).each(function(){p(e.id(this),c)<0&&(c.push(e.id(this)),d.push(this))}),b=d,this.selection.find(".select2-search-choice").remove(),a(b).each(function(){e.addSelectedChoice(this)}),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,c){this.triggerSelect(a)&&""!==a.text&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.updateResults(),this.search.select()),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),c&&c.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(c){var j,k,d=!c.locked,e=a("<li class='select2-search-choice'> <div></div> <a href='#' class='select2-search-choice-close' tabindex='-1'></a></li>"),f=a("<li class='select2-search-choice select2-locked'><div></div></li>"),g=d?e:f,h=this.id(c),i=this.getVal();j=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),j!=b&&g.find("div").replaceWith(a("<div></div>").html(j)),k=this.opts.formatSelectionCssClass(c,g.find("div")),k!=b&&g.addClass(k),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),i.push(h),this.setVal(i)},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&this.opts.closeOnSelect===!0&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("<li class='select2-no-results'>"+K(g.opts.formatNoMatches,g.opts.element,g.search.val())+"</li>")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator,this.opts.transformVal))},setVal:function(b){var c;this.select?this.select.val(b):(c=[],a(b).each(function(){p(this,c)<0&&c.push(this)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator)))},buildChangeDetails:function(a,b){for(var b=b.slice(0),a=a.slice(0),c=0;c<b.length;c++)for(var d=0;d<a.length;d++)r(this.opts.id(b[c]),this.opts.id(a[d]))&&(b.splice(c,1),c>0&&c--,a.splice(d,1),d--);return{added:b,removed:a}},val:function(c,d){var e,f=this;if(0===arguments.length)return this.getVal();if(e=this.data(),e.length||(e=[]),!c&&0!==c)return this.opts.element.val(""),this.updateSelection([]),this.clearSearch(),d&&this.triggerChange({added:this.data(),removed:e}),void 0;if(this.setVal(c),this.select)this.opts.initSelection(this.select,this.bind(this.updateSelection)),d&&this.triggerChange(this.buildChangeDetails(e,this.data()));else{if(this.opts.initSelection===b)throw new Error("val() cannot be called if initSelection() is not defined");this.opts.initSelection(this.opts.element,function(b){var c=a.map(b,f.id);f.setVal(c),f.updateSelection(b),f.clearSearch(),d&&f.triggerChange(f.buildChangeDetails(e,f.data()))})}this.clearSearch()},onSortStart:function(){if(this.select)throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(this.text(a),c.term,e,d),e.join("")},transformVal:function(b){return a.trim(b)},formatSelection:function(a,c,d){return a?d(this.text(a)):b},sortResults:function(a){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(){return b},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},text:function(b){return b&&this.data&&this.data.text?a.isFunction(this.data.text)?this.data.text(b):b[this.data.text]:b.text
23
- },matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null},nextSearchTerm:function(){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b?a.opts.minimumResultsForSearch<0?!1:!0:!0}},a.fn.select2.locales=[],a.fn.select2.locales.en={formatMatches:function(a){return 1===a?"One result is available, press enter to select it.":a+" results are available, use up and down arrow keys to navigate."},formatNoMatches:function(){return"No matches found"},formatAjaxError:function(){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"}},a.extend(a.fn.select2.defaults,a.fn.select2.locales.en),a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":c,single:d,multi:e}}}}(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2.png DELETED
Binary file
trunk/classes/admin/settings/assets/js/select2/select2x2.png DELETED
Binary file
trunk/classes/admin/settings/assets/js/sf-jquery.js DELETED
@@ -1,23 +0,0 @@
1
- jQuery(document).ready(function () {
2
-
3
- jQuery(".sf-tips").tooltip({ animation: true, html: true, delay: { show: 300, hide: 100 } });
4
-
5
-
6
- //This if statement checks if the color picker widget exists within jQuery UI
7
- //If it does exist then we initialize the WordPress color picker on our text input field
8
- if (typeof jQuery.wp === 'object' && typeof jQuery.wp.wpColorPicker === 'function') {
9
- jQuery('.colorpick').wpColorPicker();
10
- } else {
11
- // Color picker
12
- jQuery('.colorpick').each(function () {
13
- jQuery('.colorpickdiv', jQuery(this).parent()).farbtastic(this);
14
- jQuery(this).click(function () {
15
- if (jQuery(this).val() == "") jQuery(this).val('#');
16
- jQuery('.colorpickdiv', jQuery(this).parent()).show();
17
- });
18
- });
19
- jQuery(document).mousedown(function () {
20
- jQuery('.colorpickdiv').hide();
21
- });
22
- }
23
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/wcvendors-media.js DELETED
@@ -1,50 +0,0 @@
1
- jQuery( function( $ ){
2
-
3
- // Iterate over all instances of the uploader on the page
4
- $('.wcv-img-id').each( function () {
5
-
6
- var id = $('.wcv-img-id').data( 'id' );
7
-
8
- // Handle Add banner
9
- $( '#wcv-add-' + id ).on( 'click', function(e) {
10
- e.preventDefault();
11
- file_uploader( id );
12
- return false;
13
- });
14
-
15
- });
16
-
17
- function file_uploader( id )
18
- {
19
-
20
- var media_uploader, json;
21
-
22
- if (undefined !== media_uploader ) {
23
- media_uploader.open();
24
- return;
25
- }
26
-
27
- media_uploader = wp.media({
28
- title: $( '#wcv-add-' + id ).data('window_title'),
29
- button: {
30
- text: $( '#wcv-add-' + id ).data('save_button'),
31
- },
32
- multiple: false // Set to true to allow multiple files to be selected
33
- });
34
-
35
- media_uploader.on( 'select' , function(){
36
-
37
- json = media_uploader.state().get('selection').first().toJSON();
38
-
39
- if ( 0 > $.trim( json.url.length ) ) {
40
- return;
41
- }
42
-
43
- $( '.wcv-image-container-' + id ).prop( 'src', json.sizes.full.url );
44
- $( '#' + id ).val( json.sizes.full.url );
45
-
46
- });
47
-
48
- media_uploader.open();
49
- }
50
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/classes/sf-class-format-options.php DELETED
@@ -1,347 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Format an options array into HTML
5
- * This class has been deprecated
6
- *
7
- * @author Matt Gates <http://mgates.me>
8
- * @package WordPress
9
- */
10
-
11
-
12
- if ( !class_exists( 'SF_Format_Options' ) ) {
13
-
14
- class SF_Format_Options extends SF_Settings_API
15
- {
16
-
17
- /**
18
- * Format an option array into HTML
19
- *
20
- *
21
- * @access public
22
- *
23
- * @param unknown $setting
24
- *
25
- * @return string HTML.
26
- */
27
- public function settings_options_format( $setting )
28
- {
29
- if ( empty( $setting ) ) return false;
30
-
31
- $defaults = apply_filters( $this->id . '_options_defaults', array(
32
- 'name' => '',
33
- 'desc' => '',
34
- 'placeholder' => '',
35
- 'class' => '',
36
- 'tip' => '',
37
- 'id' => '',
38
- 'css' => '',
39
- 'type' => 'text',
40
- 'std' => '',
41
- 'select2' => false,
42
- 'multiple' => false,
43
- 'options' => array(),
44
- 'restrict' => array(),
45
- 'settings' => array()
46
- ) );
47
-
48
- // Each to it's own variable for slim-ness' sakes.
49
- $setting = shortcode_atts( $defaults, $setting );
50
-
51
- $restrict_defaults = array(
52
- 'min' => 0,
53
- 'max' => '',
54
- 'step' => 'any',
55
- );
56
-
57
- $setting[ 'restrict' ] = shortcode_atts( $restrict_defaults, $setting[ 'restrict' ] );
58
-
59
- $setting[ 'value' ] = $this->get_option( $setting[ 'id' ] );
60
- $setting[ 'value' ] = $setting[ 'value' ] !== false ? maybe_unserialize( $setting[ 'value' ] ) : false;
61
- $setting[ 'value' ] = SF_Format_Options::sanitize_value( $setting[ 'value' ], $setting );
62
-
63
- $setting[ 'title' ] = $setting[ 'name' ];
64
- $setting[ 'name' ] = $this->id . "_options[{$setting['id']}]";
65
-
66
- $setting[ 'grouped' ] = !$setting[ 'title' ] ? ' style="padding-top:0px;"' : '';
67
- $setting[ 'tip' ] = SF_Format_Options::get_formatted_tip( $setting[ 'tip' ] );
68
-
69
- $header_types = apply_filters( $this->id . '_options_header_types', array( 'heading', 'title' ) );
70
-
71
- extract( $setting );
72
-
73
- $description = $desc && !$grouped && $type != 'checkbox'
74
- ? '<br /><small>' . $desc . '</small>'
75
- : '<label for="' . $id . '"> ' . $desc . '</label>';
76
-
77
- $description = ( ( in_array( $type, $header_types ) || $type == 'radio' ) && !empty( $desc ) )
78
- ? '<p>' . $desc . '</p>'
79
- : $description;
80
-
81
- ?>
82
-
83
- <?php if ( !in_array( $type, $header_types ) ) : ?>
84
- <!-- Header of the option. -->
85
- <tr valign="top">
86
- <th scope="row"<?php echo $grouped; ?>>
87
-
88
- <?php echo $tip; ?>
89
-
90
- <?php if ( !$grouped ) : ?>
91
- <label for="<?php echo $name; ?>" class="description"><?php echo $title; ?></label>
92
- <?php endif; ?>
93
-
94
- </th>
95
- <td <?php echo $grouped; ?> >
96
- <?php endif; ?>
97
-
98
- <?php foreach ( $header_types as $header ) :
99
- if ( $type != $header ) continue; ?>
100
- <tr>
101
- <th scope="col" colspan="2">
102
- <h3 class="title"><?php echo $title; ?></h3>
103
- <?php echo $description; ?>
104
- </th>
105
- </tr>
106
- <?php endforeach; ?>
107
-
108
- <?php switch ( $type ) :
109
-
110
- case 'text' :
111
- case 'color' :
112
- case 'number' :
113
- if ( $type == 'color' ) {
114
- $type = 'text';
115
- $class .= ' colorpick';
116
- $description .= '<div id="colorPickerDiv_' . $id . '" class="colorpickdiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;display:none;"></div>';
117
- }
118
- ?>
119
- <input name="<?php echo $name; ?>"
120
- id="<?php echo $id; ?>"
121
- type="<?php echo $type; ?>"
122
-
123
- <?php if ( $type == 'number' ): ?>
124
- min="<?php echo $restrict[ 'min' ]; ?>"
125
- max="<?php echo $restrict[ 'max' ]; ?>"
126
- step="<?php echo $restrict[ 'step' ]; ?>"
127
- <?php endif; ?>
128
-
129
- class="regular-text <?php echo $class; ?>"
130
- style="<?php echo $css; ?>"
131
- placeholder="<?php echo $placeholder; ?>"
132
- value="<?php echo $value !== false ? $value : $std; ?>"
133
- />
134
- <?php echo $description;
135
- break;
136
-
137
- case 'checkbox':
138
-
139
- $selected = ( $value !== false ) ? $value : $std;
140
-
141
- if ( $multiple ) :
142
-
143
- foreach ( $options as $key => $desc ) : ?>
144
-
145
- <input name="<?php echo $name; ?><?php echo $multiple ? '[]' : ''; ?>"
146
- id="<?php echo $id . '_' . $key; ?>"
147
- type="checkbox"
148
- class="<?php echo $class; ?>"
149
- style="<?php echo $css; ?>"
150
- value="<?php echo $key; ?>"
151
- <?php self::checked( $value, $key ); ?>
152
- />
153
- <label for="<?php echo $id . '_' . $key; ?>">
154
- <?php echo $desc; ?>
155
- </label>
156
- <br/>
157
- <?php
158
-
159
- endforeach;
160
-
161
- else : ?>
162
-
163
- <input name="<?php echo $name; ?>"
164
- id="<?php echo $id ?>"
165
- type="checkbox"
166
- class="<?php echo $class; ?>"
167
- style="<?php echo $css; ?>"
168
- <?php checked( $selected, 1 ); ?>
169
- />
170
- <?php echo $description;
171
- endif;
172
- break;
173
-
174
- case 'radio':
175
-
176
- $selected = ( $value !== false ) ? $value : $std;
177
-
178
- foreach ( $options as $key => $val ) : ?>
179
- <label class="radio">
180
- <input type="radio"
181
- name="<?php echo $name; ?>"
182
- id="<?php echo $key; ?>"
183
- value="<?php echo $key; ?>"
184
- class="<?php echo $class; ?>"
185
- <?php checked( $selected, $key ); ?>
186
- />
187
- <?php echo $val; ?>
188
- </label><br/>
189
- <?php endforeach;
190
- echo $description;
191
- break;
192
-
193
- case 'single_select_page':
194
-
195
- $selected = ( $value !== false ) ? $value : $std;
196
-
197
- $args = array(
198
- 'name' => $name,
199
- 'id' => $id,
200
- 'sort_order' => 'ASC',
201
- 'echo' => 0,
202
- 'selected' => $selected
203
- );
204
-
205
- echo str_replace( "'>", "'><option></option>", wp_dropdown_pages( $args ) );
206
-
207
- echo $description;
208
-
209
- if ( $select2 ) : ?>
210
- <script type="text/javascript">jQuery(function () {
211
- jQuery("#<?php echo $id; ?>").select2({ allowClear: true, placeholder: "<?php _e( 'Select a page...', 'geczy' ); ?>", width: '350px' });
212
- });</script>
213
- <?php endif;
214
-
215
- break;
216
-
217
- case 'select':
218
-
219
- $selected = ( $value !== false ) ? $value : $std;
220
- $options = apply_filters( $this->id . '_select_options', $options, $setting ); ?>
221
-
222
- <select id="<?php echo $id; ?>"
223
- class="<?php echo $class; ?>"
224
- style="<?php echo $css; ?>"
225
- name="<?php echo $name; ?><?php echo $multiple ? '[]' : ''; ?>"
226
- <?php echo $multiple ? 'multiple="multiple"' : ''; ?>>
227
-
228
- <?php foreach ( $options as $key => $val ) : ?>
229
- <option
230
- value="<?php echo $key; ?>" <?php self::selected( $selected, $key ); ?>><?php echo $val; ?></option>
231
- <?php endforeach; ?>
232
- </select>
233
-
234
- <?php echo $description;
235
-
236
- if ( $select2 ) : ?>
237
- <script type="text/javascript">jQuery(function () {
238
- jQuery("#<?php echo $id; ?>").select2({ width: '350px' });
239
- });</script>
240
- <?php endif;
241
-
242
- break;
243
-
244
- case 'textarea':
245
- ?>
246
- <textarea name="<?php echo $name; ?>"
247
- id="<?php echo $id; ?>"
248
- class="large-text <?php echo $class; ?>"
249
- style="<?php if ( $css ) echo $css; else echo 'width:300px;'; ?>"
250
- placeholder="<?php echo $placeholder; ?>"
251
- rows="3"
252
- ><?php echo ( $value !== false ) ? $value : $std; ?></textarea>
253
- <?php echo $description;
254
- break;
255
-
256
- case 'wysiwyg':
257
- wp_editor( $value, $id, array( 'textarea_name' => $name ) );
258
- echo $description;
259
- break;
260
-
261
- default :
262
- do_action( $this->id . '_options_type_' . $type, $setting );
263
- break;
264
-
265
- endswitch;
266
-
267
- /* Footer of the option. */
268
- if ( !in_array( $type, $header_types ) ) echo '</td></tr>';
269
-
270
- }
271
-
272
-
273
- /**
274
- *
275
- *
276
- * @param unknown $haystack
277
- * @param unknown $current
278
- */
279
- private function selected( $haystack, $current )
280
- {
281
-
282
- if ( is_array( $haystack ) && in_array( $current, $haystack ) ) {
283
- $current = $haystack = 1;
284
- }
285
-
286
- selected( $haystack, $current );
287
- }
288
-
289
-
290
- /**
291
- *
292
- *
293
- * @param unknown $haystack
294
- * @param unknown $current
295
- */
296
- private function checked( $haystack, $current )
297
- {
298
-
299
- if ( is_array( $haystack ) && !empty( $haystack[ $current ] ) ) {
300
- $current = $haystack = 1;
301
- }
302
-
303
- checked( $haystack, $current );
304
- }
305
-
306
-
307
- /**
308
- * Format a tooltip given a string
309
- *
310
- * @param string $tip
311
- *
312
- * @return string
313
- */
314
- private function get_formatted_tip( $tip )
315
- {
316
- return $tip ? sprintf( '<a href="#" title="%s" class="sf-tips" tabindex="99"></a>', $tip ) : '';
317
- }
318
-
319
-
320
- /**
321
- *
322
- *
323
- * @param unknown $value
324
- * @param unknown $setting
325
- *
326
- * @return unknown
327
- */
328
- private function sanitize_value( $value, $setting )
329
- {
330
- if ( $value !== false && $setting[ 'type' ] != 'wysiwyg' ) {
331
- if ( is_array( $value ) ) {
332
- foreach ( $value as $key => $output ) {
333
- $value[ $key ] = esc_attr( $output );
334
- }
335
- } else {
336
- $value = esc_attr( $value );
337
- }
338
- }
339
-
340
- return apply_filters( $this->id . '_options_sanitize_value', $value, $setting );
341
- }
342
-
343
-
344
- }
345
-
346
-
347
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/classes/sf-class-sanitize.php DELETED
@@ -1,177 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Sanitize filters
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package WordPress
8
- */
9
-
10
-
11
- if ( !class_exists( 'SF_Sanitize' ) ) {
12
-
13
- class SF_Sanitize
14
- {
15
-
16
-
17
- /**
18
- * Hooks
19
- */
20
- function __construct()
21
- {
22
- add_filter( 'geczy_sanitize_color', 'sanitize_text_field' );
23
- add_filter( 'geczy_sanitize_text', 'sanitize_text_field' );
24
- add_filter( 'geczy_sanitize_number', array( 'SF_Sanitize', 'sanitize_number_field' ) );
25
- add_filter( 'geczy_sanitize_textarea', array( 'SF_Sanitize', 'sanitize_textarea' ) );
26
- add_filter( 'geczy_sanitize_wysiwyg', array( 'SF_Sanitize', 'sanitize_wysiwyg' ) );
27
- add_filter( 'geczy_sanitize_checkbox', array( 'SF_Sanitize', 'sanitize_checkbox' ), 10, 2 );
28
- add_filter( 'geczy_sanitize_radio', array( 'SF_Sanitize', 'sanitize_enum' ), 10, 2 );
29
- add_filter( 'geczy_sanitize_select', array( 'SF_Sanitize', 'sanitize_enum' ), 10, 2 );
30
- add_filter( 'geczy_sanitize_image', array( 'SF_Sanitize', 'sanitize_image_url' ), 10, 2 );
31
- add_filter( 'geczy_sanitize_single_select_page', array( 'SF_Sanitize', 'sanitize_select_pages' ), 10, 2 );
32
- }
33
-
34
-
35
- /**
36
- * Numeric sanitization
37
- *
38
- * @param int $input
39
- *
40
- * @return int
41
- */
42
- public static function sanitize_number_field( $input )
43
- {
44
- $output = is_numeric( $input ) ? (float) $input : false;
45
-
46
- return $input;
47
- }
48
-
49
-
50
- /**
51
- * Textarea sanitization
52
- *
53
- * @param string $input
54
- *
55
- * @return string
56
- */
57
- public static function sanitize_textarea( $input )
58
- {
59
- global $allowedposttags;
60
- $output = wp_kses( $input, $allowedposttags );
61
-
62
- return $output;
63
- }
64
-
65
-
66
- /**
67
- * WYSIWYG sanitization
68
- *
69
- * @param string $input
70
- *
71
- * @return string
72
- */
73
- public static function sanitize_wysiwyg( $input )
74
- {
75
- return $input;
76
- }
77
-
78
-
79
- /**
80
- * Checkbox sanitization
81
- *
82
- * @param int $input
83
- * @param unknown $option
84
- *
85
- * @return int
86
- */
87
- public static function sanitize_checkbox( $input, $option )
88
- {
89
- if ( !empty( $option[ 'multiple' ] ) ) {
90
-
91
- $defaults = array_keys( $option[ 'options' ] );
92
-
93
- foreach ( $defaults as $value ) {
94
-
95
- if ( !is_array( $input ) ) {
96
- $output[ $value ] = 0;
97
- } else {
98
- $output[ $value ] = in_array( $value, $input ) ? 1 : 0;
99
- }
100
-
101
- }
102
-
103
- $output = serialize( $output );
104
- } else {
105
- $output = $input ? 1 : 0;
106
- }
107
-
108
- return $output;
109
- }
110
-
111
-
112
- /**
113
- * Array sanitization
114
- *
115
- * @param unknown $input
116
- * @param array $option
117
- *
118
- * @return bool
119
- */
120
- public static function sanitize_enum( $input, $option )
121
- {
122
- $output = $input;
123
-
124
- $sfs = new SF_Sanitize();
125
-
126
- if ( is_array( $input ) ) {
127
- foreach ( $input as $value ) {
128
- if ( !$sfs->sanitize_enum( $value, $option ) ) {
129
- $output = false;
130
- break;
131
- }
132
- }
133
- $output = $output ? serialize( $output ) : $output;
134
- } else {
135
- $output = array_key_exists( $input, $option[ 'options' ] ) ? $input : false;
136
- }
137
-
138
- return $output;
139
- }
140
-
141
-
142
- /**
143
- * Select box for pages sanitize
144
- *
145
- * @param int $input
146
- * @param int $option
147
- *
148
- * @return int
149
- */
150
- public static function sanitize_select_pages( $input, $option )
151
- {
152
- $output = get_page( $input ) ? (int) $input : 0;
153
-
154
- return $output;
155
- }
156
-
157
-
158
-
159
- /**
160
- * Image uploader
161
- *
162
- * @param url $input
163
- *
164
- * @return int
165
- */
166
- public static function sanitize_image_url( $input, $option ) {
167
-
168
- $output = $input;
169
- return $output;
170
-
171
- }
172
-
173
-
174
- }
175
-
176
-
177
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/classes/sf-class-settings.php DELETED
@@ -1,929 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * WP-Simple-Settings-Framework
5
- *
6
- * Copyright (c) 2012 Matt Gates.
7
- * All rights reserved.
8
- *
9
- * Redistribution and use in source and binary forms, with or without
10
- * modification, are permitted provided that the following conditions
11
- * are met:
12
- *
13
- * * Redistributions of source code must retain the above copyright
14
- * notice, this list of conditions and the following disclaimer.
15
- *
16
- * * Redistributions in binary form must reproduce the above copyright
17
- * notice, this list of conditions and the following disclaimer in
18
- * the documentation and/or other materials provided with the
19
- * distribution.
20
- *
21
- * * Neither the names of the copyright holders nor the names of the
22
- * contributors may be used to endorse or promote products derived
23
- * from this software without specific prior written permission.
24
- *
25
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36
- * POSSIBILITY OF SUCH DAMAGE.
37
- *
38
- * @subpackage WP-Simple-Settings-Framework
39
- * @copyright 2012 Matt Gates.
40
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
41
- * @link http://mgates.me
42
- * @version 1.1
43
- * @author Matt Gates <info@mgates.me>
44
- * @package WordPress
45
- */
46
-
47
-
48
- if ( !class_exists( 'SF_Settings_API' ) ) {
49
-
50
- class SF_Settings_API
51
- {
52
-
53
- private $data = array();
54
-
55
- /**
56
- * Init
57
- *
58
- * @param string $id
59
- * @param string $title
60
- * @param string $menu (optional)
61
- * @param string $file
62
- */
63
- public function __construct( $id, $title, $menu = '', $file )
64
- {
65
- $this->assets_url = trailingslashit( plugins_url( 'assets/', dirname( __FILE__ ) ) );
66
- $this->id = $id;
67
- $this->title = $title;
68
- $this->menu = empty( $menu ) ? 'plugins.php' : $menu;
69
-
70
- $this->file = $file;
71
-
72
- $this->includes();
73
- $this->actions();
74
- }
75
-
76
-
77
- // ==================================================================
78
- //
79
- // Getter and setter.
80
- //
81
- // ------------------------------------------------------------------
82
-
83
- /**
84
- * Setter
85
- *
86
- * @param unknown $name
87
- * @param unknown $value
88
- */
89
- public function __set( $name, $value )
90
- {
91
- if ( isset ( $this->data[ $name ] ) && is_array( $this->data[ $name ] ) ) {
92
- $this->data[ $name ] = array_merge( $this->data[ $name ], $value );
93
- } else {
94
- $this->data[ $name ] = $value;
95
- }
96
- }
97
-
98
-
99
- /**
100
- * Getter
101
- *
102
- * @param unknown $name
103
- *
104
- * @return unknown
105
- */
106
- public function __get( $name )
107
- {
108
- if ( array_key_exists( $name, $this->data ) ) {
109
- return $this->data[ $name ];
110
- }
111
-
112
- return null;
113
- }
114
-
115
-
116
- /**
117
- * Isset
118
- *
119
- * @param unknown $name
120
- *
121
- * @return unknown
122
- */
123
- public function __isset( $name )
124
- {
125
- return isset( $this->data[ $name ] );
126
- }
127
-
128
-
129
- /**
130
- * Unset
131
- *
132
- * @param unknown $name
133
- */
134
- public function __unset( $name )
135
- {
136
- unset( $this->data[ $name ] );
137
- }
138
-
139
-
140
- /**
141
- * Add a "Settings" link to the plugins.php page
142
- *
143
- * @param array $links
144
- * @param array $file
145
- *
146
- * @return array
147
- */
148
- public function add_settings_link( $links, $file )
149
- {
150
- $this_plugin = plugin_basename( $this->file );
151
- $page = strpos( $this->menu, '.php' ) ? $this->menu : 'admin.php';
152
- if ( $file == $this_plugin ) {
153
- $settings_link = '<a href="' . $page . '?page=' . $this->id . '">' . __( 'Settings', 'geczy' ) . '</a>';
154
- array_unshift( $links, $settings_link );
155
- }
156
-
157
- return $links;
158
- }
159
-
160
-
161
- // ==================================================================
162
- //
163
- // Begin initialization.
164
- //
165
- // ------------------------------------------------------------------
166
-
167
- /**
168
- * Core files
169
- */
170
- private function includes()
171
- {
172
- require_once dirname( __FILE__ ) . '/sf-class-sanitize.php';
173
- require_once dirname( __FILE__ ) . '/sf-class-format-options.php';
174
- new SF_Sanitize;
175
- }
176
-
177
-
178
- /**
179
- * Hooks
180
- */
181
- private function actions()
182
- {
183
- add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) );
184
- add_action( 'admin_init', array( &$this, 'register_options' ) );
185
- add_action( 'admin_menu', array( &$this, 'create_menu' ) );
186
- add_filter( 'plugin_action_links', array( &$this, 'add_settings_link' ), 10, 2 );
187
- }
188
-
189
-
190
- /**
191
- * Admin scripts and styles
192
- */
193
- public function admin_enqueue_scripts()
194
- {
195
- global $pagenow;
196
- if (is_admin() || $pagenow === 'wc_prd_vendor') {
197
- wp_register_script( 'bootstrap-tooltip', $this->assets_url . 'js/bootstrap-tooltip.js', array( 'jquery' ), '1.0' );
198
- wp_register_script( 'select2', $this->assets_url . 'js/select2/select2.min.js', array( 'jquery' ), '3.5.2' );
199
- wp_register_script( 'wcvendors-media', $this->assets_url . 'js/wcvendors-media.js', array( 'jquery' ), '1.0' );
200
- wp_register_script( 'sf-scripts', $this->assets_url . 'js/sf-jquery.js', array( 'jquery' ), '1.0' );
201
- wp_register_style( 'select2', $this->assets_url . 'js/select2/select2.css' );
202
- wp_register_style( 'sf-styles', $this->assets_url . 'css/sf-styles.css' );
203
- }
204
- }
205
-
206
-
207
- /**
208
- * Admin scripts and styles
209
- */
210
- public function admin_print_scripts()
211
- {
212
- global $wp_version;
213
-
214
- //Check wp version and load appropriate scripts for colorpicker.
215
- if ( 3.5 <= $wp_version ) {
216
- wp_enqueue_style( 'wp-color-picker' );
217
- wp_enqueue_script( 'wp-color-picker' );
218
- } else {
219
- wp_enqueue_style( 'farbtastic' );
220
- wp_enqueue_script( 'farbtastic' );
221
- }
222
-
223
- wp_enqueue_script( 'bootstrap-tooltip' );
224
- wp_enqueue_script( 'select2' );
225
- wp_enqueue_script( 'wcvendors-media' );
226
- wp_enqueue_script( 'sf-scripts' );
227
-
228
- wp_enqueue_style( 'wp-color-picker' );
229
- wp_enqueue_style( 'select2' );
230
- wp_enqueue_style( 'sf-styles' );
231
- }
232
-
233
-
234
- /**
235
- * Register setting
236
- */
237
- public function register_options()
238
- {
239
- register_setting( $this->id . '_options_nonce', $this->id . '_options', array( &$this, 'validate_options' ) );
240
- }
241
-
242
-
243
- /**
244
- * Create menu
245
- */
246
- public function create_menu()
247
- {
248
- $page = add_submenu_page( $this->menu, $this->title, $this->title, apply_filters( $this->id . '_manage_options', 'manage_options' ), $this->id, array( &$this, 'init_settings_page' ) );
249
- add_action( 'admin_print_scripts-' . $page, array( &$this, 'admin_print_scripts' ) );
250
- }
251
-
252
-
253
- /**
254
- * Parse options into tabbed organization
255
- *
256
- * @return array
257
- */
258
- private function parse_options()
259
- {
260
- $options = $this->options;
261
-
262
- foreach ( $options as $option ) {
263
-
264
- if ( $option[ 'type' ] == 'heading' ) {
265
- $tab_name = sanitize_title( $option[ 'name' ] );
266
- $this->tab_headers = array( $tab_name => $option[ 'name' ] );
267
-
268
- continue;
269
- }
270
-
271
- $option[ 'tab' ] = $tab_name;
272
- $tabs[ $tab_name ][ ] = $option;
273
-
274
- }
275
-
276
- $this->tabs = $tabs;
277
-
278
- return $tabs;
279
- }
280
-
281
-
282
- /**
283
- * Load the options array from a file
284
- *
285
- * @param string $option_file
286
- */
287
- public function load_options( $option_file )
288
- {
289
- if ( !empty( $this->options ) ) return;
290
-
291
- if ( file_exists( $option_file ) ) {
292
- require $option_file;
293
- $this->options = apply_filters( $this->id . '_options', $options );
294
- $this->parse_options();
295
-
296
- $this->current_options = $this->get_current_options();
297
-
298
- /* If the option has no saved data, load the defaults. */
299
- /* @TODO: Can prob add this to the activation hook. */
300
- $this->set_defaults( $this->current_options );
301
- } else {
302
- wp_die( __( 'Could not load settings at: ', 'geczy' ) . '<br/><code>' . $option_file . '</code>', __( 'Error - WP Settings Framework', 'geczy' ) );
303
- }
304
- }
305
-
306
-
307
- /**
308
- *
309
- *
310
- * @return unknown
311
- */
312
- public function get_current_options()
313
- {
314
- if ( !empty( $this->current_options ) )
315
- return $this->current_options;
316
-
317
- $options = get_option( $this->id . '_options' );
318
-
319
- if ( $options ) {
320
- $options = array_map( 'maybe_unserialize', $options );
321
- }
322
-
323
- return $options;
324
- }
325
-
326
-
327
- /**
328
- * Sanitize and validate post fields
329
- *
330
- * @param unknown $input
331
- *
332
- * @return unknown
333
- */
334
- public function validate_options( $input )
335
- {
336
- if ( !isset( $_POST[ 'update' ] ) )
337
- return $this->get_defaults();
338
-
339
- $clean = $this->current_options;
340
- $tabname = $_POST[ 'currentTab' ];
341
-
342
- foreach ( $this->tabs[ $tabname ] as $option ) :
343
-
344
- if ( !isset( $option[ 'id' ] ) )
345
- continue;
346
-
347
- if ( !isset( $option[ 'type' ] ) )
348
- continue;
349
-
350
- if ( $option[ 'type' ] == 'select' ) {
351
- $option[ 'options' ] = apply_filters( $this->id . '_select_options', $option[ 'options' ], $option );
352
- }
353
-
354
- $id = sanitize_text_field( strtolower( $option[ 'id' ] ) );
355
-
356
- // Set checkbox to false if it wasn't sent in the $_POST
357
- if ( 'checkbox' == $option[ 'type' ] && !isset( $input[ $id ] ) )
358
- $input[ $id ] = 0;
359
-
360
- // For a value to be submitted to database it must pass through a sanitization filter
361
- if ( has_filter( 'geczy_sanitize_' . $option[ 'type' ] ) ) {
362
- $clean[ $id ] = apply_filters( 'geczy_sanitize_' . $option[ 'type' ], $input[ $id ], $option );
363
- }
364
-
365
- endforeach;
366
-
367
- do_action( $this->id . '_options_updated', $clean, $tabname );
368
- add_settings_error( $this->id, 'save_options', __( 'Settings saved.', 'geczy' ), 'updated' );
369
-
370
- return apply_filters( $this->id . '_options_on_update', $clean, $tabname );
371
- }
372
-
373
-
374
- /**
375
- * Create default options
376
- *
377
- * @param unknown $current_options (optional)
378
- */
379
- private function set_defaults( $current_options = array() )
380
- {
381
- $options = $this->get_defaults( $current_options );
382
- if ( $options ) {
383
- update_option( $this->id . '_options', $options );
384
- }
385
- }
386
-
387
-
388
- /**
389
- * Retrieve default options
390
- *
391
- * @param unknown $currents (optional)
392
- *
393
- * @return array
394
- */
395
- private function get_defaults( $currents = array() )
396
- {
397
- $output = array();
398
- $config = $this->options;
399
- $flag = false;
400
-
401
- if ( $currents ) {
402
- foreach ( $config as $value ) {
403
- if ( !isset( $value[ 'id' ] ) || !isset( $value[ 'std' ] ) || !isset( $value[ 'type' ] ) )
404
- continue;
405
-
406
- if ( !isset( $currents[ $value[ 'id' ] ] ) ) {
407
- $flag = true;
408
- }
409
- }
410
- }
411
-
412
- foreach ( $config as $option ) {
413
- if ( !isset( $option[ 'id' ] ) || !isset( $option[ 'std' ] ) || !isset( $option[ 'type' ] ) )
414
- continue;
415
-
416
- if ( $currents && isset( $currents[ $option[ 'id' ] ] ) ) {
417
- $output[ $option[ 'id' ] ] = $currents[ $option[ 'id' ] ];
418
- } else if ( has_filter( 'geczy_sanitize_' . $option[ 'type' ] ) ) {
419
- $output[ $option[ 'id' ] ] = apply_filters( 'geczy_sanitize_' . $option[ 'type' ], $option[ 'std' ], $option );
420
- }
421
- }
422
-
423
- if ( $currents ) {
424
- $output = array_merge( $currents, $output );
425
- }
426
-
427
- return !$flag && $currents ? array() : $output;
428
- }
429
-
430
-
431
- /**
432
- * HTML header
433
- */
434
- private function template_header()
435
- {
436
- ?>
437
- <div class="wrap">
438
- <?php screen_icon(); ?><h2><?php echo $this->title; ?></h2>
439
-
440
- <h2 class="nav-tab-wrapper">
441
- <?php echo $this->display_tabs(); ?>
442
- </h2><?php
443
-
444
- if ( !empty ( $_REQUEST[ 'settings-updated' ] ) )
445
- settings_errors();
446
-
447
- }
448
-
449
-
450
- /**
451
- * HTML body
452
- *
453
- * @return unknown
454
- */
455
- private function template_body()
456
- {
457
-
458
- if ( empty( $this->options ) ) return false;
459
-
460
-
461
- $options = $this->options;
462
- $tabs = $this->get_tabs();
463
- $tabname = !empty ( $_GET[ 'tab' ] ) ? $_GET[ 'tab' ] : $tabs[ 0 ][ 'slug' ];
464
-
465
- $options = apply_filters( $this->id . '_options_tab-' . $tabname, $this->tabs[ $tabname ] ); ?>
466
-
467
- <form method="post" action="options.php">
468
- <?php settings_fields( $this->id . '_options_nonce' ); ?>
469
- <table class="form-table">
470
-
471
- <?php
472
- foreach ( $options as $value ) :
473
- $this->settings_options_format( $value );
474
- endforeach;
475
-
476
- do_action( $this->id . '_options_tab-' . $tabname );
477
- ?>
478
-
479
- </table>
480
-
481
- <p class="submit">
482
- <input type="hidden" name="currentTab" value="<?php echo $tabname; ?>">
483
- <input type="submit" name="update" class="button-primary"
484
- value="<?php echo sprintf( __( 'Save %s changes', 'geczy' ), $this->tab_headers[ $tabname ] ); ?>"/>
485
- </p>
486
- </form> <?php
487
-
488
- }
489
-
490
-
491
- /**
492
- * HTML footer
493
- */
494
- private function template_footer()
495
- {
496
- echo '</div>';
497
- }
498
-
499
-
500
- /**
501
- * Create the settings page
502
- */
503
- public function init_settings_page()
504
- {
505
-
506
- $this->template_header();
507
- $this->template_body();
508
- $this->template_footer();
509
-
510
- }
511
-
512
-
513
- /**
514
- * Retrieve tabs
515
- *
516
- * @return array
517
- */
518
- private function get_tabs()
519
- {
520
- $tabs = array();
521
- foreach ( $this->options as $option ) {
522
-
523
- if ( $option[ 'type' ] != 'heading' )
524
- continue;
525
-
526
- $option[ 'slug' ] = sanitize_title( $option[ 'name' ] );
527
- unset( $option[ 'type' ] );
528
-
529
- $tabs[ ] = $option;
530
- }
531
-
532
- return $tabs;
533
- }
534
-
535
-
536
- /**
537
- * Heading for navigation
538
- *
539
- * @return string
540
- */
541
- private function display_tabs()
542
- {
543
- $tabs = $this->get_tabs();
544
- $tabname = !empty ( $_GET[ 'tab' ] ) ? $_GET[ 'tab' ] : $tabs[ 0 ][ 'slug' ];
545
- $menu = '';
546
-
547
- foreach ( $tabs as $tab ) {
548
- $class = $tabname == $tab[ 'slug' ] ? 'nav-tab-active' : '';
549
-
550
- $fields = array(
551
- 'page' => $this->id,
552
- 'tab' => $tab[ 'slug' ],
553
- );
554
-
555
- $query = http_build_query( array_merge( $_GET, $fields ) );
556
- $menu .= sprintf( '<a id="%s-tab" class="nav-tab %s" title="%s" href="?%s">%s</a>', $tab[ 'slug' ], $class, $tab[ 'name' ], $query, esc_html( $tab[ 'name' ] ) );
557
- }
558
-
559
- return $menu;
560
- }
561
-
562
-
563
- /**
564
- * Update an option
565
- *
566
- * @param string $name
567
- * @param string $value
568
- *
569
- * @return bool
570
- */
571
- public function update_option( $name, $value )
572
- {
573
- // Overwrite the key/value pair
574
- $this->current_options = array( $name => $value ) + (array) $this->current_options;
575
-
576
- return update_option( $this->id . '_options', $this->current_options );
577
- }
578
-
579
-
580
- /**
581
- * Get an option
582
- *
583
- * @param string $name
584
- * @param string $default (optional)
585
- *
586
- * @return bool
587
- */
588
- public function get_option( $name, $default = false )
589
- {
590
- return isset( $this->current_options[ $name ] ) ? maybe_unserialize( $this->current_options[ $name ] ) : $default;
591
- }
592
-
593
-
594
- public function settings_options_format( $setting )
595
- {
596
- if ( empty( $setting ) ) return false;
597
-
598
- $defaults = apply_filters( $this->id . '_options_defaults', array(
599
- 'name' => '',
600
- 'desc' => '',
601
- 'placeholder' => '',
602
- 'class' => '',
603
- 'tip' => '',
604
- 'id' => '',
605
- 'css' => '',
606
- 'type' => 'text',
607
- 'std' => '',
608
- 'select2' => false,
609
- 'multiple' => false,
610
- 'options' => array(),
611
- 'restrict' => array(),
612
- 'settings' => array()
613
- ) );
614
-
615
- // Each to it's own variable for slim-ness' sakes.
616
- $setting = shortcode_atts( $defaults, $setting );
617
-
618
- $restrict_defaults = array(
619
- 'min' => 0,
620
- 'max' => '',
621
- 'step' => 'any',
622
- );
623
-
624
- $setting[ 'restrict' ] = shortcode_atts( $restrict_defaults, $setting[ 'restrict' ] );
625
-
626
- $setting[ 'value' ] = $this->get_option( $setting[ 'id' ] );
627
- $setting[ 'value' ] = $setting[ 'value' ] !== false ? maybe_unserialize( $setting[ 'value' ] ) : false;
628
- $setting[ 'value' ] = $this->sanitize_value( $setting[ 'value' ], $setting );
629
-
630
- $setting[ 'title' ] = $setting[ 'name' ];
631
- $setting[ 'name' ] = $this->id . "_options[{$setting['id']}]";
632
-
633
- $setting[ 'grouped' ] = !$setting[ 'title' ] ? ' style="padding-top:0px;"' : '';
634
- $setting[ 'tip' ] = $this->get_formatted_tip( $setting[ 'tip' ] );
635
-
636
- $header_types = apply_filters( $this->id . '_options_header_types', array( 'heading', 'title' ) );
637
-
638
- extract( $setting );
639
-
640
- $description = $desc && !$grouped && $type != 'checkbox'
641
- ? '<br /><small>' . $desc . '</small>'
642
- : '<label for="' . $id . '"> ' . $desc . '</label>';
643
-
644
- $description = ( ( in_array( $type, $header_types ) || $type == 'radio' ) && !empty( $desc ) )
645
- ? '<p>' . $desc . '</p>'
646
- : $description;
647
-
648
- ?>
649
-
650
- <?php if ( !in_array( $type, $header_types ) ) : ?>
651
- <!-- Header of the option. -->
652
- <tr valign="top">
653
- <th scope="row"<?php echo $grouped; ?>>
654
-
655
- <?php echo $tip; ?>
656
-
657
- <?php if ( !$grouped ) : ?>
658
- <label for="<?php echo $name; ?>" class="description"><?php echo $title; ?></label>
659
- <?php endif; ?>
660
-
661
- </th>
662
- <td <?php echo $grouped; ?> >
663
- <?php endif; ?>
664
-
665
- <?php foreach ( $header_types as $header ) :
666
- if ( $type != $header ) continue; ?>
667
- <tr>
668
- <th scope="col" colspan="2">
669
- <h3 class="title"><?php echo $title; ?></h3>
670
- <?php echo $description; ?>
671
- </th>
672
- </tr>
673
- <?php endforeach; ?>
674
-
675
- <?php switch ( $type ) :
676
-
677
- case 'text' :
678
- case 'color' :
679
- case 'number' :
680
- if ( $type == 'color' ) {
681
- $type = 'text';
682
- $class .= ' colorpick';
683
- $description .= '<div id="colorPickerDiv_' . $id . '" class="colorpickdiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;display:none;"></div>';
684
- }
685
- ?>
686
- <input name="<?php echo $name; ?>"
687
- id="<?php echo $id; ?>"
688
- type="<?php echo $type; ?>"
689
-
690
- <?php if ( $type == 'number' ): ?>
691
- min="<?php echo $restrict[ 'min' ]; ?>"
692
- max="<?php echo $restrict[ 'max' ]; ?>"
693
- step="<?php echo $restrict[ 'step' ]; ?>"
694
- <?php endif; ?>
695
-
696
- class="regular-text <?php echo $class; ?>"
697
- style="<?php echo $css; ?>"
698
- placeholder="<?php echo $placeholder; ?>"
699
- value="<?php echo $value !== false ? $value : $std; ?>"
700
- />
701
- <?php echo $description;
702
- break;
703
-
704
- case 'checkbox':
705
-
706
- $selected = ( $value !== false ) ? $value : $std;
707
-
708
- if ( $multiple ) :
709
-
710
- foreach ( $options as $key => $desc ) : ?>
711
-
712
- <input name="<?php echo $name; ?><?php echo $multiple ? '[]' : ''; ?>"
713
- id="<?php echo $id . '_' . $key; ?>"
714
- type="checkbox"
715
- class="<?php echo $class; ?>"
716
- style="<?php echo $css; ?>"
717
- value="<?php echo $key; ?>"
718
- <?php @checked( $selected[$key], 1 ); ?>
719
- />
720
- <label for="<?php echo $id . '_' . $key; ?>">
721
- <?php echo $desc; ?>
722
- </label>
723
- <br/>
724
- <?php
725
-
726
- endforeach;
727
-
728
- else : ?>
729
-
730
- <input name="<?php echo $name; ?>"
731
- id="<?php echo $id ?>"
732
- type="checkbox"
733
- class="<?php echo $class; ?>"
734
- style="<?php echo $css; ?>"
735
- <?php checked( $selected, 1 ); ?>
736
- />
737
- <?php echo $description;
738
- endif;
739
- break;
740
-
741
- case 'radio':
742
-
743
- $selected = ( $value !== false ) ? $value : $std;
744
-
745
- foreach ( $options as $key => $val ) : ?>
746
- <label class="radio">
747
- <input type="radio"
748
- name="<?php echo $name; ?>"
749
- id="<?php echo $key; ?>"
750
- value="<?php echo $key; ?>"
751
- class="<?php echo $class; ?>"
752
- <?php checked( $selected, $key ); ?>
753
- />
754
- <?php echo $val; ?>
755
- </label><br/>
756
- <?php endforeach;
757
- echo $description;
758
- break;
759
-
760
- case 'single_select_page':
761
-
762
- $selected = ( $value !== false ) ? $value : $std;
763
-
764
- if ( $value == 0 ) $selected = $std;
765
-
766
- $args = array(
767
- 'name' => $name,
768
- 'id' => $id,
769
- 'sort_order' => 'ASC',
770
- 'echo' => 0,
771
- 'selected' => $selected
772
- );
773
-
774
- echo str_replace( "'>", "'><option></option>", wp_dropdown_pages( $args ) );
775
-
776
- echo $description;
777
-
778
- if ( $select2 ) : ?>
779
- <script type="text/javascript">jQuery(function () {
780
- jQuery("#<?php echo $id; ?>").select2({ allowClear: true, placeholder: "<?php _e( 'Select a page...', 'geczy' ); ?>", width: '350px' });
781
- });</script>
782
- <?php endif;
783
-
784
- break;
785
-
786
- case 'select':
787
-
788
- $selected = ( $value !== false ) ? $value : $std;
789
- $options = apply_filters( $this->id . '_select_options', $options, $setting ); ?>
790
-
791
- <select id="<?php echo $id; ?>"
792
- class="<?php echo $class; ?>"
793
- style="<?php echo $css; ?>"
794
- name="<?php echo $name; ?><?php echo $multiple ? '[]' : ''; ?>"
795
- <?php echo $multiple ? 'multiple="multiple"' : ''; ?>>
796
-
797
- <?php foreach ( $options as $key => $val ) : ?>
798
- <option
799
- value="<?php echo $key; ?>" <?php self::selected( $selected, $key ); ?>><?php echo $val; ?></option>
800
- <?php endforeach; ?>
801
- </select>
802
-
803
- <?php echo $description;
804
-
805
- if ( $select2 ) : ?>
806
- <script type="text/javascript">jQuery(function () {
807
- jQuery("#<?php echo $id; ?>").select2({ width: '350px' });
808
- });</script>
809
- <?php endif;
810
-
811
- break;
812
-
813
- case 'textarea':
814
- ?>
815
- <textarea name="<?php echo $name; ?>"
816
- id="<?php echo $id; ?>"
817
- class="large-text <?php echo $class; ?>"
818
- style="<?php if ( $css ) echo $css; else echo 'width:300px;'; ?>"
819
- placeholder="<?php echo $placeholder; ?>"
820
- rows="3"
821
- ><?php echo ( $value !== false ) ? $value : $std; ?></textarea>
822
- <?php echo $description;
823
- break;
824
-
825
- case 'wysiwyg':
826
- wp_editor( $value, $id, array( 'textarea_name' => $name ) );
827
- echo $description;
828
- break;
829
-
830
- case 'image':
831
-
832
- if ( empty ( $value ) ) $value = $std;
833
-
834
- ?>
835
- <img class="wcv-image-container-<?php echo $id; ?>" src="<?php echo $value; ?>" alt="" style="max-width:100%;" />
836
- <br />
837
- <input id="wcv-add-<?php echo $id; ?>" type="button" class="<?php echo $class; ?>" value="<?php echo sprintf( __( 'Update %s', 'wcvendors' ), strtolower( $title ) ); ?>" data-id="<?php echo $id; ?>" data-save_button="<?php echo sprintf( __( 'Add %s', 'wcvendors' ), $title ); ?>" data-window_title="<?php echo sprintf( __( 'Add %s', 'wcvendors' ), strtolower( $title ) ); ?>" data-upload_notice="<?php echo sprintf( __( 'Upload an image for the %s', 'wcvendors' ), strtolower( $title ) ); ?>" />
838
- <input type="hidden" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo $value; ?>">
839
- <?php
840
- break;
841
-
842
- default :
843
- do_action( $this->id . '_options_type_' . $type, $setting );
844
- break;
845
-
846
- endswitch;
847
-
848
- /* Footer of the option. */
849
- if ( !in_array( $type, $header_types ) ) echo '</td></tr>';
850
-
851
- }
852
-
853
-
854
- /**
855
- *
856
- *
857
- * @param unknown $haystack
858
- * @param unknown $current
859
- */
860
- private function selected( $haystack, $current )
861
- {
862
-
863
- if ( is_array( $haystack ) && in_array( $current, $haystack ) ) {
864
- $current = $haystack = 1;
865
- }
866
-
867
- selected( $haystack, $current );
868
- }
869
-
870
-
871
- /**
872
- *
873
- *
874
- * @param unknown $haystack
875
- * @param unknown $current
876
- */
877
- private function checked( $haystack, $current )
878
- {
879
-
880
- if ( is_array( $haystack ) && !empty( $haystack[ $current ] ) ) {
881
- $current = $haystack = 1;
882
- }
883
-
884
- checked( $haystack, $current );
885
- }
886
-
887
-
888
- /**
889
- * Format a tooltip given a string
890
- *
891
- * @param string $tip
892
- *
893
- * @return string
894
- */
895
- private function get_formatted_tip( $tip )
896
- {
897
- return $tip ? sprintf( '<a href="#" title="%s" class="sf-tips" tabindex="99"></a>', $tip ) : '';
898
- }
899
-
900
-
901
- /**
902
- *
903
- *
904
- * @param unknown $value
905
- * @param unknown $setting
906
- *
907
- * @return unknown
908
- */
909
- private function sanitize_value( $value, $setting )
910
- {
911
- if ( $value !== false && $setting[ 'type' ] != 'wysiwyg' ) {
912
- if ( is_array( $value ) ) {
913
- foreach ( $value as $key => $output ) {
914
- $value[ $key ] = esc_attr( $output );
915
- }
916
- } else {
917
- $value = esc_attr( $value );
918
- }
919
- }
920
-
921
- return apply_filters( $this->id . '_options_sanitize_value', $value, $setting );
922
- }
923
-
924
-
925
-
926
- }
927
-
928
-
929
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/sf-options.php DELETED
@@ -1,353 +0,0 @@
1
- <?php
2
- $options = array();
3
-
4
- $options[ ] = array( 'name' => __( 'General', 'wcvendors' ), 'type' => 'heading' );
5
- $options[ ] = array( 'name' => __( 'General options', 'wcvendors' ), 'type' => 'title', 'desc' => '' );
6
-
7
- $options[ ] = array(
8
- 'name' => __( 'Default commission (%)', 'wcvendors' ),
9
- 'desc' => __( 'The default rate you pay each vendor for a product sale. <br>You can also give vendors their own individual commission rates by editing the vendors user account.<br>Also, you can edit an individual products commission to override both of these settings on a per product basis.', 'wcvendors' ),
10
- 'id' => 'default_commission',
11
- 'css' => 'width:70px;',
12
- 'type' => 'number',
13
- 'restrict' => array(
14
- 'min' => 0,
15
- 'max' => 100
16
- )
17
- );
18
-
19
- /* Customize registration message depending on if they have registration enabled on the my account page */
20
- $registration_message = __( 'Allow users or guests to apply to become a vendor', 'wcvendors' );
21
- if ( get_option( 'woocommerce_enable_myaccount_registration' ) === 'no' ) {
22
- $registration_message = __( 'Allow users or guests to apply to become a vendor. <br><br><strong>WARNING:</strong> You MUST "<strong>Enable registration on the "My Account" page</strong>" in your <strong>WooCommerce > Settings > Accounts</strong> page for this option to work. Currently, you have registration disabled.', 'wcvendors' );
23
- }
24
-
25
- $options[ ] = array(
26
- 'name' => __( 'Registration', 'wcvendors' ),
27
- 'desc' => __( 'Allow users or guests to apply to become a vendor', 'wcvendors' ),
28
- 'tip' => __( 'This will show a checkbox on the My Account page\'s registration form asking if the user would like to apply to be a vendor. Also, on the Vendor Dashboard, users can still apply to become a vendor even if this is disabled.', 'wcvendors' ),
29
- 'id' => 'show_vendor_registration',
30
- 'type' => 'checkbox',
31
- 'std' => true,
32
- );
33
-
34
- $options[ ] = array(
35
- 'desc' => __( 'Approve vendor applications manually', 'wcvendors' ),
36
- 'tip' => __( 'With this unchecked, all vendor applications are automatically accepted. Otherwise, you must approve each manually.', 'wcvendors' ),
37
- 'id' => 'manual_vendor_registration',
38
- 'type' => 'checkbox',
39
- 'std' => true,
40
- );
41
-
42
- $options[ ] = array(
43
- 'name' => __( 'Taxes', 'wcvendors' ),
44
- 'desc' => __( 'Give vendors any tax collected per-product', 'wcvendors' ),
45
- 'tip' => __( 'The tax collected on a vendor\'s product will be given in its entirety', 'wcvendors' ),
46
- 'id' => 'give_tax',
47
- 'type' => 'checkbox',
48
- 'std' => false,
49
- );
50
-
51
- $options[ ] = array(
52
- 'name' => __( 'Shipping', 'wcvendors' ),
53
- 'desc' => __( 'Give vendors any shipping collected per-product', 'wcvendors' ),
54
- 'tip' => __( 'WC Vendors Free - Give vendors shipping if using Per Product Shipping gateway. WC Vendors Pro - Give vendors shipping when using Vendor Shipping. No other shipping module is compatible with this option.', 'wcvendors' ),
55
- 'id' => 'give_shipping',
56
- 'type' => 'checkbox',
57
- 'std' => true,
58
- );
59
-
60
- $options[ ] = array( 'name' => __( 'Shop options', 'wcvendors' ), 'type' => 'title', 'desc' => '' );
61
-
62
- $options[ ] = array(
63
- 'name' => __( 'Shop HTML', 'wcvendors' ),
64
- 'desc' => __( 'Enable HTML for a vendor\'s shop description by default. You can enable or disable this per vendor by editing the vendors user account.', 'wcvendors' ),
65
- 'id' => 'shop_html_enabled',
66
- 'type' => 'checkbox',
67
- 'std' => true,
68
- );
69
-
70
- $options[ ] = array(
71
- 'name' => __( 'Vendor Shop Page', 'wcvendors' ),
72
- 'desc' => __( 'Enter one word for the URI. If you enter "<strong>vendors</strong>" your vendors store will be <code>yourdomain.com/vendors/store-name/</code>', 'wcvendors' ),
73
- 'id' => 'vendor_shop_permalink',
74
- 'type' => 'text',
75
- 'std' => 'vendors/',
76
- );
77
-
78
- $options[ ] = array(
79
- 'name' => __( 'Shop Headers', 'wcvendors' ),
80
- 'desc' => __( 'Enable vendor shop headers', 'wcvendors' ),
81
- 'tip' => __( 'This will override the HTML Shop description output on product-archive pages. In order to customize the shop headers visit wcvendors.com and read the article in the Knowledgebase titled Changing the Vendor Templates.', 'wcvendors' ),
82
- 'id' => 'shop_headers_enabled',
83
- 'type' => 'checkbox',
84
- 'std' => false,
85
- );
86
-
87
- $options[ ] = array(
88
- 'name' => __( 'Vendor Display Name', 'wcvendors' ),
89
- 'desc' => __( 'Select what will be displayed for the sold by text throughout the store.', 'wcvendors' ),
90
- 'id' => 'vendor_display_name',
91
- 'type' => 'select',
92
- 'options' => array(
93
- 'display_name' => __( 'Display Name', 'wcvendors'),
94
- 'shop_name' => __( 'Shop Name', 'wcvendors'),
95
- 'user_login' => __( 'User Login', 'wcvendors'),
96
- 'user_email' => __( 'User Email', 'wcvendors'),
97
- ),
98
- 'std' => 'shop_name'
99
-
100
- );
101
-
102
- $options[ ] = array(
103
- 'name' => __( 'Sold By Label', 'wcvendors' ),
104
- 'desc' => __( 'The sold by label used on the site and emails.', 'wcvendors' ),
105
- 'id' => 'sold_by_label',
106
- 'type' => 'text',
107
- 'std' => __( 'Sold By', 'wcvendors' ),
108
- );
109
-
110
- $options[ ] = array(
111
- 'name' => __( 'Seller Info Label', 'wcvendors' ),
112
- 'desc' => __( 'The seller info tab title on the single product page.', 'wcvendors' ),
113
- 'id' => 'seller_info_label',
114
- 'type' => 'text',
115
- 'std' => __( 'Seller Info', 'wcvendors' ),
116
- );
117
-
118
- $options[ ] = array( 'name' => __( 'Products', 'wcvendors' ), 'type' => 'heading' );
119
- $options[ ] = array( 'name' => __( 'Product Add Page', 'wcvendors' ), 'type' => 'title', 'desc' => __( 'Configure what to hide from all vendors when adding a product', 'wcvendors' ) );
120
-
121
- $options[ ] = array(
122
- 'name' => __( 'Left side panel', 'wcvendors' ),
123
- 'desc' => __( 'CHECKING these boxes will **HIDE** these areas of the add product page for vendors', 'wcvendors' ),
124
- 'id' => 'hide_product_panel',
125
- 'options' => array(
126
- 'inventory' => __( 'Inventory', 'wcvendors' ),
127
- 'shipping' => __( 'Shipping', 'wcvendors' ),
128
- 'linked_product' => __( 'Linked Products', 'wcvendors' ),
129
- 'attribute' => __( 'Attributes', 'wcvendors' ),
130
- 'advanced' => __( 'Advanced', 'wcvendors' ),
131
- ),
132
- 'type' => 'checkbox',
133
- 'multiple' => true,
134
- );
135
-
136
- $options[ ] = array(
137
- 'name' => __( 'Types', 'wcvendors' ),
138
- 'desc' => __( 'CHECKING these boxes will HIDE these product types from the vendor', 'wcvendors' ),
139
- 'id' => 'hide_product_types',
140
- 'options' => array(
141
- 'simple' => __( 'Simple', 'wcvendors' ),
142
- 'variable' => __( 'Variable', 'wcvendors' ),
143
- 'grouped' => __( 'Grouped', 'wcvendors' ),
144
- 'external' => __( 'External / affiliate', 'wcvendors' ),
145
- ),
146
- 'type' => 'checkbox',
147
- 'multiple' => true,
148
- );
149
-
150
- $options[ ] = array(
151
- 'name' => __( 'Type options', 'wcvendors' ),
152
- 'desc' => __( 'CHECKING these boxes will **HIDE** these product options from the vendor', 'wcvendors' ),
153
- 'id' => 'hide_product_type_options',
154
- 'options' => array(
155
- 'virtual' => __( 'Virtual', 'wcvendors' ),
156
- 'downloadable' => __( 'Downloadable', 'wcvendors' ),
157
- ),
158
- 'type' => 'checkbox',
159
- 'multiple' => true,
160
- );
161
-
162
- $options[ ] = array(
163
- 'name' => __( 'Miscellaneous', 'wcvendors' ),
164
- 'id' => 'hide_product_misc',
165
- 'options' => array(
166
- 'taxes' => __( 'Taxes', 'wcvendors' ),
167
- 'sku' => __( 'SKU', 'wcvendors' ),
168
- 'featured' => __( 'Featured', 'wcvendors' ),
169
- 'duplicate' => __( 'Duplicate Product', 'wcvendors' ),
170
- ),
171
- 'type' => 'checkbox',
172
- 'multiple' => true,
173
- );
174
-
175
- $options[ ] = array(
176
- 'name' => __( 'Stylesheet', 'wcvendors' ),
177
- 'desc' => __( 'You can add CSS in this textarea, which will be loaded on the product add/edit page for vendors.', 'wcvendors' ),
178
- 'id' => 'product_page_css',
179
- 'type' => 'textarea',
180
- );
181
-
182
-
183
- $options[ ] = array( 'name' => __( 'Capabilities', 'wcvendors' ), 'type' => 'heading', 'id' => 'capabilities' );
184
- $options[ ] = array( 'name' => __( 'Permissions', 'wcvendors' ), 'id' => 'permissions', 'type' => 'title', 'desc' => __( 'General permissions used around the shop', 'wcvendors' ) );
185
-
186
- $options[ ] = array(
187
- 'name' => __( 'Orders', 'wcvendors' ),
188
- 'desc' => __( 'View orders', 'wcvendors' ),
189
- 'tip' => __( 'Show customer details such as email, address, name, etc, for each order', 'wcvendors' ),
190
- 'id' => 'can_show_orders',
191
- 'type' => 'checkbox',
192
- 'std' => true,
193
- );
194
-
195
- $options[ ] = array(
196
- 'desc' => __( 'View comments', 'wcvendors' ),
197
- 'tip' => __( 'View all vendor comments for an order on the frontend', 'wcvendors' ),
198
- 'id' => 'can_view_order_comments',
199
- 'type' => 'checkbox',
200
- 'std' => true,
201
- );
202
-
203
- $options[ ] = array(
204
- 'desc' => __( 'Submit comments', 'wcvendors' ),
205
- 'tip' => __( 'Submit comments for an order on the frontend. Eg, tracking ID for a product', 'wcvendors' ),
206
- 'id' => 'can_submit_order_comments',
207
- 'type' => 'checkbox',
208
- 'std' => true,
209
- );
210
-
211
- $options[ ] = array(
212
- 'desc' => __( 'View email addresses', 'wcvendors' ),
213
- 'tip' => __( 'While viewing order details on the frontend, you can disable or enable email addresses', 'wcvendors' ),
214
- 'id' => 'can_view_order_emails',
215
- 'type' => 'checkbox',
216
- 'std' => true,
217
- );
218
-
219
- $options[ ] = array(
220
- 'desc' => __( 'Export a CSV file of orders for a product', 'wcvendors' ),
221
- 'tip' => __( 'Vendors could export orders for a product on the frontend', 'wcvendors' ),
222
- 'id' => 'can_export_csv',
223
- 'type' => 'checkbox',
224
- 'std' => true,
225
- );
226
-
227
- $options[ ] = array(
228
- 'name' => __( 'Reports', 'wcvendors' ),
229
- 'desc' => __( '<strike>View backend sales reports</strike>. <strong>Depreciated</strong>', 'wcvendors' ),
230
- 'tip' => __( 'This option has been removed and will no longer function. It will be completely removed in future versions. Vendors should use their Vendor Dashboard for reports as all identical functionality is already there. ', 'wcvendors' ),
231
- 'id' => 'can_view_backend_reports',
232
- 'type' => 'checkbox',
233
- 'std' => false,
234
- );
235
-
236
- $options[ ] = array(
237
- 'desc' => __( 'View Frontend sales reports', 'wcvendors' ),
238
- 'tip' => __( 'Sales table on the frontend on the Vendor Dashboard page. The table will only display sales data that pertain to their products, and only for orders that are processing or completed.', 'wcvendors' ),
239
- 'id' => 'can_view_frontend_reports',
240
- 'type' => 'checkbox',
241
- 'std' => true,
242
- );
243
-
244
- $options[ ] = array(
245
- 'name' => __( 'Products', 'wcvendors' ),
246
- 'desc' => __( 'Submit products', 'wcvendors' ),
247
- 'tip' => __( 'Check to allow vendors to list new products. Admin must approve new products by editing the product, and clicking Publish.', 'wcvendors' ),
248
- 'id' => 'can_submit_products',
249
- 'type' => 'checkbox',
250
- 'std' => true,
251
- );
252
-
253
- $options[ ] = array(
254
- 'desc' => __( 'Edit live products', 'wcvendors' ),
255
- 'tip' => __( 'Vendors could edit an approved product after it has already gone live. There is no approval or review after editing a live product. This could be dangerous with malicious vendors, so take caution.', 'wcvendors' ),
256
- 'id' => 'can_edit_published_products',
257
- 'type' => 'checkbox',
258
- 'std' => false,
259
- );
260
-
261
- $options[ ] = array(
262
- 'desc' => __( 'Submit products live without requiring approval', 'wcvendors' ),
263
- 'tip' => __( 'Vendors can submit products without review or approval from a shop admin. This could be dangerous with malicious vendors, so take caution.', 'wcvendors' ),
264
- 'id' => 'can_submit_live_products',
265
- 'type' => 'checkbox',
266
- 'std' => false,
267
- );
268
-
269
- $options[ ] = array( 'name' => __( 'Pages', 'wcvendors' ), 'type' => 'heading' );
270
- $options[ ] = array( 'name' => __( 'Page configuration', 'wcvendors' ), 'type' => 'title', 'desc' => '' );
271
-
272
- $options[ ] = array(
273
- 'name' => __( 'Vendor dashboard', 'wcvendors' ),
274
- 'desc' => __( 'Choose the page that has the shortcode <code>[wcv_vendor_dashboard]</code><br/>. If this page is not set, you will break your site. If you upgrade to Pro, keep this page unchanged as both Pro Dashboard and this Dashboard page must be set.', 'wcvendors' ),
275
- 'id' => 'vendor_dashboard_page',
276
- 'type' => 'single_select_page',
277
- 'select2' => true,
278
- );
279
-
280
- $options[ ] = array(
281
- 'name' => __( 'Shop settings', 'wcvendors' ),
282
- 'desc' => __( 'Choose the page that has the shortcode <code>[wcv_shop_settings]</code><br/>These are the shop settings a vendor can configure. By default, Vendor Dashboard > Shop Settings should have this shortcode.', 'wcvendors' ),
283
- 'id' => 'shop_settings_page',
284
- 'type' => 'single_select_page',
285
- 'select2' => true,
286
- );
287
-
288
- $options[ ] = array(
289
- 'name' => __( 'Orders page', 'wcvendors' ),
290
- 'desc' => __( 'Choose the page that has the shortcode <code>[wcv_orders]</code><br/>By default, Vendor Dashboard > Orders should have the shortcode.', 'wcvendors' ),
291
- 'id' => 'orders_page',
292
- 'type' => 'single_select_page',
293
- 'select2' => true,
294
- );
295
-
296
- $options[ ] = array(
297
- 'name' => __( 'Vendor terms', 'wcvendors' ),
298
- 'desc' => __( 'These terms are shown to a user when submitting an application to become a vendor.<br/>If left blank, no terms will be shown to the applicant. Vendor must accept terms in order to register, if set.', 'wcvendors' ),
299
- 'id' => 'terms_to_apply_page',
300
- 'type' => 'single_select_page',
301
- 'select2' => true,
302
- );
303
-
304
- $total_due = 0;
305
- if ( !empty( $_GET[ 'tab' ] ) && $_GET[ 'tab' ] == __( 'payments', 'wcvendors' ) ) {
306
- global $wpdb;
307
-
308
- $table_name = $wpdb->prefix . "pv_commission";
309
- $query = "SELECT sum(total_due + total_shipping + tax) as total
310
- FROM `{$table_name}`
311
- WHERE status = %s";
312
- $results = $wpdb->get_results( $wpdb->prepare( $query, 'due' ) );
313
-
314
- $total_due = array_shift( $results )->total;
315
- }
316
- $options[ ] = array( 'name' => __( 'Payments', 'wcvendors' ), 'type' => 'heading' );
317
- $options[ ] = array(
318
- 'name' => __( 'PayPal Adaptive Payments Scheduling', 'wcvendors' ), 'type' => 'title', 'desc' =>
319
- sprintf( __( 'Total commission currently due: %s. <a href="%s">View details</a>.', 'wcvendors' ), !function_exists( 'woocommerce_price' ) ? $total_due : woocommerce_price( $total_due ), '?page=pv_admin_commissions' ) .
320
- '<br/><br/>' . sprintf( __( 'Make sure you update your PayPal Adaptive Payments settings <a href="%s">here</a>. <br><br>To instantly pay with Adaptive Payments you must activate the paypalap gateway in your Checkout settings. <br><a href="https://www.wcvendors.com/kb/configuring-paypal-adaptive-payments/" target="top">PayPal AP Application Help</a>. <br><br>Another gateway that offers instant payments to vendors that also accepts credit cards directly on your checkout page is Stripe. <br><a href="https://www.wcvendors.com/product/stripe-commissions-gateway/" target="top">Stripe Commissions & Gateway plugin</a> is $49 and specifically coded for WC Vendors and <a href="https://www.wcvendors.com/product/wc-vendors-pro/" target="top">WC Vendors Pro</a>.', 'wcvendors' ), 'admin.php?page=wc-settings&tab=checkout&section=wc_paypalap' )
321
- );
322
-
323
- $options[ ] = array(
324
- 'name' => __( 'Instant pay', 'wcvendors' ),
325
- 'desc' => __( 'Instantly pay vendors their commission when an order is made, and if a vendor has a valid PayPal email added on their Shop Settings page.', 'wcvendors' ),
326
- 'tip' => __( 'For this to work, customers must checkout with the PayPal Adaptive Payments gateway. Using any other gateways will not pay vendors instantly', 'wcvendors' ),
327
- 'id' => 'instapay',
328
- 'type' => 'checkbox',
329
- 'std' => true,
330
- );
331
-
332
- $options[ ] = array(
333
- 'name' => __( 'Payment schedule', 'wcvendors' ),
334
- 'desc' => __( 'Note: Schedule will only work if instant pay is unchecked', 'wcvendors' ),
335
- 'id' => 'schedule',
336
- 'type' => 'radio',
337
- 'std' => 'manual',
338
- 'options' => array(
339
- 'weekly' => __( 'Weekly', 'wcvendors' ),
340
- 'biweekly' => __( 'Biweekly', 'wcvendors' ),
341
- 'monthly' => __( 'Monthly', 'wcvendors' ),
342
- 'manual' => __( 'Manual', 'wcvendors' ),
343
- 'now' => '<span style="color:green;"><strong>' . __( 'Now', 'wcvendors' ) . '</strong></span>',
344
- )
345
- );
346
-
347
- $options[ ] = array(
348
- 'name' => __( 'Email notification', 'wcvendors' ),
349
- 'desc' => __( 'Send the WooCommerce admin an email each time a payment has been made via the payment schedule options above', 'wcvendors' ),
350
- 'id' => 'mail_mass_pay_results',
351
- 'type' => 'checkbox',
352
- 'std' => true,
353
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/html-vendor-settings-page.php DELETED
@@ -1,76 +0,0 @@
1
- <div class="wrap">
2
- <h2>Shop Settings</h2>
3
- <table class="form-table">
4
-
5
- <form method="post">
6
- <?php do_action( 'wcvendors_settings_before_paypal' );
7
-
8
- if ( $paypal_address !== 'false' ) { ?>
9
-
10
- <tr>
11
- <th><?php _e( 'PayPal Address', 'wcvendors' ); ?></th>
12
- <td><input type="email" name="pv_paypal" id="pv_paypal" placeholder="some@email.com"
13
- value="<?php echo get_user_meta( $user_id, 'pv_paypal', true ); ?>"/>
14
- <p class="description">
15
- <?php _e( 'Your PayPal address is used to send you your commission.', 'wcvendors' ); ?><br/>
16
- </p>
17
- </td>
18
- </tr>
19
- <?php } ?>
20
- <?php do_action( 'wcvendors_settings_after_paypal' ); ?>
21
- <tr>
22
- <th><?php _e( 'Shop Name', 'wcvendors' ); ?></th>
23
- <td><input type="text" name="pv_shop_name" id="pv_shop_name" placeholder="Your shop name" value="<?php echo get_user_meta( $user_id, 'pv_shop_name', true ); ?>"/>
24
- <p class="description"><?php _e( 'Your shop name is public and must be unique.', 'wcvendors' ); ?></p>
25
- </td>
26
- </tr>
27
- <?php do_action( 'wcvendors_settings_after_shop_name' ); ?>
28
-
29
- <tr>
30
- <th><?php echo apply_filters( 'wcvendors_seller_info_label', __( 'Seller info', 'wcvendors' ) ); ?></th>
31
- <td><?php
32
-
33
- if ( $global_html || $has_html ) {
34
- $old_post = $GLOBALS[ 'post' ];
35
- $GLOBALS[ 'post' ] = 0;
36
- wp_editor( $seller_info, 'pv_seller_info' );
37
- $GLOBALS[ 'post' ] = $old_post;
38
- } else {
39
- ?><textarea class="large-text" rows="10" id="pv_seller_info_unhtml" style="width:95%"
40
- name="pv_seller_info"><?php echo $seller_info; ?></textarea><?php
41
- }
42
- ?>
43
- <p class="description"><?php _e( 'This is displayed on each of your products.', 'wcvendors' ); ?></p>
44
- </td>
45
- </tr>
46
- <?php do_action( 'wcvendors_settings_after_seller_info' ); ?>
47
- <?php if ( $shop_description !== 'false' ) { ?>
48
- <tr>
49
- <th><?php _e( 'Shop Description', 'wcvendors' ); ?></th>
50
- <td><?php
51
-
52
- if ( $global_html || $has_html ) {
53
- $old_post = $GLOBALS[ 'post' ];
54
- $GLOBALS[ 'post' ] = 0;
55
- wp_editor( $description, 'pv_shop_description' );
56
- $GLOBALS[ 'post' ] = $old_post;
57
- } else {
58
- ?><textarea class="large-text" rows="10" id="pv_shop_description_unhtml" style="width:95%" name="pv_shop_description"><?php echo $description; ?></textarea><?php
59
- }
60
- ?>
61
- <p class="description"><?php printf( __( 'This is displayed on your <a href="%s">shop page</a>.', 'wcvendors' ), $shop_page ); ?></p>
62
- </td>
63
- </tr>
64
-
65
- <?php do_action( 'wcvendors_settings_after_shop_description' ); ?>
66
- <?php } ?>
67
- <?php wp_nonce_field( 'save-shop-settings-admin', 'wc-vendors-nonce' ); ?>
68
- <tr>
69
- <td colspa="2">
70
- <input type="submit" class="button button-primary" name="vendor_application_submit" value="<?php _e( 'Save Shop Settings', 'wcvendors' ); ?>"/>
71
- </td>
72
- </tr>
73
- </form>
74
- </table>
75
- </div>
76
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/class-commission.php DELETED
@@ -1,428 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Commission functions
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package ProductVendor
8
- */
9
-
10
-
11
- class WCV_Commission
12
- {
13
-
14
-
15
- /**
16
- * Constructor
17
- */
18
- function __construct()
19
- {
20
- $this->completed_statuses = apply_filters( 'wcvendors_completed_statuses', array(
21
- 'completed',
22
- 'processing',
23
- ) );
24
-
25
- $this->reverse_statuses = apply_filters( 'wcvendors_reversed_statuses', array(
26
- 'pending',
27
- 'refunded',
28
- 'cancelled',
29
- 'failed',
30
- ) );
31
-
32
- $this->check_order_reverse();
33
- $this->check_order_complete();
34
- }
35
-
36
-
37
- /**
38
- * Run actions when an order is reversed
39
- */
40
- public function check_order_reverse()
41
- {
42
- foreach ( $this->completed_statuses as $completed ) {
43
- foreach ( $this->reverse_statuses as $reversed ) {
44
- add_action( "woocommerce_order_status_{$completed}_to_{$reversed}", array( 'WCV_Commission', 'reverse_due_commission' ) );
45
- }
46
- }
47
- }
48
-
49
-
50
- /**
51
- * Runs only on a manual order update by a human
52
- */
53
- public function check_order_complete()
54
- {
55
- foreach ( $this->completed_statuses as $completed ) {
56
- add_action( 'woocommerce_order_status_' . $completed, array( 'WCV_Commission', 'log_commission_due' ) );
57
- }
58
- }
59
-
60
-
61
- /**
62
- * Reverse commission for an entire order
63
- *
64
- * Only runs if the order has been logged in pv_commission table
65
- *
66
- * @param int $order_id
67
- *
68
- * @return unknown
69
- */
70
- public function reverse_due_commission( $order_id )
71
- {
72
- global $wpdb;
73
-
74
- // Check if this order exists
75
- $count = WCV_Commission::count_commission_by_order( $order_id );
76
- if ( !$count ) return false;
77
-
78
- // Deduct this amount from the vendor's total due
79
- $results = WCV_Commission::sum_total_due_for_order( $order_id );
80
- $ids = implode( ',', $results[ 'ids' ] );
81
- $table_name = $wpdb->prefix . "pv_commission";
82
-
83
- $query = "UPDATE `{$table_name}` SET `status` = '%s' WHERE id IN ({$ids})";
84
- $results = $wpdb->query( $wpdb->prepare( $query, 'reversed' ) );
85
-
86
- return $results;
87
- }
88
-
89
-
90
- /**
91
- * Store all commission due for an order
92
- *
93
- * @return bool
94
- *
95
- * @param int $order_id
96
- */
97
- public static function log_commission_due( $order_id )
98
- {
99
- global $woocommerce;
100
-
101
- $order = new WC_Order( $order_id );
102
- $dues = WCV_Vendors::get_vendor_dues_from_order( $order, false );
103
-
104
- foreach ( $dues as $vendor_id => $details ) {
105
-
106
- // Only process vendor commission
107
- if ( !WCV_Vendors::is_vendor( $vendor_id ) ) continue;
108
-
109
- // See if they currently have an amount due
110
- $due = WCV_Vendors::count_due_by_vendor( $vendor_id, $order_id );
111
- if ( $due > 0 ) continue;
112
-
113
- // Get the dues in an easy format for inserting to our table
114
- $insert_due = array();
115
-
116
- foreach ( $details as $key => $detail ) {
117
- $product_id = $detail['product_id'];
118
-
119
- $insert_due[ $product_id ] = array(
120
- 'order_id' => $order_id,
121
- 'vendor_id' => $vendor_id,
122
- 'product_id' => $product_id,
123
- 'total_due' => !empty( $insert_due[ $product_id ][ 'total_due' ] ) ? ( $detail[ 'commission' ] + $insert_due[ $product_id ][ 'total_due' ] ) : $detail[ 'commission' ],
124
- 'total_shipping' => !empty( $insert_due[ $product_id ][ 'total_shipping' ] ) ? ( $detail[ 'shipping' ] + $insert_due[ $product_id ][ 'total_shipping' ] ) : $detail[ 'shipping' ],
125
- 'tax' => !empty( $insert_due[ $product_id ][ 'tax' ] ) ? ( $detail[ 'tax' ] + $insert_due[ $product_id ][ 'tax' ] ) : $detail[ 'tax' ],
126
- 'qty' => !empty( $insert_due[ $product_id ][ 'qty' ] ) ? ( $detail[ 'qty' ] + $insert_due[ $product_id ][ 'qty' ] ) : $detail[ 'qty' ],
127
- 'time' => $order->order_date,
128
- );
129
- }
130
-
131
- if ( !empty( $insert_due ) ) {
132
- WCV_Commission::insert_new_commission( array_values( $insert_due ) );
133
- }
134
- }
135
-
136
- }
137
-
138
-
139
- /**
140
- * Add up the totals for an order for each vendor
141
- *
142
- * @param int $order_id
143
- *
144
- * @return array
145
- */
146
- public function sum_total_due_for_order( $order_id )
147
- {
148
- global $wpdb;
149
-
150
- $table_name = $wpdb->prefix . "pv_commission";
151
- $query = "SELECT `id`, `total_due`, `total_shipping`, `tax`, `vendor_id`
152
- FROM `{$table_name}`
153
- WHERE `order_id` = %d
154
- AND `status` = %s";
155
-
156
- $results = $wpdb->get_results( $wpdb->prepare( $query, $order_id, 'due' ) );
157
-
158
- foreach ( $results as $commission ) {
159
- $commission_ids[ ] = $commission->id;
160
-
161
- $pay[ $commission->vendor_id ] = !empty( $pay[ $commission->vendor_id ] )
162
- ? ( $pay[ $commission->vendor_id ] + ( $commission->total_due + $commission->total_shipping + $commission->tax ) )
163
- : ( $commission->total_due + $commission->total_shipping + $commission->tax );
164
- }
165
-
166
- $return = array(
167
- 'vendors' => $pay,
168
- 'ids' => $commission_ids,
169
- );
170
-
171
- return $return;
172
- }
173
-
174
-
175
- /**
176
- * Return all commission outstanding with a 'due' status
177
- *
178
- * @return object
179
- */
180
- public static function get_all_due()
181
- {
182
- global $wpdb;
183
-
184
- $table_name = $wpdb->prefix . "pv_commission";
185
- $query = "SELECT id, vendor_id, total_due
186
- FROM `{$table_name}`
187
- WHERE status = %s";
188
- $results = $wpdb->get_results( $wpdb->prepare( $query, 'due' ) );
189
-
190
- return $results;
191
- }
192
-
193
-
194
- /**
195
- * Check if this order has commission logged already
196
- *
197
- * @param int $order_id
198
- *
199
- * @return int
200
- */
201
- public static function count_commission_by_order( $order_id )
202
- {
203
- global $wpdb;
204
- $table_name = $wpdb->prefix . "pv_commission";
205
-
206
- if ( is_array( $order_id ) )
207
- $order_id = implode( ',', $order_id );
208
-
209
- $query = "SELECT COUNT(order_id) AS order_count
210
- FROM {$table_name}
211
- WHERE order_id IN ($order_id)
212
- AND status <> %s";
213
- $count = $wpdb->get_var( $wpdb->prepare( $query, 'reversed' ) );
214
-
215
- return $count;
216
- }
217
-
218
- /**
219
- * Check the commission status for the order
220
- *
221
- * @param array $order
222
- * @param string $status
223
- *
224
- * @return int
225
- */
226
- public static function check_commission_status( $order, $status ) {
227
-
228
- global $wpdb;
229
-
230
- $table_name = $wpdb->prefix . "pv_commission";
231
-
232
- $order_id = $order[ 'order_id' ];
233
- $vendor_id = $order[ 'vendor_id' ];
234
- $product_id = $order[ 'product_id' ];
235
-
236
- $query = "SELECT count(order_id) AS order_count
237
- FROM {$table_name}
238
- WHERE order_id = {$order_id}
239
- AND vendor_id = {$vendor_id}
240
- AND product_id = {$product_id}
241
- AND status = %s
242
- ";
243
-
244
- return $wpdb->get_var( $wpdb->prepare( $query , $status ) );
245
-
246
- }
247
-
248
-
249
- /**
250
- * Product's commission rate in percentage form
251
- *
252
- * Eg: 50 for 50%
253
- *
254
- * @param int $product_id
255
- *
256
- * @return float
257
- */
258
- public static function get_commission_rate( $product_id )
259
- {
260
-
261
- $commission = 0;
262
-
263
- $parent = get_post_ancestors( $product_id );
264
- if ( $parent ) $product_id = $parent[ 0 ];
265
-
266
- $vendor_id = WCV_Vendors::get_vendor_from_product( $product_id );
267
-
268
- $product_commission = get_post_meta( $product_id, 'pv_commission_rate', true );
269
- $vendor_commission = WCV_Vendors::get_default_commission( $vendor_id );
270
- $default_commission = WC_Vendors::$pv_options->get_option( 'default_commission' );
271
-
272
- if ( $product_commission != '' && $product_commission !== false ) {
273
- $commission = $product_commission;
274
- }
275
-
276
- else if ( $vendor_commission != '' && $vendor_commission !== false ) {
277
- $commission = $vendor_commission;
278
- }
279
-
280
- else if ( $default_commission != '' && $default_commission !== false ) {
281
- $commission = $default_commission;
282
- }
283
-
284
- return apply_filters( 'wcv_commission_rate_percent', $commission, $product_id );
285
- }
286
-
287
-
288
- /**
289
- * Commission due for a product based on a rate and price
290
- *
291
- * @param float $product_price
292
- * @param unknown $product_id
293
- *
294
- * @return float
295
- */
296
- public static function calculate_commission( $product_price, $product_id, $order, $qty )
297
- {
298
- $commission_rate = WCV_Commission::get_commission_rate( $product_id );
299
- $commission = $product_price * ( $commission_rate / 100 );
300
- $commission = round( $commission, 2 );
301
-
302
- return apply_filters( 'wcv_commission_rate', $commission, $product_id, $product_price, $order, $qty );
303
- }
304
-
305
-
306
- /**
307
- * Log commission to the pv_commission table
308
- *
309
- * Will either update or insert to the database
310
- *
311
- * @param array $orders
312
- *
313
- * @return unknown
314
- */
315
- public static function insert_new_commission( $orders = array() )
316
- {
317
- global $wpdb;
318
-
319
- if ( empty( $orders ) ) return false;
320
-
321
- $table = $wpdb->prefix . "pv_commission";
322
-
323
- // Insert the time and default status 'due'
324
- foreach ( $orders as $key => $order ) {
325
- $orders[ $key ][ 'time' ] = $order['time'];
326
- $orders[ $key ][ 'status' ] = ( $order['total_due'] == 0 ) ? 'paid' : 'due';
327
- }
328
-
329
- foreach ( $orders as $key => $order ) {
330
- $where = array(
331
- 'order_id' => $order[ 'order_id' ],
332
- 'product_id' => $order[ 'product_id' ],
333
- 'vendor_id' => $order[ 'vendor_id' ],
334
- 'qty' => $order[ 'qty' ],
335
- );
336
- // Is the commission already paid?
337
- $count = WCV_Commission::check_commission_status( $order, 'paid' );
338
-
339
- if ( $count == 0 ) {
340
- $update = $wpdb->update( $table, $order, $where );
341
- if ( !$update ) $insert = $wpdb->insert( $table, $order );
342
- }
343
-
344
- }
345
-
346
- do_action( 'wcv_commissions_inserted', $orders );
347
- }
348
-
349
-
350
- /**
351
- * Set commission to 'paid' for an entire order
352
- *
353
- *
354
- * @access public
355
- *
356
- * @param mixed $order_id An array of Order IDs or an int.
357
- * @param unknown $column_ids (optional)
358
- *
359
- * @return bool.
360
- */
361
- public static function set_order_commission_paid( $order_id, $column_ids = false )
362
- {
363
- global $wpdb;
364
-
365
- $table_name = $wpdb->prefix . "pv_commission";
366
-
367
- if ( is_array( $order_id ) )
368
- $order_id = implode( ',', $order_id );
369
-
370
- $query = "UPDATE `{$table_name}` SET `status` = 'paid' WHERE order_id IN ($order_id)";
371
- $result = $wpdb->query( $query );
372
-
373
- return $result;
374
- }
375
-
376
-
377
- /**
378
- * Set commission to 'paid' for an entire order
379
- *
380
- *
381
- * @access public
382
- *
383
- * @param mixed $order_id An array of Order IDs or an int.
384
- *
385
- * @return bool.
386
- */
387
- public static function set_vendor_commission_paid( $vendors )
388
- {
389
- global $wpdb;
390
-
391
- $table_name = $wpdb->prefix . "pv_commission";
392
-
393
- if ( is_array( $vendors ) )
394
- $vendors = implode( ',', $vendors );
395
-
396
- $query = "UPDATE `{$table_name}` SET `status` = 'paid' WHERE vendor_id IN ($vendors)";
397
- $result = $wpdb->query( $query );
398
-
399
- return $result;
400
- }
401
-
402
-
403
- /**
404
- * Set commission to 'paid' for a specifc vendor
405
- *
406
- *
407
- * @access public
408
- *
409
- * @param int $vendor_id the vendor id
410
- * @param int $product_id the product id
411
- * @param int $order_id the order id
412
- *
413
- * @return bool.
414
- */
415
- public static function set_vendor_product_commission_paid( $vendor_id, $product_id, $order_id )
416
- {
417
- global $wpdb;
418
-
419
- $table_name = $wpdb->prefix . "pv_commission";
420
-
421
- $query = "UPDATE `{$table_name}` SET `status` = 'paid' WHERE vendor_id = $vendor_id AND order_id = $order_id AND product_id = $product_id";
422
- $result = $wpdb->query( $query );
423
-
424
- return $result;
425
- }
426
-
427
-
428
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/class-cron.php DELETED
@@ -1,165 +0,0 @@
1
- <?php
2
- /**
3
- * Cron class
4
- *
5
- * @package WC_Vendors
6
- */
7
-
8
-
9
- class WCV_Cron
10
- {
11
-
12
-
13
- /**
14
- * Constructor
15
- */
16
- function __construct()
17
- {
18
- add_filter( 'cron_schedules', array( 'WCV_Cron', 'custom_cron_intervals' ) );
19
- add_action( WC_Vendors::$id . '_options_updated', array( 'WCV_Cron', 'check_schedule' ) );
20
- add_filter( WC_Vendors::$id . '_options_on_update', array( 'WCV_Cron', 'check_schedule_now' ) );
21
- }
22
-
23
-
24
- /**
25
- * Re-add cron schedule when the settings have been updated
26
- *
27
- * @param array
28
- * @param unknown $options
29
- */
30
- public static function check_schedule( $options )
31
- {
32
- $old_interval = wp_get_schedule( 'pv_schedule_mass_payments' );
33
- $new_interval = $options[ 'schedule' ];
34
- $instapay = $options[ 'instapay' ];
35
-
36
- /**
37
- * 1. The user actually changed the schedule
38
- * 2. Instapay is turned off
39
- * 3. Manual was not selected
40
- */
41
- if ( ( $old_interval != $new_interval ) && !$instapay && $new_interval != 'manual' ) {
42
- WCV_Cron::remove_cron_schedule( $options );
43
- WCV_Cron::schedule_cron( $new_interval );
44
- }
45
-
46
- if ( $new_interval == 'manual' || $instapay ) {
47
- WCV_Cron::remove_cron_schedule( $options );
48
- }
49
-
50
- }
51
-
52
-
53
- /**
54
- * Check if the user chose "Now" on the Schedule settings
55
- *
56
- * @param array $options
57
- *
58
- * @return array
59
- */
60
- public static function check_schedule_now( $options )
61
- {
62
- $old_schedule = WC_Vendors::$pv_options->get_option( 'schedule' );
63
- $new_schedule = $options[ 'schedule' ];
64
-
65
- if ( $new_schedule == 'now' ) {
66
- $return = WCV_Cron::pay_now();
67
- $options[ 'schedule' ] = $old_schedule;
68
- WCV_Cron::schedule_cron( $old_schedule );
69
- add_settings_error( WC_Vendors::$pv_options->id, 'save_options', $return[ 'message' ], $return[ 'status' ] );
70
- }
71
-
72
- return $options;
73
- }
74
-
75
-
76
- /**
77
- * Pay all outstanding commission using Paypal Mass Pay
78
- *
79
- * @return array
80
- */
81
- public static function pay_now()
82
- {
83
- $mass_pay = new WCV_Mass_Pay;
84
- $mass_pay = $mass_pay->do_payments();
85
-
86
- $message = !empty( $mass_pay[ 'total' ] )
87
- ? $mass_pay[ 'msg' ] . '<br/>' . sprintf( __( 'Payment total: %s', 'wcvendors' ), woocommerce_price( $mass_pay[ 'total' ] ) )
88
- : $mass_pay[ 'msg' ];
89
-
90
- return array(
91
- 'message' => $message,
92
- 'status' => $mass_pay[ 'status' ]
93
- );
94
- }
95
-
96
-
97
- /**
98
- * Remove the mass payments schedule
99
- *
100
- * @return bool
101
- */
102
- private static function remove_cron_schedule()
103
- {
104
- $timestamp = wp_next_scheduled( 'pv_schedule_mass_payments' );
105
-
106
- return wp_unschedule_event( $timestamp, 'pv_schedule_mass_payments' );
107
- }
108
-
109
-
110
- /**
111
- * Schedule a cron event on a specified interval
112
- *
113
- * @param string $interval
114
- *
115
- * @return bool
116
- */
117
- public static function schedule_cron( $interval )
118
- {
119
- // Scheduled event
120
- add_action( 'pv_schedule_mass_payments', array( 'WCV_Cron', 'pay_now' ) );
121
-
122
- // Schedule the event
123
- if ( !wp_next_scheduled( 'pv_schedule_mass_payments' ) ) {
124
- wp_schedule_event( time(), $interval, 'pv_schedule_mass_payments' );
125
-
126
- return true;
127
- }
128
-
129
- return false;
130
- }
131
-
132
-
133
- /**
134
- * Add new schedule intervals to WP
135
- *
136
- * Weekly
137
- * Biweekly
138
- * Monthly
139
- *
140
- * @param array $schedules
141
- *
142
- * @return array
143
- */
144
- public static function custom_cron_intervals( $schedules )
145
- {
146
- $schedules[ 'weekly' ] = array(
147
- 'interval' => 604800,
148
- 'display' => __( 'Once Weekly' )
149
- );
150
-
151
- $schedules[ 'biweekly' ] = array(
152
- 'interval' => 1209600,
153
- 'display' => __( 'Once every two weeks' )
154
- );
155
-
156
- $schedules[ 'monthly' ] = array(
157
- 'interval' => 2635200,
158
- 'display' => __( 'Once a month' )
159
- );
160
-
161
- return $schedules;
162
- }
163
-
164
-
165
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/class-install.php DELETED
@@ -1,246 +0,0 @@
1
- <?php
2
- /**
3
- * Install class on activation.
4
- *
5
- * @author Matt Gates <http://mgates.me>
6
- * @package ProductVendor
7
- */
8
-
9
-
10
- class WCV_Install
11
- {
12
-
13
- /**
14
- * Checks if install is requierd
15
- *
16
- * @return unknown
17
- */
18
- public function init()
19
- {
20
- $db_version = WC_Vendors::$pv_options->get_option( 'db_version' );
21
-
22
- // Initial Install
23
- if ( version_compare( $db_version, '1.0', '<' ) ) {
24
- $this->install_wcvendor();
25
- WC_Vendors::$pv_options->update_option( 'db_version', '1.5.0' );
26
- }
27
-
28
- }
29
-
30
-
31
- /**
32
- * Grouped functions for installing the WC Vendor plugin
33
- */
34
- private function install_wcvendor()
35
- {
36
- // Clear the cron
37
- wp_clear_scheduled_hook( 'pv_schedule_mass_payments' );
38
-
39
- // Add the vendors role
40
- $this->add_new_roles();
41
-
42
- // Create tables
43
- $this->create_new_tables();
44
-
45
- // Create the Orders page if it doesn't exist
46
- $orders_page = WC_Vendors::$pv_options->get_option( 'orders_page' );
47
- if ( empty( $orders_page ) ) $this->create_new_pages();
48
- }
49
-
50
-
51
- /**
52
- * Add the new Vendor role
53
- *
54
- * @return bool
55
- */
56
- private function add_new_roles()
57
- {
58
- remove_role( 'pending_vendor' );
59
- add_role( 'pending_vendor', __( 'Pending Vendor', 'wcvendors' ), array(
60
- 'read' => true,
61
- 'edit_posts' => false,
62
- 'delete_posts' => false
63
- ) );
64
-
65
- remove_role( 'vendor' );
66
- add_role( 'vendor', __('Vendor', 'wcvendors') , array(
67
- 'assign_product_terms' => true,
68
- 'edit_products' => true,
69
- 'edit_product' => true,
70
- 'edit_published_products' => false,
71
- 'manage_product' => true,
72
- 'publish_products' => false,
73
- 'read' => true,
74
- 'upload_files' => true,
75
- 'view_woocommerce_reports' => true,
76
- ) );
77
- }
78
-
79
-
80
- /**
81
- * Create the pv_commission table
82
- */
83
- private function create_new_tables()
84
- {
85
- global $wpdb;
86
-
87
- $table_name = $wpdb->prefix . "pv_commission";
88
- require_once ABSPATH . 'wp-admin/includes/upgrade.php';
89
-
90
- $sql = "CREATE TABLE $table_name (
91
- id bigint(20) NOT NULL AUTO_INCREMENT,
92
- product_id bigint(20) NOT NULL,
93
- order_id bigint(20) NOT NULL,
94
- vendor_id bigint(20) NOT NULL,
95
- total_due decimal(20,2) NOT NULL,
96
- qty BIGINT( 20 ) NOT NULL,
97
- total_shipping decimal(20,2) NOT NULL,
98
- tax decimal(20,2) NOT NULL,
99
- status varchar(20) NOT NULL DEFAULT 'due',
100
- time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
101
- UNIQUE KEY id (id)
102
- );";
103
- dbDelta( $sql );
104
- }
105
-
106
-
107
- /**
108
- * Create a page
109
- *
110
- * @access public
111
- * @return void
112
- *
113
- * @param mixed $slug Slug for the new page
114
- * @param mixed $option Option name to store the page's ID
115
- * @param string $page_title (optional) (default: '') Title for the new page
116
- * @param string $page_content (optional) (default: '') Content for the new page
117
- * @param int $post_parent (optional) (default: 0) Parent for the new page
118
- */
119
- function create_page( $slug, $page_title = '', $page_content = '', $post_parent = 0 )
120
- {
121
- global $wpdb;
122
-
123
- $page_id = WC_Vendors::$pv_options->get_option( $slug . '_page' );
124
-
125
- if ( $page_id > 0 && get_post( $page_id ) ) {
126
- return $page_id;
127
- }
128
-
129
- $page_found = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM " . $wpdb->posts . " WHERE post_name = %s LIMIT 1;", $slug ) );
130
- if ( $page_found ) {
131
- if ( !$page_id ) {
132
- WC_Vendors::$pv_options->update_option( $slug . '_page', $page_found );
133
-
134
- return $page_found;
135
- }
136
-
137
- return $page_id;
138
- }
139
-
140
- $page_data = array(
141
- 'post_status' => 'publish',
142
- 'post_type' => 'page',
143
- 'post_author' => 1,
144
- 'post_name' => $slug,
145
- 'post_title' => $page_title,
146
- 'post_content' => $page_content,
147
- 'post_parent' => $post_parent,
148
- 'comment_status' => 'closed'
149
- );
150
-
151
- $page_id = wp_insert_post( $page_data );
152
- WC_Vendors::$pv_options->update_option( $slug . '_page', $page_id );
153
-
154
- return $page_id;
155
- }
156
-
157
-
158
- /**
159
- * Create the Orders page for the frontend
160
- */
161
- private function create_new_pages()
162
- {
163
- global $wpdb;
164
-
165
- $vendor_page_id = $this->create_page( 'vendor_dashboard', __( 'Vendor Dashboard', 'wcvendors' ), '[wcv_vendor_dashboard]' );
166
- $this->create_page( 'orders', __( 'Orders', 'wcvendors' ), '[wcv_orders]', $vendor_page_id );
167
- $this->create_page( 'shop_settings', __( 'Shop Settings', 'wcvendors' ), '[wcv_shop_settings]', $vendor_page_id );
168
- }
169
-
170
-
171
- /**
172
- * Depreciated
173
- *
174
- * @param unknown $version
175
- */
176
- public function update_to( $version )
177
- {
178
- global $wpdb;
179
-
180
- $table_name = $wpdb->prefix . "pv_commission";
181
-
182
- switch ( $version ) {
183
-
184
- case '1.3.2':
185
-
186
- $sql = "ALTER TABLE `{$table_name}` ADD `qty` BIGINT( 20 ) NOT NULL AFTER `total_due`";
187
- $wpdb->query( $sql );
188
-
189
- $sql = "SELECT * FROM `{$table_name}`";
190
- $results = $wpdb->get_results( $sql );
191
- foreach ( $results as $key => $value ) {
192
-
193
- $order = new WC_Order( $value->order_id );
194
-
195
- foreach ( $order->get_items() as $o_key => $o_value ) {
196
-
197
- if ( $value->product_id == $o_value[ 'product_id' ] || ( !empty( $o_value[ 'variation_id' ] ) && $value->product_id == $o_value[ 'variation_id' ] ) ) {
198
- $wpdb->update(
199
- $table_name,
200
- array( 'qty' => $o_value[ 'qty' ] ),
201
- array( 'id' => $value->id ),
202
- array( '%d' ),
203
- array( '%d' )
204
- );
205
- }
206
- }
207
-
208
- }
209
-
210
- break;
211
-
212
- case '1.4.0':
213
-
214
- add_role( 'pending_vendor', __( 'Pending Vendor', 'wcvendors' ), array(
215
- 'read' => true,
216
- 'edit_posts' => false,
217
- 'delete_posts' => false
218
- ) );
219
-
220
- $this->create_new_pages();
221
-
222
- break;
223
-
224
- case '1.4.2':
225
-
226
- $sql = "ALTER TABLE `{$table_name}` ADD `total_shipping` decimal(20,2) NOT NULL AFTER `total_due`";
227
- $wpdb->query( $sql );
228
-
229
- case '1.4.3':
230
-
231
- $sql = "ALTER TABLE `{$table_name}` ADD `tax` decimal(20,2) NOT NULL AFTER `total_shipping`";
232
- $wpdb->query( $sql );
233
-
234
- case '1.4.5':
235
-
236
- // Flush rules to fix the /page/2/ issue on vendor shop pages
237
- update_option( WC_Vendors::$id . '_flush_rules', true );
238
-
239
- default:
240
- // code...
241
- break;
242
- }
243
- }
244
-
245
-
246
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/class-queries.php DELETED
@@ -1,280 +0,0 @@
1
- <?php
2
-
3
- class WCV_Queries
4
- {
5
-
6
- /**
7
- *
8
- *
9
- * @param unknown $user_id
10
- *
11
- * @return unknown
12
- */
13
-
14
-
15
- public static function get_commission_products( $user_id )
16
- {
17
- global $wpdb;
18
-
19
- $dates = WCV_Queries::orders_within_range();
20
- $vendor_products = array();
21
- $sql = '';
22
-
23
- $sql .= "SELECT product_id FROM {$wpdb->prefix}pv_commission WHERE vendor_id = {$user_id} ";
24
-
25
- if ( !empty( $dates ) ) {
26
- $sql .= "AND time >= '" . $dates[ 'after' ] . "' AND time <= '" . $dates[ 'before' ] . "'";
27
- }
28
-
29
- $sql .= " AND status != 'reversed' GROUP BY product_id";
30
-
31
- $results = $wpdb->get_results( $sql );
32
-
33
- foreach ( $results as $value ) {
34
- $ids[ ] = $value->product_id;
35
- }
36
-
37
- if ( !empty( $ids ) ) {
38
- $vendor_products = get_posts( array(
39
- 'numberposts' => -1,
40
- 'orderby' => 'post_date',
41
- 'post_type' => array( 'product', 'product_variation' ),
42
- 'order' => 'DESC',
43
- 'include' => $ids
44
- )
45
- );
46
- }
47
-
48
- return $vendor_products;
49
- }
50
-
51
- /**
52
- *
53
- *
54
- * @param unknown $order_id
55
- *
56
- * @return unknown
57
- */
58
-
59
-
60
- public static function get_products_for_order( $order_id )
61
- {
62
- global $wpdb;
63
-
64
- $vendor_products = array();
65
-
66
- $results = $wpdb->get_results( "
67
- SELECT product_id
68
- FROM {$wpdb->prefix}pv_commission
69
- WHERE order_id = {$order_id}
70
- AND status != 'reversed'
71
- AND vendor_id = " . get_current_user_id() . "
72
- GROUP BY product_id" );
73
-
74
- foreach ( $results as $value ) {
75
- $ids[ ] = $value->product_id;
76
- }
77
-
78
- return $ids;
79
- }
80
-
81
-
82
- /**
83
- * All orders for a specific product
84
- *
85
- * @param array $product_ids
86
- * @param array $args (optional)
87
- *
88
- * @return object
89
- */
90
- public static function get_orders_for_products( array $product_ids, array $args = array() )
91
- {
92
- global $wpdb;
93
-
94
- if ( empty( $product_ids ) ) return false;
95
-
96
- $dates = WCV_Queries::orders_within_range();
97
-
98
- $defaults = array(
99
- 'status' => apply_filters( 'wcvendors_completed_statuses', array( 'completed', 'processing' ) ),
100
- 'dates' => array( 'before' => $dates[ 'before' ], 'after' => $dates[ 'after' ] ),
101
- );
102
-
103
- $args = wp_parse_args( $args, $defaults );
104
-
105
-
106
- $sql = "
107
- SELECT order_id
108
- FROM {$wpdb->prefix}pv_commission as order_items
109
- WHERE product_id IN ('" . implode( "','", $product_ids ) . "')
110
- AND time >= '" . $args[ 'dates' ][ 'after' ] . "'
111
- AND time <= '" . $args[ 'dates' ][ 'before' ] . "'
112
- AND status != 'reversed'
113
- ";
114
-
115
- if ( !empty( $args[ 'vendor_id' ] ) ) {
116
- $sql .= "
117
- AND vendor_id = {$args['vendor_id']}
118
- ";
119
- }
120
-
121
- $sql .= "
122
- GROUP BY order_id
123
- ORDER BY time DESC
124
- ";
125
-
126
- $orders = $wpdb->get_results( $sql );
127
-
128
- return $orders;
129
- }
130
-
131
-
132
- /**
133
- * Sum of orders for a specific product
134
- *
135
- * @param array $product_ids
136
- * @param array $args (optional)
137
- *
138
- * @return object
139
- */
140
- public static function sum_orders_for_products( array $product_ids, array $args = array() )
141
- {
142
- global $wpdb;
143
-
144
- $dates = WCV_Queries::orders_within_range();
145
-
146
- $defaults = array(
147
- 'status' => apply_filters( 'wcvendors_completed_statuses', array( 'completed', 'processing' ) ),
148
- 'dates' => array( 'before' => $dates[ 'before' ], 'after' => $dates[ 'after' ] ),
149
- );
150
-
151
- foreach ( $product_ids as $id ) {
152
- $posts = get_posts( array(
153
- 'numberposts' => -1,
154
- 'post_type' => 'product_variation',
155
- 'post_parent' => $id,
156
- )
157
- );
158
-
159
- if ( !empty( $posts ) ) {
160
- foreach ( $posts as $post ) {
161
- $product_ids[ ] = $post->ID;
162
- }
163
- }
164
- }
165
-
166
- $args = wp_parse_args( $args, $defaults );
167
-
168
- $sql = "
169
- SELECT COUNT(order_id) as total_orders,
170
- SUM(total_due + total_shipping + tax) as line_total,
171
- SUM(qty) as qty,
172
- product_id
173
-
174
- FROM {$wpdb->prefix}pv_commission
175
-
176
- WHERE product_id IN ('" . implode( "','", $product_ids ) . "')
177
- AND time >= '" . $args[ 'dates' ][ 'after' ] . "'
178
- AND time <= '" . $args[ 'dates' ][ 'before' ] . "'
179
- AND status != 'reversed'
180
- ";
181
-
182
- if ( !empty( $args[ 'vendor_id' ] ) ) {
183
- $sql .= "
184
- AND vendor_id = {$args['vendor_id']}
185
- ";
186
- }
187
-
188
- $sql .= "
189
- GROUP BY product_id
190
- ORDER BY time DESC;
191
- ";
192
-
193
- $orders = $wpdb->get_results( $sql );
194
-
195
- return $orders;
196
- }
197
-
198
-
199
- /**
200
- * Sum of orders for a specific order
201
- *
202
- * @param array $order_ids
203
- * @param array $args (optional)
204
- *
205
- * @return object
206
- */
207
- public static function sum_for_orders( array $order_ids, array $args = array() )
208
- {
209
- global $wpdb;
210
-
211
- $dates = WCV_Queries::orders_within_range();
212
-
213
- $defaults = array(
214
- 'status' => apply_filters( 'wcvendors_completed_statuses', array( 'completed', 'processing' ) ),
215
- 'dates' => array( 'before' => $dates[ 'before' ], 'after' => $dates[ 'after' ] ),
216
- );
217
-
218
- $args = wp_parse_args( $args, $defaults );
219
-
220
- $sql = "
221
- SELECT COUNT(order_id) as total_orders,
222
- SUM(total_due + total_shipping + tax) as line_total,
223
- SUM(qty) as qty,
224
- product_id
225
-
226
- FROM {$wpdb->prefix}pv_commission
227
-
228
- WHERE order_id IN ('" . implode( "','", $order_ids ) . "')
229
- AND time >= '" . $args[ 'dates' ][ 'after' ] . "'
230
- AND time <= '" . $args[ 'dates' ][ 'before' ] . "'
231
- AND status != 'reversed'
232
- ";
233
-
234
- if ( !empty( $args[ 'vendor_id' ] ) ) {
235
- $sql .= "
236
- AND vendor_id = {$args['vendor_id']}
237
- ";
238
- }
239
-
240
- $sql .= "
241
- GROUP BY order_id
242
- ORDER BY time DESC;
243
- ";
244
-
245
- $orders = $wpdb->get_results( $sql );
246
-
247
- return $orders;
248
- }
249
-
250
-
251
- /**
252
- * Orders for range filter function
253
- *
254
- * @return array
255
- */
256
- public static function orders_within_range()
257
- {
258
- global $start_date, $end_date;
259
-
260
- $start_date = !empty( $_SESSION[ 'PV_Session' ][ 'start_date' ] ) ? $_SESSION[ 'PV_Session' ][ 'start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
261
- $end_date = !empty( $_SESSION[ 'PV_Session' ][ 'end_date' ] ) ? $_SESSION[ 'PV_Session' ][ 'end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
262
-
263
- if ( !empty( $_POST[ 'start_date' ] ) ) {
264
- $start_date = strtotime( $_POST[ 'start_date' ] );
265
- $_SESSION[ 'PV_Session' ][ 'start_date' ] = $start_date;
266
- }
267
-
268
- if ( !empty( $_POST[ 'end_date' ] ) ) {
269
- $end_date = strtotime( $_POST[ 'end_date' ] );
270
- $_SESSION[ 'PV_Session' ][ 'end_date' ] = $end_date;
271
- }
272
-
273
- $after = date( 'Y-m-d', $start_date );
274
- $before = date( 'Y-m-d', strtotime( '+1 day', $end_date ) );
275
-
276
- return array( 'after' => $after, 'before' => $before );
277
- }
278
-
279
-
280
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/class-shipping.php DELETED
@@ -1,322 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Shipping functions
5
- *
6
- * @author Matt Gates <http://mgates.me>, WC Vendors <http://wcvendors.com>
7
- * @package ProductVendor
8
- */
9
-
10
-
11
- class WCV_Shipping
12
- {
13
- public static $trs2_shipping_rates;
14
- public static $trs2_shipping_calc_type;
15
- public static $pps_shipping_costs = array();
16
-
17
-
18
- /**
19
- * Constructor
20
- */
21
- function __construct()
22
- {
23
- // Table Rate Shipping 2 by WooThemes
24
- if ( function_exists( 'woocommerce_get_shipping_method_table_rate' ) ) {
25
- // add_action( 'wp', array( $this, 'trs2_clear_transients' ) );
26
- add_action( 'woocommerce_checkout_update_order_meta', array( 'WCV_Shipping', 'trs2_add_shipping_data' ), 1, 2 );
27
- add_action( 'wc_trs2_matched_rates', array( 'WCV_Shipping', 'trs2_store_shipping_data' ), 10, 3 );
28
- }
29
- }
30
-
31
-
32
- /**
33
- *
34
- *
35
- * @param unknown $order_id
36
- * @param unknown $product
37
- * @param unknown $author
38
- *
39
- * @return unknown
40
- */
41
- public static function get_shipping_due( $order_id, $product, $author )
42
- {
43
- global $woocommerce;
44
-
45
- $shipping_costs = array( 'amount' => 0, 'tax' => 0);
46
- $shipping_due = 0;
47
- $method = '';
48
- $_product = get_product( $product[ 'product_id' ] );
49
- $order = wc_get_order( $order_id );
50
-
51
- if ( $_product && $_product->needs_shipping() && !$_product->is_downloadable() ) {
52
-
53
- // Get Shipping methods.
54
- $shipping_methods = $order->get_shipping_methods();
55
-
56
- // TODO: Currently this only allows one shipping method per order, this definitely needs changing
57
- foreach ($shipping_methods as $shipping_method) {
58
- $method = $shipping_method['method_id'];
59
- break;
60
- }
61
-
62
- // Table Rate Shipping 2
63
- if ( strstr( $method, 'table_rate' ) !== false ) {
64
- // $shipping_due = WCV_Shipping::trs2_get_due( $order_id, $product[ 'product_id' ] );
65
-
66
- // Per Product Shipping 2
67
- } else if ( ( class_exists('WC_Shipping_Per_Product_Init') || function_exists( 'woocommerce_per_product_shipping' ) ) && $method == 'per_product' ) {
68
- $shipping_costs = WCV_Shipping::pps_get_due( $order_id, $product );
69
-
70
- // Local Delivery
71
- } else if ( $method == 'local_delivery' ) {
72
- $local_delivery = get_option( 'woocommerce_local_delivery_settings' );
73
-
74
- if ( $local_delivery[ 'type' ] == 'product' ) {
75
-
76
- $shipping_costs['amount'] = $product[ 'qty' ] * $local_delivery[ 'fee' ];
77
- $shipping_costs['tax'] = WCV_Shipping::calculate_shipping_tax( $shipping_costs['amount'], $order );
78
- }
79
-
80
- // International Delivery
81
- } else if ( $method == 'international_delivery' ) {
82
-
83
- $int_delivery = get_option( 'woocommerce_international_delivery_settings' );
84
-
85
- if ( $int_delivery[ 'type' ] == 'item' ) {
86
- $WC_Shipping_International_Delivery = new WC_Shipping_International_Delivery();
87
- $fee = $WC_Shipping_International_Delivery->get_fee( $int_delivery[ 'fee' ], $_product->get_price() );
88
- $shipping_costs['amount'] = ( $int_delivery[ 'cost' ] + $fee ) * $product[ 'qty' ];
89
- $shipping_costs['tax'] = ( 'taxable' === $int_delivery[ 'tax_status' ] ) ? WCV_Shipping::calculate_shipping_tax( $shipping_costs['amount'], $order ) : 0;
90
- }
91
-
92
- }
93
- }
94
-
95
- $shipping_costs = apply_filters( 'wcvendors_shipping_due', $shipping_costs, $order_id, $product, $author );
96
-
97
- return $shipping_costs;
98
- }
99
-
100
-
101
- /**
102
- *
103
- *
104
- * @param unknown $order_id
105
- * @param unknown $product
106
- *
107
- * @return array
108
- */
109
- public static function pps_get_due( $order_id, $product )
110
- {
111
- global $woocommerce;
112
-
113
- $item_shipping_cost = 0;
114
- $shipping_costs = array();
115
-
116
- $settings = get_option( 'woocommerce_per_product_settings' );
117
- $taxable = $settings['tax_status'];
118
-
119
- $order = new WC_Order( $order_id );
120
- $package[ 'destination' ][ 'country' ] = $order->shipping_country;
121
- $package[ 'destination' ][ 'state' ] = $order->shipping_state;
122
- $package[ 'destination' ][ 'postcode' ] = $order->shipping_postcode;
123
- $product_id = !empty( $product['variation_id'] ) ? $product['variation_id'] : $product['product_id'];
124
-
125
- if ( !empty( $product['variation_id'] ) ) {
126
- $rule = woocommerce_per_product_shipping_get_matching_rule( $product['variation_id'], $package );
127
- }
128
-
129
- if ( empty( $rule ) ) {
130
- $rule = woocommerce_per_product_shipping_get_matching_rule( $product['product_id'], $package );
131
- }
132
-
133
- if ( !empty( $rule ) ) {
134
- $item_shipping_cost += $rule->rule_item_cost * $product[ 'qty' ];
135
-
136
- if ( !empty(self::$pps_shipping_costs[$order_id]) && ! in_array( $rule->rule_id, self::$pps_shipping_costs[$order_id] ) ) {
137
- $item_shipping_cost += $rule->rule_cost;
138
- } else if ( empty( self::$pps_shipping_costs[$order_id] ) ) {
139
- $item_shipping_cost += $rule->rule_cost;
140
- }
141
-
142
- self::$pps_shipping_costs[$order_id][] = $rule->rule_id;
143
- }
144
-
145
- $shipping_costs['amount'] = $item_shipping_cost;
146
- $shipping_costs['tax'] = ('taxable' === $taxable ) ? WCV_Shipping::calculate_shipping_tax( $item_shipping_cost, $order ) : 0;
147
-
148
- // return $item_shipping_cost;
149
- return $shipping_costs;
150
- }
151
-
152
- public static function calculate_shipping_tax( $shipping_amount, $order ) {
153
-
154
- $tax_based_on = get_option( 'woocommerce_tax_based_on' );
155
- $wc_tax_enabled = get_option( 'woocommerce_calc_taxes' );
156
-
157
- // if taxes aren't enabled don't calculate them
158
- if ( 'no' === $wc_tax_enabled ) return 0;
159
-
160
- if ( 'base' === $tax_based_on ) {
161
-
162
- $default = wc_get_base_location();
163
- $country = $default['country'];
164
- $state = $default['state'];
165
- $postcode = '';
166
- $city = '';
167
-
168
- } elseif ( 'billing' === $tax_based_on ) {
169
-
170
- $country = $order->billing_country;
171
- $state = $order->billing_state;
172
- $postcode = $order->billing_postcode;
173
- $city = $order->billing_city;
174
-
175
- } else {
176
-
177
- $country = $order->shipping_country;
178
- $state = $order->shipping_state;
179
- $postcode = $order->shipping_postcode;
180
- $city = $order->shipping_city;
181
-
182
- }
183
-
184
- // Now calculate shipping tax
185
- $matched_tax_rates = array();
186
-
187
- $tax_rates = WC_Tax::find_rates( array(
188
- 'country' => $country,
189
- 'state' => $state,
190
- 'postcode' => $postcode,
191
- 'city' => $city,
192
- 'tax_class' => ''
193
- ) );
194
-
195
-
196
- if ( $tax_rates ) {
197
- foreach ( $tax_rates as $key => $rate ) {
198
- if ( isset( $rate['shipping'] ) && 'yes' === $rate['shipping'] ) {
199
- $matched_tax_rates[ $key ] = $rate;
200
- }
201
- }
202
- }
203
-
204
- $shipping_taxes = WC_Tax::calc_shipping_tax( $shipping_amount, $matched_tax_rates );
205
- $shipping_tax_total = WC_Tax::round( array_sum( $shipping_taxes ) );
206
-
207
- return $shipping_tax_total;
208
-
209
- }
210
-
211
-
212
- /**
213
- *
214
- */
215
- public function trs2_clear_transients()
216
- {
217
- global $woocommerce;
218
-
219
- if ( is_checkout() ) {
220
- wc_delete_product_transients();
221
- }
222
- }
223
-
224
-
225
- /**
226
- *
227
- *
228
- * @param unknown $order_id
229
- * @param unknown $product_id
230
- *
231
- * @return unknown
232
- */
233
- public function trs2_get_due( $order_id, $product_id )
234
- {
235
- if ( !function_exists( 'woocommerce_get_shipping_method_table_rate' ) ) return;
236
-
237
- $shipping_due = 0;
238
-
239
- WCV_Shipping::trs2_retrieve_shipping_data( $order_id );
240
- if ( !empty( WCV_Shipping::$trs2_shipping_calc_type ) ) {
241
-
242
- $ship_id = ( WCV_Shipping::$trs2_shipping_calc_type == 'class' ) ? get_product( $product_id )->get_shipping_class_id() : $product_id;
243
-
244
- if ( !empty( WCV_Shipping::$trs2_shipping_rates[ $ship_id ] ) ) {
245
- $shipping_due = WCV_Shipping::$trs2_shipping_rates[ $ship_id ];
246
- unset( WCV_Shipping::$trs2_shipping_rates[ $ship_id ] );
247
- }
248
- }
249
-
250
- return $shipping_due;
251
- }
252
-
253
-
254
- /**
255
- *
256
- *
257
- * @param unknown $order_id
258
- */
259
- public function trs2_retrieve_shipping_data( $order_id )
260
- {
261
- global $woocommerce;
262
-
263
- if ( !empty( WCV_Shipping::$trs2_shipping_rates ) ) return;
264
-
265
- WCV_Shipping::$trs2_shipping_rates = array_filter( (array) get_post_meta( $order_id, '_wcvendors_trs2_shipping_rates', true ) );
266
- WCV_Shipping::$trs2_shipping_calc_type = get_post_meta( $order_id, '_wcvendors_trs2_shipping_calc_type', true );
267
- }
268
-
269
-
270
- /**
271
- *
272
- *
273
- * @param unknown $type
274
- * @param unknown $rates
275
- * @param unknown $per_item
276
- */
277
- public function trs2_store_shipping_data( $type, $rates, $per_item )
278
- {
279
- global $woocommerce;
280
-
281
- $types = (array) $woocommerce->session->trs2_shipping_class_type;
282
- $types[ ] = $type;
283
- $woocommerce->session->trs2_shipping_class_type = $types;
284
-
285
- $items = (array) $woocommerce->session->trs2_shipping_rates;
286
- $items[ ] = $per_item;
287
- $woocommerce->session->trs2_shipping_rates = $items;
288
- }
289
-
290
-
291
- /**
292
- *
293
- *
294
- * @param unknown $order_id
295
- * @param unknown $post
296
- *
297
- * @return unknown
298
- */
299
- public function trs2_add_shipping_data( $order_id, $post )
300
- {
301
- global $woocommerce;
302
-
303
- if ( empty( $woocommerce->session->trs2_shipping_rates ) ) {
304
- return false;
305
- }
306
-
307
- $order = new WC_Order( $order_id );
308
-
309
- foreach ( $woocommerce->session->trs2_shipping_rates as $key => $shipping_rates ) {
310
-
311
- if ( is_array( $shipping_rates ) && array_sum( $shipping_rates ) == $order->order_shipping ) {
312
- $shipping_calc_type = $woocommerce->session->trs2_shipping_class_type[ $key ];
313
- update_post_meta( $order_id, '_wcvendors_trs2_shipping_rates', $shipping_rates );
314
- update_post_meta( $order_id, '_wcvendors_trs2_shipping_calc_type', $shipping_calc_type );
315
-
316
- break;
317
- }
318
- }
319
-
320
- unset( $woocommerce->session->trs2_shipping_rates, $woocommerce->session->trs2_shipping_class_type );
321
- }
322
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/class-vendors.php DELETED
@@ -1,462 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Vendor functions
5
- *
6
- * @author Matt Gates <http://mgates.me>, WC Vendors <http://wcvendors.com>
7
- * @package WCVendors
8
- */
9
-
10
-
11
- class WCV_Vendors
12
- {
13
-
14
- /**
15
- * Retrieve all products for a vendor
16
- *
17
- * @param int $vendor_id
18
- *
19
- * @return object
20
- */
21
- public static function get_vendor_products( $vendor_id )
22
- {
23
- $args = array(
24
- 'numberposts' => -1,
25
- 'post_type' => 'product',
26
- 'author' => $vendor_id,
27
- 'post_status' => 'publish',
28
- );
29
-
30
- $args = apply_filters( 'pv_get_vendor_products_args', $args );
31
-
32
- return get_posts( $args );
33
- }
34
-
35
- public static function get_default_commission( $vendor_id )
36
- {
37
- return get_user_meta( $vendor_id, 'pv_custom_commission_rate', true );
38
- }
39
-
40
-
41
- /**
42
- * Vendor IDs and PayPal addresses from an order
43
- *
44
- * @param object $order
45
- * @param unknown $items (optional)
46
- *
47
- * @return array
48
- */
49
- public static function get_vendors_from_order( $order, $items = false )
50
- {
51
- if ( !$order ) return;
52
- if ( !$items ) $items = $order->get_items();
53
-
54
- $vendors = array();
55
- foreach ( $items as $key => $product ) {
56
-
57
- $author = WCV_Vendors::get_vendor_from_product( $product[ 'product_id' ] );
58
-
59
- // Only store the vendor authors
60
- if ( !WCV_Vendors::is_vendor( $author ) ) continue;
61
-
62
- $vendors[ $author ] = the_author_meta( 'author_paypal', $author );
63
- }
64
-
65
- return apply_filters( 'pv_vendors_from_order', $vendors, $order );
66
- }
67
-
68
-
69
- /**
70
- *
71
- *
72
- * @param unknown $order
73
- * @param unknown $group (optional)
74
- *
75
- * @return unknown
76
- */
77
- public static function get_vendor_dues_from_order( $order, $group = true )
78
- {
79
- global $woocommerce;
80
-
81
- $give_tax = WC_Vendors::$pv_options->get_option( 'give_tax' );
82
- $give_shipping = WC_Vendors::$pv_options->get_option( 'give_shipping' );
83
- $receiver = array();
84
- $shipping_given = 0;
85
- $tax_given = 0;
86
-
87
- WCV_Shipping::$pps_shipping_costs = array();
88
-
89
- foreach ( $order->get_items() as $key => $product ) {
90
-
91
- $product_id = !empty( $product[ 'variation_id' ] ) ? $product[ 'variation_id' ] : $product[ 'product_id' ];
92
- $author = WCV_Vendors::get_vendor_from_product( $product_id );
93
- $give_tax_override = get_user_meta( $author, 'wcv_give_vendor_tax', true );
94
- $give_shipping_override = get_user_meta( $author, 'wcv_give_vendor_shipping', true );
95
- $is_vendor = WCV_Vendors::is_vendor( $author );
96
- $commission = $is_vendor ? WCV_Commission::calculate_commission( $product[ 'line_subtotal' ], $product_id, $order, $product[ 'qty' ] ) : 0;
97
- $tax = !empty( $product[ 'line_tax' ] ) ? (float) $product[ 'line_tax' ] : 0;
98
-
99
- // Check if shipping is enabled
100
- if ( get_option('woocommerce_calc_shipping') === 'no' ) {
101
- $shipping = 0; $shipping_tax = 0;
102
- } else {
103
- $shipping_costs = WCV_Shipping::get_shipping_due( $order->id, $product, $author );
104
- $shipping = $shipping_costs['amount'];
105
- $shipping_tax = $shipping_costs['tax'];
106
- }
107
-
108
- $_product = new WC_Product( $product['product_id'] );
109
-
110
- // Add line item tax and shipping taxes together
111
- $total_tax = ( $_product->is_taxable() ) ? (float) $tax + (float) $shipping_tax : 0;
112
-
113
- // Tax override on a per vendor basis
114
- if ( $give_tax_override ) $give_tax = true;
115
- // Shipping override
116
- if ( $give_shipping_override ) $give_shipping = true;
117
-
118
- if ( $is_vendor ) {
119
-
120
- $shipping_given += $give_shipping ? $shipping : 0;
121
- $tax_given += $give_tax ? $total_tax : 0;
122
-
123
- $give = 0;
124
- $give += !empty( $receiver[ $author ][ 'total' ] ) ? $receiver[ $author ][ 'total' ] : 0;
125
- $give += $give_shipping ? $shipping : 0;
126
- $give += $commission;
127
- $give += $give_tax ? $total_tax : 0;
128
-
129
- if ( $group ) {
130
-
131
- $receiver[ $author ] = array(
132
- 'vendor_id' => (int) $author,
133
- 'commission' => !empty( $receiver[ $author ][ 'commission' ] ) ? $receiver[ $author ][ 'commission' ] + $commission : $commission,
134
- 'shipping' => $give_shipping ? ( !empty( $receiver[ $author ][ 'shipping' ] ) ? $receiver[ $author ][ 'shipping' ] + $shipping : $shipping) : 0,
135
- 'tax' => $give_tax ? ( !empty( $receiver[ $author ][ 'tax' ] ) ? $receiver[ $author ][ 'tax' ] + $total_tax : $total_tax ) : 0,
136
- 'qty' => !empty( $receiver[ $author ][ 'qty' ] ) ? $receiver[ $author ][ 'qty' ] + $product[ 'qty' ] : $product[ 'qty' ],
137
- 'total' => $give,
138
- );
139
-
140
- } else {
141
-
142
- $receiver[ $author ][ $key ] = array(
143
- 'vendor_id' => (int) $author,
144
- 'product_id' => $product_id,
145
- 'commission' => $commission,
146
- 'shipping' => $give_shipping ? $shipping : 0,
147
- 'tax' => $give_tax ? $total_tax : 0,
148
- 'qty' => $product[ 'qty' ],
149
- 'total' => ($give_shipping ? $shipping : 0) + $commission + ( $give_tax ? $total_tax : 0 ),
150
- );
151
-
152
- }
153
-
154
- }
155
-
156
- $admin_comm = $product[ 'line_subtotal' ] - $commission;
157
-
158
- if ( $group ) {
159
- $receiver[ 1 ] = array(
160
- 'vendor_id' => 1,
161
- 'qty' => !empty( $receiver[ 1 ][ 'qty' ] ) ? $receiver[ 1 ][ 'qty' ] + $product[ 'qty' ] : $product[ 'qty' ],
162
- 'commission' => !empty( $receiver[ 1 ][ 'commission' ] ) ? $receiver[ 1 ][ 'commission' ] + $admin_comm : $admin_comm,
163
- 'total' => !empty( $receiver[ 1 ] ) ? $receiver[ 1 ][ 'total' ] + $admin_comm : $admin_comm,
164
- );
165
- } else {
166
- $receiver[ 1 ][ $key ] = array(
167
- 'vendor_id' => 1,
168
- 'product_id' => $product_id,
169
- 'commission' => $admin_comm,
170
- 'shipping' => 0,
171
- 'tax' => 0,
172
- 'qty' => $product[ 'qty' ],
173
- 'total' => $admin_comm,
174
- );
175
- }
176
-
177
- }
178
-
179
- // Add remainders on end to admin
180
- $discount = $order->get_total_discount();
181
- $shipping = ( $order->order_shipping - $shipping_given );
182
- $tax = round(( $order->order_tax + $order->order_shipping_tax ) - $tax_given, 2);
183
- $total = ( $tax + $shipping ) - $discount;
184
-
185
- if ( $group ) {
186
- $receiver[ 1 ][ 'commission' ] = $receiver[ 1 ][ 'commission' ] - $discount;
187
- $receiver[ 1 ][ 'shipping' ] = $shipping;
188
- $receiver[ 1 ][ 'tax' ] = $tax;
189
- $receiver[ 1 ][ 'total' ] += $total;
190
- } else {
191
- $receiver[ 1 ][ $key ][ 'commission' ] = $receiver[ 1 ][ $key ][ 'commission' ] - $discount;
192
- $receiver[ 1 ][ $key ][ 'shipping' ] = ( $order->order_shipping - $shipping_given );
193
- $receiver[ 1 ][ $key ][ 'tax' ] = $tax;
194
- $receiver[ 1 ][ $key ][ 'total' ] += $total;
195
- }
196
-
197
- // Reset the array keys
198
- // $receivers = array_values( $receiver );
199
-
200
- return $receiver;
201
- }
202
-
203
-
204
- /**
205
- * Return the PayPal address for a vendor
206
- *
207
- * If no PayPal is set, it returns the vendor's email
208
- *
209
- * @param int $vendor_id
210
- *
211
- * @return string
212
- */
213
- public static function get_vendor_paypal( $vendor_id )
214
- {
215
- $paypal = get_user_meta( $vendor_id, $meta_key = 'pv_paypal', true );
216
- $paypal = !empty( $paypal ) ? $paypal : get_the_author_meta( 'user_email', $vendor_id, false );
217
-
218
- return $paypal;
219
- }
220
-
221
-
222
- /**
223
- * Check if a vendor has an amount due for an order already
224
- *
225
- * @param int $vendor_id
226
- * @param int $order_id
227
- *
228
- * @return int
229
- */
230
- public static function count_due_by_vendor( $vendor_id, $order_id )
231
- {
232
- global $wpdb;
233
-
234
- $table_name = $wpdb->prefix . "pv_commission";
235
-
236
- $query = "SELECT COUNT(*)
237
- FROM {$table_name}
238
- WHERE vendor_id = %s
239
- AND order_id = %s
240
- AND status = %s";
241
- $count = $wpdb->get_var( $wpdb->prepare( $query, $vendor_id, $order_id, 'due' ) );
242
-
243
- return $count;
244
- }
245
-
246
-
247
- /**
248
- * All commission due for a specific vendor
249
- *
250
- * @param int $vendor_id
251
- *
252
- * @return int
253
- */
254
- public static function get_due_orders_by_vendor( $vendor_id )
255
- {
256
- global $wpdb;
257
-
258
- $table_name = $wpdb->prefix . "pv_commission";
259
-
260
- $query = "SELECT *
261
- FROM {$table_name}
262
- WHERE vendor_id = %s
263
- AND status = %s";
264
- $results = $wpdb->get_results( $wpdb->prepare( $query, $vendor_id, 'due' ) );
265
-
266
- return $results;
267
- }
268
-
269
-
270
- /**
271
- *
272
- *
273
- * @param unknown $product_id
274
- *
275
- * @return unknown
276
- */
277
- public static function get_vendor_from_product( $product_id )
278
- {
279
- // Make sure we are returning an author for products or product variations only
280
- if ( 'product' === get_post_type( $product_id ) || 'product_variation' === get_post_type( $product_id ) ) {
281
- $parent = get_post_ancestors( $product_id );
282
- if ( $parent ) $product_id = $parent[ 0 ];
283
-
284
- $post = get_post( $product_id );
285
- $author = $post ? $post->post_author : 1;
286
- $author = apply_filters( 'pv_product_author', $author, $product_id );
287
- } else {
288
- $author = -1;
289
- }
290
- return $author;
291
- }
292
-
293
-
294
- /**
295
- * Checks whether the ID provided is vendor capable or not
296
- *
297
- * @param int $user_id
298
- *
299
- * @return bool
300
- */
301
- public static function is_vendor( $user_id )
302
- {
303
- $user = get_userdata( $user_id );
304
-
305
- if (is_object($user)) {
306
- $is_vendor = is_array( $user->roles ) ? in_array( 'vendor', $user->roles ) : false;
307
- } else {
308
- $is_vendor = false;
309
- }
310
-
311
- return apply_filters( 'pv_is_vendor', $is_vendor, $user_id );
312
- }
313
-
314
-
315
- /**
316
- * Grabs the vendor ID whether a username or an int is provided
317
- * and returns the vendor_id if it's actually a vendor
318
- *
319
- * @param unknown $input
320
- *
321
- * @return unknown
322
- */
323
- public static function get_vendor_id( $input )
324
- {
325
- if ( empty( $input ) ) {
326
- return false;
327
- }
328
-
329
- $users = get_users( array( 'meta_key' => 'pv_shop_slug', 'meta_value' => sanitize_title( $input ) ) );
330
-
331
- if ( !empty( $users ) && count( $users ) == 1 ) {
332
- $vendor = $users[ 0 ];
333
- } else {
334
- $int_vendor = is_numeric( $input );
335
- $vendor = !empty( $int_vendor ) ? get_userdata( $input ) : get_user_by( 'login', $input );
336
- }
337
-
338
- if ( $vendor ) {
339
- $vendor_id = $vendor->ID;
340
- if ( self::is_vendor( $vendor_id ) ) {
341
- return $vendor_id;
342
- }
343
- }
344
-
345
- return false;
346
- }
347
-
348
-
349
- /**
350
- * Retrieve the shop page for a specific vendor
351
- *
352
- * @param unknown $vendor_id
353
- *
354
- * @return string
355
- */
356
- public static function get_vendor_shop_page( $vendor_id )
357
- {
358
- $vendor_id = self::get_vendor_id( $vendor_id );
359
- if ( !$vendor_id ) return;
360
-
361
- $slug = get_user_meta( $vendor_id, 'pv_shop_slug', true );
362
- $vendor = !$slug ? get_userdata( $vendor_id )->user_login : $slug;
363
-
364
- if ( get_option( 'permalink_structure' ) ) {
365
- $permalink = trailingslashit( WC_Vendors::$pv_options->get_option( 'vendor_shop_permalink' ) );
366
-
367
- return trailingslashit( home_url( sprintf( '/%s%s', $permalink, $vendor ) ) );
368
- } else {
369
- return esc_url( add_query_arg( array( 'vendor_shop' => $vendor ), get_post_type_archive_link( 'product' ) ) );
370
- }
371
- }
372
-
373
-
374
- /**
375
- * Retrieve the shop name for a specific vendor
376
- *
377
- * @param unknown $vendor_id
378
- *
379
- * @return string
380
- */
381
- public static function get_vendor_shop_name( $vendor_id )
382
- {
383
- $vendor_id = self::get_vendor_id( $vendor_id );
384
- $name = $vendor_id ? get_user_meta( $vendor_id, 'pv_shop_name', true ) : false;
385
- $shop_name = !$name ? get_userdata( $vendor_id )->user_login : $name;
386
-
387
- return $shop_name;
388
- }
389
-
390
-
391
- /**
392
- *
393
- *
394
- * @param unknown $user_id
395
- *
396
- * @return unknown
397
- */
398
- public static function is_pending( $user_id )
399
- {
400
- $user = get_userdata( $user_id );
401
-
402
- $role = !empty( $user->roles ) ? array_shift( $user->roles ) : false;
403
- $is_pending = ( $role == 'pending_vendor' );
404
-
405
- return $is_pending;
406
- }
407
-
408
- /*
409
- * Is this a vendor product ?
410
- * @param uknown $role
411
- */
412
- public static function is_vendor_product($role) {
413
- return ($role === 'Vendor') ? true : false;
414
- }
415
-
416
- /*
417
- * Is this the vendors shop archive page ?
418
- */
419
- public static function is_vendor_page() {
420
-
421
- $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
422
- $vendor_id = WCV_Vendors::get_vendor_id( $vendor_shop );
423
-
424
- return $vendor_id ? true : false;
425
-
426
- }
427
-
428
- /*
429
- * Is this a vendor single product page ?
430
- */
431
- public static function is_vendor_product_page($vendor_id) {
432
-
433
- $vendor_product = WCV_Vendors::is_vendor_product( wcv_get_user_role($vendor_id) );
434
- return $vendor_product ? true : false;
435
-
436
- }
437
-
438
- public static function get_vendor_sold_by( $vendor_id ){
439
-
440
- $vendor_display_name = WC_Vendors::$pv_options->get_option( 'vendor_display_name' );
441
- $vendor = get_userdata( $vendor_id );
442
-
443
- switch ($vendor_display_name) {
444
- case 'display_name':
445
- $display_name = $vendor->display_name;
446
- break;
447
- case 'user_login':
448
- $display_name = $vendor->user_login;
449
- break;
450
- case 'user_email':
451
- $display_name = $vendor->user_email;
452
- break;
453
-
454
- default:
455
- $display_name = WCV_Vendors::get_vendor_shop_name( $vendor_id );
456
- break;
457
- }
458
-
459
- return $display_name;
460
- }
461
-
462
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/front/class-vendor-cart.php DELETED
@@ -1,64 +0,0 @@
1
- <?php
2
-
3
- /**
4
- *
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package
8
- */
9
-
10
-
11
- class WCV_Vendor_Cart
12
- {
13
-
14
-
15
- /**
16
- *
17
- */
18
- function __construct()
19
- {
20
- add_filter( 'woocommerce_get_item_data', array( 'WCV_Vendor_Cart', 'sold_by' ), 10, 2 );
21
- add_action( 'woocommerce_product_meta_start', array( 'WCV_Vendor_Cart', 'sold_by_meta' ), 10, 2 );
22
- }
23
-
24
-
25
- /**
26
- * Sold by in cart item
27
- *
28
- * @param unknown $values
29
- * @param unknown $cart_item
30
- *
31
- * @return unknown
32
- */
33
- public static function sold_by( $values, $cart_item )
34
- {
35
- $vendor_id = $cart_item[ 'data' ]->post->post_author;
36
- $sold_by_label = WC_Vendors::$pv_options->get_option( 'sold_by_label' );
37
- $sold_by = WCV_Vendors::is_vendor( $vendor_id )
38
- ? sprintf( '<a href="%s" target="_TOP">%s </a>', WCV_Vendors::get_vendor_shop_page( $vendor_id ), WCV_Vendors::get_vendor_sold_by( $vendor_id ) )
39
- : get_bloginfo( 'name' );
40
-
41
- $values[ ] = array(
42
- 'name' => apply_filters('wcvendors_cart_sold_by', $sold_by_label ),
43
- 'display' => $sold_by,
44
- );
45
-
46
- return $values;
47
- }
48
-
49
-
50
- /**
51
- * Single product meta
52
- */
53
- public static function sold_by_meta()
54
- {
55
- $vendor_id = get_the_author_meta( 'ID' );
56
- $sold_by_label = WC_Vendors::$pv_options->get_option( 'sold_by_label' );
57
- $sold_by = WCV_Vendors::is_vendor( $vendor_id )
58
- ? sprintf( '<a href="%s" class="wcvendors_cart_sold_by_meta">%s</a>', WCV_Vendors::get_vendor_shop_page( $vendor_id ), WCV_Vendors::get_vendor_sold_by( $vendor_id ) )
59
- : get_bloginfo( 'name' );
60
-
61
- echo apply_filters('wcvendors_cart_sold_by_meta', $sold_by_label ) .'&nbsp;'. $sold_by . '<br/>';
62
- }
63
-
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/front/class-vendor-shop.php DELETED
@@ -1,292 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Shop functions for each vendor.
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package ProductVendor
8
- */
9
-
10
-
11
- class WCV_Vendor_Shop
12
- {
13
-
14
- public static $seller_info;
15
-
16
- /**
17
- * init
18
- */
19
- function __construct()
20
- {
21
-
22
- add_filter( 'product_enquiry_send_to', array( 'WCV_Vendor_Shop', 'product_enquiry_compatibility' ), 10, 2 );
23
-
24
- add_action( 'woocommerce_product_query', array( $this, 'vendor_shop_query' ), 10, 2 );
25
- add_filter( 'init', array( $this, 'add_rewrite_rules' ), 0 );
26
-
27
- add_action( 'woocommerce_before_main_content', array( 'WCV_Vendor_Shop', 'shop_description' ), 30 );
28
- add_filter( 'woocommerce_product_tabs', array( 'WCV_Vendor_Shop', 'seller_info_tab' ) );
29
- add_filter( 'post_type_archive_link', array( 'WCV_Vendor_Shop', 'change_archive_link' ) );
30
-
31
- // Add sold by to product loop before add to cart
32
- add_action( 'woocommerce_after_shop_loop_item', array('WCV_Vendor_Shop', 'template_loop_sold_by'), 9 );
33
-
34
- // Remove Page Title if on Vendor Shop
35
- add_filter ( 'woocommerce_show_page_title', array('WCV_Vendor_Shop', 'remove_vendor_title') );
36
-
37
- // Show vendor on all sales related invoices
38
- add_action( 'woocommerce_add_order_item_meta', array('WCV_Vendor_Shop', 'add_vendor_to_order_item_meta'), 10, 2 );
39
-
40
- // Add a vendor header
41
- if (WC_Vendors::$pv_options->get_option( 'shop_headers_enabled' ) ) {
42
- add_action( 'woocommerce_before_main_content', array('WCV_Vendor_Shop', 'vendor_main_header'), 20 );
43
- add_action( 'woocommerce_before_single_product', array('WCV_Vendor_Shop', 'vendor_mini_header'));
44
- }
45
-
46
- }
47
-
48
- public static function change_archive_link( $link )
49
- {
50
- $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
51
- $vendor_id = WCV_Vendors::get_vendor_id( $vendor_shop );
52
-
53
- return !$vendor_id ? $link : WCV_Vendors::get_vendor_shop_page( $vendor_id );
54
- }
55
-
56
- public static function vendor_shop_query( $q, $that )
57
- {
58
- $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
59
- $vendor_id = WCV_Vendors::get_vendor_id( $vendor_shop );
60
-
61
- if ( !$vendor_id ) return;
62
- add_filter( 'woocommerce_page_title', array( 'WCV_Vendor_Shop', 'page_title' ) );
63
-
64
- $q->set( 'author', $vendor_id );
65
- }
66
-
67
- public static function product_enquiry_compatibility( $send_to, $product_id )
68
- {
69
- $author_id = get_post( $product_id )->post_author;
70
- if ( WCV_Vendors::is_vendor( $author_id ) ) {
71
- $send_to = get_userdata( $author_id )->user_email;
72
- }
73
-
74
- return $send_to;
75
- }
76
-
77
-
78
- /**
79
- *
80
- *
81
- * @param unknown $tabs
82
- *
83
- * @return unknown
84
- */
85
- public static function seller_info_tab( $tabs )
86
- {
87
- global $post;
88
-
89
- if ( WCV_Vendors::is_vendor( $post->post_author ) ) {
90
-
91
- $seller_info = get_user_meta( $post->post_author, 'pv_seller_info', true );
92
- $has_html = get_user_meta( $post->post_author, 'pv_shop_html_enabled', true );
93
- $global_html = WC_Vendors::$pv_options->get_option( 'shop_html_enabled' );
94
-
95
- $seller_info_label = WC_Vendors::$pv_options->get_option( 'seller_info_label' );
96
-
97
- if ( !empty( $seller_info ) ) {
98
-
99
- $seller_info = do_shortcode( $seller_info );
100
- self::$seller_info = '<div class="pv_seller_info">';
101
- self::$seller_info .= apply_filters('wcv_before_seller_info_tab', '');
102
- self::$seller_info .= ( $global_html || $has_html ) ? wpautop( wptexturize( wp_kses_post( $seller_info ) ) ) : sanitize_text_field( $seller_info );
103
- self::$seller_info .= apply_filters('wcv_after_seller_info_tab', '');
104
- self::$seller_info .= '</div>';
105
-
106
- $tabs[ 'seller_info' ] = array(
107
- 'title' => apply_filters( 'wcvendors_seller_info_label', $seller_info_label ),
108
- 'priority' => 50,
109
- 'callback' => array( 'WCV_Vendor_Shop', 'seller_info_tab_panel' ),
110
- );
111
- }
112
- }
113
-
114
- return $tabs;
115
- }
116
-
117
-
118
- /**
119
- *
120
- */
121
- public static function seller_info_tab_panel()
122
- {
123
- echo self::$seller_info;
124
- }
125
-
126
-
127
- /**
128
- * Show the description a vendor sets when viewing products by that vendor
129
- */
130
- public static function shop_description()
131
- {
132
- $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
133
- $vendor_id = WCV_Vendors::get_vendor_id( $vendor_shop );
134
-
135
- if ( $vendor_id ) {
136
- $has_html = get_user_meta( $vendor_id, 'pv_shop_html_enabled', true );
137
- $global_html = WC_Vendors::$pv_options->get_option( 'shop_html_enabled' );
138
- $description = do_shortcode( get_user_meta( $vendor_id, 'pv_shop_description', true ) );
139
-
140
- echo '<div class="pv_shop_description">';
141
- echo ( $global_html || $has_html ) ? wpautop( wptexturize( wp_kses_post( $description ) ) ) : sanitize_text_field( $description );
142
- echo '</div>';
143
- }
144
- }
145
-
146
- /**
147
- *
148
- */
149
- public static function add_rewrite_rules()
150
- {
151
- $permalink = untrailingslashit( WC_Vendors::$pv_options->get_option( 'vendor_shop_permalink' ) );
152
-
153
- // Remove beginning slash
154
- if ( substr( $permalink, 0, 1 ) == '/' ) {
155
- $permalink = substr( $permalink, 1, strlen( $permalink ) );
156
- }
157
-
158
- add_rewrite_tag( '%vendor_shop%', '([^&]+)' );
159
-
160
- add_rewrite_rule( $permalink . '/([^/]*)/page/([0-9]+)', 'index.php?post_type=product&vendor_shop=$matches[1]&paged=$matches[2]', 'top' );
161
- add_rewrite_rule( $permalink . '/([^/]*)', 'index.php?post_type=product&vendor_shop=$matches[1]', 'top' );
162
- }
163
-
164
-
165
- public static function page_title( $page_title = "" )
166
- {
167
- $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
168
- $vendor_id = WCV_Vendors::get_vendor_id( $vendor_shop );
169
-
170
- return $vendor_id ? WCV_Vendors::get_vendor_shop_name( $vendor_id ) : $page_title;
171
- }
172
-
173
-
174
- /*
175
- Adding sold by to product loop
176
- */
177
- public static function template_loop_sold_by($product_id) {
178
- $vendor_id = WCV_Vendors::get_vendor_from_product( $product_id );
179
- $sold_by_label = WC_Vendors::$pv_options->get_option( 'sold_by_label' );
180
- $sold_by = WCV_Vendors::is_vendor( $vendor_id )
181
- ? sprintf( '<a href="%s">%s</a>', WCV_Vendors::get_vendor_shop_page( $vendor_id ), WCV_Vendors::get_vendor_sold_by( $vendor_id ) )
182
- : get_bloginfo( 'name' );
183
- echo '<small class="wcvendors_sold_by_in_loop">' . apply_filters('wcvendors_sold_by_in_loop', $sold_by_label ).'&nbsp;'. $sold_by . '</small> <br />';
184
- }
185
-
186
-
187
- /*
188
- * Remove the Page title from Archive-Product while on a vendor Page
189
- */
190
- public static function remove_vendor_title( $b ) {
191
- if ( WCV_Vendors::is_vendor_page() ) {
192
- return false;
193
- }
194
- return $b;
195
- }
196
-
197
- /*
198
- * Display a vendor header at the top of the vendors product archive page
199
- */
200
- public static function vendor_main_header() {
201
-
202
- // Remove the basic shop description from the loop
203
- remove_action( 'woocommerce_before_main_content', array('WCV_Vendor_Shop', 'shop_description' ), 30);
204
-
205
- if (WCV_Vendors::is_vendor_page()) {
206
- $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
207
- $vendor_id = WCV_Vendors::get_vendor_id( $vendor_shop );
208
- $shop_name = get_user_meta( $vendor_id, 'pv_shop_name', true );
209
-
210
- // Shop description
211
- $has_html = get_user_meta( $vendor_id, 'pv_shop_html_enabled', true );
212
- $global_html = WC_Vendors::$pv_options->get_option( 'shop_html_enabled' );
213
- $description = do_shortcode( get_user_meta( $vendor_id, 'pv_shop_description', true ) );
214
- $shop_description = ( $global_html || $has_html ) ? wpautop( wptexturize( wp_kses_post( $description ) ) ) : sanitize_text_field( $description );
215
- $seller_info = ( $global_html || $has_html ) ? wpautop( get_user_meta( $vendor_id, 'pv_seller_info', true ) ) : sanitize_text_field( get_user_meta( $vendor_id, 'pv_seller_info', true ) );
216
- $vendor = get_userdata( $vendor_id );
217
- $vendor_email = $vendor->user_email;
218
- $vendor_login = $vendor->user_login;
219
-
220
-
221
- do_action('wcv_before_main_header', $vendor_id);
222
-
223
- wc_get_template( 'vendor-main-header.php', array(
224
- 'vendor' => $vendor,
225
- 'vendor_id' => $vendor_id,
226
- 'shop_name' => $shop_name,
227
- 'shop_description' => $shop_description,
228
- 'seller_info' => $seller_info,
229
- 'vendor_email' => $vendor_email,
230
- 'vendor_login' => $vendor_login,
231
- ), 'wc-vendors/front/', wcv_plugin_dir . 'templates/front/' );
232
-
233
- do_action('wcv_after_main_header', $vendor_id);
234
-
235
- }
236
- }
237
-
238
-
239
- /*
240
- * Display a vendor header at the top of the single-product page
241
- */
242
- public static function vendor_mini_header() {
243
-
244
- global $product;
245
-
246
- if (WCV_Vendors::is_vendor_product_page($product->post->post_author)) {
247
-
248
- $vendor = get_userdata( $product->post->post_author );
249
- $vendor_id = $product->post->post_author;
250
- $vendor_shop_link = site_url( WC_Vendors::$pv_options->get_option( 'vendor_shop_permalink' ) .'/' .$vendor->pv_shop_slug );
251
- $shop_name = get_user_meta( $vendor_id, 'pv_shop_name', true );
252
- $has_html = $vendor->pv_shop_html_enabled;
253
- $global_html = WC_Vendors::$pv_options->get_option( 'shop_html_enabled' );
254
- $description = do_shortcode( $vendor->pv_shop_description );
255
- $shop_description = ( $global_html || $has_html ) ? wpautop( wptexturize( wp_kses_post( $description ) ) ) : sanitize_text_field( $description );
256
- $seller_info = ( $global_html || $has_html ) ? wpautop( get_user_meta( $vendor_id, 'pv_seller_info', true ) ) : sanitize_text_field( get_user_meta( $vendor_id, 'pv_seller_info', true ) );
257
- $vendor_email = $vendor->user_email;
258
- $vendor_login = $vendor->user_login;
259
-
260
- do_action('wcv_before_mini_header', $vendor->ID);
261
-
262
- wc_get_template( 'vendor-mini-header.php', array(
263
- 'vendor' => $vendor,
264
- 'vendor_id' => $vendor_id,
265
- 'vendor_shop_link' => $vendor_shop_link,
266
- 'shop_name' => $vendor->pv_shop_name,
267
- 'shop_description' => $shop_description,
268
- 'seller_info' => $seller_info,
269
- 'shop_name' => $shop_name,
270
- 'vendor_email' => $vendor_email,
271
- 'vendor_login' => $vendor_login,
272
- ), 'wc-vendors/front/', wcv_plugin_dir . 'templates/front/' );
273
-
274
- do_action('wcv_after_mini_header', $vendor->ID);
275
-
276
- }
277
- }
278
-
279
- /*
280
- * Add Vendor to Order item Meta
281
- * Thanks to Asbjoern Andersen for the code
282
- *
283
- */
284
- public static function add_vendor_to_order_item_meta( $item_id, $cart_item) {
285
- $vendor_id = $cart_item[ 'data' ]->post->post_author;
286
- $sold_by_label = WC_Vendors::$pv_options->get_option( 'sold_by_label' );
287
- $sold_by = WCV_Vendors::is_vendor( $vendor_id ) ? sprintf( WCV_Vendors::get_vendor_sold_by( $vendor_id ) ): get_bloginfo( 'name' );
288
-
289
- wc_add_order_item_meta( $item_id, apply_filters( 'wcvendors_sold_by_in_email', $sold_by_label ), $sold_by );
290
- }
291
-
292
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/front/dashboard/class-vendor-dashboard.php DELETED
@@ -1,462 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * WCV Vendor Dashboard
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @author Jamie Madden <http://wcvendors.com>
8
- * @package WCVendors
9
- */
10
-
11
-
12
- class WCV_Vendor_Dashboard
13
- {
14
-
15
-
16
- /**
17
- * __construct()
18
- */
19
- function __construct()
20
- {
21
- add_shortcode( 'wcv_shop_settings', array( $this, 'display_vendor_settings' ) );
22
- add_shortcode( 'wcv_vendor_dashboard', array( $this, 'display_vendor_products' ) );
23
-
24
- add_action( 'template_redirect', array( $this, 'check_access' ) );
25
- add_action( 'init', array( $this, 'save_vendor_settings' ) );
26
- }
27
-
28
- public function save_vendor_settings()
29
- {
30
- global $woocommerce;
31
-
32
- $user_id = get_current_user_id();
33
-
34
- if ( !empty( $_GET['wc_pv_mark_shipped'] ) ) {
35
- $shop_name = WCV_Vendors::get_vendor_shop_name( $user_id );
36
- $order_id = $_GET['wc_pv_mark_shipped'];
37
- $shippers = (array) get_post_meta( $order_id, 'wc_pv_shipped', true );
38
- $order = new WC_Order( $order_id );
39
-
40
- // If not in the shippers array mark as shipped otherwise do nothing.
41
- if( !in_array($user_id, $shippers)) {
42
- $shippers[] = $user_id;
43
- $mails = $woocommerce->mailer()->get_emails();
44
- if ( !empty( $mails ) ) {
45
- $mails[ 'WC_Email_Notify_Shipped' ]->trigger( $order_id, $user_id );
46
- }
47
- do_action('wcvendors_vendor_ship', $order_id, $user_id);
48
- wc_add_notice( __( 'Order marked shipped.', 'wcvendors' ), 'success' );
49
- $order->add_order_note( apply_filters( 'wcvendors_vendor_shipped_note', __( $shop_name . ' has marked as shipped. ', 'wcvendors') ), $user_id ) ;
50
- } elseif ( false != ( $key = array_search( $user_id, $shippers) ) ) {
51
- unset( $shippers[$key] ); // Remove user from the shippers array
52
- }
53
-
54
- update_post_meta( $order_id, 'wc_pv_shipped', $shippers );
55
- return;
56
- }
57
-
58
- if ( isset( $_POST[ 'update_tracking' ] ) ) {
59
- $order_id = (int) $_POST[ 'order_id' ];
60
- $product_id = (int) $_POST[ 'product_id' ];
61
-
62
- $tracking_provider = woocommerce_clean( $_POST[ 'tracking_provider' ] );
63
- $custom_tracking_provider = woocommerce_clean( $_POST[ 'custom_tracking_provider_name' ] );
64
- $custom_tracking_link = woocommerce_clean( $_POST[ 'custom_tracking_url' ] );
65
- $tracking_number = woocommerce_clean( $_POST[ 'tracking_number' ] );
66
- $date_shipped = woocommerce_clean( strtotime( $_POST[ 'date_shipped' ] ) );
67
-
68
- $order = new WC_Order( $order_id );
69
- $products = $order->get_items();
70
- foreach ( $products as $key => $value ) {
71
- if ( $value[ 'product_id' ] == $product_id || $value[ 'variation_id' ] == $product_id ) {
72
- $order_item_id = $key;
73
- break;
74
- }
75
- }
76
- if ( $order_item_id ) {
77
- woocommerce_delete_order_item_meta( $order_item_id, __( 'Tracking number', 'wcvendors' ) );
78
- woocommerce_add_order_item_meta( $order_item_id, __( 'Tracking number', 'wcvendors' ), $tracking_number );
79
-
80
- $message = __( 'Success. Your tracking number has been updated.', 'wcvendors' );
81
- wc_add_notice( $message, 'success' );
82
-
83
- // Update order data
84
- update_post_meta( $order_id, '_tracking_provider', $tracking_provider );
85
- update_post_meta( $order_id, '_custom_tracking_provider', $custom_tracking_provider );
86
- update_post_meta( $order_id, '_tracking_number', $tracking_number );
87
- update_post_meta( $order_id, '_custom_tracking_link', $custom_tracking_link );
88
- update_post_meta( $order_id, '_date_shipped', $date_shipped );
89
- }
90
-
91
- }
92
-
93
- if ( empty( $_POST[ 'vendor_application_submit' ] ) ) {
94
- return false;
95
- }
96
-
97
- if (isset ( $_POST[ 'wc-product-vendor-nonce' ] ) ) {
98
-
99
- if ( !wp_verify_nonce( $_POST[ 'wc-product-vendor-nonce' ], 'save-shop-settings' ) ) {
100
- return false;
101
- }
102
-
103
-
104
- if ( isset( $_POST[ 'pv_paypal' ] ) ) {
105
- if ( !is_email( $_POST[ 'pv_paypal' ] ) ) {
106
- wc_add_notice( __( 'Your PayPal address is not a valid email address.', 'wcvendors' ), 'error' );
107
- } else {
108
- update_user_meta( $user_id, 'pv_paypal', $_POST[ 'pv_paypal' ] );
109
- }
110
- }
111
-
112
- if ( !empty( $_POST[ 'pv_shop_name' ] ) ) {
113
- $users = get_users( array( 'meta_key' => 'pv_shop_slug', 'meta_value' => sanitize_title( $_POST[ 'pv_shop_name' ] ) ) );
114
- if ( !empty( $users ) && $users[ 0 ]->ID != $user_id ) {
115
- wc_add_notice( __( 'That shop name is already taken. Your shop name must be unique.', 'wcvendors' ), 'error' );
116
- } else {
117
- update_user_meta( $user_id, 'pv_shop_name', $_POST[ 'pv_shop_name' ] );
118
- update_user_meta( $user_id, 'pv_shop_slug', sanitize_title( $_POST[ 'pv_shop_name' ] ) );
119
- }
120
- }
121
-
122
- if ( isset( $_POST[ 'pv_shop_description' ] ) ) {
123
- update_user_meta( $user_id, 'pv_shop_description', $_POST[ 'pv_shop_description' ] );
124
- }
125
-
126
- if ( isset( $_POST[ 'pv_seller_info' ] ) ) {
127
- update_user_meta( $user_id, 'pv_seller_info', $_POST[ 'pv_seller_info' ] );
128
- }
129
-
130
- do_action( 'wcvendors_shop_settings_saved', $user_id );
131
-
132
- if ( !wc_notice_count() ) {
133
- wc_add_notice( __( 'Settings saved.', 'wcvendors' ), 'success' );
134
- }
135
- }
136
- }
137
-
138
-
139
- /**
140
- *
141
- */
142
- public function check_access()
143
- {
144
- $vendor_dashboard_page = WC_Vendors::$pv_options->get_option( 'vendor_dashboard_page' );
145
- $shop_settings_page = WC_Vendors::$pv_options->get_option( 'shop_settings_page' );
146
-
147
- if ( is_page( $vendor_dashboard_page ) || is_page( $shop_settings_page ) ) {
148
- if ( !is_user_logged_in() ) {
149
- wp_redirect( get_permalink( woocommerce_get_page_id( 'myaccount' ) ), 303 );
150
- exit;
151
- }
152
- // user is logged, start session only if it's vendor dashboard
153
- if ( !session_id() ) session_start();
154
- }
155
- }
156
-
157
-
158
- /**
159
- * [wcv_vendor_dashboard] shortcode
160
- *
161
- * @param array $atts
162
- *
163
- * @return unknown
164
- */
165
- public function display_vendor_products( $atts )
166
- {
167
- global $start_date, $end_date;
168
-
169
- $start_date = !empty( $_SESSION[ 'PV_Session' ][ 'start_date' ] ) ? $_SESSION[ 'PV_Session' ][ 'start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
170
- $end_date = !empty( $_SESSION[ 'PV_Session' ][ 'end_date' ] ) ? $_SESSION[ 'PV_Session' ][ 'end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
171
-
172
- $can_view_orders = WC_Vendors::$pv_options->get_option( 'can_show_orders' );
173
- $settings_page = get_permalink( WC_Vendors::$pv_options->get_option( 'shop_settings_page' ) );
174
- $can_submit = WC_Vendors::$pv_options->get_option( 'can_submit_products' );
175
- $submit_link = ( $can_submit ) ? admin_url( 'post-new.php?post_type=product' ) : '';
176
- $edit_link = ( $can_submit ) ? admin_url( 'edit.php?post_type=product' ) : '';
177
-
178
- if ( !$this->can_view_vendor_page() ) {
179
- return false;
180
- }
181
-
182
- extract( shortcode_atts( array(
183
- 'user_id' => get_current_user_id(),
184
- 'datepicker' => true,
185
- ), $atts ) );
186
-
187
- $vendor_products = WCV_Queries::get_commission_products( $user_id );
188
- $products = array();
189
- foreach ($vendor_products as $_product) {
190
- $products[] = $_product->ID;
191
- }
192
-
193
- $vendor_summary = $this->format_product_details( $vendor_products );
194
- $order_summary = WCV_Queries::get_orders_for_products( $products );
195
- $shop_page = WCV_Vendors::get_vendor_shop_page( wp_get_current_user()->user_login );
196
-
197
- wp_enqueue_style( 'wcv_frontend_style', wcv_assets_url . 'css/wcv-frontend.css' );
198
-
199
- $providers = array();
200
- $provider_array = array();
201
-
202
- // WC Shipment Tracking Providers
203
- if ( class_exists( 'WC_Shipment_Tracking' ) ) {
204
- $WC_Shipment_Tracking = new WC_Shipment_Tracking();
205
- $providers = (method_exists($WC_Shipment_Tracking, 'get_providers')) ? $WC_Shipment_Tracking->get_providers() : $WC_Shipment_Tracking->providers;
206
- $provider_array = array();
207
- foreach ( $providers as $all_providers ) {
208
- foreach ( $all_providers as $provider => $format ) {
209
- $provider_array[sanitize_title( $provider )] = urlencode( $format );
210
- }
211
- }
212
- }
213
-
214
- ob_start();
215
- do_action( 'wcvendors_before_dashboard' );
216
-
217
- wc_print_notices();
218
- wc_get_template( 'links.php', array(
219
- 'shop_page' => urldecode($shop_page),
220
- 'settings_page' => $settings_page,
221
- 'can_submit' => $can_submit,
222
- 'submit_link' => $submit_link,
223
- 'edit_link' => $edit_link,
224
- ), 'wc-vendors/dashboard/', wcv_plugin_dir . 'templates/dashboard/' );
225
-
226
- if ( $can_view_sales = WC_Vendors::$pv_options->get_option( 'can_view_frontend_reports' ) ) {
227
-
228
- wc_get_template( 'reports.php', array(
229
- 'start_date' => $start_date,
230
- 'end_date' => $end_date,
231
- 'vendor_products' => $vendor_products,
232
- 'vendor_summary' => $vendor_summary,
233
- 'datepicker' => $datepicker,
234
- 'can_view_orders' => $can_view_orders,
235
- ), 'wc-vendors/dashboard/', wcv_plugin_dir . 'templates/dashboard/' );
236
- }
237
-
238
- wc_get_template( 'orders.php', array(
239
- 'start_date' => $start_date,
240
- 'end_date' => $end_date,
241
- 'vendor_products' => $vendor_products,
242
- 'order_summary' => $order_summary,
243
- 'datepicker' => $datepicker,
244
- 'providers' => $providers,
245
- 'provider_array' => $provider_array,
246
- 'can_view_orders' => $can_view_orders,
247
- ), 'wc-vendors/dashboard/', wcv_plugin_dir . 'templates/dashboard/' );
248
- do_action( 'wcvendors_after_dashboard' );
249
-
250
-
251
- if ( function_exists( 'wc_enqueue_js' ) ) {
252
- wc_enqueue_js( WCV_Vendor_dashboard::wc_st_js( $provider_array ) );
253
- } else {
254
- $woocommerce->add_inline_js( $js );
255
- }
256
-
257
- return ob_get_clean();
258
- }
259
-
260
-
261
- /**
262
- * [pv_recent_vendor_sales] shortcode
263
- *
264
- * @param array $atts
265
- *
266
- * @return unknown
267
- */
268
- public function display_vendor_settings( $atts )
269
- {
270
- global $woocommerce;
271
-
272
- if ( !$this->can_view_vendor_page() ) {
273
- return false;
274
- }
275
-
276
- extract( shortcode_atts( array(
277
- 'user_id' => get_current_user_id(),
278
- 'paypal_address' => true,
279
- 'shop_description' => true,
280
- ), $atts ) );
281
-
282
- $description = get_user_meta( $user_id, 'pv_shop_description', true );
283
- $seller_info = get_user_meta( $user_id, 'pv_seller_info', true );
284
- $has_html = get_user_meta( $user_id, 'pv_shop_html_enabled', true );
285
- $shop_page = WCV_Vendors::get_vendor_shop_page( wp_get_current_user()->user_login );
286
- $global_html = WC_Vendors::$pv_options->get_option( 'shop_html_enabled' );
287
-
288
- ob_start();
289
- wc_get_template( 'settings.php', array(
290
- 'description' => $description,
291
- 'global_html' => $global_html,
292
- 'has_html' => $has_html,
293
- 'paypal_address' => $paypal_address,
294
- 'seller_info' => $seller_info,
295
- 'shop_description' => $shop_description,
296
- 'shop_page' => $shop_page,
297
- 'user_id' => $user_id,
298
- ), 'wc-vendors/dashboard/settings/', wcv_plugin_dir . 'templates/dashboard/settings/' );
299
-
300
- return ob_get_clean();
301
- }
302
-
303
-
304
- /**
305
- *
306
- *
307
- * @return unknown
308
- */
309
- public static function can_view_vendor_page()
310
- {
311
- if ( !is_user_logged_in() ) {
312
-
313
- return false;
314
-
315
- } else if ( !WCV_Vendors::is_vendor( get_current_user_id() ) ) {
316
-
317
- wc_get_template( 'denied.php', array(), 'wc-vendors/dashboard/', wcv_plugin_dir . 'templates/dashboard/' );
318
-
319
- return false;
320
-
321
- }
322
-
323
- return true;
324
- }
325
-
326
-
327
- /**
328
- * Format products for easier displaying
329
- *
330
- * @param object $products
331
- *
332
- * @return array
333
- */
334
- public function format_product_details( $products )
335
- {
336
- if ( empty( $products ) ) return false;
337
-
338
- $orders_page = get_permalink( WC_Vendors::$pv_options->get_option( 'orders_page' ) );
339
- $default_commission = WC_Vendors::$pv_options->get_option( 'default_commission' );
340
- $total_qty = $total_cost = 0;
341
- $data = array(
342
- 'products' => array(),
343
- 'total_qty' => '',
344
- 'total_cost' => '',
345
- );
346
-
347
- foreach ( $products as $product )
348
- $ids[ ] = $product->ID;
349
-
350
- $orders = WCV_Queries::sum_orders_for_products( $ids, array( 'vendor_id' => get_current_user_id() ) );
351
-
352
- if ( $orders )
353
- foreach ( $orders as $order_item ) {
354
- if ( $order_item->qty < 1 ) continue;
355
-
356
- $commission_rate = WCV_Commission::get_commission_rate( $order_item->product_id );
357
- $_product = get_product( $order_item->product_id );
358
- $id = !empty($_product->parent->id) ? $_product->parent->id : $order_item->product_id;
359
-
360
- $data[ 'products' ][$id] = array(
361
- 'id' => $id,
362
- 'title' => $_product->get_title(),
363
- 'qty' => !empty($data[ 'products' ][$id]) ? $data[ 'products' ][$id]['qty'] + $order_item->qty : $order_item->qty,
364
- 'cost' => !empty($data[ 'products' ][$id]) ? $data[ 'products' ][$id]['cost'] + $order_item->line_total : $order_item->line_total,
365
- 'view_orders_url' => esc_url( add_query_arg( 'orders_for_product', $id, $orders_page ) ),
366
- 'commission_rate' => $commission_rate,
367
- );
368
-
369
- $total_qty += $order_item->qty;
370
- $total_cost += $order_item->line_total;
371
-
372
- }
373
-
374
- $data[ 'total_qty' ] = $total_qty;
375
- $data[ 'total_cost' ] = $total_cost;
376
-
377
- // Sort by product title
378
- if ( !empty( $data[ 'products' ] ) )
379
- usort( $data[ 'products' ], array( $this, 'sort_by_title' ) );
380
-
381
- return $data;
382
- }
383
-
384
-
385
- /**
386
- * Sort an array by 'title'
387
- *
388
- * @param array $a
389
- * @param array $b
390
- *
391
- * @return array
392
- */
393
- private function sort_by_title( array $a, array $b )
394
- {
395
- return strcasecmp( $a[ 'title' ], $b[ 'title' ] );
396
- }
397
-
398
- /**
399
- * Load the javascript for the WC Shipment Tracking form
400
- */
401
- public static function wc_st_js( $provider_array ) {
402
- $js = "
403
- jQuery(function() {
404
-
405
- var providers = jQuery.parseJSON( '" . json_encode( $provider_array ) . "' );
406
-
407
- jQuery('#tracking_number').prop('readonly',true);
408
- jQuery('#date_shipped').prop('readonly',true);
409
-
410
- function updatelink( tracking, provider ) {
411
-
412
- var postcode = '32';
413
- postcode = encodeURIComponent(postcode);
414
-
415
- link = providers[provider];
416
- link = link.replace('%251%24s', tracking);
417
- link = link.replace('%252%24s', postcode);
418
- link = decodeURIComponent(link);
419
- return link;
420
- }
421
-
422
- jQuery('.tracking_provider, #tracking_number').unbind().change(function(){
423
-
424
- var form = jQuery(this).parent().parent().attr('id');
425
-
426
- var tracking = jQuery('#' + form + ' input#tracking_number').val();
427
- var provider = jQuery('#' + form + ' #tracking_provider').val();
428
-
429
- if ( providers[ provider ]) {
430
- link = updatelink(tracking, provider);
431
- jQuery('#' + form + ' #tracking_number').prop('readonly',false);
432
- jQuery('#' + form + ' #date_shipped').prop('readonly',false);
433
- jQuery('#' + form + ' .custom_tracking_url_field, #' + form + ' .custom_tracking_provider_name_field').hide();
434
- } else {
435
- jQuery('#' + form + ' .custom_tracking_url_field, #' + form + ' .custom_tracking_provider_name_field').show();
436
- link = jQuery('#' + form + ' input#custom_tracking_link').val();
437
- }
438
-
439
- if (link) {
440
- jQuery('#' + form + ' p.preview_tracking_link a').attr('href', link);
441
- jQuery('#' + form + ' p.preview_tracking_link').show();
442
- } else {
443
- jQuery('#' + form + ' p.preview_tracking_link').hide();
444
- }
445
-
446
- });
447
-
448
- jQuery('#custom_tracking_provider_name').unbind().click(function(){
449
-
450
- var form = jQuery(this).parent().parent().attr('id');
451
-
452
- jQuery('#' + form + ' #tracking_number').prop('readonly',false);
453
- jQuery('#' + form + ' #date_shipped').prop('readonly',false);
454
-
455
- });
456
-
457
- });
458
- ";
459
-
460
- return $js;
461
- }
462
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/front/orders/class-export-csv.php DELETED
@@ -1,99 +0,0 @@
1
- <?php
2
-
3
- class WCV_Export_CSV
4
- {
5
-
6
- /**
7
- * Sort the data for CSV output first
8
- *
9
- * @param int $product_id
10
- * @param array $headers
11
- * @param array $body
12
- * @param array $items
13
- */
14
-
15
-
16
- public static function output_csv( $product_id, $headers, $body, $items )
17
- {
18
-
19
- $headers[ 'quantity' ] = __( 'Quantity', 'wcvendors' );
20
- $new_body = array();
21
-
22
- foreach ( $body as $i => $order ) {
23
-
24
- // Remove comments
25
- unset( $body[ $i ][ 'comments' ] );
26
-
27
- // Remove all numeric keys in each order (these are the meta values we are redoing into new lines)
28
- foreach ( $order as $key => $col ) {
29
- if ( is_int( $key ) ) unset( $order[ $key ] );
30
- }
31
-
32
- // New order row
33
- $new_row = $body[ $i ];
34
- // Remove order to redo
35
- unset( $body[ $i ] );
36
-
37
- foreach ( $items[ $i ][ 'items' ] as $item ) {
38
-
39
- $item_meta = new WC_Order_Item_Meta( $item[ 'item_meta' ] );
40
- $item_meta_options = $item_meta->get_formatted();
41
- // $item_meta = $item_meta->display( true, true );
42
-
43
- $new_row_with_meta = $new_row;
44
-
45
- if ( sizeof( $item_meta_options ) > 0 ) {
46
-
47
- $new_row_with_meta[] = $item[ 'qty' ];
48
-
49
- foreach ( $item_meta_options as $item_meta_option ) {
50
- if (!array_key_exists( $item_meta_option[ 'label' ], $headers ) ) $headers[$item_meta_option[ 'label' ]] = $item_meta_option[ 'label' ];
51
- $new_row_with_meta[] = $item_meta_option['value'];
52
- }
53
-
54
- } else {
55
- $new_row_with_meta[] = $item[ 'qty' ];
56
- }
57
-
58
- $new_body[] = $new_row_with_meta;
59
- }
60
- }
61
-
62
- $headers = apply_filters( 'wcvendors_csv_headers', $headers, $product_id, $items );
63
- $body = apply_filters( 'wcvendors_csv_body', $new_body, $product_id, $items );
64
-
65
- WCV_Export_CSV::download( $headers, $body, $product_id );
66
- }
67
-
68
-
69
- /**
70
- * Send the CSV to the browser for download
71
- *
72
- * @param array $headers
73
- * @param array $body
74
- * @param string $filename
75
- */
76
- public static function download( $headers, $body, $filename )
77
- {
78
- // Clear browser output before this point
79
- if (ob_get_contents()) ob_end_clean();
80
-
81
- // Output headers so that the file is downloaded rather than displayed
82
- header( 'Content-Type: text/csv; charset=utf-8' );
83
- header( 'Content-Disposition: attachment; filename=orders_for_' . $filename . '.csv' );
84
-
85
- // Create a file pointer connected to the output stream
86
- $output = fopen( 'php://output', 'w' );
87
-
88
- // Output the column headings
89
- fputcsv( $output, $headers );
90
-
91
- // Body
92
- foreach ( $body as $data )
93
- fputcsv( $output, $data );
94
-
95
- die();
96
- }
97
-
98
-
99
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/front/orders/class-orders.php DELETED
@@ -1,259 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * My account views
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package ProductVendor
8
- */
9
-
10
-
11
- class WCV_Orders
12
- {
13
-
14
-
15
- /**
16
- * __construct()
17
- */
18
- function __construct()
19
- {
20
- $this->can_view_orders = WC_Vendors::$pv_options->get_option( 'can_show_orders' );
21
- $this->can_export_csv = WC_Vendors::$pv_options->get_option( 'can_export_csv' );
22
- $this->can_view_emails = WC_Vendors::$pv_options->get_option( 'can_view_order_emails' );
23
-
24
- add_action( 'template_redirect', array( $this, 'check_access' ) );
25
- add_action( 'wp', array( $this, 'display_shortcodes' ) );
26
- }
27
-
28
-
29
- /**
30
- *
31
- */
32
- public function check_access()
33
- {
34
- if ( is_page( WC_Vendors::$pv_options->get_option( 'orders_page' ) ) && !is_user_logged_in() ) {
35
- wp_redirect( get_permalink( woocommerce_get_page_id( 'myaccount' ) ), 303 );
36
- exit;
37
- }
38
- }
39
-
40
-
41
- /**
42
- *
43
- */
44
- public function display_shortcodes()
45
- {
46
- if ( is_page( WC_Vendors::$pv_options->get_option( 'orders_page' ) ) && $this->can_view_orders ) {
47
-
48
- wp_enqueue_script( 'jquery' );
49
-
50
- $this->product_id = !empty( $_GET[ 'orders_for_product' ] ) ? (int) $_GET[ 'orders_for_product' ] : false;
51
- $products = array( $this->product_id );
52
-
53
- $_product = get_product( $this->product_id );
54
- $children = $_product->get_children();
55
- if ( !empty( $children ) ) {
56
- $products = array_merge($products, $children);
57
- $products = array_unique($products);
58
- }
59
-
60
- $this->orders = WCV_Queries::get_orders_for_products( $products, array( 'vendor_id' => get_current_user_id() ) );
61
-
62
- add_action( 'init', array( $this, 'verify_order_access' ) );
63
- add_shortcode( 'wcv_orders', array( $this, 'display_product_orders' ) );
64
-
65
- if ( $this->can_export_csv && !empty( $_POST[ 'export_orders' ] ) ) {
66
- $this->download_csv();
67
- }
68
-
69
- }
70
-
71
- }
72
-
73
-
74
- /**
75
- *
76
- *
77
- * @return unknown
78
- */
79
- public function download_csv()
80
- {
81
- if ( !$this->orders ) return false;
82
-
83
- extract( WCV_Orders::format_order_details( $this->orders, $this->product_id ) );
84
- $headers = WCV_Orders::get_headers();
85
-
86
- // Export the CSV
87
- require_once wcv_plugin_dir . 'classes/front/orders/class-export-csv.php';
88
- WCV_Export_CSV::output_csv( $this->product_id, $headers, $body, $items );
89
- }
90
-
91
-
92
- /**
93
- * Use views to display the Orders page
94
- *
95
- * @return html
96
- */
97
- public function display_product_orders()
98
- {
99
- if ( !WCV_Vendors::is_vendor( get_current_user_id() ) ) {
100
- ob_start();
101
- wc_get_template( 'denied.php', array(), 'wc-vendors/dashboard/', wcv_plugin_dir . 'templates/dashboard/' );
102
-
103
- return ob_get_clean();
104
- }
105
-
106
- if ( empty( $_GET[ 'orders_for_product' ] ) ) {
107
- return __( 'You haven\'t selected a product\'s orders to view! Please go back to the Vendor Dashboard and click Show Orders on the product you\'d like to view.', 'wcvendors' );
108
- }
109
-
110
- if ( !$this->orders ) {
111
- return __( 'No orders.', 'wcvendors' );;
112
- }
113
-
114
- if ( !empty( $_POST[ 'submit_comment' ] ) ) {
115
- require_once wcv_plugin_dir . 'classes/front/orders/class-submit-comment.php';
116
- WCV_Submit_Comment::new_comment( $this->orders );
117
- }
118
-
119
- if ( isset( $_POST[ 'mark_shipped' ] ) ) {
120
- $order_id = (int) $_POST[ 'order_id' ];
121
- $product_id = (int) $_POST[ 'product_id' ];
122
- exit;
123
- }
124
-
125
- $headers = WCV_Orders::get_headers();
126
- $all = WCV_Orders::format_order_details( $this->orders, $this->product_id );
127
-
128
- wp_enqueue_style( 'pv_frontend_style', wcv_assets_url . 'css/wcv-frontend.css' );
129
- wp_enqueue_script( 'pv_frontend_script', wcv_assets_url . 'js/front-orders.js' );
130
-
131
- $providers = array();
132
- $provider_array = array();
133
-
134
- // WC Shipment Tracking Providers
135
- if ( class_exists( 'WC_Shipment_Tracking' ) ) {
136
- $WC_Shipment_Tracking = new WC_Shipment_Tracking();
137
- $providers = (method_exists($WC_Shipment_Tracking, 'get_providers')) ? $WC_Shipment_Tracking->get_providers() : $WC_Shipment_Tracking->providers;
138
- $provider_array = array();
139
- foreach ( $providers as $all_providers ) {
140
- foreach ( $all_providers as $provider => $format ) {
141
- $provider_array[sanitize_title( $provider )] = urlencode( $format );
142
- }
143
- }
144
- }
145
-
146
- ob_start();
147
- // Show the Export CSV button
148
- if ( $this->can_export_csv ) {
149
- wc_get_template( 'csv-export.php', array(), 'wc-vendors/orders/', wcv_plugin_dir . 'templates/orders/' );
150
- }
151
-
152
- wc_get_template( 'orders.php', array(
153
- 'headers' => $headers,
154
- 'body' => $all[ 'body' ],
155
- 'items' => $all[ 'items' ],
156
- 'product_id' => $all[ 'product_id' ],
157
- 'providers' => $providers,
158
- 'provider_array' => $provider_array,
159
- ), 'wc-vendors/orders/', wcv_plugin_dir . 'templates/orders/' );
160
-
161
- return ob_get_clean();
162
- }
163
-
164
-
165
- /**
166
- * Headers for the Orders page
167
- *
168
- * @return array
169
- */
170
- public function get_headers()
171
- {
172
- $headers = array(
173
- 'order' => __( 'Order', 'wcvendors' ),
174
- 'product' => __( 'Product Title', 'wcvendors' ),
175
- 'name' => __( 'Full name', 'wcvendors' ),
176
- 'address' => __( 'Address', 'wcvendors' ),
177
- 'city' => __( 'City', 'wcvendors' ),
178
- 'state' => __( 'State', 'wcvendors' ),
179
- 'zip' => __( 'Zip', 'wcvendors' ),
180
- 'email' => __( 'Email address', 'wcvendors' ),
181
- 'date' => __( 'Date', 'wcvendors' ),
182
- );
183
-
184
- if ( !$this->can_view_emails ) {
185
- unset( $headers[ 'email' ] );
186
- }
187
-
188
- return $headers;
189
- }
190
-
191
-
192
- /**
193
- * Format the orders with just the products we want
194
- *
195
- * @param object $orders
196
- * @param int $product_id
197
- *
198
- * @return array
199
- */
200
- public function format_order_details( $orders, $product_id )
201
- {
202
- $body = $items = array();
203
- $product = get_product( $product_id )->get_title();
204
-
205
- foreach ( $orders as $i => $order ) {
206
- $i = $order->order_id;
207
- $order = new WC_Order ( $i );
208
- $body[ $i ] = array(
209
- 'order_number' => $order->get_order_number(),
210
- 'product' => $product,
211
- 'name' => $order->shipping_first_name . ' ' . $order->shipping_last_name,
212
- 'address' => $order->shipping_address_1,
213
- 'city' => $order->shipping_city,
214
- 'state' => $order->shipping_state,
215
- 'zip' => $order->shipping_postcode,
216
- 'email' => $order->billing_email,
217
- 'date' => $order->order_date,
218
- 'comments' => wptexturize( $order->customer_note ),
219
- );
220
-
221
- if ( !$this->can_view_emails ) {
222
- unset( $body[ $i ][ 'email' ] );
223
- }
224
-
225
- $items[ $i ][ 'total_qty' ] = 0;
226
- foreach ( $order->get_items() as $line_id => $item ) {
227
-
228
- if ( $item[ 'product_id' ] != $product_id && $item[ 'variation_id' ] != $product_id ) continue;
229
-
230
- $items[ $i ][ 'items' ][ ] = $item;
231
- $items[ $i ][ 'total_qty' ] += $item[ 'qty' ];
232
- }
233
-
234
- }
235
-
236
- return array( 'body' => $body, 'items' => $items, 'product_id' => $product_id );
237
- }
238
-
239
-
240
- /**
241
- * Verify the current user can view orders for a product
242
- *
243
- * @param int $product_id
244
- */
245
- public function verify_order_access()
246
- {
247
- if ( !is_user_logged_in() || empty( $this->product_id ) ) {
248
- wp_safe_redirect( apply_filters( 'woocommerce_get_myaccount_page_id', get_permalink( woocommerce_get_page_id( 'myaccount' ) ) ) );
249
- exit;
250
- }
251
-
252
- $product = get_post( $this->product_id );
253
- if ( empty ( $product ) || $product->post_type != 'product' || get_current_user_id() != $product->post_author ) {
254
- wp_safe_redirect( apply_filters( 'woocommerce_get_myaccount_page_id', get_permalink( woocommerce_get_page_id( 'myaccount' ) ) ) );
255
- exit;
256
- }
257
- }
258
-
259
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/front/orders/class-submit-comment.php DELETED
@@ -1,81 +0,0 @@
1
- <?php
2
-
3
- class WCV_Submit_Comment
4
- {
5
-
6
- /**
7
- * Submit a comment for an order
8
- *
9
- * @param object $orders
10
- *
11
- * @return unknown
12
- */
13
- public static function new_comment( $orders )
14
- {
15
- global $woocommerce;
16
-
17
- $user = wp_get_current_user();
18
- $user = $user->ID;
19
-
20
- // Security
21
- if ( !wp_verify_nonce( $_POST[ '_wpnonce' ], 'add-comment' ) ) return false;
22
-
23
- // Check if this product belongs to the vendor submitting the comment
24
- $product_id = (int) $_POST[ 'product_id' ];
25
- $author = WCV_Vendors::get_vendor_from_product( $product_id );
26
- if ( $author != $user ) return false;
27
-
28
- // Find the order belonging to this comment
29
- foreach ( $orders as $order ) {
30
- if ( $order->order_id == $_POST[ 'order_id' ] ) {
31
- $found_order = $order;
32
- break;
33
- }
34
- }
35
-
36
- // No order was found
37
- if ( empty( $found_order ) ) return false;
38
-
39
- // Don't submit empty comments
40
- if ( empty( $_POST[ 'comment_text' ] ) ) {
41
- wc_add_notice( __( 'You\'ve left the comment field empty!', 'wcvendors' ), 'error' );
42
-
43
- return false;
44
- }
45
-
46
- // Only submit if the order has the product belonging to this vendor
47
- $found_order = new WC_Order ( $found_order->order_id );
48
- $valid_order = false;
49
- foreach ( $found_order->get_items() as $item ) {
50
- if ( $item[ 'product_id' ] == $product_id ) {
51
- $valid_order = true;
52
- break;
53
- }
54
- }
55
-
56
- if ( $valid_order ) {
57
- $comment = esc_textarea( $_POST[ 'comment_text' ] );
58
-
59
- add_filter( 'woocommerce_new_order_note_data', array( __CLASS__, 'filter_comment' ), 10, 2 );
60
- $found_order->add_order_note( $comment, 1 );
61
- remove_filter( 'woocommerce_new_order_note_data', array( __CLASS__, 'filter_comment' ), 10, 2 );
62
-
63
- wc_add_notice( __( 'Success. The customer has been notified of your comment.', 'wcvendors' ), 'success' );
64
- }
65
-
66
- }
67
-
68
- public static function filter_comment( $commentdata, $order )
69
- {
70
- $user_id = get_current_user_id();
71
-
72
- $commentdata[ 'user_id' ] = $user_id;
73
- $commentdata[ 'comment_author' ] = WCV_Vendors::get_vendor_shop_name( $user_id );
74
- $commentdata[ 'comment_author_url' ] = WCV_Vendors::get_vendor_shop_page( $user_id );
75
- $commentdata[ 'comment_author_email' ] = wp_get_current_user()->user_email;
76
-
77
- return $commentdata;
78
- }
79
-
80
-
81
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/front/signup/class-vendor-signup.php DELETED
@@ -1,148 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Signup form for applying as a vendor
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package ProductVendor
8
- */
9
-
10
-
11
- class WCV_Vendor_Signup
12
- {
13
-
14
-
15
- /**
16
- * __construct()
17
- */
18
- function __construct()
19
- {
20
- if ( !WC_Vendors::$pv_options->get_option( 'show_vendor_registration' ) ) return;
21
-
22
- $this->terms_page = WC_Vendors::$pv_options->get_option( 'terms_to_apply_page' );
23
-
24
- add_action( 'register_form', array( $this, 'vendor_option' ) );
25
- add_action( 'woocommerce_created_customer', array( $this, 'save_pending' ), 10, 2 );
26
- // add_action( 'register_post', array( $this, 'apply_form' ), 10 );
27
- add_action( 'template_redirect', array( $this, 'apply_form_dashboard' ), 10 );
28
- add_action( 'woocommerce_register_post', array( $this, 'validate_vendor_registration' ), 10, 3 );
29
- }
30
-
31
-
32
- /**
33
- *
34
- */
35
- public function vendor_option()
36
- {
37
- ?>
38
- <div class="clear"></div>
39
-
40
- <p class="form-row">
41
- <input class="input-checkbox"
42
- id="apply_for_vendor" <?php checked( isset( $_POST[ 'apply_for_vendor' ] ), true ) ?> type="checkbox"
43
- name="apply_for_vendor" value="1"/>
44
- <label for="apply_for_vendor"
45
- class="checkbox"><?php echo apply_filters('wcvendors_vendor_registration_checkbox', __( 'Apply to become a vendor? ', 'wcvendors' )); ?></label>
46
- </p>
47
-
48
- <?php if ( $this->terms_page ) { ?>
49
- <p class="form-row agree-to-terms-container" style="display:none">
50
- <input class="input-checkbox"
51
- id="agree_to_terms" <?php checked( isset( $_POST[ 'agree_to_terms' ] ), true ) ?> type="checkbox"
52
- name="agree_to_terms" value="1"/>
53
- <label for="agree_to_terms"
54
- class="checkbox"><?php printf( __( 'I have read and accepted the <a target="top" href="%s">terms and conditions</a>', 'wcvendors' ), get_permalink( $this->terms_page ) ); ?></label>
55
- </p>
56
-
57
- <script type="text/javascript">
58
- jQuery(function () {
59
- if (jQuery('#apply_for_vendor').is(':checked')) {
60
- jQuery('.agree-to-terms-container').show();
61
- }
62
-
63
- jQuery('#apply_for_vendor').on('click', function () {
64
- jQuery('.agree-to-terms-container').slideToggle();
65
- });
66
- })
67
- </script>
68
- <?php } ?>
69
-
70
- <div class="clear"></div>
71
- <?php
72
- }
73
-
74
-
75
- /**
76
- *
77
- *
78
- * @param unknown $user_id
79
- */
80
- public function save_pending( $user_id )
81
- {
82
-
83
- if ( isset( $_POST[ 'apply_for_vendor' ] ) ) {
84
-
85
- wc_clear_notices();
86
-
87
- if ( user_can( $user_id, 'manage_options' ) ) {
88
- wc_add_notice( __( 'Application denied. You are an administrator.', 'wcvendors' ), 'error' );
89
- } else {
90
- wc_add_notice( __( 'Your application has been submitted.', 'wcvendors' ), 'notice' );
91
-
92
- $manual = WC_Vendors::$pv_options->get_option( 'manual_vendor_registration' );
93
- $role = apply_filters( 'wcvendors_pending_role', ( $manual ? 'pending_vendor' : 'vendor' ) );
94
-
95
- $wp_user_object = new WP_User( $user_id );
96
- $wp_user_object->set_role( $role );
97
-
98
- do_action( 'wcvendors_application_submited', $user_id );
99
-
100
- add_filter( 'woocommerce_registration_redirect', array( $this, 'redirect_to_vendor_dash' ) );
101
- }
102
- }
103
- }
104
-
105
- public function redirect_to_vendor_dash( $redirect )
106
- {
107
- $vendor_dashboard_page = WC_Vendors::$pv_options->get_option( 'vendor_dashboard_page' );
108
-
109
- return apply_filters( 'wcvendors_signup_redirect', get_permalink( $vendor_dashboard_page ) );
110
- }
111
-
112
-
113
- /**
114
- *
115
- *
116
- * @return unknown
117
- */
118
- public function apply_form_dashboard()
119
- {
120
- if ( !isset( $_POST[ 'apply_for_vendor' ] ) ) return false;
121
-
122
- $vendor_dashboard_page = WC_Vendors::$pv_options->get_option( 'vendor_dashboard_page' );
123
- $page_id = get_queried_object_id();
124
-
125
- if ( $page_id == $vendor_dashboard_page ) {
126
- if ( $this->terms_page ) {
127
- if ( isset( $_POST[ 'agree_to_terms' ] ) ) {
128
- self::save_pending( get_current_user_id() );
129
- } else {
130
- wc_add_notice( __( 'You must accept the terms and conditions to become a vendor.', 'wcvendors' ), 'error' );
131
- }
132
- } else {
133
- self::save_pending( get_current_user_id() );
134
- }
135
- }
136
- }
137
-
138
- public function validate_vendor_registration( $username, $email, $validation_errors ) {
139
-
140
- if ( isset( $_POST[ 'apply_for_vendor' ] ) ) {
141
- if ( $this->terms_page && !isset( $_POST[ 'agree_to_terms' ] ) ) {
142
- $validation_errors->add( 'agree_to_terms_error', __( 'You must accept the terms and conditions to become a vendor.', 'wcvendors' ) );
143
- }
144
- }
145
- }
146
-
147
-
148
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/assets/icons/index.php DELETED
File without changes
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/assets/icons/paypalap.png DELETED
Binary file
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/assets/index.php DELETED
File without changes
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/ChangeLog.txt DELETED
@@ -1,33 +0,0 @@
1
-
2
- Version 1.2.95 - September 28, 2012
3
-
4
- - Sender details (eg:email,phno) serialization bug fixed(https://github.com/paypal/SDKs/issues/30)
5
- - Bug fixed for 'PPLoggingManager.php' to pickup configuration entries.(https://github.com/paypal/SDKs/issues/28)
6
- - Updated SDK sample
7
-
8
- --------------------------------------------------------------------------------------------------
9
-
10
-
11
- Version 1.1.93 - August 13, 2012
12
-
13
- - SDK refreshed to Release 1.8.1. Please refer https://www.x.com/developers/paypal/documentation-tools/release-notes#AdaptivePaymentsAPI
14
- - SDK Core - Deserialization Logic Change
15
- --------------------------------------------------------------------------------------------------
16
-
17
-
18
- Version 1.0.92 - July 30, 2012
19
-
20
- - Stable release
21
- -------------------------------------------------------------------------------------------------
22
- Version 0.7.92 - July 17, 2012
23
- - wsdl update version 0.7.92
24
- ------------------------------------------
25
-
26
- Version 0.6.88 - Apr 17, 2012
27
- ----------------------------------------
28
- - Fix to get SDK working with Permissions API token
29
- - wsdl update version 88.0
30
-
31
- Version 0.6.86 - Feb 27, 2012
32
- ----------------------------------------
33
- - Initial release
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/LICENSE.txt DELETED
@@ -1,41 +0,0 @@
1
- PAYPAL, INC.
2
-
3
- SDK LICENSE
4
-
5
- NOTICE TO USER: PayPal, Inc. is providing the Software and Documentation for use under the terms of this Agreement. Any use, reproduction, modification or distribution of the Software or Documentation, or any derivatives or portions hereof, constitutes your acceptance of this Agreement.
6
-
7
- As used in this Agreement, "PayPal" means PayPal, Inc. "Software" means the software code accompanying this agreement. "Documentation" means the documents, specifications and all other items accompanying this Agreement other than the Software.
8
-
9
- 1. LICENSE GRANT Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free license to use, reproduce, prepare derivative works from, publicly display, publicly perform, distribute and sublicense the Software for any purpose, provided the copyright notice below appears in a conspicuous location within the source code of the distributed Software and this license is distributed in the supporting documentation of the Software you distribute. Furthermore, you must comply with all third party licenses in order to use the third party software contained in the Software.
10
-
11
- Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free license to use, reproduce, publicly display, publicly perform, distribute and sublicense the Documentation for any purpose. You may not modify the Documentation.
12
-
13
- No title to the intellectual property in the Software or Documentation is transferred to you under the terms of this Agreement. You do not acquire any rights to the Software or the Documentation except as expressly set forth in this Agreement.
14
-
15
- If you choose to distribute the Software in a commercial product, you do so with the understanding that you agree to defend, indemnify and hold harmless PayPal and its suppliers against any losses, damages and costs arising from the claims, lawsuits or other legal actions arising out of such distribution. You may distribute the Software in object code form under your own license, provided that your license agreement:
16
-
17
- (a) complies with the terms and conditions of this license agreement;
18
-
19
- (b) effectively disclaims all warranties and conditions, express or implied, on behalf of PayPal;
20
-
21
- (c) effectively excludes all liability for damages on behalf of PayPal;
22
-
23
- (d) states that any provisions that differ from this Agreement are offered by you alone and not PayPal; and
24
-
25
- (e) states that the Software is available from you or PayPal and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
26
-
27
- 2. DISCLAIMER OF WARRANTY
28
- PAYPAL LICENSES THE SOFTWARE AND DOCUMENTATION TO YOU ONLY ON AN "AS IS" BASIS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. PAYPAL MAKES NO WARRANTY THAT THE SOFTWARE OR DOCUMENTATION WILL BE ERROR-FREE. Each user of the Software or Documentation is solely responsible for determining the appropriateness of using and distributing the Software and Documentation and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs, or equipment, and unavailability or interruption of operations. Use of the Software and Documentation is made with the understanding that PayPal will not provide you with any technical or customer support or maintenance. Some states or jurisdictions do not allow the exclusion of implied warranties or limitations on how long an implied warranty may last, so the above limitations may not apply to you. To the extent permissible, any implied warranties are limited to ninety (90) days.
29
-
30
-
31
- 3. LIMITATION OF LIABILITY
32
- PAYPAL AND ITS SUPPLIERS SHALL NOT BE LIABLE FOR LOSS OR DAMAGE ARISING OUT OF THIS AGREEMENT OR FROM THE USE OF THE SOFTWARE OR DOCUMENTATION. IN NO EVENT WILL PAYPAL OR ITS SUPPLIERS BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES INCLUDING LOST PROFITS, LOST SAVINGS, COSTS, FEES, OR EXPENSES OF ANY KIND ARISING OUT OF ANY PROVISION OF THIS AGREEMENT OR THE USE OR THE INABILITY TO USE THE SOFTWARE OR DOCUMENTATION, HOWEVER CAUSED AND UNDER ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. PAYPAL'S AGGREGATE LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION WITH THIS AGREEMENT SHALL BE LIMITED TO THE AMOUNT PAID BY YOU FOR THE SOFTWARE AND DOCUMENTATION.
33
-
34
- 4. TRADEMARK USAGE
35
- PayPal is a trademark PayPal, Inc. in the United States and other countries. Such trademarks may not be used to endorse or promote any product unless expressly permitted under separate agreement with PayPal.
36
-
37
- 5. TERM
38
- Your rights under this Agreement shall terminate if you fail to comply with any of the material terms or conditions of this Agreement and do not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all your rights under this Agreement terminate, you agree to cease use and distribution of the Software and Documentation as soon as reasonably practicable.
39
-
40
- 6. GOVERNING LAW AND JURISDICTION. This Agreement is governed by the statutes and laws of the State of California, without regard to the conflicts of law principles thereof. If any part of this Agreement is found void and unenforceable, it will not affect the validity of the balance of the Agreement, which shall remain valid and enforceable according to its terms. Any dispute arising out of or related to this Agreement shall be brought in the courts of Santa Clara County, California, USA.
41
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/README.md DELETED
@@ -1,57 +0,0 @@
1
-
2
- PayPal PHP Adaptive Payments SDK
3
- ===============================
4
-
5
- Prerequisites
6
- -------------
7
-
8
- PayPal's PHP Adaptive Payments SDK requires
9
-
10
- * PHP 5.2 and above with curl extension enabled
11
-
12
-
13
- Using the SDK
14
- -------------
15
-
16
- To use the SDK,
17
-
18
- * Copy the config and lib folders into your project.
19
- * Make sure that the lib folder in your project is available in PHP's include path
20
- * Include the services\AdaptivePayments\AdaptivePaymentsService.php file in your code.
21
- * Create a service wrapper object
22
- * Create a request object as per your project's needs. All the API request and response classes are available in services\AdaptivePayments\AdaptivePaymentsService.php
23
- * Invoke the appropriate method on the request object.
24
-
25
- For example,
26
-
27
- require_once('services/AdaptivePayments/AdaptivePaymentsService.php');
28
- require_once('PPLoggingManager.php');
29
-
30
- $payRequest = new PayRequest($requestEnvelope, $_POST['actionType'], $_POST['cancelUrl'], $_POST['currencyCode'], $receiverList, $_POST['returnUrl']);
31
- // Add optional params
32
- if($_POST["feesPayer"] != "") {
33
- $payRequest->feesPayer = $_POST["feesPayer"];
34
- }
35
- ......
36
-
37
- $service = new AdaptivePaymentsService();
38
- $response = $service->Pay($payRequest);
39
-
40
- $ack = strtoupper($response->responseEnvelope->ack);
41
-
42
- if($ack == 'SUCCESS') {
43
- // Success
44
- }
45
-
46
-
47
-
48
- SDK Configuration
49
- -----------------
50
-
51
- replace the API credential in config/sdk_config.ini . You can use the configuration file to configure
52
-
53
- * (Multiple) API account credentials.
54
- * Service endpoint and other HTTP connection parameters
55
-
56
-
57
- Please refer to the sample config file provided with this bundle.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/build.xml DELETED
@@ -1,24 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project name="PayPal_PHP_SDK" default="build">
3
-
4
-
5
- <condition property="PHPUNIT_PATH" value="phpunit.bat" else="phpunit">
6
- <os family="windows"/>
7
- </condition>
8
-
9
- <target name="clean">
10
- <delete dir="${basedir}/build"/>
11
- </target>
12
-
13
-
14
- <target name="phpunit">
15
- <mkdir dir="tests/reports/"/>
16
- <exec dir="${basedir}" executable="${PHPUNIT_PATH}" failonerror="true">
17
- <arg
18
- line="--testdox --include-path lib --log-junit tests\reports\phpunit.xml tests"/>
19
- </exec>
20
- </target>
21
-
22
-
23
- <target name="build" depends="clean, phpunit"/>
24
- </project>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/config/cert_key.pem DELETED
@@ -1,31 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIICXgIBAAKBgQCaGw566OIaeIsrp2tyzfwUtwapk2aPgL9N8oOoPmTmA/bqhqF8
3
- 2X43EB2zZF1HY35kPp3L5rZSjqraEZz5j7W4DkXMS286wLnaoh02sVWbbXlLcZ/v
4
- sAQzNgi1s2raOWonkcbAIAyhjVoGQjpuCn7y9YNgQfpZkgrh/R5ig8obQwIDAQAB
5
- AoGBAI/YrZ2BAHzhBFdNQXi6WZEkfu2PD27oKKojs006YIhsLvEflmGpyqyvOGoZ
6
- RxC6CGKeKEEKLCnHzicbxcEVqfKfOxrXkym3ldqBaYubL1OU62biDRtZZdIpG3TE
7
- gBDRtU8gPQv1ykqY9KqdeORy8vu0lW9Zx9/4ccW126HLt/kxAkEAzF9NKltIc+gu
8
- S79lzerE8qngiUSc/ccb1ssLj4v4Lf90HNeJ4oSQEikuN32GjPVrUpQYpC4fjcET
9
- KmqE7k1V3wJBAMEJB3VRToeTQKhWet8JQPkcfES3B+l7NCauUcysSI5XZ9kVflLu
10
- c5vzznMooRpcNtjJwDmkcnW0lhIQH/DKvx0CQQCWHJXoO54vDGYc2xuisQMyHha/
11
- nHcXbA0FqqP2Lt/+oTifCq3LhITx4e+BcKDInmbTA9ZJmVsx2pQCPrUe+AzPAkA/
12
- OU7ZDPVUkFU4DYMW8/f033CQLQaJYVH2bVfbWn41KMmZn2GNlg4FgTgYHbGOaa+J
13
- F6M+/e6DQM96QQ/FFRK9AkEApx1r0di+W2ibrTANnk6QjQbva9JyOztI+Avg86X5
14
- swB44tEsRImOTNsE6nfE/215AxjgI1vdn6uU4P8GIKfxnw==
15
- -----END RSA PRIVATE KEY-----
16
- -----BEGIN CERTIFICATE-----
17
- MIICiDCCAfGgAwIBAgIDD/WUMA0GCSqGSIb3DQEBBQUAMIGfMQswCQYDVQQGEwJV
18
- UzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2UxFTATBgNV
19
- BAoTDFBheVBhbCwgSW5jLjEWMBQGA1UECxQNc2FuZGJveF9jZXJ0czEbMBkGA1UE
20
- AxQSc2FuZGJveF9jYW1lcmNoYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwu
21
- Y29tMB4XDTExMDUwMjA1MDQ0NFoXDTIxMDQyOTA1MDQ0NFowYzElMCMGA1UEAxQc
22
- Y2VydHVzZXJfYml6X2FwaTEucGF5cGFsLmNvbTEPMA0GA1UEChMGQm9uem9wMQ8w
23
- DQYDVQQHEwZBdXN0aW4xCzAJBgNVBAgTAlRYMQswCQYDVQQGEwJVUzCBnzANBgkq
24
- hkiG9w0BAQEFAAOBjQAwgYkCgYEAmhsOeujiGniLK6drcs38FLcGqZNmj4C/TfKD
25
- qD5k5gP26oahfNl+NxAds2RdR2N+ZD6dy+a2Uo6q2hGc+Y+1uA5FzEtvOsC52qId
26
- NrFVm215S3Gf77AEMzYItbNq2jlqJ5HGwCAMoY1aBkI6bgp+8vWDYEH6WZIK4f0e
27
- YoPKG0MCAwEAAaMNMAswCQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOBgQBj6xWw
28
- AumLzSodCWyocPcyKSooNa7wgJKzaVrf0Kxz2QBesKpsfe9UN3Dj04016FIUbkRI
29
- 4qLJIkKHyeQRU9hvJ78tU7OeykDEVqlHAEE/Z4c5EIs6l9x60VqOpAjnaqX/9Jty
30
- jXhqpINjolTh6D5jq8y4FX5krKqIYBCNDHM+cQ==
31
- -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/config/sdk_config.ini DELETED
@@ -1,26 +0,0 @@
1
- ;Account credentials
2
- [Account]
3
- acct1.UserName = jb-us-seller_api1.paypal.com
4
- acct1.Password = WX4WTU3S8MY44S7F
5
- acct1.Signature = AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy
6
- acct1.AppId = APP-80W284485P519543T
7
-
8
- ;Connection Information
9
- [Http]
10
- http.ConnectionTimeOut = 30
11
- http.Retry = 5
12
- ;http.Proxy
13
-
14
- ;Service Configuration
15
- [Service]
16
- ; NOTE: Do not change the service binding configuration.
17
- service.Binding = NV
18
- service.EndPoint = "https://svcs.sandbox.paypal.com/"
19
- service.RedirectURL = "https://www.sandbox.paypal.com/webscr&cmd="
20
- service.DevCentralURL = "https://developer.paypal.com"
21
-
22
- ;Logging Information
23
- [Log]
24
- log.FileName = PayPal.log
25
- log.LogLevel = INFO
26
- log.LogEnabled = true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/IPPCredential.php DELETED
@@ -1,53 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Base class that represents API credentials
5
- */
6
- abstract class IPPCredential
7
- {
8
- /**
9
- * Application Id that uniquely identifies the application
10
- * The application Id is issued by PayPal.
11
- * Test application Ids are available for the sandbox environment
12
- * @var string
13
- */
14
- protected $applicationId;
15
-
16
- /**
17
- * API username
18
- * @var string
19
- */
20
- protected $userName;
21
-
22
- /**
23
- * API password
24
- * @var string
25
- */
26
- protected $password;
27
-
28
- protected abstract function validate();
29
-
30
- public function __construct( $userName, $password, $applicationId )
31
- {
32
- $this->userName = $userName;
33
- $this->password = $password;
34
- $this->applicationId = $applicationId;
35
- }
36
-
37
- public function getApplicationId()
38
- {
39
- return $this->applicationId;
40
- }
41
-
42
- public function getUserName()
43
- {
44
- return $this->userName;
45
- }
46
-
47
- public function getPassword()
48
- {
49
- return $this->password;
50
- }
51
- }
52
-
53
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPAPIService.php DELETED
@@ -1,62 +0,0 @@
1
- <?php
2
- require_once 'PPCredentialManager.php';
3
- require_once 'PPConnectionManager.php';
4
- require_once 'PPObjectTransformer.php';
5
- require_once 'PPLoggingManager.php';
6
- require_once 'PPUtils.php';
7
- require_once 'PPAuthenticationManager.php';
8
-
9
- class PPAPIService
10
- {
11
- public $endpoint;
12
- public $serviceName;
13
- private $logger;
14
-
15
- public function __construct( $serviceName = "" )
16
- {
17
- $this->serviceName = $serviceName;
18
- $config = PPConfigManager::getInstance();
19
- $this->endpoint = $config->get( 'service.EndPoint' );
20
- $this->logger = new PPLoggingManager( __CLASS__ );
21
- }
22
-
23
- public function setServiceName( $serviceName )
24
- {
25
- $this->serviceName = $serviceName;
26
- }
27
-
28
-
29
- public function makeRequest( $apiMethod, $params, $apiUsername = null, $accessToken = null, $tokenSecret = null )
30
- {
31
-
32
- $authentication = new PPAuthenticationManager();
33
- $connectionMgr = PPConnectionManager::getInstance();
34
- $connection = $connectionMgr->getConnection();
35
-
36
- $credMgr = PPCredentialManager::getInstance();
37
- // $apiUsernam is optional, if null the default account in congif file is taken
38
- $apIPPCredential = $credMgr->getCredentialObject( $apiUsername );
39
- $config = PPConfigManager::getInstance();
40
- if ( $config->get( 'service.Binding' ) == 'SOAP' ) {
41
- $url = $this->endpoint;
42
- if ( isset( $accessToken ) && isset( $tokenSecret ) ) {
43
- $headers = $authentication->getPayPalHeaders( $apIPPCredential, $connection, $accessToken, $tokenSecret, $url );
44
- } else {
45
- $headers = null;
46
- }
47
- $params = $authentication->appendSoapHeader( $params, $apIPPCredential, $connection, $accessToken, $tokenSecret, $url );
48
- } else {
49
- $url = $this->endpoint . $this->serviceName . '/' . $apiMethod;
50
- $headers = $authentication->getPayPalHeaders( $apIPPCredential, $connection, $accessToken, $tokenSecret, $url );
51
- }
52
-
53
-
54
- $this->logger->info( "Request: $params" );
55
- $response = $connection->execute( $url, $params, $headers );
56
- $this->logger->info( "Response: $response" );
57
-
58
- return $response;
59
- }
60
-
61
-
62
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPAuthenticationManager.php DELETED
@@ -1,91 +0,0 @@
1
- <?php
2
- require_once 'IPPCredential.php';
3
- require_once 'PPConfigManager.php';
4
- require_once 'PPSignatureCredential.php';
5
- require_once 'PPCertificateCredential.php';
6
- require_once 'exceptions/PPInvalidCredentialException.php';
7
- require_once 'auth/PPAuth.php';
8
-
9
- class PPAuthenticationManager
10
- {
11
- public function getPayPalHeaders( $apiCred, $connection, $accessToken = null, $tokenSecret = null, $url = null )
12
- {
13
- $config = PPConfigManager::getInstance();
14
-
15
- if ( isset( $accessToken ) && isset( $tokenSecret ) ) {
16
- $headers_arr[ ] = "X-PAYPAL-AUTHORIZATION: " . $this->generateAuthString( $apiCred, $accessToken, $tokenSecret, $url );
17
- //$headers_arr[] = "CLIENT-AUTH: No cert";
18
- } // Add headers required for service authentication
19
- else if ( $apiCred instanceof PPSignatureCredential ) {
20
- $headers_arr[ ] = "X-PAYPAL-SECURITY-USERID: " . $apiCred->getUserName();
21
- $headers_arr[ ] = "X-PAYPAL-SECURITY-PASSWORD: " . $apiCred->getPassword();
22
- $headers_arr[ ] = "X-PAYPAL-SECURITY-SIGNATURE: " . $apiCred->getSignature();
23
- } else if ( $apiCred instanceof PPCertificateCredential ) {
24
-
25
- $headers_arr[ ] = "X-PAYPAL-SECURITY-USERID: " . $apiCred->getUserName();
26
- $headers_arr[ ] = "X-PAYPAL-SECURITY-PASSWORD: " . $apiCred->getPassword();
27
- $connection->setSSLCert( $apiCred->getCertificatePath(), $apiCred->getPassPhrase() );
28
- }
29
-
30
- // Add other headers
31
- $headers_arr[ ] = "X-PAYPAL-APPLICATION-ID: " . $apiCred->getApplicationId();
32
- $headers_arr[ ] = "X-PAYPAL-REQUEST-DATA-FORMAT: " . $config->get( 'service.Binding' );
33
- $headers_arr[ ] = "X-PAYPAL-RESPONSE-DATA-FORMAT: " . $config->get( 'service.Binding' );
34
- $headers_arr[ ] = "X-PAYPAL-DEVICE-IPADDRESS: " . PPUtils::getLocalIPAddress();
35
- $headers_arr[ ] = "X-PAYPAL-REQUEST-SOURCE: " . PPUtils::getRequestSource();
36
-
37
- return $headers_arr;
38
- }
39
-
40
- public function appendSoapHeader( $payLoad, $apiCred, $connection, $accessToken = null, $tokenSecret = null, $url = null )
41
- {
42
- $soapHeader = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:ebay:api:PayPalAPI\" xmlns:ebl=\"urn:ebay:apis:eBLBaseComponents\" xmlns:cc=\"urn:ebay:apis:CoreComponentTypes\" xmlns:ed=\"urn:ebay:apis:EnhancedDataTypes\">";
43
-
44
- if ( isset( $accessToken ) && isset( $tokenSecret ) ) {
45
- $soapHeader .= "<soapenv:Header>";
46
- $soapHeader .= "<urn:RequesterCredentials/>";
47
- $soapHeader .= "</soapenv:Header>";
48
- } else if ( $apiCred instanceof PPSignatureCredential ) {
49
- $soapHeader .= "<soapenv:Header>";
50
- $soapHeader .= "<urn:RequesterCredentials>";
51
- $soapHeader .= "<ebl:Credentials>";
52
- $soapHeader .= "<ebl:Username>" . $apiCred->getUserName() . "</ebl:Username>";
53
- $soapHeader .= "<ebl:Password>" . $apiCred->getPassword() . "</ebl:Password>";
54
- $soapHeader .= "<ebl:Signature>" . $apiCred->getSignature() . "</ebl:Signature>";
55
- $soapHeader .= "</ebl:Credentials>";
56
- $soapHeader .= "</urn:RequesterCredentials>";
57
- $soapHeader .= "</soapenv:Header>";
58
- } else if ( $apiCred instanceof PPCertificateCredential ) {
59
- $soapHeader .= "<soapenv:Header>";
60
- $soapHeader .= "<urn:RequesterCredentials>";
61
- $soapHeader .= "<ebl:Credentials>";
62
- $soapHeader .= "<ebl:Username>" . $apiCred->getUserName() . "</ebl:Username>";
63
- $soapHeader .= "<ebl:Password>" . $apiCred->getPassword() . "</ebl:Password>";
64
- $soapHeader .= "</ebl:Credentials>";
65
- $soapHeader .= "</urn:RequesterCredentials>";
66
- $soapHeader .= "</soapenv:Header>";
67
- $connection->setSSLCert( $apiCred->getCertificatePath(), $apiCred->getPassPhrase() );
68
- }
69
- $soapHeader .= "<soapenv:Body>";
70
- $soapHeader .= $payLoad;
71
- $soapHeader .= "</soapenv:Body>";
72
- $soapHeader .= "</soapenv:Envelope>";
73
-
74
- return $soapHeader;
75
-
76
- }
77
-
78
- private function generateAuthString( $apiCred, $accessToken, $tokenSecret, $endpoint )
79
- {
80
- $key = $apiCred->getUserName();
81
- $secret = $apiCred->getPassword();
82
- $auth = new AuthSignature();
83
- $response = $auth->genSign( $key, $secret, $accessToken, $tokenSecret, 'POST', $endpoint );
84
- $authString = "token=" . $accessToken . ",signature=" . $response[ 'oauth_signature' ] . ",timestamp=" . $response[ 'oauth_timestamp' ];
85
-
86
- return $authString;
87
- }
88
-
89
- }
90
-
91
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPBaseService.php DELETED
@@ -1,88 +0,0 @@
1
- <?php
2
- require_once 'PPAPIService.php';
3
-
4
-
5
- class PPBaseService
6
- {
7
-
8
- private $serviceName;
9
-
10
- /*
11
- * Setters and getters for Third party authentication (Permission Services)
12
- */
13
- protected $accessToken;
14
- protected $tokenSecret;
15
- protected $lastRequest;
16
- protected $lastResponse;
17
-
18
- public function getLastRequest()
19
- {
20
- return $this->lastRequest;
21
- }
22
-
23
- public function setLastRequest( $lastRqst )
24
- {
25
- $this->lastRequest = $lastRqst;
26
- }
27
-
28
- public function getLastResponse()
29
- {
30
- return $this->lastResponse;
31
- }
32
-
33
- public function setLastResponse( $lastRspns )
34
- {
35
- $this->lastResponse = $lastRspns;
36
- }
37
-
38
- public function getAccessToken()
39
- {
40
- return $this->accessToken;
41
- }
42
-
43
- public function setAccessToken( $accessToken )
44
- {
45
- $this->accessToken = $accessToken;
46
- }
47
-
48
- public function getTokenSecret()
49
- {
50
- return $this->tokenSecret;
51
- }
52
-
53
- public function setTokenSecret( $tokenSecret )
54
- {
55
- $this->tokenSecret = $tokenSecret;
56
- }
57
-
58
- public function __construct( $serviceName )
59
- {
60
- $this->serviceName = $serviceName;
61
- }
62
-
63
- public function getServiceName()
64
- {
65
- return $this->serviceName;
66
- }
67
-
68
- public function call( $method, $requestObject, $apiUsername = null )
69
- {
70
- $params = $this->marshall( $requestObject );
71
- $service = new PPAPIService();
72
- $service->setServiceName( $this->serviceName );
73
-
74
- $this->lastRequest = $params;
75
- $this->lastResponse = $service->makeRequest( $method, $params, $apiUsername, $this->accessToken, $this->tokenSecret );
76
-
77
- return $this->lastResponse;
78
- }
79
-
80
- private function marshall( $object )
81
- {
82
- $transformer = new PPObjectTransformer();
83
-
84
- return $transformer->toString( $object );
85
- }
86
- }
87
-
88
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPCertificateCredential.php DELETED
@@ -1,72 +0,0 @@
1
- <?php
2
- require_once 'IPPCredential.php';
3
- require_once 'PPConfigManager.php';
4
- require_once 'exceptions/PPMissingCredentialException.php';
5
-
6
- class PPCertificateCredential extends IPPCredential
7
- {
8
-
9
- private $certificatePath;
10
-
11
- private $passPhrase;
12
-
13
- public function __construct( $userName, $password, $certPath, $appId, $passPhrase )
14
- {
15
- parent::__construct( $userName, $password, $appId );
16
- $this->certificatePath = $certPath;
17
- $this->passPhrase = $passPhrase;
18
- $this->validate();
19
- }
20
-
21
- public function validate()
22
- {
23
-
24
- if ( $this->userName == null || $this->userName == "" ) {
25
- throw new PPMissingCredentialException( "username cannot be empty" );
26
- }
27
- if ( $this->password == null || $this->password == "" ) {
28
- throw new PPMissingCredentialException( "password cannot be empty" );
29
- }
30
- if ( $this->certificatePath == null || $this->certificatePath == "" ) {
31
- throw new PPMissingCredentialException( "certificate cannot be empty" );
32
- }
33
- if ( $this->passPhrase == null || $this->passPhrase == "" ) {
34
- throw new PPMissingCredentialException( "passphrase cannot be empty" );
35
- }
36
- if ( $this->applicationId == null || $this->applicationId == "" ) {
37
- throw new PPMissingCredentialException( "applicationId cannot be empty" );
38
- }
39
- }
40
-
41
- public function getUserName()
42
- {
43
- return $this->userName;
44
- }
45
-
46
- public function getPassword()
47
- {
48
- return $this->password;
49
- }
50
-
51
- public function getCertificatePath()
52
- {
53
- if ( realpath( $this->certificatePath ) ) {
54
- return realpath( $this->certificatePath );
55
- } else {
56
- return realpath( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . $this->certificatePath );
57
- }
58
- }
59
-
60
- public function getPassPhrase()
61
- {
62
- return $this->passPhrase;
63
- }
64
-
65
- public function getApplicationId()
66
- {
67
- return $this->applicationId;
68
- }
69
-
70
- }
71
-
72
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPConfigManager.php DELETED
@@ -1,124 +0,0 @@
1
- <?php
2
- /**
3
- * PPConfigManager loads the SDK configuration file and
4
- * hands out appropriate config params to other classes
5
- */
6
- require_once 'exceptions/PPConfigurationException.php';
7
-
8
- class PPConfigManager
9
- {
10
-
11
- private $config;
12
- /**
13
- *
14
- *
15
- * @var PPConfigManager
16
- */
17
- private static $instance;
18
-
19
- private function __construct()
20
- {
21
- $configFile = dirname( __FILE__ ) . DIRECTORY_SEPARATOR . ".."
22
- . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "sdk_config.ini";
23
- $this->load( $configFile );
24
- }
25
-
26
- // create singleton object for PPConfigManager
27
- public static function getInstance()
28
- {
29
- if ( !isset( self::$instance ) ) {
30
- self::$instance = new PPConfigManager();
31
- }
32
-
33
- return self::$instance;
34
- }
35
-
36
- //used to load the file
37
- private function load( $fileName )
38
- {
39
- if ( class_exists( 'Woocommerce' ) ) {
40
- global $woocommerce;
41
- $gateways = $woocommerce->payment_gateways->payment_gateways();
42
- $settings = $gateways[ 'paypalap' ]->settings;
43
-
44
- $mode = $settings[ 'sandbox_enabled' ];
45
-
46
- $this->config = array(
47
- 'acct1.UserName' => $mode == 'yes' ? $settings[ 'username' ] : $settings[ 'username_live' ],
48
- 'acct1.Password' => $mode == 'yes' ? $settings[ 'password' ] : $settings[ 'password_live' ],
49
- 'acct1.Signature' => $mode == 'yes' ? $settings[ 'signature' ] : $settings[ 'signature_live' ],
50
- 'acct1.AppId' => $mode == 'yes' ? 'APP-80W284485P519543T' : $settings[ 'app_id' ],
51
-
52
- 'service.Binding' => 'NV',
53
- 'service.EndPoint' => $mode == 'yes' ? 'https://svcs.sandbox.paypal.com/' : 'https://svcs.paypal.com/',
54
- 'service.RedirectURL' => $mode == 'yes' ? 'https://sandbox.paypal.com/webscr&cmd=' : 'https://paypal.com/webscr&cmd=',
55
- 'service.DevCentralURL' => 'https://developer.paypal.com',
56
- 'http.ConnectionTimeOut' => '30',
57
- 'http.Retry' => '5',
58
- 'log.FileName' => 'PayPal.log',
59
- 'log.LogLevel' => 'INFO',
60
- 'log.LogEnabled' => $settings[ 'logging_enabled' ] == 'yes' ? 'true' : 'false',
61
- );
62
- } else {
63
- $this->config = @parse_ini_file( $fileName );
64
- }
65
-
66
- if ( $this->config == null || count( $this->config ) == 0 ) {
67
- throw new PPConfigurationException( "Config file $fileName not found", "303" );
68
- }
69
- }
70
-
71
- /**
72
- * simple getter for configuration params
73
- * If an exact match for key is not found,
74
- * does a "contains" search on the key
75
- */
76
- public function get( $searchKey )
77
- {
78
-
79
- if ( array_key_exists( $searchKey, $this->config ) ) {
80
- return $this->config[ $searchKey ];
81
- } else {
82
- $arr = array();
83
- foreach ( $this->config as $k => $v ) {
84
- if ( strstr( $k, $searchKey ) ) {
85
- $arr[ $k ] = $v;
86
- }
87
- }
88
-
89
- return $arr;
90
- }
91
-
92
- }
93
-
94
- /**
95
- * Utility method for handling account configuration
96
- * return config key corresponding to the API userId passed in
97
- *
98
- * If $userId is null, returns config keys corresponding to
99
- * all configured accounts
100
- */
101
- public function getIniPrefix( $userId = null )
102
- {
103
-
104
- if ( $userId == null ) {
105
- $arr = array();
106
- foreach ( $this->config as $key => $value ) {
107
- $pos = strpos( $key, '.' );
108
- if ( strstr( $key, "acct" ) ) {
109
- $arr[ ] = substr( $key, 0, $pos );
110
- }
111
- }
112
-
113
- return array_unique( $arr );
114
- } else {
115
- $iniPrefix = array_search( $userId, $this->config );
116
- $pos = strpos( $iniPrefix, '.' );
117
- $acct = substr( $iniPrefix, 0, $pos );
118
-
119
- return $acct;
120
- }
121
- }
122
- }
123
-
124
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPConnectionManager.php DELETED
@@ -1,48 +0,0 @@
1
- <?php
2
- require_once 'PPHttpConnection.php';
3
- require_once 'PPConfigManager.php';
4
- class PPConnectionManager
5
- {
6
- /**
7
- * reference to singleton instance
8
- * @var PPConnectionManager
9
- */
10
- private static $instance;
11
-
12
- private function __construct()
13
- {
14
- }
15
-
16
- public static function getInstance()
17
- {
18
- if ( self::$instance == null ) {
19
- self::$instance = new PPConnectionManager();
20
- }
21
-
22
- return self::$instance;
23
- }
24
-
25
- /**
26
- * This function returns a new PPHttpConnection object
27
- */
28
- public function getConnection()
29
- {
30
-
31
- $connection = new PPHttpConnection();
32
-
33
- $configMgr = PPConfigManager::getInstance();
34
- if ( ( $configMgr->get( "http.ConnectionTimeOut" ) ) ) {
35
- $connection->setHttpTimeout( $configMgr->get( "http.ConnectionTimeOut" ) );
36
- }
37
- if ( $configMgr->get( "http.Proxy" ) ) {
38
- $connection->setHttpProxy( $configMgr->get( "http.Proxy" ) );
39
- }
40
- if ( $configMgr->get( "http.Retry" ) ) {
41
- $retry = $configMgr->get( "http.Retry" );
42
- $connection->setHttpRetry( $retry );
43
- }
44
-
45
- return $connection;
46
- }
47
-
48
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPCredentialManager.php DELETED
@@ -1,117 +0,0 @@
1
- <?php
2
- require_once 'IPPCredential.php';
3
- require_once 'PPConfigManager.php';
4
- require_once 'PPSignatureCredential.php';
5
- require_once 'PPCertificateCredential.php';
6
- require_once 'exceptions/PPInvalidCredentialException.php';
7
-
8
- class PPCredentialManager
9
- {
10
-
11
- private static $instance;
12
- //hashmap to contain credentials for accounts.
13
- private $credentialHashmap = array();
14
- /**
15
- * Contains the API username of the default account to use
16
- * when authenticating API calls.
17
- * @var string
18
- */
19
- private $defaultAccountName;
20
-
21
- /*
22
- * Constructor initialize credential for multiple accounts specified in property file.
23
- */
24
- private function __construct()
25
- {
26
- try {
27
- $this->initCredential();
28
- } catch ( Exception $e ) {
29
- $this->credentialHashmap = array();
30
- throw $e;
31
- }
32
- }
33
-
34
- /*
35
- * Create singleton instance for this class.
36
- */
37
- public static function getInstance()
38
- {
39
- if ( !isset( self::$instance ) ) {
40
- self::$instance = new PPCredentialManager();
41
- }
42
-
43
- return self::$instance;
44
- }
45
-
46
- /*
47
- * Load credentials for multiple accounts, with priority given to Signature credential.
48
- */
49
- private function initCredential()
50
- {
51
- $configMgr = PPConfigManager::getInstance();
52
- $suffix = 1;
53
- $prefix = "acct";
54
-
55
- $credArr = $configMgr->get( $prefix );
56
- $arrayPartKeys = $configMgr->getIniPrefix();
57
- if ( count( $arrayPartKeys ) == 0 )
58
- throw new MissingCredentialException( "No valid API accounts have been configured" );
59
-
60
- while ( in_array( $prefix . $suffix, $arrayPartKeys ) ) {
61
-
62
- if ( isset( $credArr[ $prefix . $suffix . ".Signature" ] )
63
- && $credArr[ $prefix . $suffix . ".Signature" ] != null && $credArr[ $prefix . $suffix . ".Signature" ] != ""
64
- ) {
65
-
66
- $userName = isset( $credArr[ $prefix . $suffix . '.UserName' ] ) ? $credArr[ $prefix . $suffix . '.UserName' ] : "";
67
- $password = isset( $credArr[ $prefix . $suffix . '.Password' ] ) ? $credArr[ $prefix . $suffix . '.Password' ] : "";
68
- $signature = isset( $credArr[ $prefix . $suffix . '.Signature' ] ) ? $credArr[ $prefix . $suffix . '.Signature' ] : "";
69
- $appId = isset( $credArr[ $prefix . $suffix . '.AppId' ] ) ? $credArr[ $prefix . $suffix . '.AppId' ] : "";
70
- $this->credentialHashmap[ $userName ] = new PPSignatureCredential( $userName, $password, $signature, $appId );
71
-
72
- } elseif ( isset( $credArr[ $prefix . $suffix . ".CertPath" ] )
73
- && $credArr[ $prefix . $suffix . ".CertPath" ] != null && $credArr[ $prefix . $suffix . ".CertPath" ] != ""
74
- ) {
75
-
76
- $userName = isset( $credArr[ $prefix . $suffix . '.UserName' ] ) ? $credArr[ $prefix . $suffix . '.UserName' ] : "";
77
- $password = isset( $credArr[ $prefix . $suffix . '.Password' ] ) ? $credArr[ $prefix . $suffix . '.Password' ] : "";
78
- $passPhrase = isset( $credArr[ $prefix . $suffix . '.CertKey' ] ) ? $credArr[ $prefix . $suffix . '.CertKey' ] : "";
79
- $certPath = isset( $credArr[ $prefix . $suffix . '.CertPath' ] ) ? $credArr[ $prefix . $suffix . '.CertPath' ] : "";
80
- $appId = isset( $credArr[ $prefix . $suffix . '.AppId' ] ) ? $credArr[ $prefix . $suffix . '.AppId' ] : "";
81
- $this->credentialHashmap[ $userName ] = new PPCertificateCredential( $userName, $password, $certPath, $appId, $passPhrase );
82
-
83
- }
84
- if ( $this->defaultAccountName == null )
85
- $this->defaultAccountName = $credArr[ $prefix . $suffix . '.UserName' ];
86
- $suffix++;
87
- }
88
-
89
- }
90
-
91
- /*
92
- * Obtain Credential Object based on UserId provided.
93
- */
94
- public function getCredentialObject( $userId = null )
95
- {
96
-
97
- if ( $userId == null )
98
- $credObj = $this->credentialHashmap[ $this->defaultAccountName ];
99
- else if ( array_key_exists( $userId, $this->credentialHashmap ) )
100
- $credObj = $this->credentialHashmap[ $userId ];
101
-
102
- if ( empty( $credObj ) ) {
103
- throw new PPInvalidCredentialException( "Invalid userId $userId" );
104
- }
105
-
106
- return $credObj;
107
- }
108
-
109
-
110
- public function __clone()
111
- {
112
- trigger_error( 'Clone is not allowed.', E_USER_ERROR );
113
- }
114
-
115
- }
116
-
117
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPHttpConnection.php DELETED
@@ -1,184 +0,0 @@
1
- <?php
2
-
3
- require_once 'exceptions/PPConnectionException.php';
4
- require_once 'exceptions/PPConfigurationException.php';
5
- require_once 'PPLoggingManager.php';
6
- /**
7
- * A wrapper class based on the curl extension.
8
- * Requires the PHP curl module to be enabled.
9
- * See for full requirements the PHP manual: http://php.net/curl
10
- */
11
-
12
-
13
- class PPHttpConnection
14
- {
15
-
16
- const HTTP_GET = 'GET';
17
- const HTTP_POST = 'POST';
18
-
19
- /**
20
- * curl options to be set for the request
21
- */
22
- private $curlOpt = array();
23
-
24
- /**
25
- * Number of times a retry must be attempted on getting an HTTP error
26
- * @var integer
27
- */
28
- private $retry;
29
-
30
- /**
31
- * HTTP status codes for which a retry must be attempted
32
- */
33
- private static $retryCodes = array( '401', '403', '404', );
34
-
35
- private $logger;
36
-
37
-
38
- /**
39
- * Some default options for curl
40
- * These are typically overridden by PPConnectionManager
41
- */
42
- public static $DEFAULT_CURL_OPTS = array(
43
- CURLOPT_CONNECTTIMEOUT => 10,
44
- CURLOPT_RETURNTRANSFER => true,
45
- CURLOPT_TIMEOUT => 60, // maximum number of seconds to allow cURL functions to execute
46
- CURLOPT_USERAGENT => 'PayPal-PHP-SDK',
47
- CURLOPT_POST => 1,
48
- CURLOPT_HTTPHEADER => array(),
49
- CURLOPT_SSL_VERIFYHOST => 2,
50
- CURLOPT_SSL_VERIFYPEER => 2
51
- );
52
-
53
- public function __construct()
54
- {
55
- if ( !function_exists( "curl_init" ) ) {
56
- throw new PPConfigurationException( "Curl module is not available on this system" );
57
- }
58
- $this->curlOpt = self::$DEFAULT_CURL_OPTS;
59
- $this->logger = new PPLoggingManager( __CLASS__ );
60
- }
61
-
62
- /**
63
- * Set ssl parameters for certificate based client authentication
64
- *
65
- * @param string $certPath - path to client certificate file (PEM formatted file)
66
- */
67
- public function setSSLCert( $certPath, $passPhrase )
68
- {
69
- $this->curlOpt[ CURLOPT_SSLCERT ] = realpath( $certPath );
70
- $this->curlOpt[ CURLOPT_SSLCERTPASSWD ] = $passPhrase;
71
- }
72
-
73
- /**
74
- * Set connection timeout in seconds
75
- *
76
- * @param integer $timeout
77
- */
78
- public function setHttpTimeout( $timeout )
79
- {
80
- $this->curlOpt[ CURLOPT_CONNECTTIMEOUT ] = $timeout;
81
- }
82
-
83
- /**
84
- * Set HTTP proxy information
85
- *
86
- * @param string $proxy
87
- *
88
- * @throws PPConfigurationException
89
- */
90
- public function setHttpProxy( $proxy )
91
- {
92
- $urlParts = parse_url( $proxy );
93
- if ( $urlParts == false || !array_key_exists( "host", $urlParts ) )
94
- throw new PPConfigurationException( "Invalid proxy configuration " . $proxy );
95
-
96
- $this->curlOpt[ CURLOPT_PROXY ] = $urlParts[ "host" ];
97
- if ( isset( $urlParts[ "port" ] ) )
98
- $this->curlOpt[ CURLOPT_PROXY ] .= ":" . $urlParts[ "port" ];
99
- if ( isset( $urlParts[ "user" ] ) )
100
- $this->curlOpt[ URLOPT_PROXYUSERPWD ] = $urlParts[ "user" ] . ":" . $urlParts[ "pass" ];
101
- }
102
-
103
- public function setHttpHeaders( $headers )
104
- {
105
- $this->curlOpt[ CURLOPT_HTTPHEADER ] = $headers;
106
- }
107
-
108
- /**
109
- * @param integer $retry
110
- */
111
- public function setHttpRetry( $retry )
112
- {
113
- $this->retry = $retry;
114
- }
115
-
116
- /**
117
- * Executes an HTTP request
118
- *
119
- * @param string $url
120
- * @param string $params query string OR POST content as a string
121
- * @param array $headers array of HTTP headers to be added to existing headers
122
- * @param string $method HTTP method (GET, POST etc) defaults to POST
123
- *
124
- * @throws PPConnectionException
125
- */
126
- public function execute( $url, $params, $headers = null, $method = null )
127
- {
128
-
129
- $ch = curl_init( $url );
130
-
131
- $this->curlOpt[ CURLOPT_POSTFIELDS ] = $params;
132
- $this->curlOpt[ CURLOPT_URL ] = $url;
133
- $this->curlOpt[ CURLOPT_HEADER ] = false;
134
- if ( isset( $headers ) ) {
135
- $this->curlOpt[ CURLOPT_HTTPHEADER ] = array_merge( $this->curlOpt[ CURLOPT_HTTPHEADER ], $headers );
136
- }
137
- foreach ( $this->curlOpt[ CURLOPT_HTTPHEADER ] as $header ) {
138
- //TODO: Strip out credentials when logging.
139
- $this->logger->info( "Adding header $header" );
140
- }
141
- if ( isset( $method ) ) {
142
- $this->curlOpt[ CURLOPT_CUSTOMREQUEST ] = $method;
143
- }
144
-
145
- // curl_setopt_array available only in PHP 5 >= 5.1.3
146
- curl_setopt_array( $ch, $this->curlOpt );
147
-
148
- $result = curl_exec( $ch );
149
-
150
- if ( curl_errno( $ch ) == 60 ) {
151
- $this->logger->info( "Invalid or no certificate authority found, retrying using bundled CA certs" );
152
- curl_setopt( $ch, CURLOPT_CAINFO,
153
- dirname( __FILE__ ) . '/cacert.pem' );
154
- $result = curl_exec( $ch );
155
- }
156
- $httpStatus = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
157
- $retries = 0;
158
- if ( in_array( $httpStatus, self::$retryCodes ) && isset( $this->retry ) ) {
159
- $this->logger->info( "Got $httpStatus response from server. Retrying" );
160
-
161
- do {
162
- $result = curl_exec( $ch );
163
- $httpStatus = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
164
-
165
- } while ( in_array( $httpStatus, self::$retryCodes ) && ++$retries < $this->retry );
166
-
167
-
168
- }
169
- if ( curl_errno( $ch ) ) {
170
- $ex = new PPConnectionException( $url, curl_error( $ch ), curl_errno( $ch ) );
171
- curl_close( $ch );
172
- throw $ex;
173
- }
174
-
175
- curl_close( $ch );
176
-
177
- if ( in_array( $httpStatus, self::$retryCodes ) ) {
178
- throw new PPConnectionException( $url, "Retried " . $retries . " times, Http Response code " . $httpStatus );
179
- }
180
-
181
- return $result;
182
- }
183
-
184
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPLoggingManager.php DELETED
@@ -1,84 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Simple Logging Manager.
5
- * This does an error_log for now
6
- * Potential frameworks to use are PEAR logger, log4php from Apache
7
- */
8
-
9
- class PPLoggingLevel
10
- {
11
-
12
- // FINE Logging Level
13
- const FINE = 3;
14
-
15
- // INFO Logging Level
16
- const INFO = 2;
17
-
18
- // WARN Logging Level
19
- const WARN = 1;
20
-
21
- // ERROR Logging Level
22
- const ERROR = 0;
23
- }
24
-
25
- class PPLoggingManager
26
- {
27
-
28
- // Default Logging Level
29
- const DEFAULT_LOGGING_LEVEL = 0;
30
-
31
- // Logger name
32
- private $loggerName;
33
-
34
- // Log enabled
35
- private $isLoggingEnabled;
36
-
37
- // Configured logging level
38
- private $loggingLevel;
39
-
40
- // Configured logging file
41
- private $loggerFile;
42
-
43
- public function __construct( $loggerName )
44
- {
45
- $this->loggerName = $loggerName;
46
- $config = PPConfigManager::getInstance();
47
- $this->loggerFile = ( $config->get( 'log.FileName' ) ) ? $config->get( 'log.FileName' ) : ini_get( 'error_log' );
48
- $loggingEnabled = $config->get( 'log.LogEnabled' );
49
- $this->isLoggingEnabled = ( isset( $loggingEnabled ) ) ? $loggingEnabled : false;
50
- $loggingLevel = strtoupper( $config->get( 'log.LogLevel' ) );
51
- $this->loggingLevel = ( isset( $loggingLevel ) && defined( "PPLoggingLevel::$loggingLevel" ) ) ? constant( "PPLoggingLevel::$loggingLevel" ) : PPLoggingManager::DEFAULT_LOGGING_LEVEL;
52
-
53
- }
54
-
55
- public function log( $message, $level = PPLoggingLevel::INFO )
56
- {
57
- if ( $this->isLoggingEnabled && ( $level <= $this->loggingLevel ) ) {
58
- error_log( $this->loggerName . ": $message\n" );
59
- }
60
- }
61
-
62
- public function error( $message )
63
- {
64
- $this->log( $message, PPLoggingLevel::ERROR );
65
- }
66
-
67
- public function warning( $message )
68
- {
69
- $this->log( $message, PPLoggingLevel::WARN );
70
- }
71
-
72
- public function info( $message )
73
- {
74
- $this->log( $message, PPLoggingLevel::INFO );
75
- }
76
-
77
- public function fine( $message )
78
- {
79
- $this->log( $message, PPLoggingLevel::FINE );
80
- }
81
-
82
- }
83
-
84
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPObjectTransformer.php DELETED
@@ -1,33 +0,0 @@
1
- <?php
2
- /**
3
- * Utility class for transforming PHP objects into
4
- * appropriate service payload type and vice versa
5
- */
6
- class PPObjectTransformer
7
- {
8
-
9
- public function toString( $object )
10
- {
11
-
12
- if ( $object == null ) {
13
- throw new PPTransformerException( "Empty object" );
14
- }
15
-
16
- $confManager = PPConfigManager::getInstance();
17
- switch ( strtoupper( $confManager->get( "service.Binding" ) ) ) {
18
- case 'SOAP':
19
- return $object->toXMLString();
20
-
21
- case 'XML':
22
- case 'JSON':
23
- return "";
24
- case 'NVP':
25
- default:
26
- return $object->toNVPString();
27
- }
28
- }
29
-
30
-
31
- }
32
-
33
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPSignatureCredential.php DELETED
@@ -1,49 +0,0 @@
1
- <?php
2
-
3
- require_once 'exceptions/PPMissingCredentialException.php';
4
- require_once 'IPPCredential.php';
5
- require_once 'PPConfigManager.php';
6
-
7
- /**
8
- * API signature based credentials
9
- */
10
- class PPSignatureCredential extends IPPCredential
11
- {
12
-
13
- /**
14
- * API Signature
15
- * @var string
16
- */
17
- private $signature;
18
-
19
- public function __construct( $userName, $password, $signature, $appId )
20
- {
21
- parent::__construct( $userName, $password, $appId );
22
- $this->signature = $signature;
23
- $this->validate();
24
- }
25
-
26
- public function validate()
27
- {
28
-
29
- if ( $this->userName == null || $this->userName == "" ) {
30
- throw new PPMissingCredentialException( "username cannot be empty" );
31
- }
32
- if ( $this->password == null || $this->password == "" ) {
33
- throw new PPMissingCredentialException( "password cannot be empty" );
34
- }
35
- if ( $this->signature == null || $this->signature == "" ) {
36
- throw new PPMissingCredentialException( "signature cannot be empty" );
37
- }
38
- if ( $this->applicationId == null || $this->applicationId == "" ) {
39
- throw new PPMissingCredentialException( "applicationId cannot be empty" );
40
- }
41
- }
42
-
43
- public function getSignature()
44
- {
45
- return $this->signature;
46
- }
47
- }
48
-
49
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/PPUtils.php DELETED
@@ -1,274 +0,0 @@
1
- <?php
2
- class PPUtils
3
- {
4
-
5
- const SDK_VERSION = "1.2.95";
6
- const SDK_NAME = "sdk-adaptivepayments-php ";
7
-
8
- /**
9
- *
10
- * Convert a Name Value Pair (NVP) formatted string into
11
- * an associative array taking care to urldecode array values
12
- *
13
- * @param string $nvpString
14
- */
15
- public static function nvpToMap( $nvpString )
16
- {
17
-
18
- $ret = array();
19
- $params = explode( "&", $nvpString );
20
- foreach ( $params as $p ) {
21
- list( $k, $v ) = explode( "=", $p );
22
- $ret[ $k ] = urldecode( $v );
23
- }
24
-
25
- return $ret;
26
- }
27
-
28
- /**
29
- * Returns true if the array contains a key like $key
30
- *
31
- * @param array $map
32
- * @param regex $key
33
- */
34
- public static function array_match_key( $map, $key )
35
- {
36
- $key = str_replace( "(", "\(", $key );
37
- $key = str_replace( ")", "\)", $key );
38
- $key = str_replace( ".", "\.", $key );
39
- $pattern = "/$key*/";
40
- foreach ( $map as $k => $v ) {
41
- preg_match( $pattern, $k, $matches );
42
- if ( count( $matches ) > 0 )
43
- return true;
44
- }
45
-
46
- return false;
47
- }
48
-
49
- /**
50
- *
51
- * Get the local IP address. The client address is a required
52
- * request parameter for some API calls
53
- */
54
- public static function getLocalIPAddress()
55
- {
56
-
57
- if ( array_key_exists( "SERVER_ADDR", $_SERVER ) ) {
58
- // SERVER_ADDR is available only if we are running the CGI SAPI
59
- return $_SERVER[ 'SERVER_ADDR' ];
60
- } else if ( function_exists( "gethostname" ) ) {
61
- // gethostname is available only in PHP >= v5.3
62
- return gethostbyname( gethostname() );
63
- } else {
64
- // fallback if nothing works
65
- return "127.0.0.1";
66
- }
67
- }
68
-
69
- /**
70
- *
71
- * Compute the value that needs to sent for the PAYPAL_REQUEST_SOURCE
72
- * parameter when making API calls
73
- */
74
- public static function getRequestSource()
75
- {
76
- return str_replace( " ", "_", self::SDK_NAME ) . self::SDK_VERSION;
77
- }
78
-
79
- public static function xmlToArray( $xmlInput )
80
- {
81
-
82
- $xml = simplexml_load_string( $xmlInput );
83
-
84
- $ns = $xml->getNamespaces( true );
85
-
86
- $soap = $xml->children( $ns[ 'SOAP-ENV' ] );
87
- $getChild = $soap->Body->children();
88
-
89
- $ret = PPUtils::convertXmlObjToArr( $getChild, $array = array() );
90
-
91
- return $ret;
92
- }
93
-
94
- /*foreach ($ret as $arry)
95
- {
96
- if (isset($arry['children']) && is_array($arry['children'])&& ($arry['children'])!=null) {
97
- foreach ($arry['children'] as $novel)
98
- {
99
-
100
- }
101
- }
102
- else if ($arry['name'] != null)
103
- {
104
- $a = $arry['name'] ;
105
- $b= $arry['text'];
106
- if (isset($arry['attribute']))
107
- {
108
- $c = $arry['attribute'];
109
- }
110
- }
111
-
112
-
113
- }*/
114
-
115
- /*public function xml2array ( $xmlObject, $out = array () )
116
- {
117
- foreach ( (array) $xmlObject as $index => $node )
118
- {
119
- $out[$index] = ( is_object ( $node ) ) ? PPUtils::xml2array ( $node ) : $node;
120
- }
121
- return $out;
122
- }*/
123
-
124
-
125
- function convertXmlObjToArr( $obj, &$arr )
126
- {
127
- $children = $obj->children();
128
- foreach ( $children as $elementName => $node ) {
129
- $nextIdx = count( $arr );
130
- $arr[ $nextIdx ] = array();
131
- $arr[ $nextIdx ][ 'name' ] = strtolower( (string) $elementName );
132
- $arr[ $nextIdx ][ 'attributes' ] = array();
133
- $attributes = $node->attributes();
134
- foreach ( $attributes as $attributeName => $attributeValue ) {
135
- $attribName = strtolower( trim( (string) $attributeName ) );
136
- $attribVal = trim( (string) $attributeValue );
137
- $arr[ $nextIdx ][ 'attributes' ][ $attribName ] = $attribVal;
138
- }
139
- $text = (string) $node;
140
- $text = trim( $text );
141
- if ( strlen( $text ) > 0 ) {
142
- $arr[ $nextIdx ][ 'text' ] = $text;
143
- }
144
- $arr[ $nextIdx ][ 'children' ] = array();
145
- PPutils::convertXmlObjToArr( $node, $arr[ $nextIdx ][ 'children' ] );
146
- }
147
-
148
- return $arr;
149
- }
150
-
151
- }
152
-
153
- /**
154
- * @class xml2array
155
- */
156
-
157
-
158
- /**
159
- * XMLToArray Generator Class
160
- * @author : MA Razzaque Rupom <rupom_315@yahoo.com>, <rupom.bd@gmail.com>
161
- * Moderator, phpResource (LINK1http://groups.yahoo.com/group/phpresource/LINK1)
162
- * URL: LINK2http://www.rupom.infoLINK2
163
- * @version : 1.0
164
- * @date 06/05/2006
165
- * Purpose : Creating Hierarchical Array from XML Data
166
- * Released : Under GPL
167
- */
168
-
169
- class XmlToArray
170
- {
171
-
172
- var $xml = '';
173
-
174
- /**
175
- * Default Constructor
176
- *
177
- * @param $xml = xml data
178
- *
179
- * @return none
180
- */
181
-
182
- function XmlToArray( $xml )
183
- {
184
- $this->xml = $xml;
185
- }
186
-
187
- /**
188
- * _struct_to_array($values, &$i)
189
- *
190
- * This is adds the contents of the return xml into the array for easier processing.
191
- * Recursive, Static
192
- *
193
- * @access private
194
- *
195
- * @param array $values this is the xml data in an array
196
- * @param int $i this is the current location in the array
197
- *
198
- * @return Array
199
- */
200
-
201
- function _struct_to_array( $values, &$i )
202
- {
203
- $child = array();
204
- if ( isset( $values[ $i ][ 'value' ] ) ) array_push( $child, $values[ $i ][ 'value' ] );
205
-
206
- while ( $i++ < count( $values ) ) {
207
- switch ( $values[ $i ][ 'type' ] ) {
208
- case 'cdata':
209
- array_push( $child, $values[ $i ][ 'value' ] );
210
- break;
211
-
212
- case 'complete':
213
- $name = $values[ $i ][ 'tag' ];
214
- if ( !empty( $name ) ) {
215
- $child[ $name ] = ( $values[ $i ][ 'value' ] ) ? ( $values[ $i ][ 'value' ] ) : '';
216
- if ( isset( $values[ $i ][ 'attributes' ] ) ) {
217
- $child[ $name ] = $values[ $i ][ 'attributes' ];
218
- }
219
- }
220
- break;
221
-
222
- case 'open':
223
- $name = $values[ $i ][ 'tag' ];
224
- $size = isset( $child[ $name ] ) ? sizeof( $child[ $name ] ) : 0;
225
- $child[ $name ][ $size ] = $this->_struct_to_array( $values, $i );
226
- break;
227
-
228
- case 'close':
229
- return $child;
230
- break;
231
- }
232
- }
233
-
234
- return $child;
235
- }
236
-
237
- //_struct_to_array
238
-
239
- /**
240
- * createArray($data)
241
- *
242
- * This is adds the contents of the return xml into the array for easier processing.
243
- *
244
- * @access public
245
- *
246
- * @param string $data this is the string of the xml data
247
- *
248
- * @return Array
249
- */
250
- function createArray()
251
- {
252
- $xml = $this->xml;
253
- $values = array();
254
- $index = array();
255
- $array = array();
256
- $parser = xml_parser_create();
257
- xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
258
- xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
259
- xml_parse_into_struct( $parser, $xml, $values, $index );
260
- xml_parser_free( $parser );
261
- $i = 0;
262
- $name = $values[ $i ][ 'tag' ];
263
- $array[ $name ] = isset( $values[ $i ][ 'attributes' ] ) ? $values[ $i ][ 'attributes' ] : '';
264
- $array[ $name ] = $this->_struct_to_array( $values, $i );
265
-
266
- return $array;
267
- }
268
- //createArray
269
-
270
-
271
- }
272
-
273
- //XmlToArray
274
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/auth/AuthUtil.php DELETED
@@ -1,83 +0,0 @@
1
- <?php //vim: foldmethod=marker
2
-
3
- class MockOAuthDataStore extends OAuthDataStore
4
- { /*{{{*/
5
- private $consumer;
6
- private $request_token;
7
- private $access_token;
8
- private $nonce;
9
-
10
- function __construct()
11
- { /*{{{*/
12
- $this->consumer = new OAuthConsumer( "key", "secret", null );
13
- $this->request_token = new OAuthToken( "requestkey", "requestsecret", 1 );
14
- $this->access_token = new OAuthToken( "accesskey", "accesssecret", 1 );
15
- $this->nonce = "nonce";
16
- }
17
-
18
- /*}}}*/
19
-
20
- function lookup_consumer( $consumer_key )
21
- { /*{{{*/
22
- if ( $consumer_key == $this->consumer->key ) return $this->consumer;
23
-
24
- return null;
25
- }
26
-
27
- /*}}}*/
28
-
29
- function lookup_token( $consumer, $token_type, $token )
30
- { /*{{{*/
31
- $token_attrib = $token_type . "_token";
32
- if ( $consumer->key == $this->consumer->key
33
- && $token == $this->$token_attrib->key
34
- ) {
35
- return $this->$token_attrib;
36
- }
37
-
38
- return null;
39
- }
40
-
41
- /*}}}*/
42
-
43
- function lookup_nonce( $consumer, $token, $nonce, $timestamp )
44
- { /*{{{*/
45
- if ( $consumer->key == $this->consumer->key
46
- && ( ( $token && $token->key == $this->request_token->key )
47
- || ( $token && $token->key == $this->access_token->key ) )
48
- && $nonce == $this->nonce
49
- ) {
50
- return $this->nonce;
51
- }
52
-
53
- return null;
54
- }
55
-
56
- /*}}}*/
57
-
58
- function new_request_token( $consumer, $callback = null )
59
- { /*{{{*/
60
- if ( $consumer->key == $this->consumer->key ) {
61
- return $this->request_token;
62
- }
63
-
64
- return null;
65
- }
66
-
67
- /*}}}*/
68
-
69
- function new_access_token( $token, $consumer, $verifier = null )
70
- { /*{{{*/
71
- if ( $consumer->key == $this->consumer->key
72
- && $token->key == $this->request_token->key
73
- ) {
74
- return $this->access_token;
75
- }
76
-
77
- return null;
78
- }
79
- /*}}}*/
80
- }
81
-
82
- /*}}}*/
83
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/auth/PPAuth.php DELETED
@@ -1,1077 +0,0 @@
1
- <?php
2
- //PayPal specific modification ends
3
- /* Generic exception class
4
- */
5
- if ( !class_exists( 'OAuthException' ) ) {
6
- class OAuthException extends Exception
7
- {
8
- // pass
9
- }
10
- }
11
-
12
- if ( !class_exists( 'OAuthConsumer' ) ) {
13
- class OAuthConsumer
14
- {
15
- public $key;
16
- public $secret;
17
-
18
- function __construct( $key, $secret, $callback_url = null )
19
- {
20
- $this->key = $key;
21
- $this->secret = $secret;
22
- $this->callback_url = $callback_url;
23
- }
24
-
25
- function __toString()
26
- {
27
- return "OAuthConsumer[key=$this->key,secret=$this->secret]";
28
- }
29
- }
30
- }
31
-
32
- if ( !class_exists( 'OAuthToken' ) ) {
33
- class OAuthToken
34
- {
35
- // access tokens and request tokens
36
- public $key;
37
- public $secret;
38
-
39
- /**
40
- * key = the token
41
- * secret = the token secret
42
- */
43
- function __construct( $key, $secret )
44
- {
45
- $this->key = $key;
46
- $this->secret = $secret;
47
- }
48
-
49
- /**
50
- * generates the basic string serialization of a token that a server
51
- * would respond to request_token and access_token calls with
52
- */
53
- function to_string()
54
- {
55
- return "oauth_token=" .
56
- OAuthUtil::urlencode_rfc3986( $this->key ) .
57
- "&oauth_token_secret=" .
58
- OAuthUtil::urlencode_rfc3986( $this->secret );
59
- }
60
-
61
- function __toString()
62
- {
63
- return $this->to_string();
64
- }
65
- }
66
- }
67
-
68
- /**
69
- * A class for implementing a Signature Method
70
- * See section 9 ("Signing Requests") in the spec
71
- */
72
- if ( !class_exists( 'OAuthSignatureMethod' ) ) {
73
- abstract class OAuthSignatureMethod
74
- {
75
- /**
76
- * Needs to return the name of the Signature Method (ie HMAC-SHA1)
77
- * @return string
78
- */
79
- abstract public function get_name();
80
-
81
- /**
82
- * Build up the signature
83
- * NOTE: The output of this function MUST NOT be urlencoded.
84
- * the encoding is handled in OAuthRequest when the final
85
- * request is serialized
86
- *
87
- * @param OAuthRequest $request
88
- * @param OAuthConsumer $consumer
89
- * @param OAuthToken $token
90
- *
91
- * @return string
92
- */
93
- abstract public function build_signature( $request, $consumer, $token );
94
-
95
- /**
96
- * Verifies that a given signature is correct
97
- *
98
- * @param OAuthRequest $request
99
- * @param OAuthConsumer $consumer
100
- * @param OAuthToken $token
101
- * @param string $signature
102
- *
103
- * @return bool
104
- */
105
- public function check_signature( $request, $consumer, $token, $signature )
106
- {
107
- $built = $this->build_signature( $request, $consumer, $token );
108
-
109
- return $built == $signature;
110
- }
111
- }
112
- }
113
-
114
- /**
115
- * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
116
- * where the Signature Base String is the text and the key is the concatenated values (each first
117
- * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'
118
- * character (ASCII code 38) even if empty.
119
- * - Chapter 9.2 ("HMAC-SHA1")
120
- */
121
- if ( !class_exists( 'OAuthSignatureMethod_HMAC_SHA1' ) ) {
122
- class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod
123
- {
124
- function get_name()
125
- {
126
- return "HMAC-SHA1";
127
- }
128
-
129
- public function build_signature( $request, $consumer, $token )
130
- {
131
- $base_string = $request->get_signature_base_string();
132
- $base_string = preg_replace( "/(%[A-Za-z0-9]{2})/e", "strtolower('\\0')", $base_string ); //convert base string to lowercase
133
- $request->base_string = $base_string;
134
-
135
- $key_parts = array(
136
- $consumer->secret,
137
- ( $token ) ? $token->secret : ""
138
- );
139
-
140
- $key_parts = OAuthUtil::urlencode_rfc3986( $key_parts );
141
- $key = implode( '&', $key_parts );
142
- $key = preg_replace( "/(%[A-Za-z0-9]{2})/e", "strtolower('\\0')", $key ); //convert to lowercase
143
- return base64_encode( hash_hmac( 'sha1', $base_string, $key, true ) );
144
- }
145
- }
146
- }
147
- /**
148
- * The PLAINTEXT method does not provide any security protection and SHOULD only be used
149
- * over a secure channel such as HTTPS. It does not use the Signature Base String.
150
- * - Chapter 9.4 ("PLAINTEXT")
151
- */
152
- if ( !class_exists( 'OAuthSignatureMethod_PLAINTEXT' ) ) {
153
- class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod
154
- {
155
- public function get_name()
156
- {
157
- return "PLAINTEXT";
158
- }
159
-
160
- /**
161
- * oauth_signature is set to the concatenated encoded values of the Consumer Secret and
162
- * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is
163
- * empty. The result MUST be encoded again.
164
- * - Chapter 9.4.1 ("Generating Signatures")
165
- *
166
- * Please note that the second encoding MUST NOT happen in the SignatureMethod, as
167
- * OAuthRequest handles this!
168
- */
169
- public function build_signature( $request, $consumer, $token )
170
- {
171
- $key_parts = array(
172
- $consumer->secret,
173
- ( $token ) ? $token->secret : ""
174
- );
175
-
176
- $key_parts = OAuthUtil::urlencode_rfc3986( $key_parts );
177
- $key = implode( '&', $key_parts );
178
- $request->base_string = $key;
179
-
180
- return $key;
181
- }
182
- }
183
- }
184
- /**
185
- * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in
186
- * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for
187
- * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a
188
- * verified way to the Service Provider, in a manner which is beyond the scope of this
189
- * specification.
190
- * - Chapter 9.3 ("RSA-SHA1")
191
- */
192
- if ( !class_exists( 'OAuthSignatureMethod_RSA_SHA1' ) ) {
193
- abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod
194
- {
195
- public function get_name()
196
- {
197
- return "RSA-SHA1";
198
- }
199
-
200
- // Up to the SP to implement this lookup of keys. Possible ideas are:
201
- // (1) do a lookup in a table of trusted certs keyed off of consumer
202
- // (2) fetch via http using a url provided by the requester
203
- // (3) some sort of specific discovery code based on request
204
- //
205
- // Either way should return a string representation of the certificate
206
- protected abstract function fetch_public_cert( &$request );
207
-
208
- // Up to the SP to implement this lookup of keys. Possible ideas are:
209
- // (1) do a lookup in a table of trusted certs keyed off of consumer
210
- //
211
- // Either way should return a string representation of the certificate
212
- protected abstract function fetch_private_cert( &$request );
213
-
214
- public function build_signature( $request, $consumer, $token )
215
- {
216
- $base_string = $request->get_signature_base_string();
217
- $request->base_string = $base_string;
218
-
219
- // Fetch the private key cert based on the request
220
- $cert = $this->fetch_private_cert( $request );
221
-
222
- // Pull the private key ID from the certificate
223
- $privatekeyid = openssl_get_privatekey( $cert );
224
-
225
- // Sign using the key
226
- $ok = openssl_sign( $base_string, $signature, $privatekeyid );
227
-
228
- // Release the key resource
229
- openssl_free_key( $privatekeyid );
230
-
231
- return base64_encode( $signature );
232
- }
233
-
234
- public function check_signature( $request, $consumer, $token, $signature )
235
- {
236
- $decoded_sig = base64_decode( $signature );
237
-
238
- $base_string = $request->get_signature_base_string();
239
-
240
- // Fetch the public key cert based on the request
241
- $cert = $this->fetch_public_cert( $request );
242
-
243
- // Pull the public key ID from the certificate
244
- $publickeyid = openssl_get_publickey( $cert );
245
-
246
- // Check the computed signature against the one passed in the query
247
- $ok = openssl_verify( $base_string, $decoded_sig, $publickeyid );
248
-
249
- // Release the key resource
250
- openssl_free_key( $publickeyid );
251
-
252
- return $ok == 1;
253
- }
254
- }
255
- }
256
-
257
- if ( !class_exists( 'OAuthRequest' ) ) {
258
- class OAuthRequest
259
- {
260
- public $parameters;
261
- protected $http_method;
262
- protected $http_url;
263
- // for debug purposes
264
- public $base_string;
265
- public static $version = '1.0';
266
- public static $POST_INPUT = 'php://input';
267
-
268
- function __construct( $http_method, $http_url, $parameters = null )
269
- {
270
- $parameters = ( $parameters ) ? $parameters : array();
271
- $parameters = array_merge( OAuthUtil::parse_parameters( parse_url( $http_url, PHP_URL_QUERY ) ), $parameters );
272
- $this->parameters = $parameters;
273
- $this->http_method = $http_method;
274
- $this->http_url = $http_url;
275
- }
276
-
277
-
278
- /**
279
- * attempt to build up a request from what was passed to the server
280
- */
281
- public static function from_request( $http_method = null, $http_url = null, $parameters = null )
282
- {
283
- $scheme = ( !isset( $_SERVER[ 'HTTPS' ] ) || $_SERVER[ 'HTTPS' ] != "on" )
284
- ? 'http'
285
- : 'https';
286
- $http_url = ( $http_url ) ? $http_url : $scheme .
287
- '://' . $_SERVER[ 'HTTP_HOST' ] .
288
- ':' .
289
- $_SERVER[ 'SERVER_PORT' ] .
290
- $_SERVER[ 'REQUEST_URI' ];
291
- $http_method = ( $http_method ) ? $http_method : $_SERVER[ 'REQUEST_METHOD' ];
292
-
293
- // We weren't handed any parameters, so let's find the ones relevant to
294
- // this request.
295
- // If you run XML-RPC or similar you should use this to provide your own
296
- // parsed parameter-list
297
- if ( !$parameters ) {
298
- // Find request headers
299
- $request_headers = OAuthUtil::get_headers();
300
-
301
- // Parse the query-string to find GET parameters
302
- $parameters = OAuthUtil::parse_parameters( $_SERVER[ 'QUERY_STRING' ] );
303
-
304
- // It's a POST request of the proper content-type, so parse POST
305
- // parameters and add those overriding any duplicates from GET
306
- if ( $http_method == "POST"
307
- && isset( $request_headers[ 'Content-Type' ] )
308
- && strstr( $request_headers[ 'Content-Type' ],
309
- 'application/x-www-form-urlencoded' )
310
- ) {
311
- $post_data = OAuthUtil::parse_parameters(
312
- file_get_contents( self::$POST_INPUT )
313
- );
314
- $parameters = array_merge( $parameters, $post_data );
315
- }
316
-
317
- // We have a Authorization-header with OAuth data. Parse the header
318
- // and add those overriding any duplicates from GET or POST
319
- if ( isset( $request_headers[ 'Authorization' ] ) && substr( $request_headers[ 'Authorization' ], 0, 6 ) == 'OAuth ' ) {
320
- $header_parameters = OAuthUtil::split_header(
321
- $request_headers[ 'Authorization' ]
322
- );
323
- $parameters = array_merge( $parameters, $header_parameters );
324
- }
325
-
326
- }
327
-
328
- return new OAuthRequest( $http_method, $http_url, $parameters );
329
- }
330
-
331
- /**
332
- * pretty much a helper function to set up the request
333
- */
334
- public static function from_consumer_and_token( $consumer, $token, $http_method, $http_url, $parameters = null )
335
- {
336
- $parameters = ( $parameters ) ? $parameters : array();
337
- $defaults = array(
338
- "oauth_version" => OAuthRequest::$version,
339
- // "oauth_nonce" => OAuthRequest::generate_nonce(),
340
- "oauth_timestamp" => OAuthRequest::generate_timestamp(),
341
-
342
- "oauth_consumer_key" => $consumer->key
343
- );
344
- if ( $token )
345
- $defaults[ 'oauth_token' ] = $token->key;
346
-
347
- $parameters = array_merge( $defaults, $parameters );
348
- ksort( $parameters );
349
-
350
- return new OAuthRequest( $http_method, $http_url, $parameters );
351
- }
352
-
353
- public function set_parameter( $name, $value, $allow_duplicates = true )
354
- {
355
- if ( $allow_duplicates && isset( $this->parameters[ $name ] ) ) {
356
- // We have already added parameter(s) with this name, so add to the list
357
- if ( is_scalar( $this->parameters[ $name ] ) ) {
358
- // This is the first duplicate, so transform scalar (string)
359
- // into an array so we can add the duplicates
360
- $this->parameters[ $name ] = array( $this->parameters[ $name ] );
361
- }
362
-
363
- $this->parameters[ $name ][ ] = $value;
364
- } else {
365
- $this->parameters[ $name ] = $value;
366
- }
367
- }
368
-
369
- public function get_parameter( $name )
370
- {
371
- return isset( $this->parameters[ $name ] ) ? $this->parameters[ $name ] : null;
372
- }
373
-
374
- public function get_parameters()
375
- {
376
- return $this->parameters;
377
- }
378
-
379
- public function unset_parameter( $name )
380
- {
381
- unset( $this->parameters[ $name ] );
382
- }
383
-
384
- /**
385
- * The request parameters, sorted and concatenated into a normalized string.
386
- * @return string
387
- */
388
- public function get_signable_parameters()
389
- {
390
- // Grab all parameters
391
- $params = $this->parameters;
392
- ksort( $params );
393
- // Remove oauth_signature if present
394
- // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
395
- if ( isset( $params[ 'oauth_signature' ] ) ) {
396
- unset( $params[ 'oauth_signature' ] );
397
- }
398
- foreach ( $params as $key => $value ) {
399
- $res[ ] = $key . "=" . $value;
400
- }
401
-
402
- return implode( '&', $res );
403
- //return OAuthUtil::build_http_query($params);
404
- }
405
-
406
- /**
407
- * Returns the base string of this request
408
- *
409
- * The base string defined as the method, the url
410
- * and the parameters (normalized), each urlencoded
411
- * and the concated with &.
412
- */
413
- public function get_signature_base_string()
414
- {
415
- $parts = array(
416
- $this->get_normalized_http_method(),
417
- $this->get_normalized_http_url(),
418
- $this->get_signable_parameters()
419
- );
420
-
421
- $parts = OAuthUtil::urlencode_rfc3986( $parts );
422
-
423
- return implode( '&', $parts );
424
- }
425
-
426
- /**
427
- * just uppercases the http method
428
- */
429
- public function get_normalized_http_method()
430
- {
431
- return strtoupper( $this->http_method );
432
- }
433
-
434
- /**
435
- * parses the url and rebuilds it to be
436
- * scheme://host/path
437
- */
438
- public function get_normalized_http_url()
439
- {
440
- $parts = parse_url( $this->http_url );
441
-
442
- $scheme = ( isset( $parts[ 'scheme' ] ) ) ? $parts[ 'scheme' ] : 'http';
443
- $port = ( isset( $parts[ 'port' ] ) ) ? $parts[ 'port' ] : ( ( $scheme == 'https' ) ? '443' : '80' );
444
- $host = ( isset( $parts[ 'host' ] ) ) ? $parts[ 'host' ] : '';
445
- $path = ( isset( $parts[ 'path' ] ) ) ? $parts[ 'path' ] : '';
446
-
447
- if ( ( $scheme == 'https' && $port != '443' )
448
- || ( $scheme == 'http' && $port != '80' )
449
- ) {
450
- $host = "$host:$port";
451
- }
452
-
453
- return "$scheme://$host$path";
454
- }
455
-
456
- /**
457
- * builds a url usable for a GET request
458
- */
459
- public function to_url()
460
- {
461
- $post_data = $this->to_postdata();
462
- $out = $this->get_normalized_http_url();
463
- if ( $post_data ) {
464
- $out .= '?' . $post_data;
465
- }
466
-
467
- return $out;
468
- }
469
-
470
- /**
471
- * builds the data one would send in a POST request
472
- */
473
- public function to_postdata()
474
- {
475
- return OAuthUtil::build_http_query( $this->parameters );
476
- }
477
-
478
- /**
479
- * builds the Authorization: header
480
- */
481
- public function to_header( $realm = null )
482
- {
483
- $first = true;
484
- if ( $realm ) {
485
- $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986( $realm ) . '"';
486
- $first = false;
487
- } else
488
- $out = 'Authorization: OAuth';
489
-
490
- $total = array();
491
- foreach ( $this->parameters as $k => $v ) {
492
- if ( substr( $k, 0, 5 ) != "oauth" ) continue;
493
- if ( is_array( $v ) ) {
494
- throw new OAuthException( 'Arrays not supported in headers' );
495
- }
496
- $out .= ( $first ) ? ' ' : ',';
497
- $out .= OAuthUtil::urlencode_rfc3986( $k ) .
498
- '="' .
499
- OAuthUtil::urlencode_rfc3986( $v ) .
500
- '"';
501
- $first = false;
502
- }
503
-
504
- return $out;
505
- }
506
-
507
- public function __toString()
508
- {
509
- return $this->to_url();
510
- }
511
-
512
-
513
- public function sign_request( $signature_method, $consumer, $token )
514
- {
515
-
516
- $empty = false;
517
- $msg = array();
518
- if ( $token->key == null ) {
519
- $msg[ ] = 'Token key';
520
- }
521
- if ( $token->secret == null ) {
522
- $msg[ ] = 'Token secret';
523
- }
524
- if ( $consumer->key == null ) {
525
-
526
- $msg[ ] = 'Consumer key';
527
- }
528
- if ( $consumer->secret == null ) {
529
-
530
- $msg[ ] = 'Consumer secret';
531
- }
532
- if ( $this->http_url == null ) {
533
-
534
- $msg[ ] = 'Endpoint';
535
- }
536
- if ( $this->http_method == null ) {
537
-
538
- $msg[ ] = 'HTTP method';
539
- }
540
- if ( count( $msg ) ) {
541
- throw new OAuthException( 'Enter valid ' . implode( ',', $msg ) );
542
- }
543
- $this->set_parameter(
544
- "oauth_signature_method",
545
- $signature_method->get_name(),
546
- false );
547
-
548
- $signature = $this->build_signature( $signature_method, $consumer, $token );
549
- $this->set_parameter( "oauth_signature", $signature, false );
550
-
551
- }
552
-
553
- public function build_signature( $signature_method, $consumer, $token )
554
- {
555
- $signature = $signature_method->build_signature( $this, $consumer, $token );
556
-
557
- return $signature;
558
- }
559
-
560
- /**
561
- * util function: current timestamp
562
- */
563
- private static function generate_timestamp()
564
- {
565
- return time();
566
- }
567
-
568
- /**
569
- * util function: current nonce
570
- */
571
- private static function generate_nonce()
572
- {
573
- $mt = microtime();
574
- $rand = mt_rand();
575
-
576
- return md5( $mt . $rand ); // md5s look nicer than numbers
577
- }
578
- }
579
- }
580
-
581
- if ( !class_exists( 'OAuthServer' ) ) {
582
- class OAuthServer
583
- {
584
- protected $timestamp_threshold = 300; // in seconds, five minutes
585
- protected $version = '1.0'; // hi blaine
586
- protected $signature_methods = array();
587
-
588
- protected $data_store;
589
-
590
- function __construct( $data_store )
591
- {
592
- $this->data_store = $data_store;
593
- }
594
-
595
- public function add_signature_method( $signature_method )
596
- {
597
- $this->signature_methods[ $signature_method->get_name() ] =
598
- $signature_method;
599
- }
600
-
601
- // high level functions
602
-
603
- /**
604
- * process a request_token request
605
- * returns the request token on success
606
- */
607
- public function fetch_request_token( &$request )
608
- {
609
- $this->get_version( $request );
610
-
611
- $consumer = $this->get_consumer( $request );
612
-
613
- // no token required for the initial token request
614
- $token = null;
615
-
616
- $this->check_signature( $request, $consumer, $token );
617
-
618
- // Rev A change
619
- $callback = $request->get_parameter( 'oauth_callback' );
620
- $new_token = $this->data_store->new_request_token( $consumer, $callback );
621
-
622
- return $new_token;
623
- }
624
-
625
- /**
626
- * process an access_token request
627
- * returns the access token on success
628
- */
629
- public function fetch_access_token( &$request )
630
- {
631
- $this->get_version( $request );
632
-
633
- $consumer = $this->get_consumer( $request );
634
-
635
- // requires authorized request token
636
- $token = $this->get_token( $request, $consumer, "request" );
637
-
638
- $this->check_signature( $request, $consumer, $token );
639
-
640
- // Rev A change
641
- $verifier = $request->get_parameter( 'oauth_verifier' );
642
- $new_token = $this->data_store->new_access_token( $token, $consumer, $verifier );
643
-
644
- return $new_token;
645
- }
646
-
647
- /**
648
- * verify an api call, checks all the parameters
649
- */
650
- public function verify_request( &$request )
651
- {
652
- $this->get_version( $request );
653
- $consumer = $this->get_consumer( $request );
654
- $token = $this->get_token( $request, $consumer, "access" );
655
- $this->check_signature( $request, $consumer, $token );
656
-
657
- return array( $consumer, $token );
658
- }
659
-
660
- // Internals from here
661
- /**
662
- * version 1
663
- */
664
- private function get_version( &$request )
665
- {
666
- $version = $request->get_parameter( "oauth_version" );
667
- if ( !$version ) {
668
- // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present.
669
- // Chapter 7.0 ("Accessing Protected Ressources")
670
- $version = '1.0';
671
- }
672
- if ( $version !== $this->version ) {
673
- throw new OAuthException( "OAuth version '$version' not supported" );
674
- }
675
-
676
- return $version;
677
- }
678
-
679
- /**
680
- * figure out the signature with some defaults
681
- */
682
- private function get_signature_method( $request )
683
- {
684
- $signature_method = $request instanceof OAuthRequest
685
- ? $request->get_parameter( "oauth_signature_method" )
686
- : null;
687
-
688
- if ( !$signature_method ) {
689
- // According to chapter 7 ("Accessing Protected Ressources") the signature-method
690
- // parameter is required, and we can't just fallback to PLAINTEXT
691
- throw new OAuthException( 'No signature method parameter. This parameter is required' );
692
- }
693
-
694
- if ( !in_array( $signature_method,
695
- array_keys( $this->signature_methods ) )
696
- ) {
697
- throw new OAuthException(
698
- "Signature method '$signature_method' not supported " .
699
- "try one of the following: " .
700
- implode( ", ", array_keys( $this->signature_methods ) )
701
- );
702
- }
703
-
704
- return $this->signature_methods[ $signature_method ];
705
- }
706
-
707
- /**
708
- * try to find the consumer for the provided request's consumer key
709
- */
710
- private function get_consumer( $request )
711
- {
712
- $consumer_key = $request instanceof OAuthRequest
713
- ? $request->get_parameter( "oauth_consumer_key" )
714
- : null;
715
-
716
- if ( !$consumer_key ) {
717
- throw new OAuthException( "Invalid consumer key" );
718
- }
719
-
720
- $consumer = $this->data_store->lookup_consumer( $consumer_key );
721
- if ( !$consumer ) {
722
- throw new OAuthException( "Invalid consumer" );
723
- }
724
-
725
- return $consumer;
726
- }
727
-
728
- /**
729
- * try to find the token for the provided request's token key
730
- */
731
- private function get_token( $request, $consumer, $token_type = "access" )
732
- {
733
- $token_field = $request instanceof OAuthRequest
734
- ? $request->get_parameter( 'oauth_token' )
735
- : null;
736
-
737
- $token = $this->data_store->lookup_token(
738
- $consumer, $token_type, $token_field
739
- );
740
- if ( !$token ) {
741
- throw new OAuthException( "Invalid $token_type token: $token_field" );
742
- }
743
-
744
- return $token;
745
- }
746
-
747
- /**
748
- * all-in-one function to check the signature on a request
749
- * should guess the signature method appropriately
750
- */
751
- private function check_signature( $request, $consumer, $token )
752
- {
753
- // this should probably be in a different method
754
- $timestamp = $request instanceof OAuthRequest
755
- ? $request->get_parameter( 'oauth_timestamp' )
756
- : null;
757
- $nonce = $request instanceof OAuthRequest
758
- ? $request->get_parameter( 'oauth_nonce' )
759
- : null;
760
-
761
- $this->check_timestamp( $timestamp );
762
- $this->check_nonce( $consumer, $token, $nonce, $timestamp );
763
-
764
- $signature_method = $this->get_signature_method( $request );
765
-
766
- $signature = $request->get_parameter( 'oauth_signature' );
767
- $valid_sig = $signature_method->check_signature(
768
- $request,
769
- $consumer,
770
- $token,
771
- $signature
772
- );
773
-
774
- if ( !$valid_sig ) {
775
- throw new OAuthException( "Invalid signature" );
776
- }
777
- }
778
-
779
- /**
780
- * check that the timestamp is new enough
781
- */
782
- private function check_timestamp( $timestamp )
783
- {
784
- if ( !$timestamp )
785
- throw new OAuthException(
786
- 'Missing timestamp parameter. The parameter is required'
787
- );
788
-
789
- // verify that timestamp is recentish
790
- $now = time();
791
- if ( abs( $now - $timestamp ) > $this->timestamp_threshold ) {
792
- throw new OAuthException(
793
- "Expired timestamp, yours $timestamp, ours $now"
794
- );
795
- }
796
- }
797
-
798
- /**
799
- * check that the nonce is not repeated
800
- */
801
- private function check_nonce( $consumer, $token, $nonce, $timestamp )
802
- {
803
- if ( !$nonce )
804
- throw new OAuthException(
805
- 'Missing nonce parameter. The parameter is required'
806
- );
807
-
808
- // verify that the nonce is uniqueish
809
- $found = $this->data_store->lookup_nonce(
810
- $consumer,
811
- $token,
812
- $nonce,
813
- $timestamp
814
- );
815
- if ( $found ) {
816
- throw new OAuthException( "Nonce already used: $nonce" );
817
- }
818
- }
819
-
820
- }
821
- }
822
-
823
- // if ( !class_exists( 'OAuthDataStore' ) ) { // If you experience clashes with other OAuthDataStore classes, uncommenting this line and the closing curly brace
824
- // at the end of the class declaration MAY help you.
825
- class OAuthDataStore
826
- {
827
- function lookup_consumer( $consumer_key )
828
- {
829
- // implement me
830
- }
831
-
832
- function lookup_token( $consumer, $token_type, $token )
833
- {
834
- // implement me
835
- }
836
-
837
- function lookup_nonce( $consumer, $token, $nonce, $timestamp )
838
- {
839
- // implement me
840
- }
841
-
842
- function new_request_token( $consumer, $callback = null )
843
- {
844
- // return a new token attached to this consumer
845
- }
846
-
847
- function new_access_token( $token, $consumer, $verifier = null )
848
- {
849
- // return a new access token attached to this consumer
850
- // for the user associated with this token if the request token
851
- // is authorized
852
- // should also invalidate the request token
853
- }
854
-
855
- }
856
- // } // This is the curly brace to uncomment
857
-
858
- if ( !class_exists( 'OAuthUtil' ) ) {
859
- class OAuthUtil
860
- {
861
- public static function urlencode_rfc3986( $input )
862
- {
863
- if ( is_array( $input ) ) {
864
- return array_map( array( 'OAuthUtil', 'urlencode_rfc3986' ), $input );
865
- } else if ( is_scalar( $input ) ) {
866
- $tmp1 = str_replace( '%7E', '~', rawurlencode( $input ) );
867
- $tmp2 = str_replace( ".", "%2E", $tmp1 );
868
- $tmp3 = str_replace( "*", "%2A", $tmp2 );
869
- $tmp4 = str_replace( '+', ' ', $tmp3 );
870
- $tmp = str_replace( "-", "%2D", $tmp4 );
871
-
872
- return $tmp;
873
- /*$tmp1=str_replace('%7E', '~', rawurlencode($input));
874
- $tmp2= str_replace(".","%2E",$tmp1);
875
-
876
-
877
- return $tmp;*/
878
- } else {
879
- return '';
880
- }
881
- }
882
-
883
- public static function parseQueryString( $str )
884
- {
885
- $op = array();
886
- $pairs = explode( "&", $str );
887
- foreach ( $pairs as $pair ) {
888
- list( $k, $v ) = array_map( "urldecode", explode( "=", $pair ) );
889
- $op[ $k ] = $v;
890
- }
891
-
892
- return $op;
893
- }
894
-
895
- //parses string to associative array -modified for PayPal Signature
896
-
897
-
898
- // This decode function isn't taking into consideration the above
899
- // modifications to the encoding process. However, this method doesn't
900
- // seem to be used anywhere so leaving it as is.
901
- public static function urldecode_rfc3986( $string )
902
- {
903
- return urldecode( $string );
904
- }
905
-
906
- // Utility function for turning the Authorization: header into
907
- // parameters, has to do some unescaping
908
- // Can filter out any non-oauth parameters if needed (default behaviour)
909
- // May 28th, 2010 - method updated to tjerk.meesters for a speed improvement.
910
- // see http://code.google.com/p/oauth/issues/detail?id=163
911
- public static function split_header( $header, $only_allow_oauth_parameters = true )
912
- {
913
- $params = array();
914
- if ( preg_match_all( '/(' . ( $only_allow_oauth_parameters ? 'oauth_' : '' ) . '[a-z_-]*)=(:?"([^"]*)"|([^,]*))/', $header, $matches ) ) {
915
- foreach ( $matches[ 1 ] as $i => $h ) {
916
- $params[ $h ] = OAuthUtil::urldecode_rfc3986( empty( $matches[ 3 ][ $i ] ) ? $matches[ 4 ][ $i ] : $matches[ 3 ][ $i ] );
917
- }
918
- if ( isset( $params[ 'realm' ] ) ) {
919
- unset( $params[ 'realm' ] );
920
- }
921
- }
922
-
923
- return $params;
924
- }
925
-
926
- // helper to try to sort out headers for people who aren't running apache
927
- public static function get_headers()
928
- {
929
- if ( function_exists( 'apache_request_headers' ) ) {
930
- // we need this to get the actual Authorization: header
931
- // because apache tends to tell us it doesn't exist
932
- $headers = apache_request_headers();
933
-
934
- // sanitize the output of apache_request_headers because
935
- // we always want the keys to be Cased-Like-This and arh()
936
- // returns the headers in the same case as they are in the
937
- // request
938
- $out = array();
939
- foreach ( $headers AS $key => $value ) {
940
- $key = str_replace(
941
- " ",
942
- "-",
943
- ucwords( strtolower( str_replace( "-", " ", $key ) ) )
944
- );
945
- $out[ $key ] = $value;
946
- }
947
- } else {
948
- // otherwise we don't have apache and are just going to have to hope
949
- // that $_SERVER actually contains what we need
950
- $out = array();
951
- if ( isset( $_SERVER[ 'CONTENT_TYPE' ] ) )
952
- $out[ 'Content-Type' ] = $_SERVER[ 'CONTENT_TYPE' ];
953
- if ( isset( $_ENV[ 'CONTENT_TYPE' ] ) )
954
- $out[ 'Content-Type' ] = $_ENV[ 'CONTENT_TYPE' ];
955
-
956
- foreach ( $_SERVER as $key => $value ) {
957
- if ( substr( $key, 0, 5 ) == "HTTP_" ) {
958
- // this is chaos, basically it is just there to capitalize the first
959
- // letter of every word that is not an initial HTTP and strip HTTP
960
- // code from przemek
961
- $key = str_replace(
962
- " ",
963
- "-",
964
- ucwords( strtolower( str_replace( "_", " ", substr( $key, 5 ) ) ) )
965
- );
966
- $out[ $key ] = $value;
967
- }
968
- }
969
- }
970
-
971
- return $out;
972
- }
973
-
974
- // This function takes a input like a=b&a=c&d=e and returns the parsed
975
- // parameters like this
976
- // array('a' => array('b','c'), 'd' => 'e')
977
- public static function parse_parameters( $input )
978
- {
979
- if ( !isset( $input ) || !$input ) return array();
980
-
981
- $pairs = explode( '&', $input );
982
-
983
- $parsed_parameters = array();
984
- foreach ( $pairs as $pair ) {
985
- $split = explode( '=', $pair, 2 );
986
- $parameter = OAuthUtil::urldecode_rfc3986( $split[ 0 ] );
987
- $value = isset( $split[ 1 ] ) ? OAuthUtil::urldecode_rfc3986( $split[ 1 ] ) : '';
988
-
989
- if ( isset( $parsed_parameters[ $parameter ] ) ) {
990
- // We have already recieved parameter(s) with this name, so add to the list
991
- // of parameters with this name
992
-
993
- if ( is_scalar( $parsed_parameters[ $parameter ] ) ) {
994
- // This is the first duplicate, so transform scalar (string) into an array
995
- // so we can add the duplicates
996
- $parsed_parameters[ $parameter ] = array( $parsed_parameters[ $parameter ] );
997
- }
998
-
999
- $parsed_parameters[ $parameter ][ ] = $value;
1000
- } else {
1001
- $parsed_parameters[ $parameter ] = $value;
1002
- }
1003
- }
1004
-
1005
- return $parsed_parameters;
1006
- }
1007
-
1008
- public static function build_http_query( $params )
1009
- {
1010
- if ( !$params ) return '';
1011
-
1012
- // Urlencode both keys and values
1013
- $keys = OAuthUtil::urlencode_rfc3986( array_keys( $params ) );
1014
- $values = OAuthUtil::urlencode_rfc3986( array_values( $params ) );
1015
- $params = array_combine( $keys, $values );
1016
-
1017
- // Parameters are sorted by name, using lexicographical byte value ordering.
1018
- // Ref: Spec: 9.1.1 (1)
1019
- uksort( $params, 'strcmp' );
1020
-
1021
- $pairs = array();
1022
- foreach ( $params as $parameter => $value ) {
1023
- if ( is_array( $value ) ) {
1024
- // If two or more parameters share the same name, they are sorted by their value
1025
- // Ref: Spec: 9.1.1 (1)
1026
- // June 12th, 2010 - changed to sort because of issue 164 by hidetaka
1027
- sort( $value, SORT_STRING );
1028
- foreach ( $value as $duplicate_value ) {
1029
- $pairs[ ] = $parameter . '=' . $duplicate_value;
1030
- }
1031
- } else {
1032
- $pairs[ ] = $parameter . '=' . $value;
1033
- }
1034
- }
1035
-
1036
- // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
1037
- // Each name-value pair is separated by an '&' character (ASCII code 38)
1038
- return implode( '&', $pairs );
1039
- }
1040
- }
1041
- }
1042
- //PayPal specific modification starts
1043
- //Method to be called for generating signature
1044
- require_once( "AuthUtil.php" );
1045
- class AuthSignature
1046
- {
1047
-
1048
- public function genSign( $key, $secret, $token, $tokenSecret, $httpMethod, $endpoint )
1049
- {
1050
-
1051
-
1052
- $authServer = new OAuthServer( new MockOAuthDataStore() );
1053
- $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
1054
- $authServer->add_signature_method( $hmac_method );
1055
-
1056
- $sig_method = $hmac_method;
1057
- $authConsumer = new OAuthConsumer( $key, $secret, null );
1058
- $authToken = null;
1059
- $authToken = new OAuthToken( $token, $tokenSecret );
1060
-
1061
- //$params is the query param array which is required only in the httpMethod is "GET"
1062
-
1063
- $params = array();
1064
- //set the Query parameters to $params if httpMethod is "GET"
1065
-
1066
- $acc_req = OAuthRequest::from_consumer_and_token( $authConsumer, $authToken, $httpMethod, $endpoint, $params );
1067
-
1068
- $acc_req->sign_request( $sig_method, $authConsumer, $authToken );
1069
- $response = OAuthutil::parseQueryString( $acc_req );
1070
-
1071
- return $response;
1072
-
1073
- }
1074
- }
1075
-
1076
-
1077
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/cacert.pem DELETED
@@ -1,171 +0,0 @@
1
- Verisign Class 3 Public Primary Certification Authority
2
- =======================================================
3
- -----BEGIN CERTIFICATE-----
4
- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
5
- FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
6
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
7
- XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
8
- IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
9
- A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
10
- f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
11
- hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
12
- TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
13
- WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
14
- Tqj/ZA1k
15
- -----END CERTIFICATE-----
16
-
17
- Verisign Class 3 Public Primary Certification Authority - G2
18
- ============================================================
19
- -----BEGIN CERTIFICATE-----
20
- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
21
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
22
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
23
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
24
- dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
25
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
26
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
27
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
28
- dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
29
- FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
30
- lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
31
- MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
32
- 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
33
- Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
34
- -----END CERTIFICATE-----
35
-
36
-
37
- Verisign Class 3 Public Primary Certification Authority - G3
38
- ============================================================
39
- -----BEGIN CERTIFICATE-----
40
- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
41
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
42
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
43
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
44
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
45
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
46
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
47
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
48
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
49
- ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
50
- EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
51
- cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
52
- EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
53
- 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
54
- ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
55
- j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
56
- /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
57
- xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
58
- t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
59
- -----END CERTIFICATE-----
60
-
61
- Verisign Class 4 Public Primary Certification Authority - G3
62
- ============================================================
63
- -----BEGIN CERTIFICATE-----
64
- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
65
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
66
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
67
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
68
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
69
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
70
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
71
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
72
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
73
- ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
74
- tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
75
- 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
76
- Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
77
- Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
78
- j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
79
- mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
80
- fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
81
- RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
82
- UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
83
- -----END CERTIFICATE-----
84
- VeriSign Class 3 Public Primary Certification Authority - G5
85
- ============================================================
86
- -----BEGIN CERTIFICATE-----
87
- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
88
- BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
89
- ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
90
- IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
91
- ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
92
- yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
93
- biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
94
- dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
95
- YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
96
- ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
97
- j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
98
- Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
99
- Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
100
- fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
101
- BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
102
- Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
103
- aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
104
- SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
105
- X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
106
- KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
107
- Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
108
- ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
109
- -----END CERTIFICATE-----
110
- VeriSign Universal Root Certification Authority
111
- ===============================================
112
- -----BEGIN CERTIFICATE-----
113
- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
114
- BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
115
- ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
116
- IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
117
- IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
118
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
119
- cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
120
- IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
121
- aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
122
- 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
123
- MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
124
- 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
125
- AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
126
- tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
127
- CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
128
- a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
129
- DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
130
- Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
131
- Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
132
- P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
133
- wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
134
- mJO37M2CYfE45k+XmCpajQ==
135
- -----END CERTIFICATE-----
136
-
137
- VeriSign Class 3 Public Primary Certification Authority - G4
138
- ============================================================
139
- -----BEGIN CERTIFICATE-----
140
- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
141
- VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
142
- b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
143
- ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
144
- YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
145
- MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
146
- cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
147
- b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
148
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
149
- Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
150
- rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
151
- /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
152
- HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
153
- Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
154
- A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
155
- AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
156
- -----END CERTIFICATE-----
157
- Verisign Class 3 Public Primary Certification Authority
158
- =======================================================
159
- -----BEGIN CERTIFICATE-----
160
- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
161
- FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
162
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
163
- XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
164
- IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
165
- A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
166
- f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
167
- hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
168
- CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
169
- bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
170
- D/xwzoiQ
171
- -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPConfigurationException.php DELETED
@@ -1,9 +0,0 @@
1
- <?php
2
- class PPConfigurationException extends Exception
3
- {
4
-
5
- public function __construct( $message = null, $code = 0 )
6
- {
7
- parent::__construct( $message, $code );
8
- }
9
- }
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPConnectionException.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- class PPConnectionException extends Exception
3
- {
4
- /**
5
- * The url that was being connected to when the exception occured
6
- * @var string
7
- */
8
- private $url;
9
-
10
- public function __construct( $url, $message, $code = 0 )
11
- {
12
- parent::__construct( $message, $code );
13
- $this->url = $url;
14
- }
15
-
16
- public function getUrl()
17
- {
18
- return $this->url;
19
- }
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPInvalidCredentialException.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
-
3
-
4
- class PPInvalidCredentialException extends Exception
5
- {
6
-
7
- public function __construct( $message = null, $code = 0 )
8
- {
9
- parent::__construct( $message, $code );
10
- }
11
-
12
- public function errorMessage()
13
- {
14
- $errorMsg = 'Error on line ' . $this->getLine() . ' in ' . $this->getFile()
15
- . ': <b>' . $this->getMessage() . '</b>';
16
-
17
- return $errorMsg;
18
- }
19
-
20
- }
21
-
22
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPMissingCredentialException.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
-
3
-
4
- class PPMissingCredentialException extends Exception
5
- {
6
-
7
- public function __construct( $message = null, $code = 0 )
8
- {
9
- parent::__construct( $message, $code );
10
- }
11
-
12
- public function errorMessage()
13
- {
14
- $errorMsg = 'Error on line ' . $this->getLine() . ' in ' . $this->getFile()
15
- . ': <b>' . $this->getMessage() . '</b>';
16
-
17
- return $errorMsg;
18
- }
19
-
20
- }
21
-
22
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/exceptions/PPTransformerException.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- class PPTransformerException extends Exception
3
- {
4
-
5
- public function __construct( $message = null, $code = 0 )
6
- {
7
- parent::__construct( $message, $code );
8
- }
9
-
10
- public function errorMessage()
11
- {
12
- $errorMsg = 'Error on line ' . $this->getLine() . ' in ' . $this->getFile()
13
- . ': <b>' . $this->getMessage() . '</b>';
14
-
15
- return $errorMsg;
16
- }
17
-
18
- }
19
-
20
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/services/AdaptivePayments/AdaptivePayments.php DELETED
@@ -1,5797 +0,0 @@
1
- <?php
2
- /**
3
- * Stub objects for AdaptivePayments
4
- * Auto generated code
5
- *
6
- */
7
- require_once( 'PPUtils.php' );
8
- /**
9
- *
10
- */
11
- class AccountIdentifier
12
- {
13
-
14
- /**
15
- *
16
- * @access public
17
- * @var string
18
- */
19
- public $email;
20
-
21
- /**
22
- *
23
- * @access public
24
- * @var PhoneNumberType
25
- */
26
- public $phone;
27
-
28
-
29
- public function toNVPString( $prefix = '' )
30
- {
31
- $str = '';
32
- $delim = '';
33
- if ( $this->email != null ) {
34
- $str .= $delim . $prefix . 'email=' . urlencode( $this->email );
35
- $delim = '&';
36
- }
37
- if ( $this->phone != null ) {
38
- $newPrefix = $prefix . 'phone.';
39
- $str .= $delim . call_user_func( array( $this->phone, 'toNVPString' ), $newPrefix );
40
- $delim = '&';
41
- }
42
-
43
- return $str;
44
- }
45
-
46
- public function init( $map = null, $prefix = '' )
47
- {
48
- if ( $map != null ) {
49
- $mapKeyName = $prefix . 'email';
50
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
51
- $this->email = $map[ $mapKeyName ];
52
- }
53
- if ( PPUtils::array_match_key( $map, $prefix . "phone." ) ) {
54
- $newPrefix = $prefix . "phone.";
55
- $this->phone = new PhoneNumberType();
56
- $this->phone->init( $map, $newPrefix );
57
- }
58
-
59
- }
60
- }
61
- }
62
-
63
-
64
- /**
65
- *
66
- */
67
- class BaseAddress
68
- {
69
-
70
- /**
71
- *
72
- * @access public
73
- * @var string
74
- */
75
- public $line1;
76
-
77
- /**
78
- *
79
- * @access public
80
- * @var string
81
- */
82
- public $line2;
83
-
84
- /**
85
- *
86
- * @access public
87
- * @var string
88
- */
89
- public $city;
90
-
91
- /**
92
- *
93
- * @access public
94
- * @var string
95
- */
96
- public $state;
97
-
98
- /**
99
- *
100
- * @access public
101
- * @var string
102
- */
103
- public $postalCode;
104
-
105
- /**
106
- *
107
- * @access public
108
- * @var string
109
- */
110
- public $countryCode;
111
-
112
- /**
113
- *
114
- * @access public
115
- * @var string
116
- */
117
- public $type;
118
-
119
-
120
- public function init( $map = null, $prefix = '' )
121
- {
122
- if ( $map != null ) {
123
- $mapKeyName = $prefix . 'line1';
124
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
125
- $this->line1 = $map[ $mapKeyName ];
126
- }
127
- $mapKeyName = $prefix . 'line2';
128
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
129
- $this->line2 = $map[ $mapKeyName ];
130
- }
131
- $mapKeyName = $prefix . 'city';
132
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
133
- $this->city = $map[ $mapKeyName ];
134
- }
135
- $mapKeyName = $prefix . 'state';
136
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
137
- $this->state = $map[ $mapKeyName ];
138
- }
139
- $mapKeyName = $prefix . 'postalCode';
140
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
141
- $this->postalCode = $map[ $mapKeyName ];
142
- }
143
- $mapKeyName = $prefix . 'countryCode';
144
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
145
- $this->countryCode = $map[ $mapKeyName ];
146
- }
147
- $mapKeyName = $prefix . 'type';
148
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
149
- $this->type = $map[ $mapKeyName ];
150
- }
151
-
152
- }
153
- }
154
- }
155
-
156
-
157
- /**
158
- * Details about the end user of the application invoking this
159
- * service.
160
- */
161
- class ClientDetailsType
162
- {
163
-
164
- /**
165
- *
166
- * @access public
167
- * @var string
168
- */
169
- public $ipAddress;
170
-
171
- /**
172
- *
173
- * @access public
174
- * @var string
175
- */
176
- public $deviceId;
177
-
178
- /**
179
- *
180
- * @access public
181
- * @var string
182
- */
183
- public $applicationId;
184
-
185
- /**
186
- *
187
- * @access public
188
- * @var string
189
- */
190
- public $model;
191
-
192
- /**
193
- *
194
- * @access public
195
- * @var string
196
- */
197
- public $geoLocation;
198
-
199
- /**
200
- *
201
- * @access public
202
- * @var string
203
- */
204
- public $customerType;
205
-
206
- /**
207
- *
208
- * @access public
209
- * @var string
210
- */
211
- public $partnerName;
212
-
213
- /**
214
- *
215
- * @access public
216
- * @var string
217
- */
218
- public $customerId;
219
-
220
-
221
- public function toNVPString( $prefix = '' )
222
- {
223
- $str = '';
224
- $delim = '';
225
- if ( $this->ipAddress != null ) {
226
- $str .= $delim . $prefix . 'ipAddress=' . urlencode( $this->ipAddress );
227
- $delim = '&';
228
- }
229
- if ( $this->deviceId != null ) {
230
- $str .= $delim . $prefix . 'deviceId=' . urlencode( $this->deviceId );
231
- $delim = '&';
232
- }
233
- if ( $this->applicationId != null ) {
234
- $str .= $delim . $prefix . 'applicationId=' . urlencode( $this->applicationId );
235
- $delim = '&';
236
- }
237
- if ( $this->model != null ) {
238
- $str .= $delim . $prefix . 'model=' . urlencode( $this->model );
239
- $delim = '&';
240
- }
241
- if ( $this->geoLocation != null ) {
242
- $str .= $delim . $prefix . 'geoLocation=' . urlencode( $this->geoLocation );
243
- $delim = '&';
244
- }
245
- if ( $this->customerType != null ) {
246
- $str .= $delim . $prefix . 'customerType=' . urlencode( $this->customerType );
247
- $delim = '&';
248
- }
249
- if ( $this->partnerName != null ) {
250
- $str .= $delim . $prefix . 'partnerName=' . urlencode( $this->partnerName );
251
- $delim = '&';
252
- }
253
- if ( $this->customerId != null ) {
254
- $str .= $delim . $prefix . 'customerId=' . urlencode( $this->customerId );
255
- $delim = '&';
256
- }
257
-
258
- return $str;
259
- }
260
-
261
- }
262
-
263
-
264
- /**
265
- *
266
- */
267
- class CurrencyType
268
- {
269
-
270
- /**
271
- *
272
- * @access public
273
- * @var string
274
- */
275
- public $code;
276
-
277
- /**
278
- *
279
- * @access public
280
- * @var double
281
- */
282
- public $amount;
283
-
284
- /**
285
- * Constructor with arguments
286
- */
287
- public function __construct( $code = null, $amount = null )
288
- {
289
- $this->code = $code;
290
- $this->amount = $amount;
291
- }
292
-
293
-
294
- public function toNVPString( $prefix = '' )
295
- {
296
- $str = '';
297
- $delim = '';
298
- if ( $this->code != null ) {
299
- $str .= $delim . $prefix . 'code=' . urlencode( $this->code );
300
- $delim = '&';
301
- }
302
- if ( $this->amount != null ) {
303
- $str .= $delim . $prefix . 'amount=' . urlencode( $this->amount );
304
- $delim = '&';
305
- }
306
-
307
- return $str;
308
- }
309
-
310
- public function init( $map = null, $prefix = '' )
311
- {
312
- if ( $map != null ) {
313
- $mapKeyName = $prefix . 'code';
314
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
315
- $this->code = $map[ $mapKeyName ];
316
- }
317
- $mapKeyName = $prefix . 'amount';
318
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
319
- $this->amount = $map[ $mapKeyName ];
320
- }
321
-
322
- }
323
- }
324
- }
325
-
326
-
327
- /**
328
- * This type contains the detailed error information resulting
329
- * from the service operation.
330
- */
331
- class ErrorData
332
- {
333
-
334
- /**
335
- *
336
- * @access public
337
- * @var integer
338
- */
339
- public $errorId;
340
-
341
- /**
342
- *
343
- * @access public
344
- * @var string
345
- */
346
- public $domain;
347
-
348
- /**
349
- *
350
- * @access public
351
- * @var string
352
- */
353
- public $subdomain;
354
-
355
- /**
356
- *
357
- * @access public
358
- * @var ErrorSeverity
359
- */
360
- public $severity;
361
-
362
- /**
363
- *
364
- * @access public
365
- * @var ErrorCategory
366
- */
367
- public $category;
368
-
369
- /**
370
- *
371
- * @access public
372
- * @var string
373
- */
374
- public $message;
375
-
376
- /**
377
- *
378
- * @access public
379
- * @var string
380
- */
381
- public $exceptionId;
382
-
383
- /**
384
- *
385
- * @array
386
- * @access public
387
- * @var ErrorParameter
388
- */
389
- public $parameter;
390
-
391
-
392
- public function init( $map = null, $prefix = '' )
393
- {
394
- if ( $map != null ) {
395
- $mapKeyName = $prefix . 'errorId';
396
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
397
- $this->errorId = $map[ $mapKeyName ];
398
- }
399
- $mapKeyName = $prefix . 'domain';
400
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
401
- $this->domain = $map[ $mapKeyName ];
402
- }
403
- $mapKeyName = $prefix . 'subdomain';
404
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
405
- $this->subdomain = $map[ $mapKeyName ];
406
- }
407
- $mapKeyName = $prefix . 'severity';
408
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
409
- $this->severity = $map[ $mapKeyName ];
410
- }
411
- $mapKeyName = $prefix . 'category';
412
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
413
- $this->category = $map[ $mapKeyName ];
414
- }
415
- $mapKeyName = $prefix . 'message';
416
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
417
- $this->message = $map[ $mapKeyName ];
418
- }
419
- $mapKeyName = $prefix . 'exceptionId';
420
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
421
- $this->exceptionId = $map[ $mapKeyName ];
422
- }
423
- $i = 0;
424
- while ( true ) {
425
- if ( PPUtils::array_match_key( $map, $prefix . "parameter($i)" ) ) {
426
- $newPrefix = $prefix . "parameter($i).";
427
- $this->parameter[ $i ] = new ErrorParameter();
428
- $this->parameter[ $i ]->init( $map, $newPrefix );
429
- } else {
430
- break;
431
- }
432
- $i++;
433
- }
434
-
435
- }
436
- }
437
- }
438
-
439
-
440
- /**
441
- *
442
- */
443
- class ErrorParameter
444
- {
445
-
446
- /**
447
- *
448
- * @access public
449
- * @var string
450
- */
451
- public $name;
452
-
453
- /**
454
- *
455
- * @access public
456
- * @var string
457
- */
458
- public $value;
459
-
460
-
461
- public function init( $map = null, $prefix = '' )
462
- {
463
- if ( $map != null ) {
464
- $mapKeyName = $prefix . 'name';
465
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
466
- $this->name = $map[ $mapKeyName ];
467
- }
468
- $mapKeyName = $prefix . 'value';
469
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
470
- $this->value = $map[ $mapKeyName ];
471
- }
472
-
473
- }
474
- }
475
- }
476
-
477
-
478
- /**
479
- * This specifies a fault, encapsulating error data, with
480
- * specific error codes.
481
- */
482
- class FaultMessage
483
- {
484
-
485
- /**
486
- *
487
- * @access public
488
- * @var ResponseEnvelope
489
- */
490
- public $responseEnvelope;
491
-
492
- /**
493
- *
494
- * @array
495
- * @access public
496
- * @var ErrorData
497
- */
498
- public $error;
499
-
500
-
501
- public function init( $map = null, $prefix = '' )
502
- {
503
- if ( $map != null ) {
504
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
505
- $newPrefix = $prefix . "responseEnvelope.";
506
- $this->responseEnvelope = new ResponseEnvelope();
507
- $this->responseEnvelope->init( $map, $newPrefix );
508
- }
509
- $i = 0;
510
- while ( true ) {
511
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
512
- $newPrefix = $prefix . "error($i).";
513
- $this->error[ $i ] = new ErrorData();
514
- $this->error[ $i ]->init( $map, $newPrefix );
515
- } else {
516
- break;
517
- }
518
- $i++;
519
- }
520
-
521
- }
522
- }
523
- }
524
-
525
-
526
- /**
527
- *
528
- */
529
- class PhoneNumberType
530
- {
531
-
532
- /**
533
- *
534
- * @access public
535
- * @var string
536
- */
537
- public $countryCode;
538
-
539
- /**
540
- *
541
- * @access public
542
- * @var string
543
- */
544
- public $phoneNumber;
545
-
546
- /**
547
- *
548
- * @access public
549
- * @var string
550
- */
551
- public $extension;
552
-
553
- /**
554
- * Constructor with arguments
555
- */
556
- public function __construct( $countryCode = null, $phoneNumber = null )
557
- {
558
- $this->countryCode = $countryCode;
559
- $this->phoneNumber = $phoneNumber;
560
- }
561
-
562
-
563
- public function toNVPString( $prefix = '' )
564
- {
565
- $str = '';
566
- $delim = '';
567
- if ( $this->countryCode != null ) {
568
- $str .= $delim . $prefix . 'countryCode=' . urlencode( $this->countryCode );
569
- $delim = '&';
570
- }
571
- if ( $this->phoneNumber != null ) {
572
- $str .= $delim . $prefix . 'phoneNumber=' . urlencode( $this->phoneNumber );
573
- $delim = '&';
574
- }
575
- if ( $this->extension != null ) {
576
- $str .= $delim . $prefix . 'extension=' . urlencode( $this->extension );
577
- $delim = '&';
578
- }
579
-
580
- return $str;
581
- }
582
-
583
- public function init( $map = null, $prefix = '' )
584
- {
585
- if ( $map != null ) {
586
- $mapKeyName = $prefix . 'countryCode';
587
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
588
- $this->countryCode = $map[ $mapKeyName ];
589
- }
590
- $mapKeyName = $prefix . 'phoneNumber';
591
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
592
- $this->phoneNumber = $map[ $mapKeyName ];
593
- }
594
- $mapKeyName = $prefix . 'extension';
595
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
596
- $this->extension = $map[ $mapKeyName ];
597
- }
598
-
599
- }
600
- }
601
- }
602
-
603
-
604
- /**
605
- * This specifies the list of parameters with every request to
606
- * the service.
607
- */
608
- class RequestEnvelope
609
- {
610
-
611
- /**
612
- * This specifies the required detail level that is needed by a
613
- * client application pertaining to a particular data component
614
- * (e.g., Item, Transaction, etc.). The detail level is
615
- * specified in the DetailLevelCodeType which has all the
616
- * enumerated values of the detail level for each component.
617
- * @access public
618
- * @var DetailLevelCode
619
- */
620
- public $detailLevel;
621
-
622
- /**
623
- * This should be the standard RFC 3066 language identification
624
- * tag, e.g., en_US.
625
- * @access public
626
- * @var string
627
- */
628
- public $errorLanguage;
629
-
630
- /**
631
- * Constructor with arguments
632
- */
633
- public function __construct( $errorLanguage = null )
634
- {
635
- $this->errorLanguage = $errorLanguage;
636
- }
637
-
638
-
639
- public function toNVPString( $prefix = '' )
640
- {
641
- $str = '';
642
- $delim = '';
643
- if ( $this->detailLevel != null ) {
644
- $str .= $delim . $prefix . 'detailLevel=' . urlencode( $this->detailLevel );
645
- $delim = '&';
646
- }
647
- if ( $this->errorLanguage != null ) {
648
- $str .= $delim . $prefix . 'errorLanguage=' . urlencode( $this->errorLanguage );
649
- $delim = '&';
650
- }
651
-
652
- return $str;
653
- }
654
-
655
- }
656
-
657
-
658
- /**
659
- * This specifies a list of parameters with every response from
660
- * a service.
661
- */
662
- class ResponseEnvelope
663
- {
664
-
665
- /**
666
- *
667
- * @access public
668
- * @var dateTime
669
- */
670
- public $timestamp;
671
-
672
- /**
673
- * Application level acknowledgment code.
674
- * @access public
675
- * @var AckCode
676
- */
677
- public $ack;
678
-
679
- /**
680
- *
681
- * @access public
682
- * @var string
683
- */
684
- public $correlationId;
685
-
686
- /**
687
- *
688
- * @access public
689
- * @var string
690
- */
691
- public $build;
692
-
693
-
694
- public function init( $map = null, $prefix = '' )
695
- {
696
- if ( $map != null ) {
697
- $mapKeyName = $prefix . 'timestamp';
698
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
699
- $this->timestamp = $map[ $mapKeyName ];
700
- }
701
- $mapKeyName = $prefix . 'ack';
702
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
703
- $this->ack = $map[ $mapKeyName ];
704
- }
705
- $mapKeyName = $prefix . 'correlationId';
706
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
707
- $this->correlationId = $map[ $mapKeyName ];
708
- }
709
- $mapKeyName = $prefix . 'build';
710
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
711
- $this->build = $map[ $mapKeyName ];
712
- }
713
-
714
- }
715
- }
716
- }
717
-
718
-
719
- /**
720
- *
721
- */
722
- class Address
723
- {
724
-
725
- /**
726
- *
727
- * @access public
728
- * @var string
729
- */
730
- public $addresseeName;
731
-
732
- /**
733
- *
734
- * @access public
735
- * @var BaseAddress
736
- */
737
- public $baseAddress;
738
-
739
- /**
740
- *
741
- * @access public
742
- * @var string
743
- */
744
- public $addressId;
745
-
746
-
747
- public function init( $map = null, $prefix = '' )
748
- {
749
- if ( $map != null ) {
750
- $mapKeyName = $prefix . 'addresseeName';
751
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
752
- $this->addresseeName = $map[ $mapKeyName ];
753
- }
754
- if ( PPUtils::array_match_key( $map, $prefix . "baseAddress." ) ) {
755
- $newPrefix = $prefix . "baseAddress.";
756
- $this->baseAddress = new BaseAddress();
757
- $this->baseAddress->init( $map, $newPrefix );
758
- }
759
- $mapKeyName = $prefix . 'addressId';
760
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
761
- $this->addressId = $map[ $mapKeyName ];
762
- }
763
-
764
- }
765
- }
766
- }
767
-
768
-
769
- /**
770
- *
771
- */
772
- class AddressList
773
- {
774
-
775
- /**
776
- *
777
- * @array
778
- * @access public
779
- * @var Address
780
- */
781
- public $address;
782
-
783
-
784
- public function init( $map = null, $prefix = '' )
785
- {
786
- if ( $map != null ) {
787
- $i = 0;
788
- while ( true ) {
789
- if ( PPUtils::array_match_key( $map, $prefix . "address($i)" ) ) {
790
- $newPrefix = $prefix . "address($i).";
791
- $this->address[ $i ] = new Address();
792
- $this->address[ $i ]->init( $map, $newPrefix );
793
- } else {
794
- break;
795
- }
796
- $i++;
797
- }
798
-
799
- }
800
- }
801
- }
802
-
803
-
804
- /**
805
- * A list of ISO currency codes.
806
- */
807
- class CurrencyCodeList
808
- {
809
-
810
- /**
811
- *
812
- * @array
813
- * @access public
814
- * @var string
815
- */
816
- public $currencyCode;
817
-
818
- /**
819
- * Constructor with arguments
820
- */
821
- public function __construct( $currencyCode = null )
822
- {
823
- $this->currencyCode = $currencyCode;
824
- }
825
-
826
-
827
- public function toNVPString( $prefix = '' )
828
- {
829
- $str = '';
830
- $delim = '';
831
- for ( $i = 0; $i < count( $this->currencyCode ); $i++ ) {
832
- $str .= $delim . $prefix . "currencyCode($i)=" . urlencode( $this->currencyCode[ $i ] );
833
- $delim = '&';
834
- }
835
-
836
- return $str;
837
- }
838
-
839
- }
840
-
841
-
842
- /**
843
- * A list of estimated currency conversions for a base
844
- * currency.
845
- */
846
- class CurrencyConversionList
847
- {
848
-
849
- /**
850
- *
851
- * @access public
852
- * @var CurrencyType
853
- */
854
- public $baseAmount;
855
-
856
- /**
857
- *
858
- * @access public
859
- * @var CurrencyList
860
- */
861
- public $currencyList;
862
-
863
-
864
- public function init( $map = null, $prefix = '' )
865
- {
866
- if ( $map != null ) {
867
- if ( PPUtils::array_match_key( $map, $prefix . "baseAmount." ) ) {
868
- $newPrefix = $prefix . "baseAmount.";
869
- $this->baseAmount = new CurrencyType();
870
- $this->baseAmount->init( $map, $newPrefix );
871
- }
872
- if ( PPUtils::array_match_key( $map, $prefix . "currencyList." ) ) {
873
- $newPrefix = $prefix . "currencyList.";
874
- $this->currencyList = new CurrencyList();
875
- $this->currencyList->init( $map, $newPrefix );
876
- }
877
-
878
- }
879
- }
880
- }
881
-
882
-
883
- /**
884
- * A table that contains a list of estimated currency
885
- * conversions for a base currency in each row.
886
- */
887
- class CurrencyConversionTable
888
- {
889
-
890
- /**
891
- *
892
- * @array
893
- * @access public
894
- * @var CurrencyConversionList
895
- */
896
- public $currencyConversionList;
897
-
898
-
899
- public function init( $map = null, $prefix = '' )
900
- {
901
- if ( $map != null ) {
902
- $i = 0;
903
- while ( true ) {
904
- if ( PPUtils::array_match_key( $map, $prefix . "currencyConversionList($i)" ) ) {
905
- $newPrefix = $prefix . "currencyConversionList($i).";
906
- $this->currencyConversionList[ $i ] = new CurrencyConversionList();
907
- $this->currencyConversionList[ $i ]->init( $map, $newPrefix );
908
- } else {
909
- break;
910
- }
911
- $i++;
912
- }
913
-
914
- }
915
- }
916
- }
917
-
918
-
919
- /**
920
- * A list of ISO currencies.
921
- */
922
- class CurrencyList
923
- {
924
-
925
- /**
926
- *
927
- * @array
928
- * @access public
929
- * @var CurrencyType
930
- */
931
- public $currency;
932
-
933
- /**
934
- * Constructor with arguments
935
- */
936
- public function __construct( $currency = null )
937
- {
938
- $this->currency = $currency;
939
- }
940
-
941
-
942
- public function toNVPString( $prefix = '' )
943
- {
944
- $str = '';
945
- $delim = '';
946
- for ( $i = 0; $i < count( $this->currency ); $i++ ) {
947
- $newPrefix = $prefix . "currency($i).";
948
- $str .= $delim . call_user_func( array( $this->currency[ $i ], 'toNVPString' ), $newPrefix );
949
- $delim = '&';
950
- }
951
-
952
- return $str;
953
- }
954
-
955
- public function init( $map = null, $prefix = '' )
956
- {
957
- if ( $map != null ) {
958
- $i = 0;
959
- while ( true ) {
960
- if ( PPUtils::array_match_key( $map, $prefix . "currency($i)" ) ) {
961
- $newPrefix = $prefix . "currency($i).";
962
- $this->currency[ $i ] = new CurrencyType();
963
- $this->currency[ $i ]->init( $map, $newPrefix );
964
- } else {
965
- break;
966
- }
967
- $i++;
968
- }
969
-
970
- }
971
- }
972
- }
973
-
974
-
975
- /**
976
- * Customizable options that a client application can specify
977
- * for display purposes.
978
- */
979
- class DisplayOptions
980
- {
981
-
982
- /**
983
- *
984
- * @access public
985
- * @var string
986
- */
987
- public $emailHeaderImageUrl;
988
-
989
- /**
990
- *
991
- * @access public
992
- * @var string
993
- */
994
- public $emailMarketingImageUrl;
995
-
996
- /**
997
- *
998
- * @access public
999
- * @var string
1000
- */
1001
- public $headerImageUrl;
1002
-
1003
- /**
1004
- *
1005
- * @access public
1006
- * @var string
1007
- */
1008
- public $businessName;
1009
-
1010
-
1011
- public function toNVPString( $prefix = '' )
1012
- {
1013
- $str = '';
1014
- $delim = '';
1015
- if ( $this->emailHeaderImageUrl != null ) {
1016
- $str .= $delim . $prefix . 'emailHeaderImageUrl=' . urlencode( $this->emailHeaderImageUrl );
1017
- $delim = '&';
1018
- }
1019
- if ( $this->emailMarketingImageUrl != null ) {
1020
- $str .= $delim . $prefix . 'emailMarketingImageUrl=' . urlencode( $this->emailMarketingImageUrl );
1021
- $delim = '&';
1022
- }
1023
- if ( $this->headerImageUrl != null ) {
1024
- $str .= $delim . $prefix . 'headerImageUrl=' . urlencode( $this->headerImageUrl );
1025
- $delim = '&';
1026
- }
1027
- if ( $this->businessName != null ) {
1028
- $str .= $delim . $prefix . 'businessName=' . urlencode( $this->businessName );
1029
- $delim = '&';
1030
- }
1031
-
1032
- return $str;
1033
- }
1034
-
1035
- public function init( $map = null, $prefix = '' )
1036
- {
1037
- if ( $map != null ) {
1038
- $mapKeyName = $prefix . 'emailHeaderImageUrl';
1039
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1040
- $this->emailHeaderImageUrl = $map[ $mapKeyName ];
1041
- }
1042
- $mapKeyName = $prefix . 'emailMarketingImageUrl';
1043
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1044
- $this->emailMarketingImageUrl = $map[ $mapKeyName ];
1045
- }
1046
- $mapKeyName = $prefix . 'headerImageUrl';
1047
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1048
- $this->headerImageUrl = $map[ $mapKeyName ];
1049
- }
1050
- $mapKeyName = $prefix . 'businessName';
1051
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1052
- $this->businessName = $map[ $mapKeyName ];
1053
- }
1054
-
1055
- }
1056
- }
1057
- }
1058
-
1059
-
1060
- /**
1061
- *
1062
- */
1063
- class ErrorList
1064
- {
1065
-
1066
- /**
1067
- *
1068
- * @array
1069
- * @access public
1070
- * @var ErrorData
1071
- */
1072
- public $error;
1073
-
1074
-
1075
- public function init( $map = null, $prefix = '' )
1076
- {
1077
- if ( $map != null ) {
1078
- $i = 0;
1079
- while ( true ) {
1080
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
1081
- $newPrefix = $prefix . "error($i).";
1082
- $this->error[ $i ] = new ErrorData();
1083
- $this->error[ $i ]->init( $map, $newPrefix );
1084
- } else {
1085
- break;
1086
- }
1087
- $i++;
1088
- }
1089
-
1090
- }
1091
- }
1092
- }
1093
-
1094
-
1095
- /**
1096
- *
1097
- */
1098
- class FundingConstraint
1099
- {
1100
-
1101
- /**
1102
- *
1103
- * @access public
1104
- * @var FundingTypeList
1105
- */
1106
- public $allowedFundingType;
1107
-
1108
-
1109
- public function toNVPString( $prefix = '' )
1110
- {
1111
- $str = '';
1112
- $delim = '';
1113
- if ( $this->allowedFundingType != null ) {
1114
- $newPrefix = $prefix . 'allowedFundingType.';
1115
- $str .= $delim . call_user_func( array( $this->allowedFundingType, 'toNVPString' ), $newPrefix );
1116
- $delim = '&';
1117
- }
1118
-
1119
- return $str;
1120
- }
1121
-
1122
- public function init( $map = null, $prefix = '' )
1123
- {
1124
- if ( $map != null ) {
1125
- if ( PPUtils::array_match_key( $map, $prefix . "allowedFundingType." ) ) {
1126
- $newPrefix = $prefix . "allowedFundingType.";
1127
- $this->allowedFundingType = new FundingTypeList();
1128
- $this->allowedFundingType->init( $map, $newPrefix );
1129
- }
1130
-
1131
- }
1132
- }
1133
- }
1134
-
1135
-
1136
- /**
1137
- * FundingTypeInfo represents one allowed funding type.
1138
- */
1139
- class FundingTypeInfo
1140
- {
1141
-
1142
- /**
1143
- *
1144
- * @access public
1145
- * @var string
1146
- */
1147
- public $fundingType;
1148
-
1149
- /**
1150
- * Constructor with arguments
1151
- */
1152
- public function __construct( $fundingType = null )
1153
- {
1154
- $this->fundingType = $fundingType;
1155
- }
1156
-
1157
-
1158
- public function toNVPString( $prefix = '' )
1159
- {
1160
- $str = '';
1161
- $delim = '';
1162
- if ( $this->fundingType != null ) {
1163
- $str .= $delim . $prefix . 'fundingType=' . urlencode( $this->fundingType );
1164
- $delim = '&';
1165
- }
1166
-
1167
- return $str;
1168
- }
1169
-
1170
- public function init( $map = null, $prefix = '' )
1171
- {
1172
- if ( $map != null ) {
1173
- $mapKeyName = $prefix . 'fundingType';
1174
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1175
- $this->fundingType = $map[ $mapKeyName ];
1176
- }
1177
-
1178
- }
1179
- }
1180
- }
1181
-
1182
-
1183
- /**
1184
- *
1185
- */
1186
- class FundingTypeList
1187
- {
1188
-
1189
- /**
1190
- *
1191
- * @array
1192
- * @access public
1193
- * @var FundingTypeInfo
1194
- */
1195
- public $fundingTypeInfo;
1196
-
1197
- /**
1198
- * Constructor with arguments
1199
- */
1200
- public function __construct( $fundingTypeInfo = null )
1201
- {
1202
- $this->fundingTypeInfo = $fundingTypeInfo;
1203
- }
1204
-
1205
-
1206
- public function toNVPString( $prefix = '' )
1207
- {
1208
- $str = '';
1209
- $delim = '';
1210
- for ( $i = 0; $i < count( $this->fundingTypeInfo ); $i++ ) {
1211
- $newPrefix = $prefix . "fundingTypeInfo($i).";
1212
- $str .= $delim . call_user_func( array( $this->fundingTypeInfo[ $i ], 'toNVPString' ), $newPrefix );
1213
- $delim = '&';
1214
- }
1215
-
1216
- return $str;
1217
- }
1218
-
1219
- public function init( $map = null, $prefix = '' )
1220
- {
1221
- if ( $map != null ) {
1222
- $i = 0;
1223
- while ( true ) {
1224
- if ( PPUtils::array_match_key( $map, $prefix . "fundingTypeInfo($i)" ) ) {
1225
- $newPrefix = $prefix . "fundingTypeInfo($i).";
1226
- $this->fundingTypeInfo[ $i ] = new FundingTypeInfo();
1227
- $this->fundingTypeInfo[ $i ]->init( $map, $newPrefix );
1228
- } else {
1229
- break;
1230
- }
1231
- $i++;
1232
- }
1233
-
1234
- }
1235
- }
1236
- }
1237
-
1238
-
1239
- /**
1240
- * Describes the conversion between 2 currencies.
1241
- */
1242
- class CurrencyConversion
1243
- {
1244
-
1245
- /**
1246
- *
1247
- * @access public
1248
- * @var CurrencyType
1249
- */
1250
- public $from;
1251
-
1252
- /**
1253
- *
1254
- * @access public
1255
- * @var CurrencyType
1256
- */
1257
- public $to;
1258
-
1259
- /**
1260
- *
1261
- * @access public
1262
- * @var double
1263
- */
1264
- public $exchangeRate;
1265
-
1266
-
1267
- public function init( $map = null, $prefix = '' )
1268
- {
1269
- if ( $map != null ) {
1270
- if ( PPUtils::array_match_key( $map, $prefix . "from." ) ) {
1271
- $newPrefix = $prefix . "from.";
1272
- $this->from = new CurrencyType();
1273
- $this->from->init( $map, $newPrefix );
1274
- }
1275
- if ( PPUtils::array_match_key( $map, $prefix . "to." ) ) {
1276
- $newPrefix = $prefix . "to.";
1277
- $this->to = new CurrencyType();
1278
- $this->to->init( $map, $newPrefix );
1279
- }
1280
- $mapKeyName = $prefix . 'exchangeRate';
1281
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1282
- $this->exchangeRate = $map[ $mapKeyName ];
1283
- }
1284
-
1285
- }
1286
- }
1287
- }
1288
-
1289
-
1290
- /**
1291
- * Funding source information.
1292
- */
1293
- class FundingSource
1294
- {
1295
-
1296
- /**
1297
- *
1298
- * @access public
1299
- * @var string
1300
- */
1301
- public $lastFourOfAccountNumber;
1302
-
1303
- /**
1304
- *
1305
- * @access public
1306
- * @var string
1307
- */
1308
- public $type;
1309
-
1310
- /**
1311
- *
1312
- * @access public
1313
- * @var string
1314
- */
1315
- public $displayName;
1316
-
1317
- /**
1318
- *
1319
- * @access public
1320
- * @var string
1321
- */
1322
- public $fundingSourceId;
1323
-
1324
- /**
1325
- *
1326
- * @access public
1327
- * @var boolean
1328
- */
1329
- public $allowed;
1330
-
1331
-
1332
- public function init( $map = null, $prefix = '' )
1333
- {
1334
- if ( $map != null ) {
1335
- $mapKeyName = $prefix . 'lastFourOfAccountNumber';
1336
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1337
- $this->lastFourOfAccountNumber = $map[ $mapKeyName ];
1338
- }
1339
- $mapKeyName = $prefix . 'type';
1340
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1341
- $this->type = $map[ $mapKeyName ];
1342
- }
1343
- $mapKeyName = $prefix . 'displayName';
1344
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1345
- $this->displayName = $map[ $mapKeyName ];
1346
- }
1347
- $mapKeyName = $prefix . 'fundingSourceId';
1348
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1349
- $this->fundingSourceId = $map[ $mapKeyName ];
1350
- }
1351
- $mapKeyName = $prefix . 'allowed';
1352
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1353
- $this->allowed = $map[ $mapKeyName ];
1354
- }
1355
-
1356
- }
1357
- }
1358
- }
1359
-
1360
-
1361
- /**
1362
- * Amount to be charged to a particular funding source.
1363
- */
1364
- class FundingPlanCharge
1365
- {
1366
-
1367
- /**
1368
- *
1369
- * @access public
1370
- * @var CurrencyType
1371
- */
1372
- public $charge;
1373
-
1374
- /**
1375
- *
1376
- * @access public
1377
- * @var FundingSource
1378
- */
1379
- public $fundingSource;
1380
-
1381
-
1382
- public function init( $map = null, $prefix = '' )
1383
- {
1384
- if ( $map != null ) {
1385
- if ( PPUtils::array_match_key( $map, $prefix . "charge." ) ) {
1386
- $newPrefix = $prefix . "charge.";
1387
- $this->charge = new CurrencyType();
1388
- $this->charge->init( $map, $newPrefix );
1389
- }
1390
- if ( PPUtils::array_match_key( $map, $prefix . "fundingSource." ) ) {
1391
- $newPrefix = $prefix . "fundingSource.";
1392
- $this->fundingSource = new FundingSource();
1393
- $this->fundingSource->init( $map, $newPrefix );
1394
- }
1395
-
1396
- }
1397
- }
1398
- }
1399
-
1400
-
1401
- /**
1402
- * FundingPlan describes the funding sources to be used for a
1403
- * specific payment.
1404
- */
1405
- class FundingPlan
1406
- {
1407
-
1408
- /**
1409
- *
1410
- * @access public
1411
- * @var string
1412
- */
1413
- public $fundingPlanId;
1414
-
1415
- /**
1416
- *
1417
- * @access public
1418
- * @var CurrencyType
1419
- */
1420
- public $fundingAmount;
1421
-
1422
- /**
1423
- *
1424
- * @access public
1425
- * @var FundingSource
1426
- */
1427
- public $backupFundingSource;
1428
-
1429
- /**
1430
- *
1431
- * @access public
1432
- * @var CurrencyType
1433
- */
1434
- public $senderFees;
1435
-
1436
- /**
1437
- *
1438
- * @access public
1439
- * @var CurrencyConversion
1440
- */
1441
- public $currencyConversion;
1442
-
1443
- /**
1444
- *
1445
- * @array
1446
- * @access public
1447
- * @var FundingPlanCharge
1448
- */
1449
- public $charge;
1450
-
1451
-
1452
- public function init( $map = null, $prefix = '' )
1453
- {
1454
- if ( $map != null ) {
1455
- $mapKeyName = $prefix . 'fundingPlanId';
1456
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1457
- $this->fundingPlanId = $map[ $mapKeyName ];
1458
- }
1459
- if ( PPUtils::array_match_key( $map, $prefix . "fundingAmount." ) ) {
1460
- $newPrefix = $prefix . "fundingAmount.";
1461
- $this->fundingAmount = new CurrencyType();
1462
- $this->fundingAmount->init( $map, $newPrefix );
1463
- }
1464
- if ( PPUtils::array_match_key( $map, $prefix . "backupFundingSource." ) ) {
1465
- $newPrefix = $prefix . "backupFundingSource.";
1466
- $this->backupFundingSource = new FundingSource();
1467
- $this->backupFundingSource->init( $map, $newPrefix );
1468
- }
1469
- if ( PPUtils::array_match_key( $map, $prefix . "senderFees." ) ) {
1470
- $newPrefix = $prefix . "senderFees.";
1471
- $this->senderFees = new CurrencyType();
1472
- $this->senderFees->init( $map, $newPrefix );
1473
- }
1474
- if ( PPUtils::array_match_key( $map, $prefix . "currencyConversion." ) ) {
1475
- $newPrefix = $prefix . "currencyConversion.";
1476
- $this->currencyConversion = new CurrencyConversion();
1477
- $this->currencyConversion->init( $map, $newPrefix );
1478
- }
1479
- $i = 0;
1480
- while ( true ) {
1481
- if ( PPUtils::array_match_key( $map, $prefix . "charge($i)" ) ) {
1482
- $newPrefix = $prefix . "charge($i).";
1483
- $this->charge[ $i ] = new FundingPlanCharge();
1484
- $this->charge[ $i ]->init( $map, $newPrefix );
1485
- } else {
1486
- break;
1487
- }
1488
- $i++;
1489
- }
1490
-
1491
- }
1492
- }
1493
- }
1494
-
1495
-
1496
- /**
1497
- * Details about the party that initiated this payment. The API
1498
- * user is making this payment on behalf of the initiator. The
1499
- * initiator can simply be an institution or a customer of the
1500
- * institution.
1501
- */
1502
- class InitiatingEntity
1503
- {
1504
-
1505
- /**
1506
- *
1507
- * @access public
1508
- * @var InstitutionCustomer
1509
- */
1510
- public $institutionCustomer;
1511
-
1512
-
1513
- public function toNVPString( $prefix = '' )
1514
- {
1515
- $str = '';
1516
- $delim = '';
1517
- if ( $this->institutionCustomer != null ) {
1518
- $newPrefix = $prefix . 'institutionCustomer.';
1519
- $str .= $delim . call_user_func( array( $this->institutionCustomer, 'toNVPString' ), $newPrefix );
1520
- $delim = '&';
1521
- }
1522
-
1523
- return $str;
1524
- }
1525
-
1526
- public function init( $map = null, $prefix = '' )
1527
- {
1528
- if ( $map != null ) {
1529
- if ( PPUtils::array_match_key( $map, $prefix . "institutionCustomer." ) ) {
1530
- $newPrefix = $prefix . "institutionCustomer.";
1531
- $this->institutionCustomer = new InstitutionCustomer();
1532
- $this->institutionCustomer->init( $map, $newPrefix );
1533
- }
1534
-
1535
- }
1536
- }
1537
- }
1538
-
1539
-
1540
- /**
1541
- * The customer of the initiating institution
1542
- */
1543
- class InstitutionCustomer
1544
- {
1545
-
1546
- /**
1547
- * The unique identifier as assigned to the institution.
1548
- * @access public
1549
- * @var string
1550
- */
1551
- public $institutionId;
1552
-
1553
- /**
1554
- * The first (given) name of the end consumer as known by the
1555
- * institution.
1556
- * @access public
1557
- * @var string
1558
- */
1559
- public $firstName;
1560
-
1561
- /**
1562
- * The last (family) name of the end consumer as known by the
1563
- * institution.
1564
- * @access public
1565
- * @var string
1566
- */
1567
- public $lastName;
1568
-
1569
- /**
1570
- * The full name of the end consumer as known by the
1571
- * institution.
1572
- * @access public
1573
- * @var string
1574
- */
1575
- public $displayName;
1576
-
1577
- /**
1578
- * The unique identifier as assigned to the end consumer by the
1579
- * institution.
1580
- * @access public
1581
- * @var string
1582
- */
1583
- public $institutionCustomerId;
1584
-
1585
- /**
1586
- * The two-character ISO country code of the home country of
1587
- * the end consumer
1588
- * @access public
1589
- * @var string
1590
- */
1591
- public $countryCode;
1592
-
1593
- /**
1594
- *
1595
- * @access public
1596
- * @var string
1597
- */
1598
- public $email;
1599
-
1600
- /**
1601
- * Constructor with arguments
1602
- */
1603
- public function __construct( $institutionId = null, $firstName = null, $lastName = null, $displayName = null, $institutionCustomerId = null, $countryCode = null )
1604
- {
1605
- $this->institutionId = $institutionId;
1606
- $this->firstName = $firstName;
1607
- $this->lastName = $lastName;
1608
- $this->displayName = $displayName;
1609
- $this->institutionCustomerId = $institutionCustomerId;
1610
- $this->countryCode = $countryCode;
1611
- }
1612
-
1613
-
1614
- public function toNVPString( $prefix = '' )
1615
- {
1616
- $str = '';
1617
- $delim = '';
1618
- if ( $this->institutionId != null ) {
1619
- $str .= $delim . $prefix . 'institutionId=' . urlencode( $this->institutionId );
1620
- $delim = '&';
1621
- }
1622
- if ( $this->firstName != null ) {
1623
- $str .= $delim . $prefix . 'firstName=' . urlencode( $this->firstName );
1624
- $delim = '&';
1625
- }
1626
- if ( $this->lastName != null ) {
1627
- $str .= $delim . $prefix . 'lastName=' . urlencode( $this->lastName );
1628
- $delim = '&';
1629
- }
1630
- if ( $this->displayName != null ) {
1631
- $str .= $delim . $prefix . 'displayName=' . urlencode( $this->displayName );
1632
- $delim = '&';
1633
- }
1634
- if ( $this->institutionCustomerId != null ) {
1635
- $str .= $delim . $prefix . 'institutionCustomerId=' . urlencode( $this->institutionCustomerId );
1636
- $delim = '&';
1637
- }
1638
- if ( $this->countryCode != null ) {
1639
- $str .= $delim . $prefix . 'countryCode=' . urlencode( $this->countryCode );
1640
- $delim = '&';
1641
- }
1642
- if ( $this->email != null ) {
1643
- $str .= $delim . $prefix . 'email=' . urlencode( $this->email );
1644
- $delim = '&';
1645
- }
1646
-
1647
- return $str;
1648
- }
1649
-
1650
- public function init( $map = null, $prefix = '' )
1651
- {
1652
- if ( $map != null ) {
1653
- $mapKeyName = $prefix . 'institutionId';
1654
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1655
- $this->institutionId = $map[ $mapKeyName ];
1656
- }
1657
- $mapKeyName = $prefix . 'firstName';
1658
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1659
- $this->firstName = $map[ $mapKeyName ];
1660
- }
1661
- $mapKeyName = $prefix . 'lastName';
1662
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1663
- $this->lastName = $map[ $mapKeyName ];
1664
- }
1665
- $mapKeyName = $prefix . 'displayName';
1666
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1667
- $this->displayName = $map[ $mapKeyName ];
1668
- }
1669
- $mapKeyName = $prefix . 'institutionCustomerId';
1670
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1671
- $this->institutionCustomerId = $map[ $mapKeyName ];
1672
- }
1673
- $mapKeyName = $prefix . 'countryCode';
1674
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1675
- $this->countryCode = $map[ $mapKeyName ];
1676
- }
1677
- $mapKeyName = $prefix . 'email';
1678
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1679
- $this->email = $map[ $mapKeyName ];
1680
- }
1681
-
1682
- }
1683
- }
1684
- }
1685
-
1686
-
1687
- /**
1688
- * Describes an individual item for an invoice.
1689
- */
1690
- class InvoiceItem
1691
- {
1692
-
1693
- /**
1694
- *
1695
- * @access public
1696
- * @var string
1697
- */
1698
- public $name;
1699
-
1700
- /**
1701
- *
1702
- * @access public
1703
- * @var string
1704
- */
1705
- public $identifier;
1706
-
1707
- /**
1708
- *
1709
- * @access public
1710
- * @var double
1711
- */
1712
- public $price;
1713
-
1714
- /**
1715
- *
1716
- * @access public
1717
- * @var double
1718
- */
1719
- public $itemPrice;
1720
-
1721
- /**
1722
- *
1723
- * @access public
1724
- * @var integer
1725
- */
1726
- public $itemCount;
1727
-
1728
-
1729
- public function toNVPString( $prefix = '' )
1730
- {
1731
- $str = '';
1732
- $delim = '';
1733
- if ( $this->name != null ) {
1734
- $str .= $delim . $prefix . 'name=' . urlencode( $this->name );
1735
- $delim = '&';
1736
- }
1737
- if ( $this->identifier != null ) {
1738
- $str .= $delim . $prefix . 'identifier=' . urlencode( $this->identifier );
1739
- $delim = '&';
1740
- }
1741
- if ( $this->price != null ) {
1742
- $str .= $delim . $prefix . 'price=' . urlencode( $this->price );
1743
- $delim = '&';
1744
- }
1745
- if ( $this->itemPrice != null ) {
1746
- $str .= $delim . $prefix . 'itemPrice=' . urlencode( $this->itemPrice );
1747
- $delim = '&';
1748
- }
1749
- if ( $this->itemCount != null ) {
1750
- $str .= $delim . $prefix . 'itemCount=' . urlencode( $this->itemCount );
1751
- $delim = '&';
1752
- }
1753
-
1754
- return $str;
1755
- }
1756
-
1757
- public function init( $map = null, $prefix = '' )
1758
- {
1759
- if ( $map != null ) {
1760
- $mapKeyName = $prefix . 'name';
1761
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1762
- $this->name = $map[ $mapKeyName ];
1763
- }
1764
- $mapKeyName = $prefix . 'identifier';
1765
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1766
- $this->identifier = $map[ $mapKeyName ];
1767
- }
1768
- $mapKeyName = $prefix . 'price';
1769
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1770
- $this->price = $map[ $mapKeyName ];
1771
- }
1772
- $mapKeyName = $prefix . 'itemPrice';
1773
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1774
- $this->itemPrice = $map[ $mapKeyName ];
1775
- }
1776
- $mapKeyName = $prefix . 'itemCount';
1777
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1778
- $this->itemCount = $map[ $mapKeyName ];
1779
- }
1780
-
1781
- }
1782
- }
1783
- }
1784
-
1785
-
1786
- /**
1787
- * Describes a payment for a particular receiver (merchant),
1788
- * contains list of additional per item details.
1789
- */
1790
- class InvoiceData
1791
- {
1792
-
1793
- /**
1794
- *
1795
- * @array
1796
- * @access public
1797
- * @var InvoiceItem
1798
- */
1799
- public $item;
1800
-
1801
- /**
1802
- *
1803
- * @access public
1804
- * @var double
1805
- */
1806
- public $totalTax;
1807
-
1808
- /**
1809
- *
1810
- * @access public
1811
- * @var double
1812
- */
1813
- public $totalShipping;
1814
-
1815
-
1816
- public function toNVPString( $prefix = '' )
1817
- {
1818
- $str = '';
1819
- $delim = '';
1820
- for ( $i = 0; $i < count( $this->item ); $i++ ) {
1821
- $newPrefix = $prefix . "item($i).";
1822
- $str .= $delim . call_user_func( array( $this->item[ $i ], 'toNVPString' ), $newPrefix );
1823
- $delim = '&';
1824
- }
1825
- if ( $this->totalTax != null ) {
1826
- $str .= $delim . $prefix . 'totalTax=' . urlencode( $this->totalTax );
1827
- $delim = '&';
1828
- }
1829
- if ( $this->totalShipping != null ) {
1830
- $str .= $delim . $prefix . 'totalShipping=' . urlencode( $this->totalShipping );
1831
- $delim = '&';
1832
- }
1833
-
1834
- return $str;
1835
- }
1836
-
1837
- public function init( $map = null, $prefix = '' )
1838
- {
1839
- if ( $map != null ) {
1840
- $i = 0;
1841
- while ( true ) {
1842
- if ( PPUtils::array_match_key( $map, $prefix . "item($i)" ) ) {
1843
- $newPrefix = $prefix . "item($i).";
1844
- $this->item[ $i ] = new InvoiceItem();
1845
- $this->item[ $i ]->init( $map, $newPrefix );
1846
- } else {
1847
- break;
1848
- }
1849
- $i++;
1850
- }
1851
- $mapKeyName = $prefix . 'totalTax';
1852
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1853
- $this->totalTax = $map[ $mapKeyName ];
1854
- }
1855
- $mapKeyName = $prefix . 'totalShipping';
1856
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
1857
- $this->totalShipping = $map[ $mapKeyName ];
1858
- }
1859
-
1860
- }
1861
- }
1862
- }
1863
-
1864
-
1865
- /**
1866
- * The error that resulted from an attempt to make a payment to
1867
- * a receiver.
1868
- */
1869
- class PayError
1870
- {
1871
-
1872
- /**
1873
- *
1874
- * @access public
1875
- * @var Receiver
1876
- */
1877
- public $receiver;
1878
-
1879
- /**
1880
- *
1881
- * @access public
1882
- * @var ErrorData
1883
- */
1884
- public $error;
1885
-
1886
-
1887
- public function init( $map = null, $prefix = '' )
1888
- {
1889
- if ( $map != null ) {
1890
- if ( PPUtils::array_match_key( $map, $prefix . "receiver." ) ) {
1891
- $newPrefix = $prefix . "receiver.";
1892
- $this->receiver = new Receiver();
1893
- $this->receiver->init( $map, $newPrefix );
1894
- }
1895
- if ( PPUtils::array_match_key( $map, $prefix . "error." ) ) {
1896
- $newPrefix = $prefix . "error.";
1897
- $this->error = new ErrorData();
1898
- $this->error->init( $map, $newPrefix );
1899
- }
1900
-
1901
- }
1902
- }
1903
- }
1904
-
1905
-
1906
- /**
1907
- *
1908
- */
1909
- class PayErrorList
1910
- {
1911
-
1912
- /**
1913
- *
1914
- * @array
1915
- * @access public
1916
- * @var PayError
1917
- */
1918
- public $payError;
1919
-
1920
-
1921
- public function init( $map = null, $prefix = '' )
1922
- {
1923
- if ( $map != null ) {
1924
- $i = 0;
1925
- while ( true ) {
1926
- if ( PPUtils::array_match_key( $map, $prefix . "payError($i)" ) ) {
1927
- $newPrefix = $prefix . "payError($i).";
1928
- $this->payError[ $i ] = new PayError();
1929
- $this->payError[ $i ]->init( $map, $newPrefix );
1930
- } else {
1931
- break;
1932
- }
1933
- $i++;
1934
- }
1935
-
1936
- }
1937
- }
1938
- }
1939
-
1940
-
1941
- /**
1942
- * PaymentInfo represents the payment attempt made to a
1943
- * Receiver of a PayRequest. If the execution of the payment
1944
- * has not yet completed, there will not be any transaction
1945
- * details.
1946
- */
1947
- class PaymentInfo
1948
- {
1949
-
1950
- /**
1951
- *
1952
- * @access public
1953
- * @var string
1954
- */
1955
- public $transactionId;
1956
-
1957
- /**
1958
- *
1959
- * @access public
1960
- * @var string
1961
- */
1962
- public $transactionStatus;
1963
-
1964
- /**
1965
- *
1966
- * @access public
1967
- * @var Receiver
1968
- */
1969
- public $receiver;
1970
-
1971
- /**
1972
- *
1973
- * @access public
1974
- * @var double
1975
- */
1976
- public $refundedAmount;
1977
-
1978
- /**
1979
- *
1980
- * @access public
1981
- * @var boolean
1982
- */
1983
- public $pendingRefund;
1984
-
1985
- /**
1986
- *
1987
- * @access public
1988
- * @var string
1989
- */
1990
- public $senderTransactionId;
1991
-
1992
- /**
1993
- *
1994
- * @access public
1995
- * @var string
1996
- */
1997
- public $senderTransactionStatus;
1998
-
1999
- /**
2000
- *
2001
- * @access public
2002
- * @var string
2003
- */
2004
- public $pendingReason;
2005
-
2006
-
2007
- public function init( $map = null, $prefix = '' )
2008
- {
2009
- if ( $map != null ) {
2010
- $mapKeyName = $prefix . 'transactionId';
2011
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2012
- $this->transactionId = $map[ $mapKeyName ];
2013
- }
2014
- $mapKeyName = $prefix . 'transactionStatus';
2015
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2016
- $this->transactionStatus = $map[ $mapKeyName ];
2017
- }
2018
- if ( PPUtils::array_match_key( $map, $prefix . "receiver." ) ) {
2019
- $newPrefix = $prefix . "receiver.";
2020
- $this->receiver = new Receiver();
2021
- $this->receiver->init( $map, $newPrefix );
2022
- }
2023
- $mapKeyName = $prefix . 'refundedAmount';
2024
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2025
- $this->refundedAmount = $map[ $mapKeyName ];
2026
- }
2027
- $mapKeyName = $prefix . 'pendingRefund';
2028
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2029
- $this->pendingRefund = $map[ $mapKeyName ];
2030
- }
2031
- $mapKeyName = $prefix . 'senderTransactionId';
2032
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2033
- $this->senderTransactionId = $map[ $mapKeyName ];
2034
- }
2035
- $mapKeyName = $prefix . 'senderTransactionStatus';
2036
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2037
- $this->senderTransactionStatus = $map[ $mapKeyName ];
2038
- }
2039
- $mapKeyName = $prefix . 'pendingReason';
2040
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2041
- $this->pendingReason = $map[ $mapKeyName ];
2042
- }
2043
-
2044
- }
2045
- }
2046
- }
2047
-
2048
-
2049
- /**
2050
- *
2051
- */
2052
- class PaymentInfoList
2053
- {
2054
-
2055
- /**
2056
- *
2057
- * @array
2058
- * @access public
2059
- * @var PaymentInfo
2060
- */
2061
- public $paymentInfo;
2062
-
2063
-
2064
- public function init( $map = null, $prefix = '' )
2065
- {
2066
- if ( $map != null ) {
2067
- $i = 0;
2068
- while ( true ) {
2069
- if ( PPUtils::array_match_key( $map, $prefix . "paymentInfo($i)" ) ) {
2070
- $newPrefix = $prefix . "paymentInfo($i).";
2071
- $this->paymentInfo[ $i ] = new PaymentInfo();
2072
- $this->paymentInfo[ $i ]->init( $map, $newPrefix );
2073
- } else {
2074
- break;
2075
- }
2076
- $i++;
2077
- }
2078
-
2079
- }
2080
- }
2081
- }
2082
-
2083
-
2084
- /**
2085
- * Receiver is the party where funds are transferred to. A
2086
- * primary receiver receives a payment directly from the sender
2087
- * in a chained split payment. A primary receiver should not be
2088
- * specified when making a single or parallel split payment.
2089
- */
2090
- class Receiver
2091
- {
2092
-
2093
- /**
2094
- *
2095
- * @access public
2096
- * @var double
2097
- */
2098
- public $amount;
2099
-
2100
- /**
2101
- *
2102
- * @access public
2103
- * @var string
2104
- */
2105
- public $email;
2106
-
2107
- /**
2108
- *
2109
- * @access public
2110
- * @var PhoneNumberType
2111
- */
2112
- public $phone;
2113
-
2114
- /**
2115
- *
2116
- * @access public
2117
- * @var boolean
2118
- */
2119
- public $primary;
2120
-
2121
- /**
2122
- *
2123
- * @access public
2124
- * @var string
2125
- */
2126
- public $invoiceId;
2127
-
2128
- /**
2129
- *
2130
- * @access public
2131
- * @var string
2132
- */
2133
- public $paymentType;
2134
-
2135
- /**
2136
- *
2137
- * @access public
2138
- * @var string
2139
- */
2140
- public $paymentSubType;
2141
-
2142
- /**
2143
- * Constructor with arguments
2144
- */
2145
- public function __construct( $amount = null )
2146
- {
2147
- $this->amount = $amount;
2148
- }
2149
-
2150
-
2151
- public function toNVPString( $prefix = '' )
2152
- {
2153
- $str = '';
2154
- $delim = '';
2155
- if ( $this->amount != null ) {
2156
- $str .= $delim . $prefix . 'amount=' . urlencode( $this->amount );
2157
- $delim = '&';
2158
- }
2159
- if ( $this->email != null ) {
2160
- $str .= $delim . $prefix . 'email=' . urlencode( $this->email );
2161
- $delim = '&';
2162
- }
2163
- if ( $this->phone != null ) {
2164
- $newPrefix = $prefix . 'phone.';
2165
- $str .= $delim . call_user_func( array( $this->phone, 'toNVPString' ), $newPrefix );
2166
- $delim = '&';
2167
- }
2168
- if ( $this->primary != null ) {
2169
- $str .= $delim . $prefix . 'primary=' . urlencode( $this->primary );
2170
- $delim = '&';
2171
- }
2172
- if ( $this->invoiceId != null ) {
2173
- $str .= $delim . $prefix . 'invoiceId=' . urlencode( $this->invoiceId );
2174
- $delim = '&';
2175
- }
2176
- if ( $this->paymentType != null ) {
2177
- $str .= $delim . $prefix . 'paymentType=' . urlencode( $this->paymentType );
2178
- $delim = '&';
2179
- }
2180
- if ( $this->paymentSubType != null ) {
2181
- $str .= $delim . $prefix . 'paymentSubType=' . urlencode( $this->paymentSubType );
2182
- $delim = '&';
2183
- }
2184
-
2185
- return $str;
2186
- }
2187
-
2188
- public function init( $map = null, $prefix = '' )
2189
- {
2190
- if ( $map != null ) {
2191
- $mapKeyName = $prefix . 'amount';
2192
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2193
- $this->amount = $map[ $mapKeyName ];
2194
- }
2195
- $mapKeyName = $prefix . 'email';
2196
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2197
- $this->email = $map[ $mapKeyName ];
2198
- }
2199
- if ( PPUtils::array_match_key( $map, $prefix . "phone." ) ) {
2200
- $newPrefix = $prefix . "phone.";
2201
- $this->phone = new PhoneNumberType();
2202
- $this->phone->init( $map, $newPrefix );
2203
- }
2204
- $mapKeyName = $prefix . 'primary';
2205
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2206
- $this->primary = $map[ $mapKeyName ];
2207
- }
2208
- $mapKeyName = $prefix . 'invoiceId';
2209
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2210
- $this->invoiceId = $map[ $mapKeyName ];
2211
- }
2212
- $mapKeyName = $prefix . 'paymentType';
2213
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2214
- $this->paymentType = $map[ $mapKeyName ];
2215
- }
2216
- $mapKeyName = $prefix . 'paymentSubType';
2217
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2218
- $this->paymentSubType = $map[ $mapKeyName ];
2219
- }
2220
-
2221
- }
2222
- }
2223
- }
2224
-
2225
-
2226
- /**
2227
- *
2228
- */
2229
- class ReceiverList
2230
- {
2231
-
2232
- /**
2233
- *
2234
- * @array
2235
- * @access public
2236
- * @var Receiver
2237
- */
2238
- public $receiver;
2239
-
2240
- /**
2241
- * Constructor with arguments
2242
- */
2243
- public function __construct( $receiver = null )
2244
- {
2245
- $this->receiver = $receiver;
2246
- }
2247
-
2248
-
2249
- public function toNVPString( $prefix = '' )
2250
- {
2251
- $str = '';
2252
- $delim = '';
2253
- for ( $i = 0; $i < count( $this->receiver ); $i++ ) {
2254
- $newPrefix = $prefix . "receiver($i).";
2255
- $str .= $delim . call_user_func( array( $this->receiver[ $i ], 'toNVPString' ), $newPrefix );
2256
- $delim = '&';
2257
- }
2258
-
2259
- return $str;
2260
- }
2261
-
2262
- }
2263
-
2264
-
2265
- /**
2266
- * The sender identifier type contains information to identify
2267
- * a PayPal account.
2268
- */
2269
- class ReceiverIdentifier extends AccountIdentifier
2270
- {
2271
-
2272
-
2273
- public function toNVPString( $prefix = '' )
2274
- {
2275
- $str = parent::toNVPString( $prefix );
2276
- if ( strlen( $str ) > 0 ) {
2277
- $delim = '&';
2278
- } else {
2279
- $delim = '';
2280
- }
2281
-
2282
- return $str;
2283
- }
2284
-
2285
- public function init( $map = null, $prefix = '' )
2286
- {
2287
- if ( $map != null ) {
2288
-
2289
- }
2290
- }
2291
- }
2292
-
2293
-
2294
- /**
2295
- * Options that apply to the receiver of a payment, allows
2296
- * setting additional details for payment using invoice.
2297
- */
2298
- class ReceiverOptions
2299
- {
2300
-
2301
- /**
2302
- *
2303
- * @access public
2304
- * @var string
2305
- */
2306
- public $description;
2307
-
2308
- /**
2309
- *
2310
- * @access public
2311
- * @var string
2312
- */
2313
- public $customId;
2314
-
2315
- /**
2316
- *
2317
- * @access public
2318
- * @var InvoiceData
2319
- */
2320
- public $invoiceData;
2321
-
2322
- /**
2323
- *
2324
- * @access public
2325
- * @var ReceiverIdentifier
2326
- */
2327
- public $receiver;
2328
-
2329
- /**
2330
- *
2331
- * @access public
2332
- * @var string
2333
- */
2334
- public $referrerCode;
2335
-
2336
- /**
2337
- * Constructor with arguments
2338
- */
2339
- public function __construct( $receiver = null )
2340
- {
2341
- $this->receiver = $receiver;
2342
- }
2343
-
2344
-
2345
- public function toNVPString( $prefix = '' )
2346
- {
2347
- $str = '';
2348
- $delim = '';
2349
- if ( $this->description != null ) {
2350
- $str .= $delim . $prefix . 'description=' . urlencode( $this->description );
2351
- $delim = '&';
2352
- }
2353
- if ( $this->customId != null ) {
2354
- $str .= $delim . $prefix . 'customId=' . urlencode( $this->customId );
2355
- $delim = '&';
2356
- }
2357
- if ( $this->invoiceData != null ) {
2358
- $newPrefix = $prefix . 'invoiceData.';
2359
- $str .= $delim . call_user_func( array( $this->invoiceData, 'toNVPString' ), $newPrefix );
2360
- $delim = '&';
2361
- }
2362
- if ( $this->receiver != null ) {
2363
- $newPrefix = $prefix . 'receiver.';
2364
- $str .= $delim . call_user_func( array( $this->receiver, 'toNVPString' ), $newPrefix );
2365
- $delim = '&';
2366
- }
2367
- if ( $this->referrerCode != null ) {
2368
- $str .= $delim . $prefix . 'referrerCode=' . urlencode( $this->referrerCode );
2369
- $delim = '&';
2370
- }
2371
-
2372
- return $str;
2373
- }
2374
-
2375
- public function init( $map = null, $prefix = '' )
2376
- {
2377
- if ( $map != null ) {
2378
- $mapKeyName = $prefix . 'description';
2379
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2380
- $this->description = $map[ $mapKeyName ];
2381
- }
2382
- $mapKeyName = $prefix . 'customId';
2383
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2384
- $this->customId = $map[ $mapKeyName ];
2385
- }
2386
- if ( PPUtils::array_match_key( $map, $prefix . "invoiceData." ) ) {
2387
- $newPrefix = $prefix . "invoiceData.";
2388
- $this->invoiceData = new InvoiceData();
2389
- $this->invoiceData->init( $map, $newPrefix );
2390
- }
2391
- if ( PPUtils::array_match_key( $map, $prefix . "receiver." ) ) {
2392
- $newPrefix = $prefix . "receiver.";
2393
- $this->receiver = new ReceiverIdentifier();
2394
- $this->receiver->init( $map, $newPrefix );
2395
- }
2396
- $mapKeyName = $prefix . 'referrerCode';
2397
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2398
- $this->referrerCode = $map[ $mapKeyName ];
2399
- }
2400
-
2401
- }
2402
- }
2403
- }
2404
-
2405
-
2406
- /**
2407
- * RefundInfo represents the refund attempt made to a Receiver
2408
- * of a PayRequest.
2409
- */
2410
- class RefundInfo
2411
- {
2412
-
2413
- /**
2414
- *
2415
- * @access public
2416
- * @var Receiver
2417
- */
2418
- public $receiver;
2419
-
2420
- /**
2421
- *
2422
- * @access public
2423
- * @var string
2424
- */
2425
- public $refundStatus;
2426
-
2427
- /**
2428
- *
2429
- * @access public
2430
- * @var double
2431
- */
2432
- public $refundNetAmount;
2433
-
2434
- /**
2435
- *
2436
- * @access public
2437
- * @var double
2438
- */
2439
- public $refundFeeAmount;
2440
-
2441
- /**
2442
- *
2443
- * @access public
2444
- * @var double
2445
- */
2446
- public $refundGrossAmount;
2447
-
2448
- /**
2449
- *
2450
- * @access public
2451
- * @var double
2452
- */
2453
- public $totalOfAllRefunds;
2454
-
2455
- /**
2456
- *
2457
- * @access public
2458
- * @var boolean
2459
- */
2460
- public $refundHasBecomeFull;
2461
-
2462
- /**
2463
- *
2464
- * @access public
2465
- * @var string
2466
- */
2467
- public $encryptedRefundTransactionId;
2468
-
2469
- /**
2470
- *
2471
- * @access public
2472
- * @var string
2473
- */
2474
- public $refundTransactionStatus;
2475
-
2476
- /**
2477
- *
2478
- * @access public
2479
- * @var ErrorList
2480
- */
2481
- public $errorList;
2482
-
2483
-
2484
- public function init( $map = null, $prefix = '' )
2485
- {
2486
- if ( $map != null ) {
2487
- if ( PPUtils::array_match_key( $map, $prefix . "receiver." ) ) {
2488
- $newPrefix = $prefix . "receiver.";
2489
- $this->receiver = new Receiver();
2490
- $this->receiver->init( $map, $newPrefix );
2491
- }
2492
- $mapKeyName = $prefix . 'refundStatus';
2493
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2494
- $this->refundStatus = $map[ $mapKeyName ];
2495
- }
2496
- $mapKeyName = $prefix . 'refundNetAmount';
2497
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2498
- $this->refundNetAmount = $map[ $mapKeyName ];
2499
- }
2500
- $mapKeyName = $prefix . 'refundFeeAmount';
2501
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2502
- $this->refundFeeAmount = $map[ $mapKeyName ];
2503
- }
2504
- $mapKeyName = $prefix . 'refundGrossAmount';
2505
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2506
- $this->refundGrossAmount = $map[ $mapKeyName ];
2507
- }
2508
- $mapKeyName = $prefix . 'totalOfAllRefunds';
2509
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2510
- $this->totalOfAllRefunds = $map[ $mapKeyName ];
2511
- }
2512
- $mapKeyName = $prefix . 'refundHasBecomeFull';
2513
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2514
- $this->refundHasBecomeFull = $map[ $mapKeyName ];
2515
- }
2516
- $mapKeyName = $prefix . 'encryptedRefundTransactionId';
2517
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2518
- $this->encryptedRefundTransactionId = $map[ $mapKeyName ];
2519
- }
2520
- $mapKeyName = $prefix . 'refundTransactionStatus';
2521
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2522
- $this->refundTransactionStatus = $map[ $mapKeyName ];
2523
- }
2524
- if ( PPUtils::array_match_key( $map, $prefix . "errorList." ) ) {
2525
- $newPrefix = $prefix . "errorList.";
2526
- $this->errorList = new ErrorList();
2527
- $this->errorList->init( $map, $newPrefix );
2528
- }
2529
-
2530
- }
2531
- }
2532
- }
2533
-
2534
-
2535
- /**
2536
- *
2537
- */
2538
- class RefundInfoList
2539
- {
2540
-
2541
- /**
2542
- *
2543
- * @array
2544
- * @access public
2545
- * @var RefundInfo
2546
- */
2547
- public $refundInfo;
2548
-
2549
-
2550
- public function init( $map = null, $prefix = '' )
2551
- {
2552
- if ( $map != null ) {
2553
- $i = 0;
2554
- while ( true ) {
2555
- if ( PPUtils::array_match_key( $map, $prefix . "refundInfo($i)" ) ) {
2556
- $newPrefix = $prefix . "refundInfo($i).";
2557
- $this->refundInfo[ $i ] = new RefundInfo();
2558
- $this->refundInfo[ $i ]->init( $map, $newPrefix );
2559
- } else {
2560
- break;
2561
- }
2562
- $i++;
2563
- }
2564
-
2565
- }
2566
- }
2567
- }
2568
-
2569
-
2570
- /**
2571
- * Options that apply to the sender of a payment.
2572
- */
2573
- class SenderOptions
2574
- {
2575
-
2576
- /**
2577
- * Require the user to select a shipping address during the web
2578
- * flow.
2579
- * @access public
2580
- * @var boolean
2581
- */
2582
- public $requireShippingAddressSelection;
2583
-
2584
- /**
2585
- *
2586
- * @access public
2587
- * @var string
2588
- */
2589
- public $referrerCode;
2590
-
2591
-
2592
- public function toNVPString( $prefix = '' )
2593
- {
2594
- $str = '';
2595
- $delim = '';
2596
- if ( $this->requireShippingAddressSelection != null ) {
2597
- $str .= $delim . $prefix . 'requireShippingAddressSelection=' . urlencode( $this->requireShippingAddressSelection );
2598
- $delim = '&';
2599
- }
2600
- if ( $this->referrerCode != null ) {
2601
- $str .= $delim . $prefix . 'referrerCode=' . urlencode( $this->referrerCode );
2602
- $delim = '&';
2603
- }
2604
-
2605
- return $str;
2606
- }
2607
-
2608
- public function init( $map = null, $prefix = '' )
2609
- {
2610
- if ( $map != null ) {
2611
- $mapKeyName = $prefix . 'requireShippingAddressSelection';
2612
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2613
- $this->requireShippingAddressSelection = $map[ $mapKeyName ];
2614
- }
2615
- $mapKeyName = $prefix . 'referrerCode';
2616
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2617
- $this->referrerCode = $map[ $mapKeyName ];
2618
- }
2619
-
2620
- }
2621
- }
2622
- }
2623
-
2624
-
2625
- /**
2626
- * Details about the payer's tax info passed in by the merchant
2627
- * or partner.
2628
- */
2629
- class TaxIdDetails
2630
- {
2631
-
2632
- /**
2633
- * Tax id of the merchant/business.
2634
- * @access public
2635
- * @var string
2636
- */
2637
- public $taxId;
2638
-
2639
- /**
2640
- * Tax type of the Tax Id.
2641
- * @access public
2642
- * @var string
2643
- */
2644
- public $taxIdType;
2645
-
2646
-
2647
- public function toNVPString( $prefix = '' )
2648
- {
2649
- $str = '';
2650
- $delim = '';
2651
- if ( $this->taxId != null ) {
2652
- $str .= $delim . $prefix . 'taxId=' . urlencode( $this->taxId );
2653
- $delim = '&';
2654
- }
2655
- if ( $this->taxIdType != null ) {
2656
- $str .= $delim . $prefix . 'taxIdType=' . urlencode( $this->taxIdType );
2657
- $delim = '&';
2658
- }
2659
-
2660
- return $str;
2661
- }
2662
-
2663
- public function init( $map = null, $prefix = '' )
2664
- {
2665
- if ( $map != null ) {
2666
- $mapKeyName = $prefix . 'taxId';
2667
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2668
- $this->taxId = $map[ $mapKeyName ];
2669
- }
2670
- $mapKeyName = $prefix . 'taxIdType';
2671
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2672
- $this->taxIdType = $map[ $mapKeyName ];
2673
- }
2674
-
2675
- }
2676
- }
2677
- }
2678
-
2679
-
2680
- /**
2681
- * The sender identifier type contains information to identify
2682
- * a PayPal account.
2683
- */
2684
- class SenderIdentifier extends AccountIdentifier
2685
- {
2686
-
2687
- /**
2688
- *
2689
- * @access public
2690
- * @var boolean
2691
- */
2692
- public $useCredentials;
2693
-
2694
- /**
2695
- *
2696
- * @access public
2697
- * @var TaxIdDetails
2698
- */
2699
- public $taxIdDetails;
2700
-
2701
-
2702
- public function toNVPString( $prefix = '' )
2703
- {
2704
- $str = parent::toNVPString( $prefix );
2705
- if ( strlen( $str ) > 0 ) {
2706
- $delim = '&';
2707
- } else {
2708
- $delim = '';
2709
- }
2710
- if ( $this->useCredentials != null ) {
2711
- $str .= $delim . $prefix . 'useCredentials=' . urlencode( $this->useCredentials );
2712
- $delim = '&';
2713
- }
2714
- if ( $this->taxIdDetails != null ) {
2715
- $newPrefix = $prefix . 'taxIdDetails.';
2716
- $str .= $delim . call_user_func( array( $this->taxIdDetails, 'toNVPString' ), $newPrefix );
2717
- $delim = '&';
2718
- }
2719
-
2720
- return $str;
2721
- }
2722
-
2723
- public function init( $map = null, $prefix = '' )
2724
- {
2725
- if ( $map != null ) {
2726
- $mapKeyName = $prefix . 'useCredentials';
2727
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2728
- $this->useCredentials = $map[ $mapKeyName ];
2729
- }
2730
- if ( PPUtils::array_match_key( $map, $prefix . "taxIdDetails." ) ) {
2731
- $newPrefix = $prefix . "taxIdDetails.";
2732
- $this->taxIdDetails = new TaxIdDetails();
2733
- $this->taxIdDetails->init( $map, $newPrefix );
2734
- }
2735
-
2736
- }
2737
- }
2738
- }
2739
-
2740
-
2741
- /**
2742
- *
2743
- */
2744
- class UserLimit
2745
- {
2746
-
2747
- /**
2748
- *
2749
- * @access public
2750
- * @var string
2751
- */
2752
- public $limitType;
2753
-
2754
- /**
2755
- *
2756
- * @access public
2757
- * @var CurrencyType
2758
- */
2759
- public $limitAmount;
2760
-
2761
-
2762
- public function init( $map = null, $prefix = '' )
2763
- {
2764
- if ( $map != null ) {
2765
- $mapKeyName = $prefix . 'limitType';
2766
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2767
- $this->limitType = $map[ $mapKeyName ];
2768
- }
2769
- if ( PPUtils::array_match_key( $map, $prefix . "limitAmount." ) ) {
2770
- $newPrefix = $prefix . "limitAmount.";
2771
- $this->limitAmount = new CurrencyType();
2772
- $this->limitAmount->init( $map, $newPrefix );
2773
- }
2774
-
2775
- }
2776
- }
2777
- }
2778
-
2779
-
2780
- /**
2781
- * This type contains the detailed warning information
2782
- * resulting from the service operation.
2783
- */
2784
- class WarningData
2785
- {
2786
-
2787
- /**
2788
- *
2789
- * @access public
2790
- * @var integer
2791
- */
2792
- public $warningId;
2793
-
2794
- /**
2795
- *
2796
- * @access public
2797
- * @var string
2798
- */
2799
- public $message;
2800
-
2801
-
2802
- public function init( $map = null, $prefix = '' )
2803
- {
2804
- if ( $map != null ) {
2805
- $mapKeyName = $prefix . 'warningId';
2806
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2807
- $this->warningId = $map[ $mapKeyName ];
2808
- }
2809
- $mapKeyName = $prefix . 'message';
2810
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
2811
- $this->message = $map[ $mapKeyName ];
2812
- }
2813
-
2814
- }
2815
- }
2816
- }
2817
-
2818
-
2819
- /**
2820
- *
2821
- */
2822
- class WarningDataList
2823
- {
2824
-
2825
- /**
2826
- *
2827
- * @array
2828
- * @access public
2829
- * @var WarningData
2830
- */
2831
- public $warningData;
2832
-
2833
-
2834
- public function init( $map = null, $prefix = '' )
2835
- {
2836
- if ( $map != null ) {
2837
- $i = 0;
2838
- while ( true ) {
2839
- if ( PPUtils::array_match_key( $map, $prefix . "warningData($i)" ) ) {
2840
- $newPrefix = $prefix . "warningData($i).";
2841
- $this->warningData[ $i ] = new WarningData();
2842
- $this->warningData[ $i ]->init( $map, $newPrefix );
2843
- } else {
2844
- break;
2845
- }
2846
- $i++;
2847
- }
2848
-
2849
- }
2850
- }
2851
- }
2852
-
2853
-
2854
- /**
2855
- * The request to cancel a Preapproval.
2856
- */
2857
- class CancelPreapprovalRequest
2858
- {
2859
-
2860
- /**
2861
- *
2862
- * @access public
2863
- * @var RequestEnvelope
2864
- */
2865
- public $requestEnvelope;
2866
-
2867
- /**
2868
- *
2869
- * @access public
2870
- * @var string
2871
- */
2872
- public $preapprovalKey;
2873
-
2874
- /**
2875
- * Constructor with arguments
2876
- */
2877
- public function __construct( $requestEnvelope = null, $preapprovalKey = null )
2878
- {
2879
- $this->requestEnvelope = $requestEnvelope;
2880
- $this->preapprovalKey = $preapprovalKey;
2881
- }
2882
-
2883
-
2884
- public function toNVPString( $prefix = '' )
2885
- {
2886
- $str = '';
2887
- $delim = '';
2888
- if ( $this->requestEnvelope != null ) {
2889
- $newPrefix = $prefix . 'requestEnvelope.';
2890
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
2891
- $delim = '&';
2892
- }
2893
- if ( $this->preapprovalKey != null ) {
2894
- $str .= $delim . $prefix . 'preapprovalKey=' . urlencode( $this->preapprovalKey );
2895
- $delim = '&';
2896
- }
2897
-
2898
- return $str;
2899
- }
2900
-
2901
- }
2902
-
2903
-
2904
- /**
2905
- * The result of the CancelPreapprovalRequest.
2906
- */
2907
- class CancelPreapprovalResponse
2908
- {
2909
-
2910
- /**
2911
- *
2912
- * @access public
2913
- * @var ResponseEnvelope
2914
- */
2915
- public $responseEnvelope;
2916
-
2917
- /**
2918
- *
2919
- * @array
2920
- * @access public
2921
- * @var ErrorData
2922
- */
2923
- public $error;
2924
-
2925
-
2926
- public function init( $map = null, $prefix = '' )
2927
- {
2928
- if ( $map != null ) {
2929
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
2930
- $newPrefix = $prefix . "responseEnvelope.";
2931
- $this->responseEnvelope = new ResponseEnvelope();
2932
- $this->responseEnvelope->init( $map, $newPrefix );
2933
- }
2934
- $i = 0;
2935
- while ( true ) {
2936
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
2937
- $newPrefix = $prefix . "error($i).";
2938
- $this->error[ $i ] = new ErrorData();
2939
- $this->error[ $i ]->init( $map, $newPrefix );
2940
- } else {
2941
- break;
2942
- }
2943
- $i++;
2944
- }
2945
-
2946
- }
2947
- }
2948
- }
2949
-
2950
-
2951
- /**
2952
- * The request to confirm a Preapproval.
2953
- */
2954
- class ConfirmPreapprovalRequest
2955
- {
2956
-
2957
- /**
2958
- *
2959
- * @access public
2960
- * @var RequestEnvelope
2961
- */
2962
- public $requestEnvelope;
2963
-
2964
- /**
2965
- *
2966
- * @access public
2967
- * @var string
2968
- */
2969
- public $preapprovalKey;
2970
-
2971
- /**
2972
- *
2973
- * @access public
2974
- * @var string
2975
- */
2976
- public $fundingSourceId;
2977
-
2978
- /**
2979
- *
2980
- * @access public
2981
- * @var string
2982
- */
2983
- public $pin;
2984
-
2985
- /**
2986
- * Constructor with arguments
2987
- */
2988
- public function __construct( $requestEnvelope = null, $preapprovalKey = null )
2989
- {
2990
- $this->requestEnvelope = $requestEnvelope;
2991
- $this->preapprovalKey = $preapprovalKey;
2992
- }
2993
-
2994
-
2995
- public function toNVPString( $prefix = '' )
2996
- {
2997
- $str = '';
2998
- $delim = '';
2999
- if ( $this->requestEnvelope != null ) {
3000
- $newPrefix = $prefix . 'requestEnvelope.';
3001
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
3002
- $delim = '&';
3003
- }
3004
- if ( $this->preapprovalKey != null ) {
3005
- $str .= $delim . $prefix . 'preapprovalKey=' . urlencode( $this->preapprovalKey );
3006
- $delim = '&';
3007
- }
3008
- if ( $this->fundingSourceId != null ) {
3009
- $str .= $delim . $prefix . 'fundingSourceId=' . urlencode( $this->fundingSourceId );
3010
- $delim = '&';
3011
- }
3012
- if ( $this->pin != null ) {
3013
- $str .= $delim . $prefix . 'pin=' . urlencode( $this->pin );
3014
- $delim = '&';
3015
- }
3016
-
3017
- return $str;
3018
- }
3019
-
3020
- }
3021
-
3022
-
3023
- /**
3024
- * The result of the ConfirmPreapprovalRequest.
3025
- */
3026
- class ConfirmPreapprovalResponse
3027
- {
3028
-
3029
- /**
3030
- *
3031
- * @access public
3032
- * @var ResponseEnvelope
3033
- */
3034
- public $responseEnvelope;
3035
-
3036
- /**
3037
- *
3038
- * @array
3039
- * @access public
3040
- * @var ErrorData
3041
- */
3042
- public $error;
3043
-
3044
-
3045
- public function init( $map = null, $prefix = '' )
3046
- {
3047
- if ( $map != null ) {
3048
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
3049
- $newPrefix = $prefix . "responseEnvelope.";
3050
- $this->responseEnvelope = new ResponseEnvelope();
3051
- $this->responseEnvelope->init( $map, $newPrefix );
3052
- }
3053
- $i = 0;
3054
- while ( true ) {
3055
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
3056
- $newPrefix = $prefix . "error($i).";
3057
- $this->error[ $i ] = new ErrorData();
3058
- $this->error[ $i ]->init( $map, $newPrefix );
3059
- } else {
3060
- break;
3061
- }
3062
- $i++;
3063
- }
3064
-
3065
- }
3066
- }
3067
- }
3068
-
3069
-
3070
- /**
3071
- * A request to convert one or more currencies into their
3072
- * estimated values in other currencies.
3073
- */
3074
- class ConvertCurrencyRequest
3075
- {
3076
-
3077
- /**
3078
- *
3079
- * @access public
3080
- * @var RequestEnvelope
3081
- */
3082
- public $requestEnvelope;
3083
-
3084
- /**
3085
- *
3086
- * @access public
3087
- * @var CurrencyList
3088
- */
3089
- public $baseAmountList;
3090
-
3091
- /**
3092
- *
3093
- * @access public
3094
- * @var CurrencyCodeList
3095
- */
3096
- public $convertToCurrencyList;
3097
-
3098
- /**
3099
- * The two-character ISO country code where fx suppposed to
3100
- * happen
3101
- * @access public
3102
- * @var string
3103
- */
3104
- public $countryCode;
3105
-
3106
- /**
3107
- *
3108
- * @access public
3109
- * @var string
3110
- */
3111
- public $conversionType;
3112
-
3113
- /**
3114
- * Constructor with arguments
3115
- */
3116
- public function __construct( $requestEnvelope = null, $baseAmountList = null, $convertToCurrencyList = null )
3117
- {
3118
- $this->requestEnvelope = $requestEnvelope;
3119
- $this->baseAmountList = $baseAmountList;
3120
- $this->convertToCurrencyList = $convertToCurrencyList;
3121
- }
3122
-
3123
-
3124
- public function toNVPString( $prefix = '' )
3125
- {
3126
- $str = '';
3127
- $delim = '';
3128
- if ( $this->requestEnvelope != null ) {
3129
- $newPrefix = $prefix . 'requestEnvelope.';
3130
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
3131
- $delim = '&';
3132
- }
3133
- if ( $this->baseAmountList != null ) {
3134
- $newPrefix = $prefix . 'baseAmountList.';
3135
- $str .= $delim . call_user_func( array( $this->baseAmountList, 'toNVPString' ), $newPrefix );
3136
- $delim = '&';
3137
- }
3138
- if ( $this->convertToCurrencyList != null ) {
3139
- $newPrefix = $prefix . 'convertToCurrencyList.';
3140
- $str .= $delim . call_user_func( array( $this->convertToCurrencyList, 'toNVPString' ), $newPrefix );
3141
- $delim = '&';
3142
- }
3143
- if ( $this->countryCode != null ) {
3144
- $str .= $delim . $prefix . 'countryCode=' . urlencode( $this->countryCode );
3145
- $delim = '&';
3146
- }
3147
- if ( $this->conversionType != null ) {
3148
- $str .= $delim . $prefix . 'conversionType=' . urlencode( $this->conversionType );
3149
- $delim = '&';
3150
- }
3151
-
3152
- return $str;
3153
- }
3154
-
3155
- }
3156
-
3157
-
3158
- /**
3159
- * A response that contains a table of estimated converted
3160
- * currencies based on the Convert Currency Request.
3161
- */
3162
- class ConvertCurrencyResponse
3163
- {
3164
-
3165
- /**
3166
- *
3167
- * @access public
3168
- * @var ResponseEnvelope
3169
- */
3170
- public $responseEnvelope;
3171
-
3172
- /**
3173
- *
3174
- * @access public
3175
- * @var CurrencyConversionTable
3176
- */
3177
- public $estimatedAmountTable;
3178
-
3179
- /**
3180
- *
3181
- * @array
3182
- * @access public
3183
- * @var ErrorData
3184
- */
3185
- public $error;
3186
-
3187
-
3188
- public function init( $map = null, $prefix = '' )
3189
- {
3190
- if ( $map != null ) {
3191
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
3192
- $newPrefix = $prefix . "responseEnvelope.";
3193
- $this->responseEnvelope = new ResponseEnvelope();
3194
- $this->responseEnvelope->init( $map, $newPrefix );
3195
- }
3196
- if ( PPUtils::array_match_key( $map, $prefix . "estimatedAmountTable." ) ) {
3197
- $newPrefix = $prefix . "estimatedAmountTable.";
3198
- $this->estimatedAmountTable = new CurrencyConversionTable();
3199
- $this->estimatedAmountTable->init( $map, $newPrefix );
3200
- }
3201
- $i = 0;
3202
- while ( true ) {
3203
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
3204
- $newPrefix = $prefix . "error($i).";
3205
- $this->error[ $i ] = new ErrorData();
3206
- $this->error[ $i ]->init( $map, $newPrefix );
3207
- } else {
3208
- break;
3209
- }
3210
- $i++;
3211
- }
3212
-
3213
- }
3214
- }
3215
- }
3216
-
3217
-
3218
- /**
3219
- * The request to execute the payment request.
3220
- */
3221
- class ExecutePaymentRequest
3222
- {
3223
-
3224
- /**
3225
- *
3226
- * @access public
3227
- * @var RequestEnvelope
3228
- */
3229
- public $requestEnvelope;
3230
-
3231
- /**
3232
- *
3233
- * @access public
3234
- * @var string
3235
- */
3236
- public $payKey;
3237
-
3238
- /**
3239
- * Describes the action that is performed by this API
3240
- * @access public
3241
- * @var string
3242
- */
3243
- public $actionType;
3244
-
3245
- /**
3246
- *
3247
- * @access public
3248
- * @var string
3249
- */
3250
- public $fundingPlanId;
3251
-
3252
- /**
3253
- * Constructor with arguments
3254
- */
3255
- public function __construct( $requestEnvelope = null, $payKey = null )
3256
- {
3257
- $this->requestEnvelope = $requestEnvelope;
3258
- $this->payKey = $payKey;
3259
- }
3260
-
3261
-
3262
- public function toNVPString( $prefix = '' )
3263
- {
3264
- $str = '';
3265
- $delim = '';
3266
- if ( $this->requestEnvelope != null ) {
3267
- $newPrefix = $prefix . 'requestEnvelope.';
3268
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
3269
- $delim = '&';
3270
- }
3271
- if ( $this->payKey != null ) {
3272
- $str .= $delim . $prefix . 'payKey=' . urlencode( $this->payKey );
3273
- $delim = '&';
3274
- }
3275
- if ( $this->actionType != null ) {
3276
- $str .= $delim . $prefix . 'actionType=' . urlencode( $this->actionType );
3277
- $delim = '&';
3278
- }
3279
- if ( $this->fundingPlanId != null ) {
3280
- $str .= $delim . $prefix . 'fundingPlanId=' . urlencode( $this->fundingPlanId );
3281
- $delim = '&';
3282
- }
3283
-
3284
- return $str;
3285
- }
3286
-
3287
- }
3288
-
3289
-
3290
- /**
3291
- * The result of a payment execution.
3292
- */
3293
- class ExecutePaymentResponse
3294
- {
3295
-
3296
- /**
3297
- *
3298
- * @access public
3299
- * @var ResponseEnvelope
3300
- */
3301
- public $responseEnvelope;
3302
-
3303
- /**
3304
- *
3305
- * @access public
3306
- * @var string
3307
- */
3308
- public $paymentExecStatus;
3309
-
3310
- /**
3311
- *
3312
- * @access public
3313
- * @var PayErrorList
3314
- */
3315
- public $payErrorList;
3316
-
3317
- /**
3318
- *
3319
- * @array
3320
- * @access public
3321
- * @var ErrorData
3322
- */
3323
- public $error;
3324
-
3325
-
3326
- public function init( $map = null, $prefix = '' )
3327
- {
3328
- if ( $map != null ) {
3329
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
3330
- $newPrefix = $prefix . "responseEnvelope.";
3331
- $this->responseEnvelope = new ResponseEnvelope();
3332
- $this->responseEnvelope->init( $map, $newPrefix );
3333
- }
3334
- $mapKeyName = $prefix . 'paymentExecStatus';
3335
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3336
- $this->paymentExecStatus = $map[ $mapKeyName ];
3337
- }
3338
- if ( PPUtils::array_match_key( $map, $prefix . "payErrorList." ) ) {
3339
- $newPrefix = $prefix . "payErrorList.";
3340
- $this->payErrorList = new PayErrorList();
3341
- $this->payErrorList->init( $map, $newPrefix );
3342
- }
3343
- $i = 0;
3344
- while ( true ) {
3345
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
3346
- $newPrefix = $prefix . "error($i).";
3347
- $this->error[ $i ] = new ErrorData();
3348
- $this->error[ $i ]->init( $map, $newPrefix );
3349
- } else {
3350
- break;
3351
- }
3352
- $i++;
3353
- }
3354
-
3355
- }
3356
- }
3357
- }
3358
-
3359
-
3360
- /**
3361
- * The request to get the allowed funding sources available for
3362
- * a preapproval.
3363
- */
3364
- class GetAllowedFundingSourcesRequest
3365
- {
3366
-
3367
- /**
3368
- *
3369
- * @access public
3370
- * @var RequestEnvelope
3371
- */
3372
- public $requestEnvelope;
3373
-
3374
- /**
3375
- *
3376
- * @access public
3377
- * @var string
3378
- */
3379
- public $key;
3380
-
3381
- /**
3382
- * Constructor with arguments
3383
- */
3384
- public function __construct( $requestEnvelope = null, $key = null )
3385
- {
3386
- $this->requestEnvelope = $requestEnvelope;
3387
- $this->key = $key;
3388
- }
3389
-
3390
-
3391
- public function toNVPString( $prefix = '' )
3392
- {
3393
- $str = '';
3394
- $delim = '';
3395
- if ( $this->requestEnvelope != null ) {
3396
- $newPrefix = $prefix . 'requestEnvelope.';
3397
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
3398
- $delim = '&';
3399
- }
3400
- if ( $this->key != null ) {
3401
- $str .= $delim . $prefix . 'key=' . urlencode( $this->key );
3402
- $delim = '&';
3403
- }
3404
-
3405
- return $str;
3406
- }
3407
-
3408
- }
3409
-
3410
-
3411
- /**
3412
- * The response to get the backup funding sources available for
3413
- * a preapproval.
3414
- */
3415
- class GetAllowedFundingSourcesResponse
3416
- {
3417
-
3418
- /**
3419
- *
3420
- * @access public
3421
- * @var ResponseEnvelope
3422
- */
3423
- public $responseEnvelope;
3424
-
3425
- /**
3426
- *
3427
- * @array
3428
- * @access public
3429
- * @var FundingSource
3430
- */
3431
- public $fundingSource;
3432
-
3433
- /**
3434
- *
3435
- * @array
3436
- * @access public
3437
- * @var ErrorData
3438
- */
3439
- public $error;
3440
-
3441
-
3442
- public function init( $map = null, $prefix = '' )
3443
- {
3444
- if ( $map != null ) {
3445
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
3446
- $newPrefix = $prefix . "responseEnvelope.";
3447
- $this->responseEnvelope = new ResponseEnvelope();
3448
- $this->responseEnvelope->init( $map, $newPrefix );
3449
- }
3450
- $i = 0;
3451
- while ( true ) {
3452
- if ( PPUtils::array_match_key( $map, $prefix . "fundingSource($i)" ) ) {
3453
- $newPrefix = $prefix . "fundingSource($i).";
3454
- $this->fundingSource[ $i ] = new FundingSource();
3455
- $this->fundingSource[ $i ]->init( $map, $newPrefix );
3456
- } else {
3457
- break;
3458
- }
3459
- $i++;
3460
- }
3461
- $i = 0;
3462
- while ( true ) {
3463
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
3464
- $newPrefix = $prefix . "error($i).";
3465
- $this->error[ $i ] = new ErrorData();
3466
- $this->error[ $i ]->init( $map, $newPrefix );
3467
- } else {
3468
- break;
3469
- }
3470
- $i++;
3471
- }
3472
-
3473
- }
3474
- }
3475
- }
3476
-
3477
-
3478
- /**
3479
- * The request to get the options of a payment request.
3480
- */
3481
- class GetPaymentOptionsRequest
3482
- {
3483
-
3484
- /**
3485
- *
3486
- * @access public
3487
- * @var RequestEnvelope
3488
- */
3489
- public $requestEnvelope;
3490
-
3491
- /**
3492
- *
3493
- * @access public
3494
- * @var string
3495
- */
3496
- public $payKey;
3497
-
3498
- /**
3499
- * Constructor with arguments
3500
- */
3501
- public function __construct( $requestEnvelope = null, $payKey = null )
3502
- {
3503
- $this->requestEnvelope = $requestEnvelope;
3504
- $this->payKey = $payKey;
3505
- }
3506
-
3507
-
3508
- public function toNVPString( $prefix = '' )
3509
- {
3510
- $str = '';
3511
- $delim = '';
3512
- if ( $this->requestEnvelope != null ) {
3513
- $newPrefix = $prefix . 'requestEnvelope.';
3514
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
3515
- $delim = '&';
3516
- }
3517
- if ( $this->payKey != null ) {
3518
- $str .= $delim . $prefix . 'payKey=' . urlencode( $this->payKey );
3519
- $delim = '&';
3520
- }
3521
-
3522
- return $str;
3523
- }
3524
-
3525
- }
3526
-
3527
-
3528
- /**
3529
- * The response message for the GetPaymentOption request
3530
- */
3531
- class GetPaymentOptionsResponse
3532
- {
3533
-
3534
- /**
3535
- *
3536
- * @access public
3537
- * @var ResponseEnvelope
3538
- */
3539
- public $responseEnvelope;
3540
-
3541
- /**
3542
- *
3543
- * @access public
3544
- * @var InitiatingEntity
3545
- */
3546
- public $initiatingEntity;
3547
-
3548
- /**
3549
- *
3550
- * @access public
3551
- * @var DisplayOptions
3552
- */
3553
- public $displayOptions;
3554
-
3555
- /**
3556
- *
3557
- * @access public
3558
- * @var string
3559
- */
3560
- public $shippingAddressId;
3561
-
3562
- /**
3563
- *
3564
- * @access public
3565
- * @var SenderOptions
3566
- */
3567
- public $senderOptions;
3568
-
3569
- /**
3570
- *
3571
- * @array
3572
- * @access public
3573
- * @var ReceiverOptions
3574
- */
3575
- public $receiverOptions;
3576
-
3577
- /**
3578
- *
3579
- * @array
3580
- * @access public
3581
- * @var ErrorData
3582
- */
3583
- public $error;
3584
-
3585
-
3586
- public function init( $map = null, $prefix = '' )
3587
- {
3588
- if ( $map != null ) {
3589
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
3590
- $newPrefix = $prefix . "responseEnvelope.";
3591
- $this->responseEnvelope = new ResponseEnvelope();
3592
- $this->responseEnvelope->init( $map, $newPrefix );
3593
- }
3594
- if ( PPUtils::array_match_key( $map, $prefix . "initiatingEntity." ) ) {
3595
- $newPrefix = $prefix . "initiatingEntity.";
3596
- $this->initiatingEntity = new InitiatingEntity();
3597
- $this->initiatingEntity->init( $map, $newPrefix );
3598
- }
3599
- if ( PPUtils::array_match_key( $map, $prefix . "displayOptions." ) ) {
3600
- $newPrefix = $prefix . "displayOptions.";
3601
- $this->displayOptions = new DisplayOptions();
3602
- $this->displayOptions->init( $map, $newPrefix );
3603
- }
3604
- $mapKeyName = $prefix . 'shippingAddressId';
3605
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3606
- $this->shippingAddressId = $map[ $mapKeyName ];
3607
- }
3608
- if ( PPUtils::array_match_key( $map, $prefix . "senderOptions." ) ) {
3609
- $newPrefix = $prefix . "senderOptions.";
3610
- $this->senderOptions = new SenderOptions();
3611
- $this->senderOptions->init( $map, $newPrefix );
3612
- }
3613
- $i = 0;
3614
- while ( true ) {
3615
- if ( PPUtils::array_match_key( $map, $prefix . "receiverOptions($i)" ) ) {
3616
- $newPrefix = $prefix . "receiverOptions($i).";
3617
- $this->receiverOptions[ $i ] = new ReceiverOptions();
3618
- $this->receiverOptions[ $i ]->init( $map, $newPrefix );
3619
- } else {
3620
- break;
3621
- }
3622
- $i++;
3623
- }
3624
- $i = 0;
3625
- while ( true ) {
3626
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
3627
- $newPrefix = $prefix . "error($i).";
3628
- $this->error[ $i ] = new ErrorData();
3629
- $this->error[ $i ]->init( $map, $newPrefix );
3630
- } else {
3631
- break;
3632
- }
3633
- $i++;
3634
- }
3635
-
3636
- }
3637
- }
3638
- }
3639
-
3640
-
3641
- /**
3642
- * The request to look up the details of a PayRequest. The
3643
- * PaymentDetailsRequest can be made with either a payKey,
3644
- * trackingId, or a transactionId of the PayRequest.
3645
- */
3646
- class PaymentDetailsRequest
3647
- {
3648
-
3649
- /**
3650
- *
3651
- * @access public
3652
- * @var RequestEnvelope
3653
- */
3654
- public $requestEnvelope;
3655
-
3656
- /**
3657
- *
3658
- * @access public
3659
- * @var string
3660
- */
3661
- public $payKey;
3662
-
3663
- /**
3664
- *
3665
- * @access public
3666
- * @var string
3667
- */
3668
- public $transactionId;
3669
-
3670
- /**
3671
- *
3672
- * @access public
3673
- * @var string
3674
- */
3675
- public $trackingId;
3676
-
3677
- /**
3678
- * Constructor with arguments
3679
- */
3680
- public function __construct( $requestEnvelope = null )
3681
- {
3682
- $this->requestEnvelope = $requestEnvelope;
3683
- }
3684
-
3685
-
3686
- public function toNVPString( $prefix = '' )
3687
- {
3688
- $str = '';
3689
- $delim = '';
3690
- if ( $this->requestEnvelope != null ) {
3691
- $newPrefix = $prefix . 'requestEnvelope.';
3692
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
3693
- $delim = '&';
3694
- }
3695
- if ( $this->payKey != null ) {
3696
- $str .= $delim . $prefix . 'payKey=' . urlencode( $this->payKey );
3697
- $delim = '&';
3698
- }
3699
- if ( $this->transactionId != null ) {
3700
- $str .= $delim . $prefix . 'transactionId=' . urlencode( $this->transactionId );
3701
- $delim = '&';
3702
- }
3703
- if ( $this->trackingId != null ) {
3704
- $str .= $delim . $prefix . 'trackingId=' . urlencode( $this->trackingId );
3705
- $delim = '&';
3706
- }
3707
-
3708
- return $str;
3709
- }
3710
-
3711
- }
3712
-
3713
-
3714
- /**
3715
- * The details of the PayRequest as specified in the Pay
3716
- * operation.
3717
- */
3718
- class PaymentDetailsResponse
3719
- {
3720
-
3721
- /**
3722
- *
3723
- * @access public
3724
- * @var ResponseEnvelope
3725
- */
3726
- public $responseEnvelope;
3727
-
3728
- /**
3729
- *
3730
- * @access public
3731
- * @var string
3732
- */
3733
- public $cancelUrl;
3734
-
3735
- /**
3736
- *
3737
- * @access public
3738
- * @var string
3739
- */
3740
- public $currencyCode;
3741
-
3742
- /**
3743
- *
3744
- * @access public
3745
- * @var string
3746
- */
3747
- public $ipnNotificationUrl;
3748
-
3749
- /**
3750
- *
3751
- * @access public
3752
- * @var string
3753
- */
3754
- public $memo;
3755
-
3756
- /**
3757
- *
3758
- * @access public
3759
- * @var PaymentInfoList
3760
- */
3761
- public $paymentInfoList;
3762
-
3763
- /**
3764
- *
3765
- * @access public
3766
- * @var string
3767
- */
3768
- public $returnUrl;
3769
-
3770
- /**
3771
- *
3772
- * @access public
3773
- * @var string
3774
- */
3775
- public $senderEmail;
3776
-
3777
- /**
3778
- *
3779
- * @access public
3780
- * @var string
3781
- */
3782
- public $status;
3783
-
3784
- /**
3785
- *
3786
- * @access public
3787
- * @var string
3788
- */
3789
- public $trackingId;
3790
-
3791
- /**
3792
- *
3793
- * @access public
3794
- * @var string
3795
- */
3796
- public $payKey;
3797
-
3798
- /**
3799
- *
3800
- * @access public
3801
- * @var string
3802
- */
3803
- public $actionType;
3804
-
3805
- /**
3806
- *
3807
- * @access public
3808
- * @var string
3809
- */
3810
- public $feesPayer;
3811
-
3812
- /**
3813
- *
3814
- * @access public
3815
- * @var boolean
3816
- */
3817
- public $reverseAllParallelPaymentsOnError;
3818
-
3819
- /**
3820
- *
3821
- * @access public
3822
- * @var string
3823
- */
3824
- public $preapprovalKey;
3825
-
3826
- /**
3827
- *
3828
- * @access public
3829
- * @var FundingConstraint
3830
- */
3831
- public $fundingConstraint;
3832
-
3833
- /**
3834
- *
3835
- * @access public
3836
- * @var SenderIdentifier
3837
- */
3838
- public $sender;
3839
-
3840
- /**
3841
- *
3842
- * @array
3843
- * @access public
3844
- * @var ErrorData
3845
- */
3846
- public $error;
3847
-
3848
-
3849
- public function init( $map = null, $prefix = '' )
3850
- {
3851
- if ( $map != null ) {
3852
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
3853
- $newPrefix = $prefix . "responseEnvelope.";
3854
- $this->responseEnvelope = new ResponseEnvelope();
3855
- $this->responseEnvelope->init( $map, $newPrefix );
3856
- }
3857
- $mapKeyName = $prefix . 'cancelUrl';
3858
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3859
- $this->cancelUrl = $map[ $mapKeyName ];
3860
- }
3861
- $mapKeyName = $prefix . 'currencyCode';
3862
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3863
- $this->currencyCode = $map[ $mapKeyName ];
3864
- }
3865
- $mapKeyName = $prefix . 'ipnNotificationUrl';
3866
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3867
- $this->ipnNotificationUrl = $map[ $mapKeyName ];
3868
- }
3869
- $mapKeyName = $prefix . 'memo';
3870
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3871
- $this->memo = $map[ $mapKeyName ];
3872
- }
3873
- if ( PPUtils::array_match_key( $map, $prefix . "paymentInfoList." ) ) {
3874
- $newPrefix = $prefix . "paymentInfoList.";
3875
- $this->paymentInfoList = new PaymentInfoList();
3876
- $this->paymentInfoList->init( $map, $newPrefix );
3877
- }
3878
- $mapKeyName = $prefix . 'returnUrl';
3879
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3880
- $this->returnUrl = $map[ $mapKeyName ];
3881
- }
3882
- $mapKeyName = $prefix . 'senderEmail';
3883
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3884
- $this->senderEmail = $map[ $mapKeyName ];
3885
- }
3886
- $mapKeyName = $prefix . 'status';
3887
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3888
- $this->status = $map[ $mapKeyName ];
3889
- }
3890
- $mapKeyName = $prefix . 'trackingId';
3891
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3892
- $this->trackingId = $map[ $mapKeyName ];
3893
- }
3894
- $mapKeyName = $prefix . 'payKey';
3895
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3896
- $this->payKey = $map[ $mapKeyName ];
3897
- }
3898
- $mapKeyName = $prefix . 'actionType';
3899
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3900
- $this->actionType = $map[ $mapKeyName ];
3901
- }
3902
- $mapKeyName = $prefix . 'feesPayer';
3903
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3904
- $this->feesPayer = $map[ $mapKeyName ];
3905
- }
3906
- $mapKeyName = $prefix . 'reverseAllParallelPaymentsOnError';
3907
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3908
- $this->reverseAllParallelPaymentsOnError = $map[ $mapKeyName ];
3909
- }
3910
- $mapKeyName = $prefix . 'preapprovalKey';
3911
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
3912
- $this->preapprovalKey = $map[ $mapKeyName ];
3913
- }
3914
- if ( PPUtils::array_match_key( $map, $prefix . "fundingConstraint." ) ) {
3915
- $newPrefix = $prefix . "fundingConstraint.";
3916
- $this->fundingConstraint = new FundingConstraint();
3917
- $this->fundingConstraint->init( $map, $newPrefix );
3918
- }
3919
- if ( PPUtils::array_match_key( $map, $prefix . "sender." ) ) {
3920
- $newPrefix = $prefix . "sender.";
3921
- $this->sender = new SenderIdentifier();
3922
- $this->sender->init( $map, $newPrefix );
3923
- }
3924
- $i = 0;
3925
- while ( true ) {
3926
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
3927
- $newPrefix = $prefix . "error($i).";
3928
- $this->error[ $i ] = new ErrorData();
3929
- $this->error[ $i ]->init( $map, $newPrefix );
3930
- } else {
3931
- break;
3932
- }
3933
- $i++;
3934
- }
3935
-
3936
- }
3937
- }
3938
- }
3939
-
3940
-
3941
- /**
3942
- * The PayRequest contains the payment instructions to make
3943
- * from sender to receivers.
3944
- */
3945
- class PayRequest
3946
- {
3947
-
3948
- /**
3949
- *
3950
- * @access public
3951
- * @var RequestEnvelope
3952
- */
3953
- public $requestEnvelope;
3954
-
3955
- /**
3956
- *
3957
- * @access public
3958
- * @var ClientDetailsType
3959
- */
3960
- public $clientDetails;
3961
-
3962
- /**
3963
- *
3964
- * @access public
3965
- * @var string
3966
- */
3967
- public $actionType;
3968
-
3969
- /**
3970
- *
3971
- * @access public
3972
- * @var string
3973
- */
3974
- public $cancelUrl;
3975
-
3976
- /**
3977
- *
3978
- * @access public
3979
- * @var string
3980
- */
3981
- public $currencyCode;
3982
-
3983
- /**
3984
- *
3985
- * @access public
3986
- * @var string
3987
- */
3988
- public $feesPayer;
3989
-
3990
- /**
3991
- *
3992
- * @access public
3993
- * @var string
3994
- */
3995
- public $ipnNotificationUrl;
3996
-
3997
- /**
3998
- *
3999
- * @access public
4000
- * @var string
4001
- */
4002
- public $memo;
4003
-
4004
- /**
4005
- *
4006
- * @access public
4007
- * @var string
4008
- */
4009
- public $pin;
4010
-
4011
- /**
4012
- *
4013
- * @access public
4014
- * @var string
4015
- */
4016
- public $preapprovalKey;
4017
-
4018
- /**
4019
- *
4020
- * @access public
4021
- * @var ReceiverList
4022
- */
4023
- public $receiverList;
4024
-
4025
- /**
4026
- *
4027
- * @access public
4028
- * @var boolean
4029
- */
4030
- public $reverseAllParallelPaymentsOnError;
4031
-
4032
- /**
4033
- *
4034
- * @access public
4035
- * @var string
4036
- */
4037
- public $senderEmail;
4038
-
4039
- /**
4040
- *
4041
- * @access public
4042
- * @var string
4043
- */
4044
- public $returnUrl;
4045
-
4046
- /**
4047
- *
4048
- * @access public
4049
- * @var string
4050
- */
4051
- public $trackingId;
4052
-
4053
- /**
4054
- *
4055
- * @access public
4056
- * @var FundingConstraint
4057
- */
4058
- public $fundingConstraint;
4059
-
4060
- /**
4061
- *
4062
- * @access public
4063
- * @var SenderIdentifier
4064
- */
4065
- public $sender;
4066
-
4067
- /**
4068
- * Constructor with arguments
4069
- */
4070
- public function __construct( $requestEnvelope = null, $actionType = null, $cancelUrl = null, $currencyCode = null, $receiverList = null, $returnUrl = null )
4071
- {
4072
- $this->requestEnvelope = $requestEnvelope;
4073
- $this->actionType = $actionType;
4074
- $this->cancelUrl = $cancelUrl;
4075
- $this->currencyCode = $currencyCode;
4076
- $this->receiverList = $receiverList;
4077
- $this->returnUrl = $returnUrl;
4078
- }
4079
-
4080
-
4081
- public function toNVPString( $prefix = '' )
4082
- {
4083
- $str = '';
4084
- $delim = '';
4085
- if ( $this->requestEnvelope != null ) {
4086
- $newPrefix = $prefix . 'requestEnvelope.';
4087
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
4088
- $delim = '&';
4089
- }
4090
- if ( $this->clientDetails != null ) {
4091
- $newPrefix = $prefix . 'clientDetails.';
4092
- $str .= $delim . call_user_func( array( $this->clientDetails, 'toNVPString' ), $newPrefix );
4093
- $delim = '&';
4094
- }
4095
- if ( $this->actionType != null ) {
4096
- $str .= $delim . $prefix . 'actionType=' . urlencode( $this->actionType );
4097
- $delim = '&';
4098
- }
4099
- if ( $this->cancelUrl != null ) {
4100
- $str .= $delim . $prefix . 'cancelUrl=' . urlencode( $this->cancelUrl );
4101
- $delim = '&';
4102
- }
4103
- if ( $this->currencyCode != null ) {
4104
- $str .= $delim . $prefix . 'currencyCode=' . urlencode( $this->currencyCode );
4105
- $delim = '&';
4106
- }
4107
- if ( $this->feesPayer != null ) {
4108
- $str .= $delim . $prefix . 'feesPayer=' . urlencode( $this->feesPayer );
4109
- $delim = '&';
4110
- }
4111
- if ( $this->ipnNotificationUrl != null ) {
4112
- $str .= $delim . $prefix . 'ipnNotificationUrl=' . urlencode( $this->ipnNotificationUrl );
4113
- $delim = '&';
4114
- }
4115
- if ( $this->memo != null ) {
4116
- $str .= $delim . $prefix . 'memo=' . urlencode( $this->memo );
4117
- $delim = '&';
4118
- }
4119
- if ( $this->pin != null ) {
4120
- $str .= $delim . $prefix . 'pin=' . urlencode( $this->pin );
4121
- $delim = '&';
4122
- }
4123
- if ( $this->preapprovalKey != null ) {
4124
- $str .= $delim . $prefix . 'preapprovalKey=' . urlencode( $this->preapprovalKey );
4125
- $delim = '&';
4126
- }
4127
- if ( $this->receiverList != null ) {
4128
- $newPrefix = $prefix . 'receiverList.';
4129
- $str .= $delim . call_user_func( array( $this->receiverList, 'toNVPString' ), $newPrefix );
4130
- $delim = '&';
4131
- }
4132
- if ( $this->reverseAllParallelPaymentsOnError != null ) {
4133
- $str .= $delim . $prefix . 'reverseAllParallelPaymentsOnError=' . urlencode( $this->reverseAllParallelPaymentsOnError );
4134
- $delim = '&';
4135
- }
4136
- if ( $this->senderEmail != null ) {
4137
- $str .= $delim . $prefix . 'senderEmail=' . urlencode( $this->senderEmail );
4138
- $delim = '&';
4139
- }
4140
- if ( $this->returnUrl != null ) {
4141
- $str .= $delim . $prefix . 'returnUrl=' . urlencode( $this->returnUrl );
4142
- $delim = '&';
4143
- }
4144
- if ( $this->trackingId != null ) {
4145
- $str .= $delim . $prefix . 'trackingId=' . urlencode( $this->trackingId );
4146
- $delim = '&';
4147
- }
4148
- if ( $this->fundingConstraint != null ) {
4149
- $newPrefix = $prefix . 'fundingConstraint.';
4150
- $str .= $delim . call_user_func( array( $this->fundingConstraint, 'toNVPString' ), $newPrefix );
4151
- $delim = '&';
4152
- }
4153
- if ( $this->sender != null ) {
4154
- $newPrefix = $prefix . 'sender.';
4155
- $str .= $delim . call_user_func( array( $this->sender, 'toNVPString' ), $newPrefix );
4156
- $delim = '&';
4157
- }
4158
-
4159
- return $str;
4160
- }
4161
-
4162
- }
4163
-
4164
-
4165
- /**
4166
- * The PayResponse contains the result of the Pay operation.
4167
- * The payKey and execution status of the request should always
4168
- * be provided.
4169
- */
4170
- class PayResponse
4171
- {
4172
-
4173
- /**
4174
- *
4175
- * @access public
4176
- * @var ResponseEnvelope
4177
- */
4178
- public $responseEnvelope;
4179
-
4180
- /**
4181
- *
4182
- * @access public
4183
- * @var string
4184
- */
4185
- public $payKey;
4186
-
4187
- /**
4188
- *
4189
- * @access public
4190
- * @var string
4191
- */
4192
- public $paymentExecStatus;
4193
-
4194
- /**
4195
- *
4196
- * @access public
4197
- * @var PayErrorList
4198
- */
4199
- public $payErrorList;
4200
-
4201
- /**
4202
- *
4203
- * @access public
4204
- * @var FundingPlan
4205
- */
4206
- public $defaultFundingPlan;
4207
-
4208
- /**
4209
- *
4210
- * @array
4211
- * @access public
4212
- * @var ErrorData
4213
- */
4214
- public $error;
4215
-
4216
-
4217
- public function init( $map = null, $prefix = '' )
4218
- {
4219
- if ( $map != null ) {
4220
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
4221
- $newPrefix = $prefix . "responseEnvelope.";
4222
- $this->responseEnvelope = new ResponseEnvelope();
4223
- $this->responseEnvelope->init( $map, $newPrefix );
4224
- }
4225
- $mapKeyName = $prefix . 'payKey';
4226
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4227
- $this->payKey = $map[ $mapKeyName ];
4228
- }
4229
- $mapKeyName = $prefix . 'paymentExecStatus';
4230
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4231
- $this->paymentExecStatus = $map[ $mapKeyName ];
4232
- }
4233
- if ( PPUtils::array_match_key( $map, $prefix . "payErrorList." ) ) {
4234
- $newPrefix = $prefix . "payErrorList.";
4235
- $this->payErrorList = new PayErrorList();
4236
- $this->payErrorList->init( $map, $newPrefix );
4237
- }
4238
- if ( PPUtils::array_match_key( $map, $prefix . "defaultFundingPlan." ) ) {
4239
- $newPrefix = $prefix . "defaultFundingPlan.";
4240
- $this->defaultFundingPlan = new FundingPlan();
4241
- $this->defaultFundingPlan->init( $map, $newPrefix );
4242
- }
4243
- $i = 0;
4244
- while ( true ) {
4245
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
4246
- $newPrefix = $prefix . "error($i).";
4247
- $this->error[ $i ] = new ErrorData();
4248
- $this->error[ $i ]->init( $map, $newPrefix );
4249
- } else {
4250
- break;
4251
- }
4252
- $i++;
4253
- }
4254
-
4255
- }
4256
- }
4257
- }
4258
-
4259
-
4260
- /**
4261
- * The request to look up the details of a Preapproval.
4262
- */
4263
- class PreapprovalDetailsRequest
4264
- {
4265
-
4266
- /**
4267
- *
4268
- * @access public
4269
- * @var RequestEnvelope
4270
- */
4271
- public $requestEnvelope;
4272
-
4273
- /**
4274
- *
4275
- * @access public
4276
- * @var string
4277
- */
4278
- public $preapprovalKey;
4279
-
4280
- /**
4281
- *
4282
- * @access public
4283
- * @var boolean
4284
- */
4285
- public $getBillingAddress;
4286
-
4287
- /**
4288
- * Constructor with arguments
4289
- */
4290
- public function __construct( $requestEnvelope = null, $preapprovalKey = null )
4291
- {
4292
- $this->requestEnvelope = $requestEnvelope;
4293
- $this->preapprovalKey = $preapprovalKey;
4294
- }
4295
-
4296
-
4297
- public function toNVPString( $prefix = '' )
4298
- {
4299
- $str = '';
4300
- $delim = '';
4301
- if ( $this->requestEnvelope != null ) {
4302
- $newPrefix = $prefix . 'requestEnvelope.';
4303
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
4304
- $delim = '&';
4305
- }
4306
- if ( $this->preapprovalKey != null ) {
4307
- $str .= $delim . $prefix . 'preapprovalKey=' . urlencode( $this->preapprovalKey );
4308
- $delim = '&';
4309
- }
4310
- if ( $this->getBillingAddress != null ) {
4311
- $str .= $delim . $prefix . 'getBillingAddress=' . urlencode( $this->getBillingAddress );
4312
- $delim = '&';
4313
- }
4314
-
4315
- return $str;
4316
- }
4317
-
4318
- }
4319
-
4320
-
4321
- /**
4322
- * The details of the Preapproval as specified in the
4323
- * Preapproval operation.
4324
- */
4325
- class PreapprovalDetailsResponse
4326
- {
4327
-
4328
- /**
4329
- *
4330
- * @access public
4331
- * @var ResponseEnvelope
4332
- */
4333
- public $responseEnvelope;
4334
-
4335
- /**
4336
- *
4337
- * @access public
4338
- * @var boolean
4339
- */
4340
- public $approved;
4341
-
4342
- /**
4343
- *
4344
- * @access public
4345
- * @var string
4346
- */
4347
- public $cancelUrl;
4348
-
4349
- /**
4350
- *
4351
- * @access public
4352
- * @var integer
4353
- */
4354
- public $curPayments;
4355
-
4356
- /**
4357
- *
4358
- * @access public
4359
- * @var double
4360
- */
4361
- public $curPaymentsAmount;
4362
-
4363
- /**
4364
- *
4365
- * @access public
4366
- * @var integer
4367
- */
4368
- public $curPeriodAttempts;
4369
-
4370
- /**
4371
- *
4372
- * @access public
4373
- * @var dateTime
4374
- */
4375
- public $curPeriodEndingDate;
4376
-
4377
- /**
4378
- *
4379
- * @access public
4380
- * @var string
4381
- */
4382
- public $currencyCode;
4383
-
4384
- /**
4385
- *
4386
- * @access public
4387
- * @var integer
4388
- */
4389
- public $dateOfMonth;
4390
-
4391
- /**
4392
- *
4393
- * @access public
4394
- * @var DayOfWeek
4395
- */
4396
- public $dayOfWeek;
4397
-
4398
- /**
4399
- *
4400
- * @access public
4401
- * @var dateTime
4402
- */
4403
- public $endingDate;
4404
-
4405
- /**
4406
- *
4407
- * @access public
4408
- * @var double
4409
- */
4410
- public $maxAmountPerPayment;
4411
-
4412
- /**
4413
- *
4414
- * @access public
4415
- * @var integer
4416
- */
4417
- public $maxNumberOfPayments;
4418
-
4419
- /**
4420
- *
4421
- * @access public
4422
- * @var integer
4423
- */
4424
- public $maxNumberOfPaymentsPerPeriod;
4425
-
4426
- /**
4427
- *
4428
- * @access public
4429
- * @var double
4430
- */
4431
- public $maxTotalAmountOfAllPayments;
4432
-
4433
- /**
4434
- *
4435
- * @access public
4436
- * @var string
4437
- */
4438
- public $paymentPeriod;
4439
-
4440
- /**
4441
- *
4442
- * @access public
4443
- * @var string
4444
- */
4445
- public $pinType;
4446
-
4447
- /**
4448
- *
4449
- * @access public
4450
- * @var string
4451
- */
4452
- public $returnUrl;
4453
-
4454
- /**
4455
- *
4456
- * @access public
4457
- * @var string
4458
- */
4459
- public $senderEmail;
4460
-
4461
- /**
4462
- *
4463
- * @access public
4464
- * @var string
4465
- */
4466
- public $memo;
4467
-
4468
- /**
4469
- *
4470
- * @access public
4471
- * @var dateTime
4472
- */
4473
- public $startingDate;
4474
-
4475
- /**
4476
- *
4477
- * @access public
4478
- * @var string
4479
- */
4480
- public $status;
4481
-
4482
- /**
4483
- *
4484
- * @access public
4485
- * @var string
4486
- */
4487
- public $ipnNotificationUrl;
4488
-
4489
- /**
4490
- *
4491
- * @access public
4492
- * @var AddressList
4493
- */
4494
- public $addressList;
4495
-
4496
- /**
4497
- *
4498
- * @access public
4499
- * @var string
4500
- */
4501
- public $feesPayer;
4502
-
4503
- /**
4504
- *
4505
- * @access public
4506
- * @var boolean
4507
- */
4508
- public $displayMaxTotalAmount;
4509
-
4510
- /**
4511
- *
4512
- * @array
4513
- * @access public
4514
- * @var ErrorData
4515
- */
4516
- public $error;
4517
-
4518
-
4519
- public function init( $map = null, $prefix = '' )
4520
- {
4521
- if ( $map != null ) {
4522
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
4523
- $newPrefix = $prefix . "responseEnvelope.";
4524
- $this->responseEnvelope = new ResponseEnvelope();
4525
- $this->responseEnvelope->init( $map, $newPrefix );
4526
- }
4527
- $mapKeyName = $prefix . 'approved';
4528
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4529
- $this->approved = $map[ $mapKeyName ];
4530
- }
4531
- $mapKeyName = $prefix . 'cancelUrl';
4532
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4533
- $this->cancelUrl = $map[ $mapKeyName ];
4534
- }
4535
- $mapKeyName = $prefix . 'curPayments';
4536
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4537
- $this->curPayments = $map[ $mapKeyName ];
4538
- }
4539
- $mapKeyName = $prefix . 'curPaymentsAmount';
4540
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4541
- $this->curPaymentsAmount = $map[ $mapKeyName ];
4542
- }
4543
- $mapKeyName = $prefix . 'curPeriodAttempts';
4544
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4545
- $this->curPeriodAttempts = $map[ $mapKeyName ];
4546
- }
4547
- $mapKeyName = $prefix . 'curPeriodEndingDate';
4548
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4549
- $this->curPeriodEndingDate = $map[ $mapKeyName ];
4550
- }
4551
- $mapKeyName = $prefix . 'currencyCode';
4552
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4553
- $this->currencyCode = $map[ $mapKeyName ];
4554
- }
4555
- $mapKeyName = $prefix . 'dateOfMonth';
4556
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4557
- $this->dateOfMonth = $map[ $mapKeyName ];
4558
- }
4559
- $mapKeyName = $prefix . 'dayOfWeek';
4560
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4561
- $this->dayOfWeek = $map[ $mapKeyName ];
4562
- }
4563
- $mapKeyName = $prefix . 'endingDate';
4564
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4565
- $this->endingDate = $map[ $mapKeyName ];
4566
- }
4567
- $mapKeyName = $prefix . 'maxAmountPerPayment';
4568
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4569
- $this->maxAmountPerPayment = $map[ $mapKeyName ];
4570
- }
4571
- $mapKeyName = $prefix . 'maxNumberOfPayments';
4572
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4573
- $this->maxNumberOfPayments = $map[ $mapKeyName ];
4574
- }
4575
- $mapKeyName = $prefix . 'maxNumberOfPaymentsPerPeriod';
4576
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4577
- $this->maxNumberOfPaymentsPerPeriod = $map[ $mapKeyName ];
4578
- }
4579
- $mapKeyName = $prefix . 'maxTotalAmountOfAllPayments';
4580
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4581
- $this->maxTotalAmountOfAllPayments = $map[ $mapKeyName ];
4582
- }
4583
- $mapKeyName = $prefix . 'paymentPeriod';
4584
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4585
- $this->paymentPeriod = $map[ $mapKeyName ];
4586
- }
4587
- $mapKeyName = $prefix . 'pinType';
4588
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4589
- $this->pinType = $map[ $mapKeyName ];
4590
- }
4591
- $mapKeyName = $prefix . 'returnUrl';
4592
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4593
- $this->returnUrl = $map[ $mapKeyName ];
4594
- }
4595
- $mapKeyName = $prefix . 'senderEmail';
4596
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4597
- $this->senderEmail = $map[ $mapKeyName ];
4598
- }
4599
- $mapKeyName = $prefix . 'memo';
4600
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4601
- $this->memo = $map[ $mapKeyName ];
4602
- }
4603
- $mapKeyName = $prefix . 'startingDate';
4604
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4605
- $this->startingDate = $map[ $mapKeyName ];
4606
- }
4607
- $mapKeyName = $prefix . 'status';
4608
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4609
- $this->status = $map[ $mapKeyName ];
4610
- }
4611
- $mapKeyName = $prefix . 'ipnNotificationUrl';
4612
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4613
- $this->ipnNotificationUrl = $map[ $mapKeyName ];
4614
- }
4615
- if ( PPUtils::array_match_key( $map, $prefix . "addressList." ) ) {
4616
- $newPrefix = $prefix . "addressList.";
4617
- $this->addressList = new AddressList();
4618
- $this->addressList->init( $map, $newPrefix );
4619
- }
4620
- $mapKeyName = $prefix . 'feesPayer';
4621
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4622
- $this->feesPayer = $map[ $mapKeyName ];
4623
- }
4624
- $mapKeyName = $prefix . 'displayMaxTotalAmount';
4625
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4626
- $this->displayMaxTotalAmount = $map[ $mapKeyName ];
4627
- }
4628
- $i = 0;
4629
- while ( true ) {
4630
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
4631
- $newPrefix = $prefix . "error($i).";
4632
- $this->error[ $i ] = new ErrorData();
4633
- $this->error[ $i ]->init( $map, $newPrefix );
4634
- } else {
4635
- break;
4636
- }
4637
- $i++;
4638
- }
4639
-
4640
- }
4641
- }
4642
- }
4643
-
4644
-
4645
- /**
4646
- * A request to create a Preapproval. A Preapproval is an
4647
- * agreement between a Paypal account holder (the sender) and
4648
- * the API caller (the service invoker) to make payment(s) on
4649
- * the the sender's behalf with various limitations defined.
4650
- */
4651
- class PreapprovalRequest
4652
- {
4653
-
4654
- /**
4655
- *
4656
- * @access public
4657
- * @var RequestEnvelope
4658
- */
4659
- public $requestEnvelope;
4660
-
4661
- /**
4662
- *
4663
- * @access public
4664
- * @var ClientDetailsType
4665
- */
4666
- public $clientDetails;
4667
-
4668
- /**
4669
- *
4670
- * @access public
4671
- * @var string
4672
- */
4673
- public $cancelUrl;
4674
-
4675
- /**
4676
- *
4677
- * @access public
4678
- * @var string
4679
- */
4680
- public $currencyCode;
4681
-
4682
- /**
4683
- *
4684
- * @access public
4685
- * @var integer
4686
- */
4687
- public $dateOfMonth;
4688
-
4689
- /**
4690
- *
4691
- * @access public
4692
- * @var DayOfWeek
4693
- */
4694
- public $dayOfWeek;
4695
-
4696
- /**
4697
- *
4698
- * @access public
4699
- * @var dateTime
4700
- */
4701
- public $endingDate;
4702
-
4703
- /**
4704
- *
4705
- * @access public
4706
- * @var double
4707
- */
4708
- public $maxAmountPerPayment;
4709
-
4710
- /**
4711
- *
4712
- * @access public
4713
- * @var integer
4714
- */
4715
- public $maxNumberOfPayments;
4716
-
4717
- /**
4718
- *
4719
- * @access public
4720
- * @var integer
4721
- */
4722
- public $maxNumberOfPaymentsPerPeriod;
4723
-
4724
- /**
4725
- *
4726
- * @access public
4727
- * @var double
4728
- */
4729
- public $maxTotalAmountOfAllPayments;
4730
-
4731
- /**
4732
- *
4733
- * @access public
4734
- * @var string
4735
- */
4736
- public $paymentPeriod;
4737
-
4738
- /**
4739
- *
4740
- * @access public
4741
- * @var string
4742
- */
4743
- public $returnUrl;
4744
-
4745
- /**
4746
- *
4747
- * @access public
4748
- * @var string
4749
- */
4750
- public $memo;
4751
-
4752
- /**
4753
- *
4754
- * @access public
4755
- * @var string
4756
- */
4757
- public $ipnNotificationUrl;
4758
-
4759
- /**
4760
- *
4761
- * @access public
4762
- * @var string
4763
- */
4764
- public $senderEmail;
4765
-
4766
- /**
4767
- *
4768
- * @access public
4769
- * @var dateTime
4770
- */
4771
- public $startingDate;
4772
-
4773
- /**
4774
- *
4775
- * @access public
4776
- * @var string
4777
- */
4778
- public $pinType;
4779
-
4780
- /**
4781
- *
4782
- * @access public
4783
- * @var string
4784
- */
4785
- public $feesPayer;
4786
-
4787
- /**
4788
- *
4789
- * @access public
4790
- * @var boolean
4791
- */
4792
- public $displayMaxTotalAmount;
4793
-
4794
- /**
4795
- * Constructor with arguments
4796
- */
4797
- public function __construct( $requestEnvelope = null, $cancelUrl = null, $currencyCode = null, $returnUrl = null, $startingDate = null )
4798
- {
4799
- $this->requestEnvelope = $requestEnvelope;
4800
- $this->cancelUrl = $cancelUrl;
4801
- $this->currencyCode = $currencyCode;
4802
- $this->returnUrl = $returnUrl;
4803
- $this->startingDate = $startingDate;
4804
- }
4805
-
4806
-
4807
- public function toNVPString( $prefix = '' )
4808
- {
4809
- $str = '';
4810
- $delim = '';
4811
- if ( $this->requestEnvelope != null ) {
4812
- $newPrefix = $prefix . 'requestEnvelope.';
4813
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
4814
- $delim = '&';
4815
- }
4816
- if ( $this->clientDetails != null ) {
4817
- $newPrefix = $prefix . 'clientDetails.';
4818
- $str .= $delim . call_user_func( array( $this->clientDetails, 'toNVPString' ), $newPrefix );
4819
- $delim = '&';
4820
- }
4821
- if ( $this->cancelUrl != null ) {
4822
- $str .= $delim . $prefix . 'cancelUrl=' . urlencode( $this->cancelUrl );
4823
- $delim = '&';
4824
- }
4825
- if ( $this->currencyCode != null ) {
4826
- $str .= $delim . $prefix . 'currencyCode=' . urlencode( $this->currencyCode );
4827
- $delim = '&';
4828
- }
4829
- if ( $this->dateOfMonth != null ) {
4830
- $str .= $delim . $prefix . 'dateOfMonth=' . urlencode( $this->dateOfMonth );
4831
- $delim = '&';
4832
- }
4833
- if ( $this->dayOfWeek != null ) {
4834
- $str .= $delim . $prefix . 'dayOfWeek=' . urlencode( $this->dayOfWeek );
4835
- $delim = '&';
4836
- }
4837
- if ( $this->endingDate != null ) {
4838
- $str .= $delim . $prefix . 'endingDate=' . urlencode( $this->endingDate );
4839
- $delim = '&';
4840
- }
4841
- if ( $this->maxAmountPerPayment != null ) {
4842
- $str .= $delim . $prefix . 'maxAmountPerPayment=' . urlencode( $this->maxAmountPerPayment );
4843
- $delim = '&';
4844
- }
4845
- if ( $this->maxNumberOfPayments != null ) {
4846
- $str .= $delim . $prefix . 'maxNumberOfPayments=' . urlencode( $this->maxNumberOfPayments );
4847
- $delim = '&';
4848
- }
4849
- if ( $this->maxNumberOfPaymentsPerPeriod != null ) {
4850
- $str .= $delim . $prefix . 'maxNumberOfPaymentsPerPeriod=' . urlencode( $this->maxNumberOfPaymentsPerPeriod );
4851
- $delim = '&';
4852
- }
4853
- if ( $this->maxTotalAmountOfAllPayments != null ) {
4854
- $str .= $delim . $prefix . 'maxTotalAmountOfAllPayments=' . urlencode( $this->maxTotalAmountOfAllPayments );
4855
- $delim = '&';
4856
- }
4857
- if ( $this->paymentPeriod != null ) {
4858
- $str .= $delim . $prefix . 'paymentPeriod=' . urlencode( $this->paymentPeriod );
4859
- $delim = '&';
4860
- }
4861
- if ( $this->returnUrl != null ) {
4862
- $str .= $delim . $prefix . 'returnUrl=' . urlencode( $this->returnUrl );
4863
- $delim = '&';
4864
- }
4865
- if ( $this->memo != null ) {
4866
- $str .= $delim . $prefix . 'memo=' . urlencode( $this->memo );
4867
- $delim = '&';
4868
- }
4869
- if ( $this->ipnNotificationUrl != null ) {
4870
- $str .= $delim . $prefix . 'ipnNotificationUrl=' . urlencode( $this->ipnNotificationUrl );
4871
- $delim = '&';
4872
- }
4873
- if ( $this->senderEmail != null ) {
4874
- $str .= $delim . $prefix . 'senderEmail=' . urlencode( $this->senderEmail );
4875
- $delim = '&';
4876
- }
4877
- if ( $this->startingDate != null ) {
4878
- $str .= $delim . $prefix . 'startingDate=' . urlencode( $this->startingDate );
4879
- $delim = '&';
4880
- }
4881
- if ( $this->pinType != null ) {
4882
- $str .= $delim . $prefix . 'pinType=' . urlencode( $this->pinType );
4883
- $delim = '&';
4884
- }
4885
- if ( $this->feesPayer != null ) {
4886
- $str .= $delim . $prefix . 'feesPayer=' . urlencode( $this->feesPayer );
4887
- $delim = '&';
4888
- }
4889
- if ( $this->displayMaxTotalAmount != null ) {
4890
- $str .= $delim . $prefix . 'displayMaxTotalAmount=' . urlencode( $this->displayMaxTotalAmount );
4891
- $delim = '&';
4892
- }
4893
-
4894
- return $str;
4895
- }
4896
-
4897
- }
4898
-
4899
-
4900
- /**
4901
- * The result of the PreapprovalRequest is a preapprovalKey.
4902
- */
4903
- class PreapprovalResponse
4904
- {
4905
-
4906
- /**
4907
- *
4908
- * @access public
4909
- * @var ResponseEnvelope
4910
- */
4911
- public $responseEnvelope;
4912
-
4913
- /**
4914
- *
4915
- * @access public
4916
- * @var string
4917
- */
4918
- public $preapprovalKey;
4919
-
4920
- /**
4921
- *
4922
- * @array
4923
- * @access public
4924
- * @var ErrorData
4925
- */
4926
- public $error;
4927
-
4928
-
4929
- public function init( $map = null, $prefix = '' )
4930
- {
4931
- if ( $map != null ) {
4932
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
4933
- $newPrefix = $prefix . "responseEnvelope.";
4934
- $this->responseEnvelope = new ResponseEnvelope();
4935
- $this->responseEnvelope->init( $map, $newPrefix );
4936
- }
4937
- $mapKeyName = $prefix . 'preapprovalKey';
4938
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
4939
- $this->preapprovalKey = $map[ $mapKeyName ];
4940
- }
4941
- $i = 0;
4942
- while ( true ) {
4943
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
4944
- $newPrefix = $prefix . "error($i).";
4945
- $this->error[ $i ] = new ErrorData();
4946
- $this->error[ $i ]->init( $map, $newPrefix );
4947
- } else {
4948
- break;
4949
- }
4950
- $i++;
4951
- }
4952
-
4953
- }
4954
- }
4955
- }
4956
-
4957
-
4958
- /**
4959
- * A request to make a refund based on various criteria. A
4960
- * refund can be made against the entire payKey, an individual
4961
- * transaction belonging to a payKey, a tracking id, or a
4962
- * specific receiver of a payKey.
4963
- */
4964
- class RefundRequest
4965
- {
4966
-
4967
- /**
4968
- *
4969
- * @access public
4970
- * @var RequestEnvelope
4971
- */
4972
- public $requestEnvelope;
4973
-
4974
- /**
4975
- *
4976
- * @access public
4977
- * @var string
4978
- */
4979
- public $currencyCode;
4980
-
4981
- /**
4982
- *
4983
- * @access public
4984
- * @var string
4985
- */
4986
- public $payKey;
4987
-
4988
- /**
4989
- *
4990
- * @access public
4991
- * @var string
4992
- */
4993
- public $transactionId;
4994
-
4995
- /**
4996
- *
4997
- * @access public
4998
- * @var string
4999
- */
5000
- public $trackingId;
5001
-
5002
- /**
5003
- *
5004
- * @access public
5005
- * @var ReceiverList
5006
- */
5007
- public $receiverList;
5008
-
5009
- /**
5010
- * Constructor with arguments
5011
- */
5012
- public function __construct( $requestEnvelope = null )
5013
- {
5014
- $this->requestEnvelope = $requestEnvelope;
5015
- }
5016
-
5017
-
5018
- public function toNVPString( $prefix = '' )
5019
- {
5020
- $str = '';
5021
- $delim = '';
5022
- if ( $this->requestEnvelope != null ) {
5023
- $newPrefix = $prefix . 'requestEnvelope.';
5024
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
5025
- $delim = '&';
5026
- }
5027
- if ( $this->currencyCode != null ) {
5028
- $str .= $delim . $prefix . 'currencyCode=' . urlencode( $this->currencyCode );
5029
- $delim = '&';
5030
- }
5031
- if ( $this->payKey != null ) {
5032
- $str .= $delim . $prefix . 'payKey=' . urlencode( $this->payKey );
5033
- $delim = '&';
5034
- }
5035
- if ( $this->transactionId != null ) {
5036
- $str .= $delim . $prefix . 'transactionId=' . urlencode( $this->transactionId );
5037
- $delim = '&';
5038
- }
5039
- if ( $this->trackingId != null ) {
5040
- $str .= $delim . $prefix . 'trackingId=' . urlencode( $this->trackingId );
5041
- $delim = '&';
5042
- }
5043
- if ( $this->receiverList != null ) {
5044
- $newPrefix = $prefix . 'receiverList.';
5045
- $str .= $delim . call_user_func( array( $this->receiverList, 'toNVPString' ), $newPrefix );
5046
- $delim = '&';
5047
- }
5048
-
5049
- return $str;
5050
- }
5051
-
5052
- }
5053
-
5054
-
5055
- /**
5056
- * The result of a Refund request.
5057
- */
5058
- class RefundResponse
5059
- {
5060
-
5061
- /**
5062
- *
5063
- * @access public
5064
- * @var ResponseEnvelope
5065
- */
5066
- public $responseEnvelope;
5067
-
5068
- /**
5069
- *
5070
- * @access public
5071
- * @var string
5072
- */
5073
- public $currencyCode;
5074
-
5075
- /**
5076
- *
5077
- * @access public
5078
- * @var RefundInfoList
5079
- */
5080
- public $refundInfoList;
5081
-
5082
- /**
5083
- *
5084
- * @array
5085
- * @access public
5086
- * @var ErrorData
5087
- */
5088
- public $error;
5089
-
5090
-
5091
- public function init( $map = null, $prefix = '' )
5092
- {
5093
- if ( $map != null ) {
5094
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
5095
- $newPrefix = $prefix . "responseEnvelope.";
5096
- $this->responseEnvelope = new ResponseEnvelope();
5097
- $this->responseEnvelope->init( $map, $newPrefix );
5098
- }
5099
- $mapKeyName = $prefix . 'currencyCode';
5100
- if ( $map != null && array_key_exists( $mapKeyName, $map ) ) {
5101
- $this->currencyCode = $map[ $mapKeyName ];
5102
- }
5103
- if ( PPUtils::array_match_key( $map, $prefix . "refundInfoList." ) ) {
5104
- $newPrefix = $prefix . "refundInfoList.";
5105
- $this->refundInfoList = new RefundInfoList();
5106
- $this->refundInfoList->init( $map, $newPrefix );
5107
- }
5108
- $i = 0;
5109
- while ( true ) {
5110
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
5111
- $newPrefix = $prefix . "error($i).";
5112
- $this->error[ $i ] = new ErrorData();
5113
- $this->error[ $i ]->init( $map, $newPrefix );
5114
- } else {
5115
- break;
5116
- }
5117
- $i++;
5118
- }
5119
-
5120
- }
5121
- }
5122
- }
5123
-
5124
-
5125
- /**
5126
- * The request to set the options of a payment request.
5127
- */
5128
- class SetPaymentOptionsRequest
5129
- {
5130
-
5131
- /**
5132
- *
5133
- * @access public
5134
- * @var RequestEnvelope
5135
- */
5136
- public $requestEnvelope;
5137
-
5138
- /**
5139
- *
5140
- * @access public
5141
- * @var string
5142
- */
5143
- public $payKey;
5144
-
5145
- /**
5146
- *
5147
- * @access public
5148
- * @var InitiatingEntity
5149
- */
5150
- public $initiatingEntity;
5151
-
5152
- /**
5153
- *
5154
- * @access public
5155
- * @var DisplayOptions
5156
- */
5157
- public $displayOptions;
5158
-
5159
- /**
5160
- *
5161
- * @access public
5162
- * @var string
5163
- */
5164
- public $shippingAddressId;
5165
-
5166
- /**
5167
- *
5168
- * @access public
5169
- * @var SenderOptions
5170
- */
5171
- public $senderOptions;
5172
-
5173
- /**
5174
- *
5175
- * @array
5176
- * @access public
5177
- * @var ReceiverOptions
5178
- */
5179
- public $receiverOptions;
5180
-
5181
- /**
5182
- * Constructor with arguments
5183
- */
5184
- public function __construct( $requestEnvelope = null, $payKey = null )
5185
- {
5186
- $this->requestEnvelope = $requestEnvelope;
5187
- $this->payKey = $payKey;
5188
- }
5189
-
5190
-
5191
- public function toNVPString( $prefix = '' )
5192
- {
5193
- $str = '';
5194
- $delim = '';
5195
- if ( $this->requestEnvelope != null ) {
5196
- $newPrefix = $prefix . 'requestEnvelope.';
5197
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
5198
- $delim = '&';
5199
- }
5200
- if ( $this->payKey != null ) {
5201
- $str .= $delim . $prefix . 'payKey=' . urlencode( $this->payKey );
5202
- $delim = '&';
5203
- }
5204
- if ( $this->initiatingEntity != null ) {
5205
- $newPrefix = $prefix . 'initiatingEntity.';
5206
- $str .= $delim . call_user_func( array( $this->initiatingEntity, 'toNVPString' ), $newPrefix );
5207
- $delim = '&';
5208
- }
5209
- if ( $this->displayOptions != null ) {
5210
- $newPrefix = $prefix . 'displayOptions.';
5211
- $str .= $delim . call_user_func( array( $this->displayOptions, 'toNVPString' ), $newPrefix );
5212
- $delim = '&';
5213
- }
5214
- if ( $this->shippingAddressId != null ) {
5215
- $str .= $delim . $prefix . 'shippingAddressId=' . urlencode( $this->shippingAddressId );
5216
- $delim = '&';
5217
- }
5218
- if ( $this->senderOptions != null ) {
5219
- $newPrefix = $prefix . 'senderOptions.';
5220
- $str .= $delim . call_user_func( array( $this->senderOptions, 'toNVPString' ), $newPrefix );
5221
- $delim = '&';
5222
- }
5223
- for ( $i = 0; $i < count( $this->receiverOptions ); $i++ ) {
5224
- $newPrefix = $prefix . "receiverOptions($i).";
5225
- $str .= $delim . call_user_func( array( $this->receiverOptions[ $i ], 'toNVPString' ), $newPrefix );
5226
- $delim = '&';
5227
- }
5228
-
5229
- return $str;
5230
- }
5231
-
5232
- }
5233
-
5234
-
5235
- /**
5236
- * The response message for the SetPaymentOption request
5237
- */
5238
- class SetPaymentOptionsResponse
5239
- {
5240
-
5241
- /**
5242
- *
5243
- * @access public
5244
- * @var ResponseEnvelope
5245
- */
5246
- public $responseEnvelope;
5247
-
5248
- /**
5249
- *
5250
- * @array
5251
- * @access public
5252
- * @var ErrorData
5253
- */
5254
- public $error;
5255
-
5256
-
5257
- public function init( $map = null, $prefix = '' )
5258
- {
5259
- if ( $map != null ) {
5260
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
5261
- $newPrefix = $prefix . "responseEnvelope.";
5262
- $this->responseEnvelope = new ResponseEnvelope();
5263
- $this->responseEnvelope->init( $map, $newPrefix );
5264
- }
5265
- $i = 0;
5266
- while ( true ) {
5267
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
5268
- $newPrefix = $prefix . "error($i).";
5269
- $this->error[ $i ] = new ErrorData();
5270
- $this->error[ $i ]->init( $map, $newPrefix );
5271
- } else {
5272
- break;
5273
- }
5274
- $i++;
5275
- }
5276
-
5277
- }
5278
- }
5279
- }
5280
-
5281
-
5282
- /**
5283
- * The request to get the funding plans available for a
5284
- * payment.
5285
- */
5286
- class GetFundingPlansRequest
5287
- {
5288
-
5289
- /**
5290
- *
5291
- * @access public
5292
- * @var RequestEnvelope
5293
- */
5294
- public $requestEnvelope;
5295
-
5296
- /**
5297
- *
5298
- * @access public
5299
- * @var string
5300
- */
5301
- public $payKey;
5302
-
5303
- /**
5304
- * Constructor with arguments
5305
- */
5306
- public function __construct( $requestEnvelope = null, $payKey = null )
5307
- {
5308
- $this->requestEnvelope = $requestEnvelope;
5309
- $this->payKey = $payKey;
5310
- }
5311
-
5312
-
5313
- public function toNVPString( $prefix = '' )
5314
- {
5315
- $str = '';
5316
- $delim = '';
5317
- if ( $this->requestEnvelope != null ) {
5318
- $newPrefix = $prefix . 'requestEnvelope.';
5319
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
5320
- $delim = '&';
5321
- }
5322
- if ( $this->payKey != null ) {
5323
- $str .= $delim . $prefix . 'payKey=' . urlencode( $this->payKey );
5324
- $delim = '&';
5325
- }
5326
-
5327
- return $str;
5328
- }
5329
-
5330
- }
5331
-
5332
-
5333
- /**
5334
- * The response to get the funding plans available for a
5335
- * payment.
5336
- */
5337
- class GetFundingPlansResponse
5338
- {
5339
-
5340
- /**
5341
- *
5342
- * @access public
5343
- * @var ResponseEnvelope
5344
- */
5345
- public $responseEnvelope;
5346
-
5347
- /**
5348
- *
5349
- * @array
5350
- * @access public
5351
- * @var FundingPlan
5352
- */
5353
- public $fundingPlan;
5354
-
5355
- /**
5356
- *
5357
- * @array
5358
- * @access public
5359
- * @var ErrorData
5360
- */
5361
- public $error;
5362
-
5363
-
5364
- public function init( $map = null, $prefix = '' )
5365
- {
5366
- if ( $map != null ) {
5367
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
5368
- $newPrefix = $prefix . "responseEnvelope.";
5369
- $this->responseEnvelope = new ResponseEnvelope();
5370
- $this->responseEnvelope->init( $map, $newPrefix );
5371
- }
5372
- $i = 0;
5373
- while ( true ) {
5374
- if ( PPUtils::array_match_key( $map, $prefix . "fundingPlan($i)" ) ) {
5375
- $newPrefix = $prefix . "fundingPlan($i).";
5376
- $this->fundingPlan[ $i ] = new FundingPlan();
5377
- $this->fundingPlan[ $i ]->init( $map, $newPrefix );
5378
- } else {
5379
- break;
5380
- }
5381
- $i++;
5382
- }
5383
- $i = 0;
5384
- while ( true ) {
5385
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
5386
- $newPrefix = $prefix . "error($i).";
5387
- $this->error[ $i ] = new ErrorData();
5388
- $this->error[ $i ]->init( $map, $newPrefix );
5389
- } else {
5390
- break;
5391
- }
5392
- $i++;
5393
- }
5394
-
5395
- }
5396
- }
5397
- }
5398
-
5399
-
5400
- /**
5401
- * The request to get the addresses available for a payment.
5402
- */
5403
- class GetAvailableShippingAddressesRequest
5404
- {
5405
-
5406
- /**
5407
- *
5408
- * @access public
5409
- * @var RequestEnvelope
5410
- */
5411
- public $requestEnvelope;
5412
-
5413
- /**
5414
- * The key for which to provide the available addresses. Key
5415
- * can be an AdaptivePayments key such as payKey or
5416
- * preapprovalKey
5417
- * @access public
5418
- * @var string
5419
- */
5420
- public $key;
5421
-
5422
- /**
5423
- * Constructor with arguments
5424
- */
5425
- public function __construct( $requestEnvelope = null, $key = null )
5426
- {
5427
- $this->requestEnvelope = $requestEnvelope;
5428
- $this->key = $key;
5429
- }
5430
-
5431
-
5432
- public function toNVPString( $prefix = '' )
5433
- {
5434
- $str = '';
5435
- $delim = '';
5436
- if ( $this->requestEnvelope != null ) {
5437
- $newPrefix = $prefix . 'requestEnvelope.';
5438
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
5439
- $delim = '&';
5440
- }
5441
- if ( $this->key != null ) {
5442
- $str .= $delim . $prefix . 'key=' . urlencode( $this->key );
5443
- $delim = '&';
5444
- }
5445
-
5446
- return $str;
5447
- }
5448
-
5449
- }
5450
-
5451
-
5452
- /**
5453
- * The response to get the shipping addresses available for a
5454
- * payment.
5455
- */
5456
- class GetAvailableShippingAddressesResponse
5457
- {
5458
-
5459
- /**
5460
- *
5461
- * @access public
5462
- * @var ResponseEnvelope
5463
- */
5464
- public $responseEnvelope;
5465
-
5466
- /**
5467
- *
5468
- * @array
5469
- * @access public
5470
- * @var Address
5471
- */
5472
- public $availableAddress;
5473
-
5474
- /**
5475
- *
5476
- * @array
5477
- * @access public
5478
- * @var ErrorData
5479
- */
5480
- public $error;
5481
-
5482
-
5483
- public function init( $map = null, $prefix = '' )
5484
- {
5485
- if ( $map != null ) {
5486
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
5487
- $newPrefix = $prefix . "responseEnvelope.";
5488
- $this->responseEnvelope = new ResponseEnvelope();
5489
- $this->responseEnvelope->init( $map, $newPrefix );
5490
- }
5491
- $i = 0;
5492
- while ( true ) {
5493
- if ( PPUtils::array_match_key( $map, $prefix . "availableAddress($i)" ) ) {
5494
- $newPrefix = $prefix . "availableAddress($i).";
5495
- $this->availableAddress[ $i ] = new Address();
5496
- $this->availableAddress[ $i ]->init( $map, $newPrefix );
5497
- } else {
5498
- break;
5499
- }
5500
- $i++;
5501
- }
5502
- $i = 0;
5503
- while ( true ) {
5504
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
5505
- $newPrefix = $prefix . "error($i).";
5506
- $this->error[ $i ] = new ErrorData();
5507
- $this->error[ $i ]->init( $map, $newPrefix );
5508
- } else {
5509
- break;
5510
- }
5511
- $i++;
5512
- }
5513
-
5514
- }
5515
- }
5516
- }
5517
-
5518
-
5519
- /**
5520
- * The request to get the addresses available for a payment.
5521
- */
5522
- class GetShippingAddressesRequest
5523
- {
5524
-
5525
- /**
5526
- *
5527
- * @access public
5528
- * @var RequestEnvelope
5529
- */
5530
- public $requestEnvelope;
5531
-
5532
- /**
5533
- * The key for which to provide the available addresses. Key
5534
- * can be an AdaptivePayments key such as payKey or
5535
- * preapprovalKey
5536
- * @access public
5537
- * @var string
5538
- */
5539
- public $key;
5540
-
5541
- /**
5542
- * Constructor with arguments
5543
- */
5544
- public function __construct( $requestEnvelope = null, $key = null )
5545
- {
5546
- $this->requestEnvelope = $requestEnvelope;
5547
- $this->key = $key;
5548
- }
5549
-
5550
-
5551
- public function toNVPString( $prefix = '' )
5552
- {
5553
- $str = '';
5554
- $delim = '';
5555
- if ( $this->requestEnvelope != null ) {
5556
- $newPrefix = $prefix . 'requestEnvelope.';
5557
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
5558
- $delim = '&';
5559
- }
5560
- if ( $this->key != null ) {
5561
- $str .= $delim . $prefix . 'key=' . urlencode( $this->key );
5562
- $delim = '&';
5563
- }
5564
-
5565
- return $str;
5566
- }
5567
-
5568
- }
5569
-
5570
-
5571
- /**
5572
- * The response to get the shipping addresses available for a
5573
- * payment.
5574
- */
5575
- class GetShippingAddressesResponse
5576
- {
5577
-
5578
- /**
5579
- *
5580
- * @access public
5581
- * @var ResponseEnvelope
5582
- */
5583
- public $responseEnvelope;
5584
-
5585
- /**
5586
- *
5587
- * @access public
5588
- * @var Address
5589
- */
5590
- public $selectedAddress;
5591
-
5592
- /**
5593
- *
5594
- * @array
5595
- * @access public
5596
- * @var ErrorData
5597
- */
5598
- public $error;
5599
-
5600
-
5601
- public function init( $map = null, $prefix = '' )
5602
- {
5603
- if ( $map != null ) {
5604
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
5605
- $newPrefix = $prefix . "responseEnvelope.";
5606
- $this->responseEnvelope = new ResponseEnvelope();
5607
- $this->responseEnvelope->init( $map, $newPrefix );
5608
- }
5609
- if ( PPUtils::array_match_key( $map, $prefix . "selectedAddress." ) ) {
5610
- $newPrefix = $prefix . "selectedAddress.";
5611
- $this->selectedAddress = new Address();
5612
- $this->selectedAddress->init( $map, $newPrefix );
5613
- }
5614
- $i = 0;
5615
- while ( true ) {
5616
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
5617
- $newPrefix = $prefix . "error($i).";
5618
- $this->error[ $i ] = new ErrorData();
5619
- $this->error[ $i ]->init( $map, $newPrefix );
5620
- } else {
5621
- break;
5622
- }
5623
- $i++;
5624
- }
5625
-
5626
- }
5627
- }
5628
- }
5629
-
5630
-
5631
- /**
5632
- * The request to get the remaining limits for a user
5633
- */
5634
- class GetUserLimitsRequest
5635
- {
5636
-
5637
- /**
5638
- *
5639
- * @access public
5640
- * @var RequestEnvelope
5641
- */
5642
- public $requestEnvelope;
5643
-
5644
- /**
5645
- * The account identifier for the user
5646
- * @access public
5647
- * @var AccountIdentifier
5648
- */
5649
- public $user;
5650
-
5651
- /**
5652
- *
5653
- * @access public
5654
- * @var string
5655
- */
5656
- public $country;
5657
-
5658
- /**
5659
- *
5660
- * @access public
5661
- * @var string
5662
- */
5663
- public $currencyCode;
5664
-
5665
- /**
5666
- * List of limit types
5667
- * @array
5668
- * @access public
5669
- * @var string
5670
- */
5671
- public $limitType;
5672
-
5673
- /**
5674
- * Constructor with arguments
5675
- */
5676
- public function __construct( $requestEnvelope = null, $user = null, $country = null, $currencyCode = null, $limitType = null )
5677
- {
5678
- $this->requestEnvelope = $requestEnvelope;
5679
- $this->user = $user;
5680
- $this->country = $country;
5681
- $this->currencyCode = $currencyCode;
5682
- $this->limitType = $limitType;
5683
- }
5684
-
5685
-
5686
- public function toNVPString( $prefix = '' )
5687
- {
5688
- $str = '';
5689
- $delim = '';
5690
- if ( $this->requestEnvelope != null ) {
5691
- $newPrefix = $prefix . 'requestEnvelope.';
5692
- $str .= $delim . call_user_func( array( $this->requestEnvelope, 'toNVPString' ), $newPrefix );
5693
- $delim = '&';
5694
- }
5695
- if ( $this->user != null ) {
5696
- $newPrefix = $prefix . 'user.';
5697
- $str .= $delim . call_user_func( array( $this->user, 'toNVPString' ), $newPrefix );
5698
- $delim = '&';
5699
- }
5700
- if ( $this->country != null ) {
5701
- $str .= $delim . $prefix . 'country=' . urlencode( $this->country );
5702
- $delim = '&';
5703
- }
5704
- if ( $this->currencyCode != null ) {
5705
- $str .= $delim . $prefix . 'currencyCode=' . urlencode( $this->currencyCode );
5706
- $delim = '&';
5707
- }
5708
- for ( $i = 0; $i < count( $this->limitType ); $i++ ) {
5709
- $str .= $delim . $prefix . "limitType($i)=" . urlencode( $this->limitType[ $i ] );
5710
- $delim = '&';
5711
- }
5712
-
5713
- return $str;
5714
- }
5715
-
5716
- }
5717
-
5718
-
5719
- /**
5720
- * A response that contains a list of remaining limits
5721
- */
5722
- class GetUserLimitsResponse
5723
- {
5724
-
5725
- /**
5726
- *
5727
- * @access public
5728
- * @var ResponseEnvelope
5729
- */
5730
- public $responseEnvelope;
5731
-
5732
- /**
5733
- *
5734
- * @array
5735
- * @access public
5736
- * @var UserLimit
5737
- */
5738
- public $userLimit;
5739
-
5740
- /**
5741
- *
5742
- * @access public
5743
- * @var WarningDataList
5744
- */
5745
- public $warningDataList;
5746
-
5747
- /**
5748
- *
5749
- * @array
5750
- * @access public
5751
- * @var ErrorData
5752
- */
5753
- public $error;
5754
-
5755
-
5756
- public function init( $map = null, $prefix = '' )
5757
- {
5758
- if ( $map != null ) {
5759
- if ( PPUtils::array_match_key( $map, $prefix . "responseEnvelope." ) ) {
5760
- $newPrefix = $prefix . "responseEnvelope.";
5761
- $this->responseEnvelope = new ResponseEnvelope();
5762
- $this->responseEnvelope->init( $map, $newPrefix );
5763
- }
5764
- $i = 0;
5765
- while ( true ) {
5766
- if ( PPUtils::array_match_key( $map, $prefix . "userLimit($i)" ) ) {
5767
- $newPrefix = $prefix . "userLimit($i).";
5768
- $this->userLimit[ $i ] = new UserLimit();
5769
- $this->userLimit[ $i ]->init( $map, $newPrefix );
5770
- } else {
5771
- break;
5772
- }
5773
- $i++;
5774
- }
5775
- if ( PPUtils::array_match_key( $map, $prefix . "warningDataList." ) ) {
5776
- $newPrefix = $prefix . "warningDataList.";
5777
- $this->warningDataList = new WarningDataList();
5778
- $this->warningDataList->init( $map, $newPrefix );
5779
- }
5780
- $i = 0;
5781
- while ( true ) {
5782
- if ( PPUtils::array_match_key( $map, $prefix . "error($i)" ) ) {
5783
- $newPrefix = $prefix . "error($i).";
5784
- $this->error[ $i ] = new ErrorData();
5785
- $this->error[ $i ]->init( $map, $newPrefix );
5786
- } else {
5787
- break;
5788
- }
5789
- $i++;
5790
- }
5791
-
5792
- }
5793
- }
5794
- }
5795
-
5796
-
5797
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/adaptivepayments-sdk/lib/services/AdaptivePayments/AdaptivePaymentsService.php DELETED
@@ -1,314 +0,0 @@
1
- <?php
2
- require_once( 'PPBaseService.php' );
3
- require_once( 'AdaptivePayments.php' );
4
- require_once( 'PPUtils.php' );
5
-
6
-
7
- /**
8
- * AUTO GENERATED code for AdaptivePayments
9
- */
10
- class AdaptivePaymentsService extends PPBaseService
11
- {
12
-
13
- // Service Version
14
- private static $SERVICE_VERSION = "1.8.1";
15
-
16
- // Service Name
17
- private static $SERVICE_NAME = "AdaptivePayments";
18
-
19
- public function __construct()
20
- {
21
- parent::__construct( 'AdaptivePayments' );
22
- }
23
-
24
-
25
- /**
26
- * Service Call: CancelPreapproval
27
- *
28
- * @param CancelPreapprovalRequest $cancelPreapprovalRequest
29
- *
30
- * @return CancelPreapprovalResponse
31
- * @throws APIException
32
- */
33
- public function CancelPreapproval( $cancelPreapprovalRequest, $apiUsername = null )
34
- {
35
- $ret = new CancelPreapprovalResponse();
36
- $resp = $this->call( "CancelPreapproval", $cancelPreapprovalRequest, $apiUsername );
37
- $ret->init( PPUtils::nvpToMap( $resp ) );
38
-
39
- return $ret;
40
- }
41
-
42
-
43
- /**
44
- * Service Call: ConfirmPreapproval
45
- *
46
- * @param ConfirmPreapprovalRequest $confirmPreapprovalRequest
47
- *
48
- * @return ConfirmPreapprovalResponse
49
- * @throws APIException
50
- */
51
- public function ConfirmPreapproval( $confirmPreapprovalRequest, $apiUsername = null )
52
- {
53
- $ret = new ConfirmPreapprovalResponse();
54
- $resp = $this->call( "ConfirmPreapproval", $confirmPreapprovalRequest, $apiUsername );
55
- $ret->init( PPUtils::nvpToMap( $resp ) );
56
-
57
- return $ret;
58
- }
59
-
60
-
61
- /**
62
- * Service Call: ConvertCurrency
63
- *
64
- * @param ConvertCurrencyRequest $convertCurrencyRequest
65
- *
66
- * @return ConvertCurrencyResponse
67
- * @throws APIException
68
- */
69
- public function ConvertCurrency( $convertCurrencyRequest, $apiUsername = null )
70
- {
71
- $ret = new ConvertCurrencyResponse();
72
- $resp = $this->call( "ConvertCurrency", $convertCurrencyRequest, $apiUsername );
73
- $ret->init( PPUtils::nvpToMap( $resp ) );
74
-
75
- return $ret;
76
- }
77
-
78
-
79
- /**
80
- * Service Call: ExecutePayment
81
- *
82
- * @param ExecutePaymentRequest $executePaymentRequest
83
- *
84
- * @return ExecutePaymentResponse
85
- * @throws APIException
86
- */
87
- public function ExecutePayment( $executePaymentRequest, $apiUsername = null )
88
- {
89
- $ret = new ExecutePaymentResponse();
90
- $resp = $this->call( "ExecutePayment", $executePaymentRequest, $apiUsername );
91
- $ret->init( PPUtils::nvpToMap( $resp ) );
92
-
93
- return $ret;
94
- }
95
-
96
-
97
- /**
98
- * Service Call: GetAllowedFundingSources
99
- *
100
- * @param GetAllowedFundingSourcesRequest $getAllowedFundingSourcesRequest
101
- *
102
- * @return GetAllowedFundingSourcesResponse
103
- * @throws APIException
104
- */
105
- public function GetAllowedFundingSources( $getAllowedFundingSourcesRequest, $apiUsername = null )
106
- {
107
- $ret = new GetAllowedFundingSourcesResponse();
108
- $resp = $this->call( "GetAllowedFundingSources", $getAllowedFundingSourcesRequest, $apiUsername );
109
- $ret->init( PPUtils::nvpToMap( $resp ) );
110
-
111
- return $ret;
112
- }
113
-
114
-
115
- /**
116
- * Service Call: GetPaymentOptions
117
- *
118
- * @param GetPaymentOptionsRequest $getPaymentOptionsRequest
119
- *
120
- * @return GetPaymentOptionsResponse
121
- * @throws APIException
122
- */
123
- public function GetPaymentOptions( $getPaymentOptionsRequest, $apiUsername = null )
124
- {
125
- $ret = new GetPaymentOptionsResponse();
126
- $resp = $this->call( "GetPaymentOptions", $getPaymentOptionsRequest, $apiUsername );
127
- $ret->init( PPUtils::nvpToMap( $resp ) );
128
-
129
- return $ret;
130
- }
131
-
132
-
133
- /**
134
- * Service Call: PaymentDetails
135
- *
136
- * @param PaymentDetailsRequest $paymentDetailsRequest
137
- *
138
- * @return PaymentDetailsResponse
139
- * @throws APIException
140
- */
141
- public function PaymentDetails( $paymentDetailsRequest, $apiUsername = null )
142
- {
143
- $ret = new PaymentDetailsResponse();
144
- $resp = $this->call( "PaymentDetails", $paymentDetailsRequest, $apiUsername );
145
- $ret->init( PPUtils::nvpToMap( $resp ) );
146
-
147
- return $ret;
148
- }
149
-
150
-
151
- /**
152
- * Service Call: Pay
153
- *
154
- * @param PayRequest $payRequest
155
- *
156
- * @return PayResponse
157
- * @throws APIException
158
- */
159
- public function Pay( $payRequest, $apiUsername = null )
160
- {
161
- $ret = new PayResponse();
162
- $resp = $this->call( "Pay", $payRequest, $apiUsername );
163
- $ret->init( PPUtils::nvpToMap( $resp ) );
164
-
165
- return $ret;
166
- }
167
-
168
-
169
- /**
170
- * Service Call: PreapprovalDetails
171
- *
172
- * @param PreapprovalDetailsRequest $preapprovalDetailsRequest
173
- *
174
- * @return PreapprovalDetailsResponse
175
- * @throws APIException
176
- */
177
- public function PreapprovalDetails( $preapprovalDetailsRequest, $apiUsername = null )
178
- {
179
- $ret = new PreapprovalDetailsResponse();
180
- $resp = $this->call( "PreapprovalDetails", $preapprovalDetailsRequest, $apiUsername );
181
- $ret->init( PPUtils::nvpToMap( $resp ) );
182
-
183
- return $ret;
184
- }
185
-
186
-
187
- /**
188
- * Service Call: Preapproval
189
- *
190
- * @param PreapprovalRequest $preapprovalRequest
191
- *
192
- * @return PreapprovalResponse
193
- * @throws APIException
194
- */
195
- public function Preapproval( $preapprovalRequest, $apiUsername = null )
196
- {
197
- $ret = new PreapprovalResponse();
198
- $resp = $this->call( "Preapproval", $preapprovalRequest, $apiUsername );
199
- $ret->init( PPUtils::nvpToMap( $resp ) );
200
-
201
- return $ret;
202
- }
203
-
204
-
205
- /**
206
- * Service Call: Refund
207
- *
208
- * @param RefundRequest $refundRequest
209
- *
210
- * @return RefundResponse
211
- * @throws APIException
212
- */
213
- public function Refund( $refundRequest, $apiUsername = null )
214
- {
215
- $ret = new RefundResponse();
216
- $resp = $this->call( "Refund", $refundRequest, $apiUsername );
217
- $ret->init( PPUtils::nvpToMap( $resp ) );
218
-
219
- return $ret;
220
- }
221
-
222
-
223
- /**
224
- * Service Call: SetPaymentOptions
225
- *
226
- * @param SetPaymentOptionsRequest $setPaymentOptionsRequest
227
- *
228
- * @return SetPaymentOptionsResponse
229
- * @throws APIException
230
- */
231
- public function SetPaymentOptions( $setPaymentOptionsRequest, $apiUsername = null )
232
- {
233
- $ret = new SetPaymentOptionsResponse();
234
- $resp = $this->call( "SetPaymentOptions", $setPaymentOptionsRequest, $apiUsername );
235
- $ret->init( PPUtils::nvpToMap( $resp ) );
236
-
237
- return $ret;
238
- }
239
-
240
-
241
- /**
242
- * Service Call: GetFundingPlans
243
- *
244
- * @param GetFundingPlansRequest $getFundingPlansRequest
245
- *
246
- * @return GetFundingPlansResponse
247
- * @throws APIException
248
- */
249
- public function GetFundingPlans( $getFundingPlansRequest, $apiUsername = null )
250
- {
251
- $ret = new GetFundingPlansResponse();
252
- $resp = $this->call( "GetFundingPlans", $getFundingPlansRequest, $apiUsername );
253
- $ret->init( PPUtils::nvpToMap( $resp ) );
254
-
255
- return $ret;
256
- }
257
-
258
-
259
- /**
260
- * Service Call: GetAvailableShippingAddresses
261
- *
262
- * @param GetAvailableShippingAddressesRequest $getAvailableShippingAddressesRequest
263
- *
264
- * @return GetAvailableShippingAddressesResponse
265
- * @throws APIException
266
- */
267
- public function GetAvailableShippingAddresses( $getAvailableShippingAddressesRequest, $apiUsername = null )
268
- {
269
- $ret = new GetAvailableShippingAddressesResponse();
270
- $resp = $this->call( "GetAvailableShippingAddresses", $getAvailableShippingAddressesRequest, $apiUsername );
271
- $ret->init( PPUtils::nvpToMap( $resp ) );
272
-
273
- return $ret;
274
- }
275
-
276
-
277
- /**
278
- * Service Call: GetShippingAddresses
279
- *
280
- * @param GetShippingAddressesRequest $getShippingAddressesRequest
281
- *
282
- * @return GetShippingAddressesResponse
283
- * @throws APIException
284
- */
285
- public function GetShippingAddresses( $getShippingAddressesRequest, $apiUsername = null )
286
- {
287
- $ret = new GetShippingAddressesResponse();
288
- $resp = $this->call( "GetShippingAddresses", $getShippingAddressesRequest, $apiUsername );
289
- $ret->init( PPUtils::nvpToMap( $resp ) );
290
-
291
- return $ret;
292
- }
293
-
294
-
295
- /**
296
- * Service Call: GetUserLimits
297
- *
298
- * @param GetUserLimitsRequest $getUserLimitsRequest
299
- *
300
- * @return GetUserLimitsResponse
301
- * @throws APIException
302
- */
303
- public function GetUserLimits( $getUserLimitsRequest, $apiUsername = null )
304
- {
305
- $ret = new GetUserLimitsResponse();
306
- $resp = $this->call( "GetUserLimits", $getUserLimitsRequest, $apiUsername );
307
- $ret->init( PPUtils::nvpToMap( $resp ) );
308
-
309
- return $ret;
310
- }
311
-
312
- }
313
-
314
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_AdvPayments/PayPal_AP/classes/index.php DELETED
File without changes
trunk/classes/gateways/PayPal_AdvPayments/paypal_ap.php DELETED
@@ -1,555 +0,0 @@
1
- <?php
2
-
3
- if ( !class_exists( 'WC_Payment_Gateway' ) ) return false;
4
-
5
- /**
6
- * Add the gateway to WooCommerce
7
- *
8
- * @access public
9
- *
10
- * @param array $methods
11
- *
12
- * @return array
13
- */
14
-
15
-
16
- function add_paypal_ap_gateway( $methods )
17
- {
18
- $methods[ ] = 'WC_PaypalAP';
19
-
20
- return $methods;
21
- }
22
-
23
-
24
- add_filter( 'woocommerce_payment_gateways', 'add_paypal_ap_gateway' );
25
-
26
- class WC_PaypalAP extends WC_Payment_Gateway
27
- {
28
-
29
- public static $pluginDir;
30
-
31
- /**
32
- *
33
- */
34
- public function __construct()
35
- {
36
- global $woocommerce;
37
-
38
- self::$pluginDir = trailingslashit( dirname( __FILE__ ) ) . 'PayPal_AP/';
39
-
40
- /* Standard WooCommerce Configuration */
41
- $this->id = 'paypalap';
42
- $this->icon = plugin_dir_url( __FILE__ ) . 'PayPal_AP/assets/icons/paypalap.png';
43
- $this->method_title = __( 'PayPal Adaptive Payments', 'wcvendors' );
44
- $this->has_fields = false;
45
-
46
- // Load the settings
47
- $this->init_form_fields();
48
- $this->init_settings();
49
-
50
- $this->enabled = $this->settings[ 'enabled' ];
51
- $this->title = $this->settings[ 'title' ];
52
- $this->description = $this->settings[ 'description' ];
53
-
54
- $this->currency = get_option( 'woocommerce_currency' );
55
-
56
- /* PayPal Adaptive Payments Configuration. */
57
- $this->sandbox = $this->settings[ 'sandbox_enabled' ];
58
- $this->main_paypal = $this->sandbox == 'yes' ? $this->settings[ 'main_paypal' ] : $this->settings[ 'main_paypal_live' ];
59
- $this->instapay = WC_Vendors::$pv_options->get_option( 'instapay' );
60
- $this->give_tax = WC_Vendors::$pv_options->get_option( 'give_tax' );
61
-
62
- add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
63
-
64
- // Payment listener/API hook
65
- add_action( 'woocommerce_api_wc_paypalap', array( $this, 'paypal_ap_ipn' ) );
66
-
67
- $this->debug_me = false;
68
- }
69
-
70
-
71
- /**
72
- *
73
- *
74
- * @return unknown
75
- */
76
- public function is_available()
77
- {
78
- return ( $this->is_valid_currency() && $this->enabled == 'yes' );
79
- }
80
-
81
-
82
- /**
83
- *
84
- *
85
- * @return unknown
86
- */
87
- public function is_valid_currency()
88
- {
89
- return in_array( get_woocommerce_currency(), array( 'AUD', 'BRL', 'CAD', 'MXN', 'NZD', 'HKD', 'SGD', 'USD', 'EUR', 'JPY', 'TRY', 'NOK', 'CZK', 'DKK', 'HUF', 'ILS', 'MYR', 'PHP', 'PLN', 'SEK', 'CHF', 'TWD', 'THB', 'GBP', 'RMB' ) );
90
- }
91
-
92
-
93
- /**
94
- *
95
- */
96
- public function include_paypal_sdk()
97
- {
98
- $path = self::$pluginDir . 'classes/adaptivepayments-sdk/lib';
99
- set_include_path( get_include_path() . PATH_SEPARATOR . $path );
100
- require_once 'services/AdaptivePayments/AdaptivePaymentsService.php';
101
- }
102
-
103
-
104
- /**
105
- *
106
- *
107
- * @return unknown
108
- */
109
- public function paypal_ap_ipn()
110
- {
111
- if ( empty( $_GET[ 'paypal_chain_ipn' ] ) || empty( $_GET[ 'order_id' ] ) ) return false;
112
-
113
- $order_id = (int) $_GET[ 'order_id' ];
114
-
115
- $order = new WC_Order( $order_id );
116
- if ( !$order ) return false;
117
-
118
- if ( $_POST[ 'status' ] !== 'COMPLETED' ) {
119
- $order->update_status( 'failed', sprintf( __( 'Something went wrong. Response from PayPal invalidated this order. Status: %s.', 'wcvendors' ), $_POST[ 'status' ] ) );
120
- exit;
121
- }
122
-
123
- $order->payment_complete();
124
- $order->add_order_note( __( 'IPN payment completed', 'wcvendors' ) );
125
-
126
- if ( $this->instapay ) {
127
- WCV_Commission::set_order_commission_paid( $order_id );
128
- }
129
- exit;
130
- }
131
-
132
-
133
- /**
134
- * Initialise Gateway Settings Form Fields
135
- *
136
- * @access public
137
- * @return void
138
- */
139
- function init_form_fields()
140
- {
141
-
142
- $this->form_fields = array();
143
-
144
- // List each option in order of appearance with details
145
- $this->form_fields[ 'enabled' ] = array(
146
- 'title' => __( 'Enable PayPal Adaptive Payments', 'wcvendors' ),
147
- 'default' => 'no',
148
- 'type' => 'checkbox',
149
- );
150
-
151
- $this->form_fields[ 'title' ] = array(
152
- 'title' => __( 'Method Title', 'wcvendors' ),
153
- 'description' => __( 'This controls the title which the user sees during checkout.', 'wcvendors' ),
154
- 'default' => __( 'PayPal', 'wcvendors' ),
155
- 'type' => 'text'
156
- );
157
-
158
- $this->form_fields[ 'description' ] = array(
159
- 'title' => __( 'Description', 'wcvendors' ),
160
- 'description' => __( 'This controls the description which the user sees during checkout.', 'wcvendors' ),
161
- 'default' => __( "Pay via PayPal!", 'wcvendors' ),
162
- 'type' => 'textarea'
163
- );
164
-
165
- // ==================================================================
166
- //
167
- // Credentials
168
- //
169
- // ------------------------------------------------------------------
170
-
171
- $this->form_fields[ ] = array(
172
- 'title' => __( 'Live Credentials', 'wcvendors' ),
173
- 'type' => 'title',
174
- 'description' => sprintf( __( 'You must have an <a href="%s">Application ID</a> to process live transactions. You do not need one for testing in Sandbox mode.', 'wcvendors' )
175
- , 'https://developer.paypal.com/webapps/developer/docs/classic/lifecycle/goingLive/' )
176
- );
177
-
178
- $this->form_fields[ 'main_paypal_live' ] = array(
179
- 'title' => __( 'PayPal Email', 'wcvendors' ),
180
- 'description' => __( 'The email address main payments should go to.', 'wcvendors' ),
181
- 'type' => 'text'
182
- );
183
-
184
- $this->form_fields[ 'username_live' ] = array(
185
- 'title' => __( 'API Username', 'wcvendors' ),
186
- 'type' => 'text'
187
- );
188
-
189
- $this->form_fields[ 'password_live' ] = array(
190
- 'title' => __( 'API Password', 'wcvendors' ),
191
- 'type' => 'text'
192
- );
193
-
194
- $this->form_fields[ 'signature_live' ] = array(
195
- 'title' => __( 'API Signature', 'wcvendors' ),
196
- 'type' => 'text'
197
- );
198
-
199
- $this->form_fields[ 'app_id' ] = array(
200
- 'title' => __( 'Application ID', 'wcvendors' ),
201
- 'type' => 'text',
202
- 'description' => __( 'Only required when doing live transactions.', 'wcvendors' ),
203
- );
204
-
205
- $this->form_fields[ ] = array(
206
- 'title' => __( 'Sandbox Credentials', 'wcvendors' ),
207
- 'type' => 'title',
208
- 'description' => sprintf( __( 'You can signup for a sandbox developer account <a href="%s">here</a>. You need a developer account if you want to enable Sandbox mode for testing.', 'wcvendors' )
209
- , 'https://developer.paypal.com/' )
210
- );
211
-
212
- $this->form_fields[ 'main_paypal' ] = array(
213
- 'title' => __( 'PayPal Email', 'wcvendors' ),
214
- 'description' => __( 'The email address main payments should go to.', 'wcvendors' ),
215
- 'type' => 'text'
216
- );
217
-
218
- $this->form_fields[ 'username' ] = array(
219
- 'title' => __( 'API Username', 'wcvendors' ),
220
- 'type' => 'text'
221
- );
222
-
223
- $this->form_fields[ 'password' ] = array(
224
- 'title' => __( 'API Password', 'wcvendors' ),
225
- 'type' => 'text'
226
- );
227
-
228
- $this->form_fields[ 'signature' ] = array(
229
- 'title' => __( 'API Signature', 'wcvendors' ),
230
- 'type' => 'text'
231
- );
232
-
233
- // ==================================================================
234
- //
235
- // Misc. Settings
236
- //
237
- // ------------------------------------------------------------------
238
-
239
- $this->form_fields[ ] = array(
240
- 'title' => __( 'Misc. Settings', 'wcvendors' ),
241
- 'type' => 'title',
242
- );
243
-
244
- $this->form_fields[ 'sandbox_enabled' ] = array(
245
- 'title' => __( 'Enable PayPal Sandbox mode', 'wcvendors' ),
246
- 'default' => 'yes',
247
- 'type' => 'checkbox',
248
- );
249
-
250
- $this->form_fields[ 'logging_enabled' ] = array(
251
- 'title' => __( 'Enable logging', 'wcvendors' ),
252
- 'default' => 'no',
253
- 'type' => 'checkbox',
254
- );
255
-
256
- }
257
-
258
-
259
- /**
260
- * Admin Panel Options
261
- *
262
- * @access public
263
- * @return void
264
- */
265
- function admin_options()
266
- {
267
- ?>
268
- <h3><?php echo $this->method_title; ?></h3>
269
- <p><?php _e( 'The PayPal Adaptive Payments gateway can instantly pay your vendors their due commission (if enabled). Also used to mass pay vendors on a schedule / manual method (if enabled).', 'wcvendors' ); ?></p>
270
- <table class="form-table">
271
-
272
- <?php if ( $this->is_valid_currency() ) :
273
-
274
- // Generate the HTML For the settings form.
275
- $this->generate_settings_html();
276
-
277
- else : ?>
278
-
279
- <div class="inline error"><p>
280
- <strong><?php _e( 'Gateway Disabled', 'wcvendors' ); ?></strong>: <?php printf( __( '%s does not support your store currency.', 'wcvendors' ), $this->method_title ); ?>
281
- </p></div>
282
-
283
- <?php endif; ?>
284
-
285
- </table>
286
- <?php
287
- }
288
-
289
-
290
- /**
291
- *
292
- *
293
- * @param unknown $order
294
- *
295
- * @return unknown
296
- */
297
- private function get_receivers( $order )
298
- {
299
- $response = array();
300
-
301
- // Process the payment and split as required
302
- if ( $this->instapay ) {
303
-
304
- $receivers = WCV_Vendors::get_vendor_dues_from_order( $order );
305
- $i = 0;
306
-
307
- foreach ( $receivers as $author => $values ) {
308
- if ( empty( $values[ 'total' ] ) ) continue;
309
-
310
- $response[ $i ] = new Receiver();
311
- $response[ $i ]->email = $values[ 'vendor_id' ] == 1 ? $this->main_paypal : WCV_Vendors::get_vendor_paypal( $values[ 'vendor_id' ] );
312
- $response[ $i ]->amount = round( $values[ 'total' ], 2);
313
- $response[ $i ]->primary = false;
314
- $response[ $i ]->invoiceId = $order->id;
315
- $i++;
316
- }
317
-
318
- } else {
319
- // Send all monies to the site admin
320
- $single_receiver = new Receiver();
321
- $single_receiver->email = $this->main_paypal;
322
- $single_receiver->amount = $order->get_total();
323
- $single_receiver->primary = false;
324
- $single_receiver->invoiceId = $order->id;
325
- // Set a single reciever for the transaction
326
- $response[] = $single_receiver;
327
- }
328
-
329
- if ( $this->debug_me ) {
330
- var_dump( $response );
331
- }
332
-
333
- return $response;
334
- }
335
-
336
-
337
- /**
338
- *
339
- *
340
- * @param unknown $order_id
341
- *
342
- * @return unknown
343
- */
344
- public function paypalap_check_form( $order_id )
345
- {
346
- global $woocommerce;
347
-
348
- $this->include_paypal_sdk();
349
- $this->logger = new PPLoggingManager( 'Pay' );
350
- $order = new WC_Order( $order_id );
351
-
352
- $receivers = $this->get_receivers( $order );
353
- $receiverList = new ReceiverList( $receivers );
354
-
355
- $actionType = 'CREATE';
356
- $cancelUrl = $order->get_cancel_order_url();
357
- $currencyCode = get_woocommerce_currency();
358
- $returnUrl = esc_url( add_query_arg( 'key', $order->order_key, add_query_arg( 'order-received', $order->id, $order->get_checkout_order_received_url() ) ) );
359
-
360
- $payRequest = new PayRequest( new RequestEnvelope( "en_US" ), $actionType, $cancelUrl, $currencyCode, $receiverList, $returnUrl );
361
-
362
- // ==================================================================
363
- //
364
- // Optional params
365
- //
366
- // ------------------------------------------------------------------
367
-
368
- $payRequest->feesPayer = 'EACHRECEIVER';
369
-
370
- $args = array(
371
- 'wc-api' => 'WC_PayPalAP',
372
- 'paypal_chain_ipn' => '1',
373
- 'order_id' => $order_id,
374
- );
375
-
376
- $payRequest->ipnNotificationUrl = add_query_arg( $args, home_url( '/' ) );
377
- $payRequest->memo = !empty( $order->customer_note ) ? $order->customer_note : '';
378
- $payRequest->reverseAllParallelPaymentsOnError = true;
379
-
380
- $service = new AdaptivePaymentsService();
381
- try {
382
- $response = $service->Pay( $payRequest );
383
- } catch ( Exception $ex ) {
384
- wc_add_notice( sprintf( __( 'Error: %s', 'wcvendors' ), $ex->getMessage() ), 'error' );
385
-
386
- return false;
387
- }
388
-
389
- $this->logger->log( "Received payResponse:" );
390
- $ack = strtoupper( $response->responseEnvelope->ack );
391
-
392
- if ( $ack != 'SUCCESS' ) {
393
- $order->update_status( 'cancelled', sprintf( __( 'Error ID: %s. %s', 'wcvendors' ), $response->error[ 0 ]->errorId, $response->error[ 0 ]->message ) );
394
- wc_add_notice( sprintf( __( 'Error ID: %s. %s', 'wcvendors' ), $response->error[ 0 ]->errorId, $response->error[ 0 ]->message ), 'error' );
395
-
396
- return false;
397
- }
398
-
399
- return $response->payKey;
400
- }
401
-
402
-
403
- /**
404
- *
405
- *
406
- * @param unknown $order
407
- * @param unknown $author_email
408
- * @param unknown $setPaymentOptionsRequest
409
- * @param unknown $is_admin (optional)
410
- *
411
- * @return unknown
412
- */
413
- public function set_vendor_items( $order, $setPaymentOptionsRequest )
414
- {
415
- $receivers = WCV_Vendors::get_vendor_dues_from_order( $order, false );
416
- $receivers_two = WCV_Vendors::get_vendor_dues_from_order( $order );
417
-
418
- foreach ( $receivers as $products ) {
419
- $invoice_items = array();
420
- $shipping_given = $tax_given = 0;
421
-
422
- foreach ( $products as $key => $product ) {
423
-
424
- $product_id = $product[ 'product_id' ];
425
- $shipping_given += $product[ 'shipping' ];
426
- $tax_given += $product[ 'tax' ];
427
-
428
- if ( !empty( $product[ 'commission' ] ) ) {
429
- $item = new InvoiceItem();
430
- $item->name = get_the_title( $product_id );
431
- $item->identifier = $product_id;
432
- $item->price = $product[ 'commission' ];
433
- $item->itemPrice = round( $product[ 'commission' ] / $product[ 'qty' ], 2 );
434
- $item->itemCount = $product[ 'qty' ];
435
- $invoice_items[ ] = $item;
436
- }
437
- }
438
-
439
- if ( empty( $invoice_items ) ) {
440
- continue;
441
- }
442
-
443
- $receiverOptions = new ReceiverOptions();
444
- $setPaymentOptionsRequest->receiverOptions[ ] = $receiverOptions;
445
-
446
- // Set the current vendor
447
- $receiverId = new ReceiverIdentifier();
448
- $receiverId->email = $product[ 'vendor_id' ] == 1 ? $this->main_paypal : WCV_Vendors::get_vendor_paypal( $product[ 'vendor_id' ] );
449
-
450
- $receiverOptions->receiver = $receiverId;
451
- $receiverOptions->invoiceData = new InvoiceData();
452
- $receiverOptions->invoiceData->item = $invoice_items;
453
- $receiverOptions->invoiceData->totalTax = number_format( $receivers_two[$product['vendor_id']]['tax'], 2 );
454
- $receiverOptions->invoiceData->totalShipping = number_format( $receivers_two[$product['vendor_id']]['shipping'], 2 );
455
- }
456
-
457
- return $setPaymentOptionsRequest;
458
- }
459
-
460
-
461
- /**
462
- *
463
- *
464
- * @param unknown $pay_key
465
- * @param unknown $order_id
466
- *
467
- * @return unknown
468
- */
469
- public function set_paypal_author_specifics( $pay_key, $order_id )
470
- {
471
- global $woocommerce;
472
-
473
- $this->include_paypal_sdk();
474
- $order = new WC_Order( $order_id );
475
-
476
- // Create request
477
- $setPaymentOptionsRequest = new SetPaymentOptionsRequest( new RequestEnvelope( "en_US" ) );
478
- $setPaymentOptionsRequest->payKey = $pay_key;
479
-
480
- if ( $this->instapay ) {
481
- $setPaymentOptionsRequest = $this->set_vendor_items( $order, $setPaymentOptionsRequest );
482
- }
483
-
484
- if ( $this->debug_me ) {
485
- foreach ( $setPaymentOptionsRequest->receiverOptions as $k ) {
486
- var_dump( $k->invoiceData );
487
- }
488
- exit;
489
- }
490
-
491
- $setPaymentOptionsRequest->senderOptions = new SenderOptions();
492
- $setPaymentOptionsRequest->senderOptions->requireShippingAddressSelection = true;
493
-
494
- $service = new AdaptivePaymentsService();
495
- try {
496
- $response = $service->SetPaymentOptions( $setPaymentOptionsRequest );
497
- } catch ( Exception $ex ) {
498
- wc_add_notice( sprintf( __( 'Error: %s', 'wcvendors' ), $ex->getMessage() ), 'error' );
499
-
500
- return false;
501
- }
502
-
503
- $this->logger->error( "Received SetPaymentOptionsResponse:" );
504
- $ack = strtoupper( $response->responseEnvelope->ack );
505
- if ( $ack != "SUCCESS" ) {
506
- $order->update_status( 'cancelled', __( sprintf( 'Error ID: %s. %s', $response->error[ 0 ]->errorId, $response->error[ 0 ]->message ), 'wcvendors' ) );
507
- wc_add_notice( sprintf( 'Error ID: %s. %s', $response->error[ 0 ]->errorId, $response->error[ 0 ]->message ), 'error' );
508
-
509
- return false;
510
- }
511
-
512
- return true;
513
- }
514
-
515
-
516
- /**
517
- * Payment fields
518
- */
519
- function payment_fields()
520
- {
521
- if ( $description = $this->settings[ 'description' ] ) echo wpautop( wptexturize( $this->description ) );
522
- }
523
-
524
-
525
- /**
526
- * Process the payment and return the result
527
- *
528
- * @param unknown $order_id
529
- *
530
- * @return unknown
531
- */
532
- function process_payment( $order_id )
533
- {
534
- global $woocommerce;
535
-
536
- $order = new WC_Order( $order_id );
537
- $pay_key = $this->paypalap_check_form( $order_id );
538
-
539
- if ( !empty( $woocommerce->errors ) ) return false;
540
-
541
- if ( $this->instapay ) {
542
- $this->set_paypal_author_specifics( $pay_key, $order_id );
543
- if ( !empty( $woocommerce->errors ) ) return false;
544
- }
545
-
546
- $paypal_redirect_url = $this->sandbox == 'yes' ? 'https://www.sandbox.paypal.com/webscr&cmd=' : 'https://www.paypal.com/webscr&cmd=';
547
- $pay_url = $paypal_redirect_url . '_ap-payment&paykey=' . $pay_key;
548
-
549
- return array(
550
- 'result' => 'success',
551
- 'redirect' => $pay_url,
552
- );
553
-
554
- }
555
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/ChangeLog.txt DELETED
@@ -1,48 +0,0 @@
1
-
2
- Version 1.2.95 - September 28, 2012
3
-
4
- - SDK refreshed to Release 95. Please refer https://www.x.com/developers/paypal/documentation-tools/release-notes#MerchantAPI
5
- - SDK now supports third party permission by subject header. Configure subject header
6
- in the configuration file, this is basically third party merchant email address who has
7
- given permission to you to call api on their behalf.
8
- - Bug fixed for Page styling attributes (eg: cpp-header**) serialization. (https://github.com/paypal/SDKs/issues/31)
9
- - Bug fixed for 'convertToXML' method for not escaping xml element correctly.(https://github.com/paypal/SDKs/issues/17)
10
- - PayPal Endpoint is corrected in config file.(https://github.com/paypal/SDKs/issues/22)
11
- - Bug fixed for BasicAmountType serialization without currencyID attribute.(https://github.com/paypal/SDKs/issues/23)
12
- - Bug fixed for 'PPLoggingManager.php' to pickup configuration entries.(https://github.com/paypal/SDKs/issues/28)
13
- - Updated SDK sample
14
- --------------------------------------------------------------------------------------------------
15
-
16
-
17
- Version 1.1.93 - August 14, 2012
18
-
19
- - SDK refreshed to Release 93. Please refer https://www.x.com/developers/paypal/documentation-tools/release-notes#MerchantAPI
20
- - SDK Core - Deserialization Logic Change
21
- --------------------------------------------------------------------------------------------------
22
-
23
-
24
- Version 1.0.92 - July 30, 2012
25
-
26
- - Stable release
27
- -------------------------------------------------------------------------------------------------
28
- Version 0.7.92 - July 17, 2012
29
-
30
- - wsdl update version 0.7.92
31
- --------------------------------------------------------------------------------------------------
32
-
33
- Version 0.7.90 - 11-June-2012
34
-
35
- - SDK upgrade to latest WSDL release (90.0)
36
- --------------------------------------------------------------------------------------------------
37
-
38
- Version 0.7.88 - 17-Apr-2012
39
-
40
- - Fix to get SDK working with Permissions API token
41
-
42
- --------------------------------------------------------------------------------------------------
43
-
44
- Version 0.6.88 - 27-Feb-2012
45
-
46
- - Initial release
47
-
48
- --------------------------------------------------------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/LICENSE.txt DELETED
@@ -1,41 +0,0 @@
1
- PAYPAL, INC.
2
-
3
- SDK LICENSE
4
-
5
- NOTICE TO USER: PayPal, Inc. is providing the Software and Documentation for use under the terms of this Agreement. Any use, reproduction, modification or distribution of the Software or Documentation, or any derivatives or portions hereof, constitutes your acceptance of this Agreement.
6
-
7
- As used in this Agreement, "PayPal" means PayPal, Inc. "Software" means the software code accompanying this agreement. "Documentation" means the documents, specifications and all other items accompanying this Agreement other than the Software.
8
-
9
- 1. LICENSE GRANT Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free license to use, reproduce, prepare derivative works from, publicly display, publicly perform, distribute and sublicense the Software for any purpose, provided the copyright notice below appears in a conspicuous location within the source code of the distributed Software and this license is distributed in the supporting documentation of the Software you distribute. Furthermore, you must comply with all third party licenses in order to use the third party software contained in the Software.
10
-
11
- Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free license to use, reproduce, publicly display, publicly perform, distribute and sublicense the Documentation for any purpose. You may not modify the Documentation.
12
-
13
- No title to the intellectual property in the Software or Documentation is transferred to you under the terms of this Agreement. You do not acquire any rights to the Software or the Documentation except as expressly set forth in this Agreement.
14
-
15
- If you choose to distribute the Software in a commercial product, you do so with the understanding that you agree to defend, indemnify and hold harmless PayPal and its suppliers against any losses, damages and costs arising from the claims, lawsuits or other legal actions arising out of such distribution. You may distribute the Software in object code form under your own license, provided that your license agreement:
16
-
17
- (a) complies with the terms and conditions of this license agreement;
18
-
19
- (b) effectively disclaims all warranties and conditions, express or implied, on behalf of PayPal;
20
-
21
- (c) effectively excludes all liability for damages on behalf of PayPal;
22
-
23
- (d) states that any provisions that differ from this Agreement are offered by you alone and not PayPal; and
24
-
25
- (e) states that the Software is available from you or PayPal and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
26
-
27
- 2. DISCLAIMER OF WARRANTY
28
- PAYPAL LICENSES THE SOFTWARE AND DOCUMENTATION TO YOU ONLY ON AN "AS IS" BASIS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. PAYPAL MAKES NO WARRANTY THAT THE SOFTWARE OR DOCUMENTATION WILL BE ERROR-FREE. Each user of the Software or Documentation is solely responsible for determining the appropriateness of using and distributing the Software and Documentation and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs, or equipment, and unavailability or interruption of operations. Use of the Software and Documentation is made with the understanding that PayPal will not provide you with any technical or customer support or maintenance. Some states or jurisdictions do not allow the exclusion of implied warranties or limitations on how long an implied warranty may last, so the above limitations may not apply to you. To the extent permissible, any implied warranties are limited to ninety (90) days.
29
-
30
-
31
- 3. LIMITATION OF LIABILITY
32
- PAYPAL AND ITS SUPPLIERS SHALL NOT BE LIABLE FOR LOSS OR DAMAGE ARISING OUT OF THIS AGREEMENT OR FROM THE USE OF THE SOFTWARE OR DOCUMENTATION. IN NO EVENT WILL PAYPAL OR ITS SUPPLIERS BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES INCLUDING LOST PROFITS, LOST SAVINGS, COSTS, FEES, OR EXPENSES OF ANY KIND ARISING OUT OF ANY PROVISION OF THIS AGREEMENT OR THE USE OR THE INABILITY TO USE THE SOFTWARE OR DOCUMENTATION, HOWEVER CAUSED AND UNDER ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. PAYPAL'S AGGREGATE LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION WITH THIS AGREEMENT SHALL BE LIMITED TO THE AMOUNT PAID BY YOU FOR THE SOFTWARE AND DOCUMENTATION.
33
-
34
- 4. TRADEMARK USAGE
35
- PayPal is a trademark PayPal, Inc. in the United States and other countries. Such trademarks may not be used to endorse or promote any product unless expressly permitted under separate agreement with PayPal.
36
-
37
- 5. TERM
38
- Your rights under this Agreement shall terminate if you fail to comply with any of the material terms or conditions of this Agreement and do not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all your rights under this Agreement terminate, you agree to cease use and distribution of the Software and Documentation as soon as reasonably practicable.
39
-
40
- 6. GOVERNING LAW AND JURISDICTION. This Agreement is governed by the statutes and laws of the State of California, without regard to the conflicts of law principles thereof. If any part of this Agreement is found void and unenforceable, it will not affect the validity of the balance of the Agreement, which shall remain valid and enforceable according to its terms. Any dispute arising out of or related to this Agreement shall be brought in the courts of Santa Clara County, California, USA.
41
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/README.md DELETED
@@ -1,60 +0,0 @@
1
-
2
- PayPal PHP Merchant SDK
3
- ===============================
4
-
5
- Prerequisites
6
- -------------
7
-
8
- PayPal's PHP Merchant SDK requires
9
-
10
- * PHP 5.2 and above with curl extension enabled
11
-
12
-
13
- Using the SDK
14
- -------------
15
-
16
- To use the SDK,
17
-
18
- * Copy the config and lib folders into your project.
19
- * Make sure that the lib folder in your project is available in PHP's include path
20
- * Include the services\PayPalAPIInterfaceService\PayPalAPIInterfaceServiceService.php file in your code.
21
- * Create a service wrapper object
22
- * Create a request object as per your project's needs. All the API request and response classes are available in services\PayPalAPIInterfaceService\PayPalAPIInterfaceServiceService.php
23
- * Invoke the appropriate method on the request object.
24
-
25
-
26
- For example,
27
-
28
- require_once('services/PayPalAPIInterfaceService/PayPalAPIInterfaceServiceService.php'); require_once('PPLoggingManager.php');
29
-
30
- $itemAmount = new BasicAmountType();
31
- $itemAmount->currencyID = $_REQUEST['currencyCode'];
32
- $itemAmount->value = $_REQUEST['itemAmount'];
33
- $setECReqType = new SetExpressCheckoutRequestType();
34
- $setECReqType->SetExpressCheckoutRequestDetails = $setECReqDetails;
35
- $setECReqType->Version = '86.0';
36
- $setECReq = new SetExpressCheckoutReq();
37
- $setECReq->SetExpressCheckoutRequest = $setECReqType;
38
- ......
39
-
40
- $paypalService = new PayPalAPIInterfaceServiceService();
41
- $setECResponse = $paypalService->SetExpressCheckout($setECReq);
42
-
43
- $ack = strtoupper($setECResponse->Ack);
44
-
45
- if($ack == 'SUCCESS') {
46
- // Success
47
- }
48
-
49
-
50
-
51
- SDK Configuration
52
- -----------------
53
-
54
- replace the API credential in config/sdk_config.ini . You can use the configuration file to configure
55
-
56
- * (Multiple) API account credentials.
57
- * Service endpoint and other HTTP connection parameters
58
-
59
-
60
- Please refer to the sample config file provided with this bundle.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/build.xml DELETED
@@ -1,24 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project name="PayPal_PHP_SDK" default="build">
3
-
4
-
5
- <condition property="PHPUNIT_PATH" value="phpunit.bat" else="phpunit">
6
- <os family="windows"/>
7
- </condition>
8
-
9
- <target name="clean">
10
- <delete dir="${basedir}/build"/>
11
- </target>
12
-
13
-
14
- <target name="phpunit">
15
- <mkdir dir="tests/reports/"/>
16
- <exec dir="${basedir}" executable="${PHPUNIT_PATH}" failonerror="true">
17
- <arg
18
- line="--testdox --include-path lib --log-junit tests\reports\phpunit.xml tests"/>
19
- </exec>
20
- </target>
21
-
22
-
23
- <target name="build" depends="clean, phpunit"/>
24
- </project>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/config/sdk-cert.pem DELETED
@@ -1,41 +0,0 @@
1
- Bag Attributes
2
- localKeyID: E4 F0 42 FE 24 52 DD 61 B0 4A EE 64 74 62 6B 2F 6E 3B 31 7B
3
- subject=/CN=certuser_biz_api1.paypal.com/O=Bonzop/L=Austin/ST=TX/C=US
4
- issuer=/C=US/ST=California/L=San Jose/O=PayPal, Inc./OU=sandbox_certs/CN=sandbox_camerchapi/emailAddress=re@paypal.com
5
- -----BEGIN CERTIFICATE-----
6
- MIICiDCCAfGgAwIBAgIDD/WUMA0GCSqGSIb3DQEBBQUAMIGfMQswCQYDVQQGEwJV
7
- UzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2UxFTATBgNV
8
- BAoTDFBheVBhbCwgSW5jLjEWMBQGA1UECxQNc2FuZGJveF9jZXJ0czEbMBkGA1UE
9
- AxQSc2FuZGJveF9jYW1lcmNoYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwu
10
- Y29tMB4XDTExMDUwMjA1MDQ0NFoXDTIxMDQyOTA1MDQ0NFowYzElMCMGA1UEAxQc
11
- Y2VydHVzZXJfYml6X2FwaTEucGF5cGFsLmNvbTEPMA0GA1UEChMGQm9uem9wMQ8w
12
- DQYDVQQHEwZBdXN0aW4xCzAJBgNVBAgTAlRYMQswCQYDVQQGEwJVUzCBnzANBgkq
13
- hkiG9w0BAQEFAAOBjQAwgYkCgYEAmhsOeujiGniLK6drcs38FLcGqZNmj4C/TfKD
14
- qD5k5gP26oahfNl+NxAds2RdR2N+ZD6dy+a2Uo6q2hGc+Y+1uA5FzEtvOsC52qId
15
- NrFVm215S3Gf77AEMzYItbNq2jlqJ5HGwCAMoY1aBkI6bgp+8vWDYEH6WZIK4f0e
16
- YoPKG0MCAwEAAaMNMAswCQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOBgQBj6xWw
17
- AumLzSodCWyocPcyKSooNa7wgJKzaVrf0Kxz2QBesKpsfe9UN3Dj04016FIUbkRI
18
- 4qLJIkKHyeQRU9hvJ78tU7OeykDEVqlHAEE/Z4c5EIs6l9x60VqOpAjnaqX/9Jty
19
- jXhqpINjolTh6D5jq8y4FX5krKqIYBCNDHM+cQ==
20
- -----END CERTIFICATE-----
21
- Bag Attributes
22
- localKeyID: E4 F0 42 FE 24 52 DD 61 B0 4A EE 64 74 62 6B 2F 6E 3B 31 7B
23
- Key Attributes: <No Attributes>
24
- -----BEGIN RSA PRIVATE KEY-----
25
- Proc-Type: 4,ENCRYPTED
26
- DEK-Info: DES-EDE3-CBC,18E53CC94575411A
27
-
28
- Dbkm1iUDbpaY3abg08u1NKnzdd0tZwArMQKpRJ4zaVbm4qYkwAEvmKWGCemP0hwM
29
- iA0EeLgbSbYbgXi+3Ba1Hm5kf5p5MbGqylgUNBVzKV+OtuPgZPnHclyHoJwRf8NU
30
- e+wwRIDB/6ZpXt69t3poxmYR0MfhrgSm/YdBDRLJbBE8I51vTELmCRC2SN/5ebo+
31
- TCNtGyf/upKBf0XfM8sY5SvffwSA1uaOLh0FwtYq0vQViFayPfmyBBDirVZqAFMt
32
- DOuX2JaYUj9s9qVuwQIqHThJLhTqU/0eZjkYXy22F2ER8fNG77LQ5+SMevngWXjt
33
- afErYBJYcSc1V/MX39126vaYL/AzLTBXHkSmJ0w+nCs+4ifVv9dJTb8W6W10ZWk6
34
- HQrSuIhLbgbPg0J5LagYymCWjkl3UseJSFsUdH2EkQA4uBwKX4aJzH4n44H2sCk0
35
- UCzDSGC6jWr7VOTpOk5+NHi/pqZhvpNn2Tg+jZt/kqKAa08di9jTP0eZbS4+bb6S
36
- 9FtpOLWXKz/JZVLmA5v2o1L9kqvFoMsgvito4oK/j5jPGat22xTpoBnSom3+QsfB
37
- ViOStyAh9MqGqsTh+YcNNUbv5dJ4IpmUAki64Cx4j90wFkpbUpoeT3l/0Gbuwnpy
38
- Ugw97/qHVGlFAhrXDr72TqI2+YXFfxklyCLMNnsBvrM55NZcgxsH7UWp0hCNXq/j
39
- FQNduuw6CAqfosj5aKjDRIll1MN0631yxkGxhsHiMQNMOCMe6+OwDs5gdF+Wvc4j
40
- HlSAq1H0v3iZRcWs1qdf9eKMAc1k5T9TPHlcEgwv9zMWSGqvxizwNQ==
41
- -----END RSA PRIVATE KEY-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/config/sdk_config.ini DELETED
@@ -1,39 +0,0 @@
1
- ;Account credentials
2
- [Account]
3
- acct1.UserName = jb-us-seller_api1.paypal.com
4
- acct1.Password = WX4WTU3S8MY44S7F
5
- acct1.Signature = AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy
6
- acct1.AppId = APP-80W284485P519543T
7
- # Subject is optinal, only required in case of third party permission
8
- acct1.Subject =
9
-
10
- ; Certificate Credentials Test Account
11
- acct2.UserName = certuser_biz_api1.paypal.com
12
- acct2.Password = D6JNKKULHN3G5B8A
13
- ; Certificate path relative to config folder or absolute path in file system
14
- acct2.CertPath = sdk-cert.pem
15
- acct2.CertKey = password ; Password given when generating .PEM file from a .p12 file
16
- acct2.AppId = APP-80W284485P519543T
17
- # Subject is optinal, only required in case of third party permission
18
- acct2.Subject =
19
-
20
- ;Connection Information
21
- [Http]
22
- http.ConnectionTimeOut = 30
23
- http.Retry = 5
24
- ;http.Proxy
25
-
26
- ;Service Configuration
27
- [Service]
28
- ; NOTE: Do not change the service binding configuration.
29
- service.Binding = SOAP
30
- service.EndPoint = "https://api-3t.sandbox.paypal.com/2.0/" ; Endpoint for 3-token credentials
31
- ; Uncomment this line if you are using certificate credentials
32
- ;service.EndPoint = "https://api.sandbox.paypal.com/2.0/"
33
- service.RedirectURL = "https://www.sandbox.paypal.com/webscr&cmd="
34
-
35
- ;Logging Information
36
- [Log]
37
- log.FileName = ../PayPal.log
38
- log.LogLevel = INFO
39
- log.LogEnabled = true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/IPPCredential.php DELETED
@@ -1,53 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Base class that represents API credentials
5
- */
6
- abstract class IPPCredential
7
- {
8
- /**
9
- * Application Id that uniquely identifies the application
10
- * The application Id is issued by PayPal.
11
- * Test application Ids are available for the sandbox environment
12
- * @var string
13
- */
14
- protected $applicationId;
15
-
16
- /**
17
- * API username
18
- * @var string
19
- */
20
- protected $userName;
21
-
22
- /**
23
- * API password
24
- * @var string
25
- */
26
- protected $password;
27
-
28
- protected abstract function validate();
29
-
30
- public function __construct( $userName, $password, $applicationId )
31
- {
32
- $this->userName = $userName;
33
- $this->password = $password;
34
- $this->applicationId = $applicationId;
35
- }
36
-
37
- public function getApplicationId()
38
- {
39
- return $this->applicationId;
40
- }
41
-
42
- public function getUserName()
43
- {
44
- return $this->userName;
45
- }
46
-
47
- public function getPassword()
48
- {
49
- return $this->password;
50
- }
51
- }
52
-
53
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPAPIService.php DELETED
@@ -1,62 +0,0 @@
1
- <?php
2
- require_once 'PPCredentialManager.php';
3
- require_once 'PPConnectionManager.php';
4
- require_once 'PPObjectTransformer.php';
5
- require_once 'PPLoggingManager.php';
6
- require_once 'PPUtils.php';
7
- require_once 'PPAuthenticationManager.php';
8
-
9
- class PPAPIService
10
- {
11
- public $endpoint;
12
- public $serviceName;
13
- private $logger;
14
-
15
- public function __construct( $serviceName = "" )
16
- {
17
- $this->serviceName = $serviceName;
18
- $config = PPConfigManager::getInstance();
19
- $this->endpoint = $config->get( 'service.EndPoint' );
20
- $this->logger = new PPLoggingManager( __CLASS__ );
21
- }
22
-
23
- public function setServiceName( $serviceName )
24
- {
25
- $this->serviceName = $serviceName;
26
- }
27
-
28
-
29
- public function makeRequest( $apiMethod, $params, $apiUsername = null, $accessToken = null, $tokenSecret = null )
30
- {
31
-
32
- $authentication = new PPAuthenticationManager();
33
- $connectionMgr = PPConnectionManager::getInstance();
34
- $connection = $connectionMgr->getConnection();
35
-
36
- $credMgr = PPCredentialManager::getInstance();
37
- // $apiUsernam is optional, if null the default account in congif file is taken
38
- $apIPPCredential = $credMgr->getCredentialObject( $apiUsername );
39
- $config = PPConfigManager::getInstance();
40
- if ( $config->get( 'service.Binding' ) == 'SOAP' ) {
41
- $url = $this->endpoint;
42
- if ( isset( $accessToken ) && isset( $tokenSecret ) ) {
43
- $headers = $authentication->getPayPalHeaders( $apIPPCredential, $connection, $accessToken, $tokenSecret, $url );
44
- } else {
45
- $headers = null;
46
- }
47
- $params = $authentication->appendSoapHeader( $params, $apIPPCredential, $connection, $accessToken, $tokenSecret, $url );
48
- } else {
49
- $url = $this->endpoint . $this->serviceName . '/' . $apiMethod;
50
- $headers = $authentication->getPayPalHeaders( $apIPPCredential, $connection, $accessToken, $tokenSecret, $url );
51
- }
52
-
53
-
54
- $this->logger->info( "Request: $params" );
55
- $response = $connection->execute( $url, $params, $headers );
56
- $this->logger->info( "Response: $response" );
57
-
58
- return $response;
59
- }
60
-
61
-
62
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPAuthenticationManager.php DELETED
@@ -1,99 +0,0 @@
1
- <?php
2
- require_once 'IPPCredential.php';
3
- require_once 'PPConfigManager.php';
4
- require_once 'PPSignatureCredential.php';
5
- require_once 'PPCertificateCredential.php';
6
- require_once 'exceptions/PPInvalidCredentialException.php';
7
- require_once 'auth/PPAuth.php';
8
-
9
- class PPAuthenticationManager
10
- {
11
- public function getPayPalHeaders( $apiCred, $connection, $accessToken = null, $tokenSecret = null, $url = null )
12
- {
13
- $config = PPConfigManager::getInstance();
14
-
15
- if ( isset( $accessToken ) && isset( $tokenSecret ) ) {
16
- $headers_arr[ ] = "X-PP-AUTHORIZATION: " . $this->generateAuthString( $apiCred, $accessToken, $tokenSecret, $url );
17
- //$headers_arr[] = "CLIENT-AUTH: No cert";
18
- } // Add headers required for service authentication
19
- else if ( $apiCred instanceof PPSignatureCredential ) {
20
- $headers_arr[ ] = "X-PAYPAL-SECURITY-USERID: " . $apiCred->getUserName();
21
- $headers_arr[ ] = "X-PAYPAL-SECURITY-PASSWORD: " . $apiCred->getPassword();
22
- $headers_arr[ ] = "X-PAYPAL-SECURITY-SIGNATURE: " . $apiCred->getSignature();
23
- } else if ( $apiCred instanceof PPCertificateCredential ) {
24
-
25
- $headers_arr[ ] = "X-PAYPAL-SECURITY-USERID: " . $apiCred->getUserName();
26
- $headers_arr[ ] = "X-PAYPAL-SECURITY-PASSWORD: " . $apiCred->getPassword();
27
- $connection->setSSLCert( $apiCred->getCertificatePath(), $apiCred->getPassPhrase() );
28
- }
29
-
30
- // Add other headers
31
- $headers_arr[ ] = "X-PAYPAL-APPLICATION-ID: " . $apiCred->getApplicationId();
32
- $headers_arr[ ] = "X-PAYPAL-REQUEST-DATA-FORMAT: " . $config->get( 'service.Binding' );
33
- $headers_arr[ ] = "X-PAYPAL-RESPONSE-DATA-FORMAT: " . $config->get( 'service.Binding' );
34
- $headers_arr[ ] = "X-PAYPAL-DEVICE-IPADDRESS: " . PPUtils::getLocalIPAddress();
35
- $headers_arr[ ] = "X-PAYPAL-REQUEST-SOURCE: " . PPUtils::getRequestSource();
36
-
37
- return $headers_arr;
38
- }
39
-
40
- public function appendSoapHeader( $payLoad, $apiCred, $connection, $accessToken = null, $tokenSecret = null, $url = null )
41
- {
42
- $soapHeader = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:ebay:api:PayPalAPI\" xmlns:ebl=\"urn:ebay:apis:eBLBaseComponents\" xmlns:cc=\"urn:ebay:apis:CoreComponentTypes\" xmlns:ed=\"urn:ebay:apis:EnhancedDataTypes\">";
43
-
44
- if ( isset( $accessToken ) && isset( $tokenSecret ) ) {
45
- $soapHeader .= "<soapenv:Header>";
46
- $soapHeader .= "<urn:RequesterCredentials/>";
47
- $soapHeader .= "</soapenv:Header>";
48
- } else if ( $apiCred instanceof PPSignatureCredential ) {
49
- $soapHeader .= "<soapenv:Header>";
50
- $soapHeader .= "<urn:RequesterCredentials>";
51
- $soapHeader .= "<ebl:Credentials>";
52
- $soapHeader .= "<ebl:Username>" . $apiCred->getUserName() . "</ebl:Username>";
53
- $soapHeader .= "<ebl:Password>" . $apiCred->getPassword() . "</ebl:Password>";
54
- $soapHeader .= "<ebl:Signature>" . $apiCred->getSignature() . "</ebl:Signature>";
55
- $subject = $apiCred->getSubject();
56
- if ( isset( $subject ) && $subject != "" ) {
57
- $soapHeader .= "<ebl:Subject>" . $apiCred->getSubject() . "</ebl:Subject>";
58
- }
59
- $soapHeader .= "</ebl:Credentials>";
60
- $soapHeader .= "</urn:RequesterCredentials>";
61
- $soapHeader .= "</soapenv:Header>";
62
- } else if ( $apiCred instanceof PPCertificateCredential ) {
63
- $soapHeader .= "<soapenv:Header>";
64
- $soapHeader .= "<urn:RequesterCredentials>";
65
- $soapHeader .= "<ebl:Credentials>";
66
- $soapHeader .= "<ebl:Username>" . $apiCred->getUserName() . "</ebl:Username>";
67
- $soapHeader .= "<ebl:Password>" . $apiCred->getPassword() . "</ebl:Password>";
68
- $subject = $apiCred->getSubject();
69
- if ( isset( $subject ) && $subject != "" ) {
70
- $soapHeader .= "<ebl:Subject>" . $apiCred->getSubject() . "</ebl:Subject>";
71
- }
72
- $soapHeader .= "</ebl:Credentials>";
73
- $soapHeader .= "</urn:RequesterCredentials>";
74
- $soapHeader .= "</soapenv:Header>";
75
- $connection->setSSLCert( $apiCred->getCertificatePath(), $apiCred->getPassPhrase() );
76
- }
77
- $soapHeader .= "<soapenv:Body>";
78
- $soapHeader .= $payLoad;
79
- $soapHeader .= "</soapenv:Body>";
80
- $soapHeader .= "</soapenv:Envelope>";
81
-
82
- return $soapHeader;
83
-
84
- }
85
-
86
- private function generateAuthString( $apiCred, $accessToken, $tokenSecret, $endpoint )
87
- {
88
- $key = $apiCred->getUserName();
89
- $secret = $apiCred->getPassword();
90
- $auth = new AuthSignature();
91
- $response = $auth->genSign( $key, $secret, $accessToken, $tokenSecret, 'POST', $endpoint );
92
- $authString = "token=" . $accessToken . ",signature=" . $response[ 'oauth_signature' ] . ",timestamp=" . $response[ 'oauth_timestamp' ];
93
-
94
- return $authString;
95
- }
96
-
97
- }
98
-
99
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPBaseService.php DELETED
@@ -1,88 +0,0 @@
1
- <?php
2
- require_once 'PPAPIService.php';
3
-
4
-
5
- class PPBaseService
6
- {
7
-
8
- private $serviceName;
9
-
10
- /*
11
- * Setters and getters for Third party authentication (Permission Services)
12
- */
13
- protected $accessToken;
14
- protected $tokenSecret;
15
- protected $lastRequest;
16
- protected $lastResponse;
17
-
18
- public function getLastRequest()
19
- {
20
- return $this->lastRequest;
21
- }
22
-
23
- public function setLastRequest( $lastRqst )
24
- {
25
- $this->lastRequest = $lastRqst;
26
- }
27
-
28
- public function getLastResponse()
29
- {
30
- return $this->lastResponse;
31
- }
32
-
33
- public function setLastResponse( $lastRspns )
34
- {
35
- $this->lastResponse = $lastRspns;
36
- }
37
-
38
- public function getAccessToken()
39
- {
40
- return $this->accessToken;
41
- }
42
-
43
- public function setAccessToken( $accessToken )
44
- {
45
- $this->accessToken = $accessToken;
46
- }
47
-
48
- public function getTokenSecret()
49
- {
50
- return $this->tokenSecret;
51
- }
52
-
53
- public function setTokenSecret( $tokenSecret )
54
- {
55
- $this->tokenSecret = $tokenSecret;
56
- }
57
-
58
- public function __construct( $serviceName )
59
- {
60
- $this->serviceName = $serviceName;
61
- }
62
-
63
- public function getServiceName()
64
- {
65
- return $this->serviceName;
66
- }
67
-
68
- public function call( $method, $requestObject, $apiUsername = null )
69
- {
70
- $params = $this->marshall( $requestObject );
71
- $service = new PPAPIService();
72
- $service->setServiceName( $this->serviceName );
73
-
74
- $this->lastRequest = $params;
75
- $this->lastResponse = $service->makeRequest( $method, $params, $apiUsername, $this->accessToken, $this->tokenSecret );
76
-
77
- return $this->lastResponse;
78
- }
79
-
80
- private function marshall( $object )
81
- {
82
- $transformer = new PPObjectTransformer();
83
-
84
- return $transformer->toString( $object );
85
- }
86
- }
87
-
88
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPCertificateCredential.php DELETED
@@ -1,77 +0,0 @@
1
- <?php
2
- require_once 'IPPCredential.php';
3
- require_once 'PPConfigManager.php';
4
- require_once 'exceptions/PPMissingCredentialException.php';
5
-
6
- class PPCertificateCredential extends IPPCredential
7
- {
8
-
9
- private $certificatePath;
10
- private $passPhrase;
11
- private $subject;
12
-
13
- public function __construct( $userName, $password, $certPath, $appId, $passPhrase, $subject )
14
- {
15
- parent::__construct( $userName, $password, $appId );
16
- $this->certificatePath = $certPath;
17
- $this->passPhrase = $passPhrase;
18
- $this->subject = $subject;
19
- $this->validate();
20
- }
21
-
22
- public function validate()
23
- {
24
-
25
- if ( $this->userName == null || $this->userName == "" ) {
26
- throw new PPMissingCredentialException( "username cannot be empty" );
27
- }
28
- if ( $this->password == null || $this->password == "" ) {
29
- throw new PPMissingCredentialException( "password cannot be empty" );
30
- }
31
- if ( $this->certificatePath == null || $this->certificatePath == "" ) {
32
- throw new PPMissingCredentialException( "certificate cannot be empty" );
33
- }
34
- if ( $this->passPhrase == null || $this->passPhrase == "" ) {
35
- throw new PPMissingCredentialException( "passphrase cannot be empty" );
36
- }
37
- if ( $this->applicationId == null || $this->applicationId == "" ) {
38
- throw new PPMissingCredentialException( "applicationId cannot be empty" );
39
- }
40
- }
41
-
42
- public function getUserName()
43
- {
44
- return $this->userName;
45
- }
46
-
47
- public function getPassword()
48
- {
49
- return $this->password;
50
- }
51
-
52
- public function getCertificatePath()
53
- {
54
- if ( realpath( $this->certificatePath ) ) {
55
- return realpath( $this->certificatePath );
56
- } else {
57
- return realpath( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . $this->certificatePath );
58
- }
59
- }
60
-
61
- public function getPassPhrase()
62
- {
63
- return $this->passPhrase;
64
- }
65
-
66
- public function getApplicationId()
67
- {
68
- return $this->applicationId;
69
- }
70
-
71
- public function getSubject()
72
- {
73
- return $this->subject;
74
- }
75
- }
76
-
77
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPConfigManager.php DELETED
@@ -1,121 +0,0 @@
1
- <?php
2
- /**
3
- * PPConfigManager loads the SDK configuration file and
4
- * hands out appropriate config params to other classes
5
- */
6
- require_once 'exceptions/PPConfigurationException.php';
7
-
8
- class PPConfigManager
9
- {
10
-
11
- private $config;
12
- /**
13
- * @var PPConfigManager
14
- */
15
- private static $instance;
16
-
17
- private function __construct()
18
- {
19
- $configFile = dirname( __FILE__ ) . DIRECTORY_SEPARATOR . ".."
20
- . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "sdk_config.ini";
21
- $this->load( $configFile );
22
- }
23
-
24
- // create singleton object for PPConfigManager
25
- public static function getInstance()
26
- {
27
- if ( !isset( self::$instance ) ) {
28
- self::$instance = new PPConfigManager();
29
- }
30
-
31
- return self::$instance;
32
- }
33
-
34
- //used to load the file
35
- private function load( $fileName )
36
- {
37
- if ( class_exists( 'Woocommerce' ) ) {
38
- global $woocommerce;
39
- $gateways = $woocommerce->payment_gateways->payment_gateways();
40
- $settings = $gateways[ 'paypalap' ]->settings;
41
- $mode = $settings[ 'sandbox_enabled' ];
42
-
43
- $this->config = array(
44
- 'acct1.UserName' => $mode == 'yes' ? $settings[ 'username' ] : $settings[ 'username_live' ],
45
- 'acct1.Password' => $mode == 'yes' ? $settings[ 'password' ] : $settings[ 'password_live' ],
46
- 'acct1.Signature' => $mode == 'yes' ? $settings[ 'signature' ] : $settings[ 'signature_live' ],
47
- 'acct1.AppId' => $mode == 'yes' ? 'APP-80W284485P519543T' : $settings[ 'app_id' ],
48
-
49
- 'service.Binding' => 'SOAP',
50
- 'service.EndPoint' => $mode == 'yes' ? 'https://api-3t.sandbox.paypal.com/2.0/' : 'https://api-3t.paypal.com/2.0/',
51
- 'service.RedirectURL' => $mode == 'yes' ? 'https://sandbox.paypal.com/webscr&cmd=' : 'https://paypal.com/webscr&cmd=',
52
- 'service.DevCentralURL' => 'https://developer.paypal.com',
53
- 'http.ConnectionTimeOut' => '10',
54
- 'http.Retry' => '5',
55
- 'log.FileName' => 'PayPal.log',
56
- 'log.LogLevel' => 'INFO',
57
- 'log.LogEnabled' => $settings[ 'logging_enabled' ] == 'yes' ? 'true' : 'false',
58
- );
59
- } else {
60
- $this->config = @parse_ini_file( $fileName );
61
- }
62
-
63
- if ( $this->config == null || count( $this->config ) == 0 ) {
64
- throw new PPConfigurationException( "Config file $fileName not found", "303" );
65
- }
66
- }
67
-
68
- /**
69
- * simple getter for configuration params
70
- * If an exact match for key is not found,
71
- * does a "contains" search on the key
72
- */
73
- public function get( $searchKey )
74
- {
75
-
76
- if ( array_key_exists( $searchKey, $this->config ) ) {
77
- return $this->config[ $searchKey ];
78
- } else {
79
- $arr = array();
80
- foreach ( $this->config as $k => $v ) {
81
- if ( strstr( $k, $searchKey ) ) {
82
- $arr[ $k ] = $v;
83
- }
84
- }
85
-
86
- return $arr;
87
- }
88
-
89
- }
90
-
91
- /**
92
- * Utility method for handling account configuration
93
- * return config key corresponding to the API userId passed in
94
- *
95
- * If $userId is null, returns config keys corresponding to
96
- * all configured accounts
97
- */
98
- public function getIniPrefix( $userId = null )
99
- {
100
-
101
- if ( $userId == null ) {
102
- $arr = array();
103
- foreach ( $this->config as $key => $value ) {
104
- $pos = strpos( $key, '.' );
105
- if ( strstr( $key, "acct" ) ) {
106
- $arr[ ] = substr( $key, 0, $pos );
107
- }
108
- }
109
-
110
- return array_unique( $arr );
111
- } else {
112
- $iniPrefix = array_search( $userId, $this->config );
113
- $pos = strpos( $iniPrefix, '.' );
114
- $acct = substr( $iniPrefix, 0, $pos );
115
-
116
- return $acct;
117
- }
118
- }
119
- }
120
-
121
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPConnectionManager.php DELETED
@@ -1,48 +0,0 @@
1
- <?php
2
- require_once 'PPHttpConnection.php';
3
- require_once 'PPConfigManager.php';
4
- class PPConnectionManager
5
- {
6
- /**
7
- * reference to singleton instance
8
- * @var PPConnectionManager
9
- */
10
- private static $instance;
11
-
12
- private function __construct()
13
- {
14
- }
15
-
16
- public static function getInstance()
17
- {
18
- if ( self::$instance == null ) {
19
- self::$instance = new PPConnectionManager();
20
- }
21
-
22
- return self::$instance;
23
- }
24
-
25
- /**
26
- * This function returns a new PPHttpConnection object
27
- */
28
- public function getConnection()
29
- {
30
-
31
- $connection = new PPHttpConnection();
32
-
33
- $configMgr = PPConfigManager::getInstance();
34
- if ( ( $configMgr->get( "http.ConnectionTimeOut" ) ) ) {
35
- $connection->setHttpTimeout( $configMgr->get( "http.ConnectionTimeOut" ) );
36
- }
37
- if ( $configMgr->get( "http.Proxy" ) ) {
38
- $connection->setHttpProxy( $configMgr->get( "http.Proxy" ) );
39
- }
40
- if ( $configMgr->get( "http.Retry" ) ) {
41
- $retry = $configMgr->get( "http.Retry" );
42
- $connection->setHttpRetry( $retry );
43
- }
44
-
45
- return $connection;
46
- }
47
-
48
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPCredentialManager.php DELETED
@@ -1,119 +0,0 @@
1
- <?php
2
- require_once 'IPPCredential.php';
3
- require_once 'PPConfigManager.php';
4
- require_once 'PPSignatureCredential.php';
5
- require_once 'PPCertificateCredential.php';
6
- require_once 'exceptions/PPInvalidCredentialException.php';
7
-
8
- class PPCredentialManager
9
- {
10
-
11
- private static $instance;
12
- //hashmap to contain credentials for accounts.
13
- private $credentialHashmap = array();
14
- /**
15
- * Contains the API username of the default account to use
16
- * when authenticating API calls.
17
- * @var string
18
- */
19
- private $defaultAccountName;
20
-
21
- /*
22
- * Constructor initialize credential for multiple accounts specified in property file.
23
- */
24
- private function __construct()
25
- {
26
- try {
27
- $this->initCredential();
28
- } catch ( Exception $e ) {
29
- $this->credentialHashmap = array();
30
- throw $e;
31
- }
32
- }
33
-
34
- /*
35
- * Create singleton instance for this class.
36
- */
37
- public static function getInstance()
38
- {
39
- if ( !isset( self::$instance ) ) {
40
- self::$instance = new PPCredentialManager();
41
- }
42
-
43
- return self::$instance;
44
- }
45
-
46
- /*
47
- * Load credentials for multiple accounts, with priority given to Signature credential.
48
- */
49
- private function initCredential()
50
- {
51
- $configMgr = PPConfigManager::getInstance();
52
- $suffix = 1;
53
- $prefix = "acct";
54
-
55
- $credArr = $configMgr->get( $prefix );
56
- $arrayPartKeys = $configMgr->getIniPrefix();
57
- if ( count( $arrayPartKeys ) == 0 )
58
- throw new MissingCredentialException( "No valid API accounts have been configured" );
59
-
60
- while ( in_array( $prefix . $suffix, $arrayPartKeys ) ) {
61
-
62
- if ( isset( $credArr[ $prefix . $suffix . ".Signature" ] )
63
- && $credArr[ $prefix . $suffix . ".Signature" ] != null && $credArr[ $prefix . $suffix . ".Signature" ] != ""
64
- ) {
65
-
66
- $userName = isset( $credArr[ $prefix . $suffix . '.UserName' ] ) ? $credArr[ $prefix . $suffix . '.UserName' ] : "";
67
- $password = isset( $credArr[ $prefix . $suffix . '.Password' ] ) ? $credArr[ $prefix . $suffix . '.Password' ] : "";
68
- $signature = isset( $credArr[ $prefix . $suffix . '.Signature' ] ) ? $credArr[ $prefix . $suffix . '.Signature' ] : "";
69
- $appId = isset( $credArr[ $prefix . $suffix . '.AppId' ] ) ? $credArr[ $prefix . $suffix . '.AppId' ] : "";
70
- $subject = isset( $credArr[ $prefix . $suffix . '.Subject' ] ) ? $credArr[ $prefix . $suffix . '.Subject' ] : "";
71
- $this->credentialHashmap[ $userName ] = new PPSignatureCredential( $userName, $password, $signature, $appId, $subject );
72
-
73
- } elseif ( isset( $credArr[ $prefix . $suffix . ".CertPath" ] )
74
- && $credArr[ $prefix . $suffix . ".CertPath" ] != null && $credArr[ $prefix . $suffix . ".CertPath" ] != ""
75
- ) {
76
-
77
- $userName = isset( $credArr[ $prefix . $suffix . '.UserName' ] ) ? $credArr[ $prefix . $suffix . '.UserName' ] : "";
78
- $password = isset( $credArr[ $prefix . $suffix . '.Password' ] ) ? $credArr[ $prefix . $suffix . '.Password' ] : "";
79
- $passPhrase = isset( $credArr[ $prefix . $suffix . '.CertKey' ] ) ? $credArr[ $prefix . $suffix . '.CertKey' ] : "";
80
- $certPath = isset( $credArr[ $prefix . $suffix . '.CertPath' ] ) ? $credArr[ $prefix . $suffix . '.CertPath' ] : "";
81
- $appId = isset( $credArr[ $prefix . $suffix . '.AppId' ] ) ? $credArr[ $prefix . $suffix . '.AppId' ] : "";
82
- $subject = isset( $credArr[ $prefix . $suffix . '.Subject' ] ) ? $credArr[ $prefix . $suffix . '.Subject' ] : "";
83
- $this->credentialHashmap[ $userName ] = new PPCertificateCredential( $userName, $password, $certPath, $appId, $passPhrase, $subject );
84
-
85
- }
86
- if ( $this->defaultAccountName == null )
87
- $this->defaultAccountName = $credArr[ $prefix . $suffix . '.UserName' ];
88
- $suffix++;
89
- }
90
-
91
- }
92
-
93
- /*
94
- * Obtain Credential Object based on UserId provided.
95
- */
96
- public function getCredentialObject( $userId = null )
97
- {
98
-
99
- if ( $userId == null )
100
- $credObj = $this->credentialHashmap[ $this->defaultAccountName ];
101
- else if ( array_key_exists( $userId, $this->credentialHashmap ) )
102
- $credObj = $this->credentialHashmap[ $userId ];
103
-
104
- if ( empty( $credObj ) ) {
105
- throw new PPInvalidCredentialException( "Invalid userId $userId" );
106
- }
107
-
108
- return $credObj;
109
- }
110
-
111
-
112
- public function __clone()
113
- {
114
- trigger_error( 'Clone is not allowed.', E_USER_ERROR );
115
- }
116
-
117
- }
118
-
119
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPHttpConnection.php DELETED
@@ -1,184 +0,0 @@
1
- <?php
2
-
3
- require_once 'exceptions/PPConnectionException.php';
4
- require_once 'exceptions/PPConfigurationException.php';
5
- require_once 'PPLoggingManager.php';
6
- /**
7
- * A wrapper class based on the curl extension.
8
- * Requires the PHP curl module to be enabled.
9
- * See for full requirements the PHP manual: http://php.net/curl
10
- */
11
-
12
-
13
- class PPHttpConnection
14
- {
15
-
16
- const HTTP_GET = 'GET';
17
- const HTTP_POST = 'POST';
18
-
19
- /**
20
- * curl options to be set for the request
21
- */
22
- private $curlOpt = array();
23
-
24
- /**
25
- * Number of times a retry must be attempted on getting an HTTP error
26
- * @var integer
27
- */
28
- private $retry;
29
-
30
- /**
31
- * HTTP status codes for which a retry must be attempted
32
- */
33
- private static $retryCodes = array( '401', '403', '404', );
34
-
35
- private $logger;
36
-
37
-
38
- /**
39
- * Some default options for curl
40
- * These are typically overridden by PPConnectionManager
41
- */
42
- public static $DEFAULT_CURL_OPTS = array(
43
- CURLOPT_CONNECTTIMEOUT => 10,
44
- CURLOPT_RETURNTRANSFER => true,
45
- CURLOPT_TIMEOUT => 60, // maximum number of seconds to allow cURL functions to execute
46
- CURLOPT_USERAGENT => 'PayPal-PHP-SDK',
47
- CURLOPT_POST => 1,
48
- CURLOPT_HTTPHEADER => array(),
49
- CURLOPT_SSL_VERIFYHOST => 1,
50
- CURLOPT_SSL_VERIFYPEER => 2
51
- );
52
-
53
- public function __construct()
54
- {
55
- if ( !function_exists( "curl_init" ) ) {
56
- throw new PPConfigurationException( "Curl module is not available on this system" );
57
- }
58
- $this->curlOpt = self::$DEFAULT_CURL_OPTS;
59
- $this->logger = new PPLoggingManager( __CLASS__ );
60
- }
61
-
62
- /**
63
- * Set ssl parameters for certificate based client authentication
64
- *
65
- * @param string $certPath - path to client certificate file (PEM formatted file)
66
- */
67
- public function setSSLCert( $certPath, $passPhrase )
68
- {
69
- $this->curlOpt[ CURLOPT_SSLCERT ] = realpath( $certPath );
70
- $this->curlOpt[ CURLOPT_SSLCERTPASSWD ] = $passPhrase;
71
- }
72
-
73
- /**
74
- * Set connection timeout in seconds
75
- *
76
- * @param integer $timeout
77
- */
78
- public function setHttpTimeout( $timeout )
79
- {
80
- $this->curlOpt[ CURLOPT_CONNECTTIMEOUT ] = $timeout;
81
- }
82
-
83
- /**
84
- * Set HTTP proxy information
85
- *
86
- * @param string $proxy
87
- *
88
- * @throws PPConfigurationException
89
- */
90
- public function setHttpProxy( $proxy )
91
- {
92
- $urlParts = parse_url( $proxy );
93
- if ( $urlParts == false || !array_key_exists( "host", $urlParts ) )
94
- throw new PPConfigurationException( "Invalid proxy configuration " . $proxy );
95
-
96
- $this->curlOpt[ CURLOPT_PROXY ] = $urlParts[ "host" ];
97
- if ( isset( $urlParts[ "port" ] ) )
98
- $this->curlOpt[ CURLOPT_PROXY ] .= ":" . $urlParts[ "port" ];
99
- if ( isset( $urlParts[ "user" ] ) )
100
- $this->curlOpt[ URLOPT_PROXYUSERPWD ] = $urlParts[ "user" ] . ":" . $urlParts[ "pass" ];
101
- }
102
-
103
- public function setHttpHeaders( $headers )
104
- {
105
- $this->curlOpt[ CURLOPT_HTTPHEADER ] = $headers;
106
- }
107
-
108
- /**
109
- * @param integer $retry
110
- */
111
- public function setHttpRetry( $retry )
112
- {
113
- $this->retry = $retry;
114
- }
115
-
116
- /**
117
- * Executes an HTTP request
118
- *
119
- * @param string $url
120
- * @param string $params query string OR POST content as a string
121
- * @param array $headers array of HTTP headers to be added to existing headers
122
- * @param string $method HTTP method (GET, POST etc) defaults to POST
123
- *
124
- * @throws PPConnectionException
125
- */
126
- public function execute( $url, $params, $headers = null, $method = null )
127
- {
128
-
129
- $ch = curl_init( $url );
130
-
131
- $this->curlOpt[ CURLOPT_POSTFIELDS ] = $params;
132
- $this->curlOpt[ CURLOPT_URL ] = $url;
133
- $this->curlOpt[ CURLOPT_HEADER ] = false;
134
- if ( isset( $headers ) ) {
135
- $this->curlOpt[ CURLOPT_HTTPHEADER ] = array_merge( $this->curlOpt[ CURLOPT_HTTPHEADER ], $headers );
136
- }
137
- foreach ( $this->curlOpt[ CURLOPT_HTTPHEADER ] as $header ) {
138
- //TODO: Strip out credentials when logging.
139
- $this->logger->info( "Adding header $header" );
140
- }
141
- if ( isset( $method ) ) {
142
- $this->curlOpt[ CURLOPT_CUSTOMREQUEST ] = $method;
143
- }
144
-
145
- // curl_setopt_array available only in PHP 5 >= 5.1.3
146
- curl_setopt_array( $ch, $this->curlOpt );
147
-
148
- $result = curl_exec( $ch );
149
-
150
- if ( curl_errno( $ch ) == 60 ) {
151
- $this->logger->info( "Invalid or no certificate authority found, retrying using bundled CA certs" );
152
- curl_setopt( $ch, CURLOPT_CAINFO,
153
- dirname( __FILE__ ) . '/cacert.pem' );
154
- $result = curl_exec( $ch );
155
- }
156
- $httpStatus = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
157
- $retries = 0;
158
- if ( in_array( $httpStatus, self::$retryCodes ) && isset( $this->retry ) ) {
159
- $this->logger->info( "Got $httpStatus response from server. Retrying" );
160
-
161
- do {
162
- $result = curl_exec( $ch );
163
- $httpStatus = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
164
-
165
- } while ( in_array( $httpStatus, self::$retryCodes ) && ++$retries < $this->retry );
166
-
167
-
168
- }
169
- if ( curl_errno( $ch ) ) {
170
- $ex = new PPConnectionException( $url, curl_error( $ch ), curl_errno( $ch ) );
171
- curl_close( $ch );
172
- throw $ex;
173
- }
174
-
175
- curl_close( $ch );
176
-
177
- if ( in_array( $httpStatus, self::$retryCodes ) ) {
178
- throw new PPConnectionException( $url, "Retried " . $retries . " times, Http Response code " . $httpStatus );
179
- }
180
-
181
- return $result;
182
- }
183
-
184
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPLoggingManager.php DELETED
@@ -1,84 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Simple Logging Manager.
5
- * This does an error_log for now
6
- * Potential frameworks to use are PEAR logger, log4php from Apache
7
- */
8
-
9
- class PPLoggingLevel
10
- {
11
-
12
- // FINE Logging Level
13
- const FINE = 3;
14
-
15
- // INFO Logging Level
16
- const INFO = 2;
17
-
18
- // WARN Logging Level
19
- const WARN = 1;
20
-
21
- // ERROR Logging Level
22
- const ERROR = 0;
23
- }
24
-
25
- class PPLoggingManager
26
- {
27
-
28
- // Default Logging Level
29
- const DEFAULT_LOGGING_LEVEL = 0;
30
-
31
- // Logger name
32
- private $loggerName;
33
-
34
- // Log enabled
35
- private $isLoggingEnabled;
36
-
37
- // Configured logging level
38
- private $loggingLevel;
39
-
40
- // Configured logging file
41
- private $loggerFile;
42
-
43
- public function __construct( $loggerName )
44
- {
45
- $this->loggerName = $loggerName;
46
- $config = PPConfigManager::getInstance();
47
- $this->loggerFile = ( $config->get( 'log.FileName' ) ) ? $config->get( 'log.FileName' ) : ini_get( 'error_log' );
48
- $loggingEnabled = $config->get( 'log.LogEnabled' );
49
- $this->isLoggingEnabled = ( isset( $loggingEnabled ) ) ? $loggingEnabled : false;
50
- $loggingLevel = strtoupper( $config->get( 'log.LogLevel' ) );
51
- $this->loggingLevel = ( isset( $loggingLevel ) && defined( "PPLoggingLevel::$loggingLevel" ) ) ? constant( "PPLoggingLevel::$loggingLevel" ) : PPLoggingManager::DEFAULT_LOGGING_LEVEL;
52
-
53
- }
54
-
55
- public function log( $message, $level = PPLoggingLevel::INFO )
56
- {
57
- if ( $this->isLoggingEnabled && ( $level <= $this->loggingLevel ) ) {
58
- error_log( $this->loggerName . ": $message\n", 3, $this->loggerFile );
59
- }
60
- }
61
-
62
- public function error( $message )
63
- {
64
- $this->log( $message, PPLoggingLevel::ERROR );
65
- }
66
-
67
- public function warning( $message )
68
- {
69
- $this->log( $message, PPLoggingLevel::WARN );
70
- }
71
-
72
- public function info( $message )
73
- {
74
- $this->log( $message, PPLoggingLevel::INFO );
75
- }
76
-
77
- public function fine( $message )
78
- {
79
- $this->log( $message, PPLoggingLevel::FINE );
80
- }
81
-
82
- }
83
-
84
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPObjectTransformer.php DELETED
@@ -1,33 +0,0 @@
1
- <?php
2
- /**
3
- * Utility class for transforming PHP objects into
4
- * appropriate service payload type and vice versa
5
- */
6
- class PPObjectTransformer
7
- {
8
-
9
- public function toString( $object )
10
- {
11
-
12
- if ( $object == null ) {
13
- throw new PPTransformerException( "Empty object" );
14
- }
15
-
16
- $confManager = PPConfigManager::getInstance();
17
- switch ( strtoupper( $confManager->get( "service.Binding" ) ) ) {
18
- case 'SOAP':
19
- return $object->toXMLString();
20
-
21
- case 'XML':
22
- case 'JSON':
23
- return "";
24
- case 'NVP':
25
- default:
26
- return $object->toNVPString();
27
- }
28
- }
29
-
30
-
31
- }
32
-
33
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPSignatureCredential.php DELETED
@@ -1,56 +0,0 @@
1
- <?php
2
-
3
- require_once 'exceptions/PPMissingCredentialException.php';
4
- require_once 'IPPCredential.php';
5
- require_once 'PPConfigManager.php';
6
-
7
- /**
8
- * API signature based credentials
9
- */
10
- class PPSignatureCredential extends IPPCredential
11
- {
12
-
13
- /**
14
- * API Signature
15
- * @var string
16
- */
17
- private $signature;
18
- private $subject;
19
-
20
- public function __construct( $userName, $password, $signature, $appId, $subject )
21
- {
22
- parent::__construct( $userName, $password, $appId );
23
- $this->signature = $signature;
24
- $this->subject = $subject;
25
- $this->validate();
26
- }
27
-
28
- public function validate()
29
- {
30
-
31
- if ( $this->userName == null || $this->userName == "" ) {
32
- throw new PPMissingCredentialException( "username cannot be empty" );
33
- }
34
- if ( $this->password == null || $this->password == "" ) {
35
- throw new PPMissingCredentialException( "password cannot be empty" );
36
- }
37
- if ( $this->signature == null || $this->signature == "" ) {
38
- throw new PPMissingCredentialException( "signature cannot be empty" );
39
- }
40
- if ( $this->applicationId == null || $this->applicationId == "" ) {
41
- throw new PPMissingCredentialException( "applicationId cannot be empty" );
42
- }
43
- }
44
-
45
- public function getSignature()
46
- {
47
- return $this->signature;
48
- }
49
-
50
- public function getSubject()
51
- {
52
- return $this->subject;
53
- }
54
- }
55
-
56
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/PPUtils.php DELETED
@@ -1,284 +0,0 @@
1
- <?php
2
- class PPUtils
3
- {
4
-
5
- const SDK_VERSION = "1.2.95";
6
- const SDK_NAME = "sdk-merchant-php ";
7
-
8
- /**
9
- *
10
- * Convert a Name Value Pair (NVP) formatted string into
11
- * an associative array taking care to urldecode array values
12
- *
13
- * @param string $nvpString
14
- */
15
- public static function nvpToMap( $nvpString )
16
- {
17
-
18
- $ret = array();
19
- $params = explode( "&", $nvpString );
20
- foreach ( $params as $p ) {
21
- list( $k, $v ) = explode( "=", $p );
22
- $ret[ $k ] = urldecode( $v );
23
- }
24
-
25
- return $ret;
26
- }
27
-
28
- /**
29
- * Returns true if the array contains a key like $key
30
- *
31
- * @param array $map
32
- * @param regex $key
33
- */
34
- public static function array_match_key( $map, $key )
35
- {
36
- $key = str_replace( "(", "\(", $key );
37
- $key = str_replace( ")", "\)", $key );
38
- $key = str_replace( ".", "\.", $key );
39
- $pattern = "/$key*/";
40
- foreach ( $map as $k => $v ) {
41
- preg_match( $pattern, $k, $matches );
42
- if ( count( $matches ) > 0 )
43
- return true;
44
- }
45
-
46
- return false;
47
- }
48
-
49
- /**
50
- *
51
- * Get the local IP address. The client address is a required
52
- * request parameter for some API calls
53
- */
54
- public static function getLocalIPAddress()
55
- {
56
-
57
- if ( array_key_exists( "SERVER_ADDR", $_SERVER ) ) {
58
- // SERVER_ADDR is available only if we are running the CGI SAPI
59
- return $_SERVER[ 'SERVER_ADDR' ];
60
- } else if ( function_exists( "gethostname" ) ) {
61
- // gethostname is available only in PHP >= v5.3
62
- return gethostbyname( gethostname() );
63
- } else {
64
- // fallback if nothing works
65
- return "127.0.0.1";
66
- }
67
- }
68
-
69
- /**
70
- *
71
- * Compute the value that needs to sent for the PAYPAL_REQUEST_SOURCE
72
- * parameter when making API calls
73
- */
74
- public static function getRequestSource()
75
- {
76
- return str_replace( " ", "-", self::SDK_NAME ) . self::SDK_VERSION;
77
- }
78
-
79
- public static function xmlToArray( $xmlInput )
80
- {
81
-
82
- $xml = simplexml_load_string( $xmlInput );
83
-
84
- $ns = $xml->getNamespaces( true );
85
-
86
- $soap = $xml->children( $ns[ 'SOAP-ENV' ] );
87
- $getChild = $soap->Body->children();
88
-
89
- $ret = PPUtils::convertXmlObjToArr( $getChild, $array = array() );
90
-
91
- return $ret;
92
- }
93
-
94
- /*foreach ($ret as $arry)
95
- {
96
- if (isset($arry['children']) && is_array($arry['children'])&& ($arry['children'])!=null) {
97
- foreach ($arry['children'] as $novel)
98
- {
99
-
100
- }
101
- }
102
- else if ($arry['name'] != null)
103
- {
104
- $a = $arry['name'] ;
105
- $b= $arry['text'];
106
- if (isset($arry['attribute']))
107
- {
108
- $c = $arry['attribute'];
109
- }
110
- }
111
-
112
-
113
- }*/
114
-
115
- /*public function xml2array ( $xmlObject, $out = array () )
116
- {
117
- foreach ( (array) $xmlObject as $index => $node )
118
- {
119
- $out[$index] = ( is_object ( $node ) ) ? PPUtils::xml2array ( $node ) : $node;
120
- }
121
- return $out;
122
- }*/
123
-
124
-
125
- function convertXmlObjToArr( $obj, &$arr )
126
- {
127
- $children = $obj->children();
128
- foreach ( $children as $elementName => $node ) {
129
- $nextIdx = count( $arr );
130
- $arr[ $nextIdx ] = array();
131
- $arr[ $nextIdx ][ 'name' ] = strtolower( (string) $elementName );
132
- $arr[ $nextIdx ][ 'attributes' ] = array();
133
- $attributes = $node->attributes();
134
- foreach ( $attributes as $attributeName => $attributeValue ) {
135
- $attribName = strtolower( trim( (string) $attributeName ) );
136
- $attribVal = trim( (string) $attributeValue );
137
- $arr[ $nextIdx ][ 'attributes' ][ $attribName ] = $attribVal;
138
- }
139
- $text = (string) $node;
140
- $text = trim( $text );
141
- if ( strlen( $text ) > 0 ) {
142
- $arr[ $nextIdx ][ 'text' ] = $text;
143
- }
144
- $arr[ $nextIdx ][ 'children' ] = array();
145
- PPutils::convertXmlObjToArr( $node, $arr[ $nextIdx ][ 'children' ] );
146
- }
147
-
148
- return $arr;
149
- }
150
-
151
- /**
152
- * Escapes invalid xml characters
153
- *
154
- * @param $textContent = xml data to be escaped
155
- */
156
- public static function escapeInvalidXmlCharsRegex( $textContent )
157
- {
158
- return htmlspecialchars( $textContent, ( 1 | 2 ), 'UTF-8', false );
159
- }
160
-
161
- }
162
-
163
- /**
164
- * @class xml2array
165
- */
166
-
167
-
168
- /**
169
- * XMLToArray Generator Class
170
- * @author : MA Razzaque Rupom <rupom_315@yahoo.com>, <rupom.bd@gmail.com>
171
- * Moderator, phpResource (LINK1http://groups.yahoo.com/group/phpresource/LINK1)
172
- * URL: LINK2http://www.rupom.infoLINK2
173
- * @version : 1.0
174
- * @date 06/05/2006
175
- * Purpose : Creating Hierarchical Array from XML Data
176
- * Released : Under GPL
177
- */
178
-
179
- class XmlToArray
180
- {
181
-
182
- var $xml = '';
183
-
184
- /**
185
- * Default Constructor
186
- *
187
- * @param $xml = xml data
188
- *
189
- * @return none
190
- */
191
-
192
- function XmlToArray( $xml )
193
- {
194
- $this->xml = $xml;
195
- }
196
-
197
- /**
198
- * _struct_to_array($values, &$i)
199
- *
200
- * This is adds the contents of the return xml into the array for easier processing.
201
- * Recursive, Static
202
- *
203
- * @access private
204
- *
205
- * @param array $values this is the xml data in an array
206
- * @param int $i this is the current location in the array
207
- *
208
- * @return Array
209
- */
210
-
211
- function _struct_to_array( $values, &$i )
212
- {
213
- $child = array();
214
- if ( isset( $values[ $i ][ 'value' ] ) ) array_push( $child, $values[ $i ][ 'value' ] );
215
-
216
- while ( $i++ < count( $values ) ) {
217
- switch ( $values[ $i ][ 'type' ] ) {
218
- case 'cdata':
219
- array_push( $child, $values[ $i ][ 'value' ] );
220
- break;
221
-
222
- case 'complete':
223
- $name = $values[ $i ][ 'tag' ];
224
- if ( !empty( $name ) ) {
225
- $child[ $name ] = ( $values[ $i ][ 'value' ] ) ? ( $values[ $i ][ 'value' ] ) : '';
226
- if ( isset( $values[ $i ][ 'attributes' ] ) ) {
227
- $child[ $name ] = $values[ $i ][ 'attributes' ];
228
- }
229
- }
230
- break;
231
-
232
- case 'open':
233
- $name = $values[ $i ][ 'tag' ];
234
- $size = isset( $child[ $name ] ) ? sizeof( $child[ $name ] ) : 0;
235
- $child[ $name ][ $size ] = $this->_struct_to_array( $values, $i );
236
- break;
237
-
238
- case 'close':
239
- return $child;
240
- break;
241
- }
242
- }
243
-
244
- return $child;
245
- }
246
-
247
- //_struct_to_array
248
-
249
- /**
250
- * createArray($data)
251
- *
252
- * This is adds the contents of the return xml into the array for easier processing.
253
- *
254
- * @access public
255
- *
256
- * @param string $data this is the string of the xml data
257
- *
258
- * @return Array
259
- */
260
- function createArray()
261
- {
262
- $xml = $this->xml;
263
- $values = array();
264
- $index = array();
265
- $array = array();
266
- $parser = xml_parser_create();
267
- xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
268
- xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
269
- xml_parse_into_struct( $parser, $xml, $values, $index );
270
- xml_parser_free( $parser );
271
- $i = 0;
272
- $name = $values[ $i ][ 'tag' ];
273
- $array[ $name ] = isset( $values[ $i ][ 'attributes' ] ) ? $values[ $i ][ 'attributes' ] : '';
274
- $array[ $name ] = $this->_struct_to_array( $values, $i );
275
-
276
- return $array;
277
- }
278
- //createArray
279
-
280
-
281
- }
282
-
283
- //XmlToArray
284
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/auth/AuthUtil.php DELETED
@@ -1,83 +0,0 @@
1
- <?php //vim: foldmethod=marker
2
-
3
- class MockOAuthDataStore extends OAuthDataStore
4
- { /*{{{*/
5
- private $consumer;
6
- private $request_token;
7
- private $access_token;
8
- private $nonce;
9
-
10
- function __construct()
11
- { /*{{{*/
12
- $this->consumer = new OAuthConsumer( "key", "secret", null );
13
- $this->request_token = new OAuthToken( "requestkey", "requestsecret", 1 );
14
- $this->access_token = new OAuthToken( "accesskey", "accesssecret", 1 );
15
- $this->nonce = "nonce";
16
- }
17
-
18
- /*}}}*/
19
-
20
- function lookup_consumer( $consumer_key )
21
- { /*{{{*/
22
- if ( $consumer_key == $this->consumer->key ) return $this->consumer;
23
-
24
- return null;
25
- }
26
-
27
- /*}}}*/
28
-
29
- function lookup_token( $consumer, $token_type, $token )
30
- { /*{{{*/
31
- $token_attrib = $token_type . "_token";
32
- if ( $consumer->key == $this->consumer->key
33
- && $token == $this->$token_attrib->key
34
- ) {
35
- return $this->$token_attrib;
36
- }
37
-
38
- return null;
39
- }
40
-
41
- /*}}}*/
42
-
43
- function lookup_nonce( $consumer, $token, $nonce, $timestamp )
44
- { /*{{{*/
45
- if ( $consumer->key == $this->consumer->key
46
- && ( ( $token && $token->key == $this->request_token->key )
47
- || ( $token && $token->key == $this->access_token->key ) )
48
- && $nonce == $this->nonce
49
- ) {
50
- return $this->nonce;
51
- }
52
-
53
- return null;
54
- }
55
-
56
- /*}}}*/
57
-
58
- function new_request_token( $consumer, $callback = null )
59
- { /*{{{*/
60
- if ( $consumer->key == $this->consumer->key ) {
61
- return $this->request_token;
62
- }
63
-
64
- return null;
65
- }
66
-
67
- /*}}}*/
68
-
69
- function new_access_token( $token, $consumer, $verifier = null )
70
- { /*{{{*/
71
- if ( $consumer->key == $this->consumer->key
72
- && $token->key == $this->request_token->key
73
- ) {
74
- return $this->access_token;
75
- }
76
-
77
- return null;
78
- }
79
- /*}}}*/
80
- }
81
-
82
- /*}}}*/
83
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/auth/PPAuth.php DELETED
@@ -1,1057 +0,0 @@
1
- <?php
2
- //PayPal specific modification starts
3
- //Method to be called for generating signature
4
- require_once( "AuthUtil.php" );
5
- class AuthSignature
6
- {
7
-
8
- public function genSign( $key, $secret, $token, $tokenSecret, $httpMethod, $endpoint )
9
- {
10
-
11
-
12
- $authServer = new OAuthServer( new MockOAuthDataStore() );
13
- $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
14
- $authServer->add_signature_method( $hmac_method );
15
-
16
- $sig_method = $hmac_method;
17
- $authConsumer = new OAuthConsumer( $key, $secret, null );
18
- $authToken = null;
19
- $authToken = new OAuthToken( $token, $tokenSecret );
20
-
21
- //$params is the query param array which is required only in the httpMethod is "GET"
22
-
23
- $params = array();
24
- //set the Query parameters to $params if httpMethod is "GET"
25
-
26
- $acc_req = OAuthRequest::from_consumer_and_token( $authConsumer, $authToken, $httpMethod, $endpoint, $params );
27
-
28
- $acc_req->sign_request( $sig_method, $authConsumer, $authToken );
29
- $response = OAuthutil::parseQueryString( $acc_req );
30
-
31
- return $response;
32
-
33
- }
34
- }
35
-
36
- //PayPal specific modification ends
37
- /* Generic exception class
38
- */
39
- class OAuthException extends Exception
40
- {
41
- // pass
42
- }
43
-
44
- class OAuthConsumer
45
- {
46
- public $key;
47
- public $secret;
48
-
49
- function __construct( $key, $secret, $callback_url = null )
50
- {
51
- $this->key = $key;
52
- $this->secret = $secret;
53
- $this->callback_url = $callback_url;
54
- }
55
-
56
- function __toString()
57
- {
58
- return "OAuthConsumer[key=$this->key,secret=$this->secret]";
59
- }
60
- }
61
-
62
- class OAuthToken
63
- {
64
- // access tokens and request tokens
65
- public $key;
66
- public $secret;
67
-
68
- /**
69
- * key = the token
70
- * secret = the token secret
71
- */
72
- function __construct( $key, $secret )
73
- {
74
- $this->key = $key;
75
- $this->secret = $secret;
76
- }
77
-
78
- /**
79
- * generates the basic string serialization of a token that a server
80
- * would respond to request_token and access_token calls with
81
- */
82
- function to_string()
83
- {
84
- return "oauth_token=" .
85
- OAuthUtil::urlencode_rfc3986( $this->key ) .
86
- "&oauth_token_secret=" .
87
- OAuthUtil::urlencode_rfc3986( $this->secret );
88
- }
89
-
90
- function __toString()
91
- {
92
- return $this->to_string();
93
- }
94
- }
95
-
96
- /**
97
- * A class for implementing a Signature Method
98
- * See section 9 ("Signing Requests") in the spec
99
- */
100
- abstract class OAuthSignatureMethod
101
- {
102
- /**
103
- * Needs to return the name of the Signature Method (ie HMAC-SHA1)
104
- * @return string
105
- */
106
- abstract public function get_name();
107
-
108
- /**
109
- * Build up the signature
110
- * NOTE: The output of this function MUST NOT be urlencoded.
111
- * the encoding is handled in OAuthRequest when the final
112
- * request is serialized
113
- *
114
- * @param OAuthRequest $request
115
- * @param OAuthConsumer $consumer
116
- * @param OAuthToken $token
117
- *
118
- * @return string
119
- */
120
- abstract public function build_signature( $request, $consumer, $token );
121
-
122
- /**
123
- * Verifies that a given signature is correct
124
- *
125
- * @param OAuthRequest $request
126
- * @param OAuthConsumer $consumer
127
- * @param OAuthToken $token
128
- * @param string $signature
129
- *
130
- * @return bool
131
- */
132
- public function check_signature( $request, $consumer, $token, $signature )
133
- {
134
- $built = $this->build_signature( $request, $consumer, $token );
135
-
136
- return $built == $signature;
137
- }
138
- }
139
-
140
- /**
141
- * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
142
- * where the Signature Base String is the text and the key is the concatenated values (each first
143
- * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'
144
- * character (ASCII code 38) even if empty.
145
- * - Chapter 9.2 ("HMAC-SHA1")
146
- */
147
- class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod
148
- {
149
- function get_name()
150
- {
151
- return "HMAC-SHA1";
152
- }
153
-
154
- public function build_signature( $request, $consumer, $token )
155
- {
156
- $base_string = $request->get_signature_base_string();
157
- $base_string = preg_replace( "/(%[A-Za-z0-9]{2})/e", "strtolower('\\0')", $base_string ); //convert base string to lowercase
158
- $request->base_string = $base_string;
159
-
160
- $key_parts = array(
161
- $consumer->secret,
162
- ( $token ) ? $token->secret : ""
163
- );
164
-
165
- $key_parts = OAuthUtil::urlencode_rfc3986( $key_parts );
166
- $key = implode( '&', $key_parts );
167
- $key = preg_replace( "/(%[A-Za-z0-9]{2})/e", "strtolower('\\0')", $key ); //convert to lowercase
168
- return base64_encode( hash_hmac( 'sha1', $base_string, $key, true ) );
169
- }
170
- }
171
-
172
- /**
173
- * The PLAINTEXT method does not provide any security protection and SHOULD only be used
174
- * over a secure channel such as HTTPS. It does not use the Signature Base String.
175
- * - Chapter 9.4 ("PLAINTEXT")
176
- */
177
- if ( !class_exists( 'OAuthSignatureMethod_PLAINTEXT' ) ) {
178
- class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod
179
- {
180
- public function get_name()
181
- {
182
- return "PLAINTEXT";
183
- }
184
-
185
- /**
186
- * oauth_signature is set to the concatenated encoded values of the Consumer Secret and
187
- * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is
188
- * empty. The result MUST be encoded again.
189
- * - Chapter 9.4.1 ("Generating Signatures")
190
- *
191
- * Please note that the second encoding MUST NOT happen in the SignatureMethod, as
192
- * OAuthRequest handles this!
193
- */
194
- public function build_signature( $request, $consumer, $token )
195
- {
196
- $key_parts = array(
197
- $consumer->secret,
198
- ( $token ) ? $token->secret : ""
199
- );
200
-
201
- $key_parts = OAuthUtil::urlencode_rfc3986( $key_parts );
202
- $key = implode( '&', $key_parts );
203
- $request->base_string = $key;
204
-
205
- return $key;
206
- }
207
- }
208
- }
209
- /**
210
- * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in
211
- * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for
212
- * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a
213
- * verified way to the Service Provider, in a manner which is beyond the scope of this
214
- * specification.
215
- * - Chapter 9.3 ("RSA-SHA1")
216
- */
217
- abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod
218
- {
219
- public function get_name()
220
- {
221
- return "RSA-SHA1";
222
- }
223
-
224
- // Up to the SP to implement this lookup of keys. Possible ideas are:
225
- // (1) do a lookup in a table of trusted certs keyed off of consumer
226
- // (2) fetch via http using a url provided by the requester
227
- // (3) some sort of specific discovery code based on request
228
- //
229
- // Either way should return a string representation of the certificate
230
- protected abstract function fetch_public_cert( &$request );
231
-
232
- // Up to the SP to implement this lookup of keys. Possible ideas are:
233
- // (1) do a lookup in a table of trusted certs keyed off of consumer
234
- //
235
- // Either way should return a string representation of the certificate
236
- protected abstract function fetch_private_cert( &$request );
237
-
238
- public function build_signature( $request, $consumer, $token )
239
- {
240
- $base_string = $request->get_signature_base_string();
241
- $request->base_string = $base_string;
242
-
243
- // Fetch the private key cert based on the request
244
- $cert = $this->fetch_private_cert( $request );
245
-
246
- // Pull the private key ID from the certificate
247
- $privatekeyid = openssl_get_privatekey( $cert );
248
-
249
- // Sign using the key
250
- $ok = openssl_sign( $base_string, $signature, $privatekeyid );
251
-
252
- // Release the key resource
253
- openssl_free_key( $privatekeyid );
254
-
255
- return base64_encode( $signature );
256
- }
257
-
258
- public function check_signature( $request, $consumer, $token, $signature )
259
- {
260
- $decoded_sig = base64_decode( $signature );
261
-
262
- $base_string = $request->get_signature_base_string();
263
-
264
- // Fetch the public key cert based on the request
265
- $cert = $this->fetch_public_cert( $request );
266
-
267
- // Pull the public key ID from the certificate
268
- $publickeyid = openssl_get_publickey( $cert );
269
-
270
- // Check the computed signature against the one passed in the query
271
- $ok = openssl_verify( $base_string, $decoded_sig, $publickeyid );
272
-
273
- // Release the key resource
274
- openssl_free_key( $publickeyid );
275
-
276
- return $ok == 1;
277
- }
278
- }
279
-
280
- class OAuthRequest
281
- {
282
- public $parameters;
283
- protected $http_method;
284
- protected $http_url;
285
- // for debug purposes
286
- public $base_string;
287
- public static $version = '1.0';
288
- public static $POST_INPUT = 'php://input';
289
-
290
- function __construct( $http_method, $http_url, $parameters = null )
291
- {
292
- $parameters = ( $parameters ) ? $parameters : array();
293
- $parameters = array_merge( OAuthUtil::parse_parameters( parse_url( $http_url, PHP_URL_QUERY ) ), $parameters );
294
- $this->parameters = $parameters;
295
- $this->http_method = $http_method;
296
- $this->http_url = $http_url;
297
- }
298
-
299
-
300
- /**
301
- * attempt to build up a request from what was passed to the server
302
- */
303
- public static function from_request( $http_method = null, $http_url = null, $parameters = null )
304
- {
305
- $scheme = ( !isset( $_SERVER[ 'HTTPS' ] ) || $_SERVER[ 'HTTPS' ] != "on" )
306
- ? 'http'
307
- : 'https';
308
- $http_url = ( $http_url ) ? $http_url : $scheme .
309
- '://' . $_SERVER[ 'HTTP_HOST' ] .
310
- ':' .
311
- $_SERVER[ 'SERVER_PORT' ] .
312
- $_SERVER[ 'REQUEST_URI' ];
313
- $http_method = ( $http_method ) ? $http_method : $_SERVER[ 'REQUEST_METHOD' ];
314
-
315
- // We weren't handed any parameters, so let's find the ones relevant to
316
- // this request.
317
- // If you run XML-RPC or similar you should use this to provide your own
318
- // parsed parameter-list
319
- if ( !$parameters ) {
320
- // Find request headers
321
- $request_headers = OAuthUtil::get_headers();
322
-
323
- // Parse the query-string to find GET parameters
324
- $parameters = OAuthUtil::parse_parameters( $_SERVER[ 'QUERY_STRING' ] );
325
-
326
- // It's a POST request of the proper content-type, so parse POST
327
- // parameters and add those overriding any duplicates from GET
328
- if ( $http_method == "POST"
329
- && isset( $request_headers[ 'Content-Type' ] )
330
- && strstr( $request_headers[ 'Content-Type' ],
331
- 'application/x-www-form-urlencoded' )
332
- ) {
333
- $post_data = OAuthUtil::parse_parameters(
334
- file_get_contents( self::$POST_INPUT )
335
- );
336
- $parameters = array_merge( $parameters, $post_data );
337
- }
338
-
339
- // We have a Authorization-header with OAuth data. Parse the header
340
- // and add those overriding any duplicates from GET or POST
341
- if ( isset( $request_headers[ 'Authorization' ] ) && substr( $request_headers[ 'Authorization' ], 0, 6 ) == 'OAuth ' ) {
342
- $header_parameters = OAuthUtil::split_header(
343
- $request_headers[ 'Authorization' ]
344
- );
345
- $parameters = array_merge( $parameters, $header_parameters );
346
- }
347
-
348
- }
349
-
350
- return new OAuthRequest( $http_method, $http_url, $parameters );
351
- }
352
-
353
- /**
354
- * pretty much a helper function to set up the request
355
- */
356
- public static function from_consumer_and_token( $consumer, $token, $http_method, $http_url, $parameters = null )
357
- {
358
- $parameters = ( $parameters ) ? $parameters : array();
359
- $defaults = array(
360
- "oauth_version" => OAuthRequest::$version,
361
- // "oauth_nonce" => OAuthRequest::generate_nonce(),
362
- "oauth_timestamp" => OAuthRequest::generate_timestamp(),
363
-
364
- "oauth_consumer_key" => $consumer->key
365
- );
366
- if ( $token )
367
- $defaults[ 'oauth_token' ] = $token->key;
368
-
369
- $parameters = array_merge( $defaults, $parameters );
370
- ksort( $parameters );
371
-
372
- return new OAuthRequest( $http_method, $http_url, $parameters );
373
- }
374
-
375
- public function set_parameter( $name, $value, $allow_duplicates = true )
376
- {
377
- if ( $allow_duplicates && isset( $this->parameters[ $name ] ) ) {
378
- // We have already added parameter(s) with this name, so add to the list
379
- if ( is_scalar( $this->parameters[ $name ] ) ) {
380
- // This is the first duplicate, so transform scalar (string)
381
- // into an array so we can add the duplicates
382
- $this->parameters[ $name ] = array( $this->parameters[ $name ] );
383
- }
384
-
385
- $this->parameters[ $name ][ ] = $value;
386
- } else {
387
- $this->parameters[ $name ] = $value;
388
- }
389
- }
390
-
391
- public function get_parameter( $name )
392
- {
393
- return isset( $this->parameters[ $name ] ) ? $this->parameters[ $name ] : null;
394
- }
395
-
396
- public function get_parameters()
397
- {
398
- return $this->parameters;
399
- }
400
-
401
- public function unset_parameter( $name )
402
- {
403
- unset( $this->parameters[ $name ] );
404
- }
405
-
406
- /**
407
- * The request parameters, sorted and concatenated into a normalized string.
408
- * @return string
409
- */
410
- public function get_signable_parameters()
411
- {
412
- // Grab all parameters
413
- $params = $this->parameters;
414
- ksort( $params );
415
- // Remove oauth_signature if present
416
- // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
417
- if ( isset( $params[ 'oauth_signature' ] ) ) {
418
- unset( $params[ 'oauth_signature' ] );
419
- }
420
- foreach ( $params as $key => $value ) {
421
- $res[ ] = $key . "=" . $value;
422
- }
423
-
424
- return implode( '&', $res );
425
- //return OAuthUtil::build_http_query($params);
426
- }
427
-
428
- /**
429
- * Returns the base string of this request
430
- *
431
- * The base string defined as the method, the url
432
- * and the parameters (normalized), each urlencoded
433
- * and the concated with &.
434
- */
435
- public function get_signature_base_string()
436
- {
437
- $parts = array(
438
- $this->get_normalized_http_method(),
439
- $this->get_normalized_http_url(),
440
- $this->get_signable_parameters()
441
- );
442
-
443
- $parts = OAuthUtil::urlencode_rfc3986( $parts );
444
-
445
- return implode( '&', $parts );
446
- }
447
-
448
- /**
449
- * just uppercases the http method
450
- */
451
- public function get_normalized_http_method()
452
- {
453
- return strtoupper( $this->http_method );
454
- }
455
-
456
- /**
457
- * parses the url and rebuilds it to be
458
- * scheme://host/path
459
- */
460
- public function get_normalized_http_url()
461
- {
462
- $parts = parse_url( $this->http_url );
463
-
464
- $scheme = ( isset( $parts[ 'scheme' ] ) ) ? $parts[ 'scheme' ] : 'http';
465
- $port = ( isset( $parts[ 'port' ] ) ) ? $parts[ 'port' ] : ( ( $scheme == 'https' ) ? '443' : '80' );
466
- $host = ( isset( $parts[ 'host' ] ) ) ? $parts[ 'host' ] : '';
467
- $path = ( isset( $parts[ 'path' ] ) ) ? $parts[ 'path' ] : '';
468
-
469
- if ( ( $scheme == 'https' && $port != '443' )
470
- || ( $scheme == 'http' && $port != '80' )
471
- ) {
472
- $host = "$host:$port";
473
- }
474
-
475
- return "$scheme://$host$path";
476
- }
477
-
478
- /**
479
- * builds a url usable for a GET request
480
- */
481
- public function to_url()
482
- {
483
- $post_data = $this->to_postdata();
484
- $out = $this->get_normalized_http_url();
485
- if ( $post_data ) {
486
- $out .= '?' . $post_data;
487
- }
488
-
489
- return $out;
490
- }
491
-
492
- /**
493
- * builds the data one would send in a POST request
494
- */
495
- public function to_postdata()
496
- {
497
- return OAuthUtil::build_http_query( $this->parameters );
498
- }
499
-
500
- /**
501
- * builds the Authorization: header
502
- */
503
- public function to_header( $realm = null )
504
- {
505
- $first = true;
506
- if ( $realm ) {
507
- $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986( $realm ) . '"';
508
- $first = false;
509
- } else
510
- $out = 'Authorization: OAuth';
511
-
512
- $total = array();
513
- foreach ( $this->parameters as $k => $v ) {
514
- if ( substr( $k, 0, 5 ) != "oauth" ) continue;
515
- if ( is_array( $v ) ) {
516
- throw new OAuthException( 'Arrays not supported in headers' );
517
- }
518
- $out .= ( $first ) ? ' ' : ',';
519
- $out .= OAuthUtil::urlencode_rfc3986( $k ) .
520
- '="' .
521
- OAuthUtil::urlencode_rfc3986( $v ) .
522
- '"';
523
- $first = false;
524
- }
525
-
526
- return $out;
527
- }
528
-
529
- public function __toString()
530
- {
531
- return $this->to_url();
532
- }
533
-
534
-
535
- public function sign_request( $signature_method, $consumer, $token )
536
- {
537
-
538
- $empty = false;
539
- $msg = array();
540
- if ( $token->key == null ) {
541
- $msg[ ] = 'Token key';
542
- }
543
- if ( $token->secret == null ) {
544
- $msg[ ] = 'Token secret';
545
- }
546
- if ( $consumer->key == null ) {
547
-
548
- $msg[ ] = 'Consumer key';
549
- }
550
- if ( $consumer->secret == null ) {
551
-
552
- $msg[ ] = 'Consumer secret';
553
- }
554
- if ( $this->http_url == null ) {
555
-
556
- $msg[ ] = 'Endpoint';
557
- }
558
- if ( $this->http_method == null ) {
559
-
560
- $msg[ ] = 'HTTP method';
561
- }
562
- if ( count( $msg ) ) {
563
- throw new OAuthException( 'Enter valid ' . implode( ',', $msg ) );
564
- }
565
- $this->set_parameter(
566
- "oauth_signature_method",
567
- $signature_method->get_name(),
568
- false );
569
-
570
- $signature = $this->build_signature( $signature_method, $consumer, $token );
571
- $this->set_parameter( "oauth_signature", $signature, false );
572
-
573
- }
574
-
575
- public function build_signature( $signature_method, $consumer, $token )
576
- {
577
- $signature = $signature_method->build_signature( $this, $consumer, $token );
578
-
579
- return $signature;
580
- }
581
-
582
- /**
583
- * util function: current timestamp
584
- */
585
- private static function generate_timestamp()
586
- {
587
- return time();
588
- }
589
-
590
- /**
591
- * util function: current nonce
592
- */
593
- private static function generate_nonce()
594
- {
595
- $mt = microtime();
596
- $rand = mt_rand();
597
-
598
- return md5( $mt . $rand ); // md5s look nicer than numbers
599
- }
600
- }
601
-
602
- class OAuthServer
603
- {
604
- protected $timestamp_threshold = 300; // in seconds, five minutes
605
- protected $version = '1.0'; // hi blaine
606
- protected $signature_methods = array();
607
-
608
- protected $data_store;
609
-
610
- function __construct( $data_store )
611
- {
612
- $this->data_store = $data_store;
613
- }
614
-
615
- public function add_signature_method( $signature_method )
616
- {
617
- $this->signature_methods[ $signature_method->get_name() ] =
618
- $signature_method;
619
- }
620
-
621
- // high level functions
622
-
623
- /**
624
- * process a request_token request
625
- * returns the request token on success
626
- */
627
- public function fetch_request_token( &$request )
628
- {
629
- $this->get_version( $request );
630
-
631
- $consumer = $this->get_consumer( $request );
632
-
633
- // no token required for the initial token request
634
- $token = null;
635
-
636
- $this->check_signature( $request, $consumer, $token );
637
-
638
- // Rev A change
639
- $callback = $request->get_parameter( 'oauth_callback' );
640
- $new_token = $this->data_store->new_request_token( $consumer, $callback );
641
-
642
- return $new_token;
643
- }
644
-
645
- /**
646
- * process an access_token request
647
- * returns the access token on success
648
- */
649
- public function fetch_access_token( &$request )
650
- {
651
- $this->get_version( $request );
652
-
653
- $consumer = $this->get_consumer( $request );
654
-
655
- // requires authorized request token
656
- $token = $this->get_token( $request, $consumer, "request" );
657
-
658
- $this->check_signature( $request, $consumer, $token );
659
-
660
- // Rev A change
661
- $verifier = $request->get_parameter( 'oauth_verifier' );
662
- $new_token = $this->data_store->new_access_token( $token, $consumer, $verifier );
663
-
664
- return $new_token;
665
- }
666
-
667
- /**
668
- * verify an api call, checks all the parameters
669
- */
670
- public function verify_request( &$request )
671
- {
672
- $this->get_version( $request );
673
- $consumer = $this->get_consumer( $request );
674
- $token = $this->get_token( $request, $consumer, "access" );
675
- $this->check_signature( $request, $consumer, $token );
676
-
677
- return array( $consumer, $token );
678
- }
679
-
680
- // Internals from here
681
- /**
682
- * version 1
683
- */
684
- private function get_version( &$request )
685
- {
686
- $version = $request->get_parameter( "oauth_version" );
687
- if ( !$version ) {
688
- // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present.
689
- // Chapter 7.0 ("Accessing Protected Ressources")
690
- $version = '1.0';
691
- }
692
- if ( $version !== $this->version ) {
693
- throw new OAuthException( "OAuth version '$version' not supported" );
694
- }
695
-
696
- return $version;
697
- }
698
-
699
- /**
700
- * figure out the signature with some defaults
701
- */
702
- private function get_signature_method( $request )
703
- {
704
- $signature_method = $request instanceof OAuthRequest
705
- ? $request->get_parameter( "oauth_signature_method" )
706
- : null;
707
-
708
- if ( !$signature_method ) {
709
- // According to chapter 7 ("Accessing Protected Ressources") the signature-method
710
- // parameter is required, and we can't just fallback to PLAINTEXT
711
- throw new OAuthException( 'No signature method parameter. This parameter is required' );
712
- }
713
-
714
- if ( !in_array( $signature_method,
715
- array_keys( $this->signature_methods ) )
716
- ) {
717
- throw new OAuthException(
718
- "Signature method '$signature_method' not supported " .
719
- "try one of the following: " .
720
- implode( ", ", array_keys( $this->signature_methods ) )
721
- );
722
- }
723
-
724
- return $this->signature_methods[ $signature_method ];
725
- }
726
-
727
- /**
728
- * try to find the consumer for the provided request's consumer key
729
- */
730
- private function get_consumer( $request )
731
- {
732
- $consumer_key = $request instanceof OAuthRequest
733
- ? $request->get_parameter( "oauth_consumer_key" )
734
- : null;
735
-
736
- if ( !$consumer_key ) {
737
- throw new OAuthException( "Invalid consumer key" );
738
- }
739
-
740
- $consumer = $this->data_store->lookup_consumer( $consumer_key );
741
- if ( !$consumer ) {
742
- throw new OAuthException( "Invalid consumer" );
743
- }
744
-
745
- return $consumer;
746
- }
747
-
748
- /**
749
- * try to find the token for the provided request's token key
750
- */
751
- private function get_token( $request, $consumer, $token_type = "access" )
752
- {
753
- $token_field = $request instanceof OAuthRequest
754
- ? $request->get_parameter( 'oauth_token' )
755
- : null;
756
-
757
- $token = $this->data_store->lookup_token(
758
- $consumer, $token_type, $token_field
759
- );
760
- if ( !$token ) {
761
- throw new OAuthException( "Invalid $token_type token: $token_field" );
762
- }
763
-
764
- return $token;
765
- }
766
-
767
- /**
768
- * all-in-one function to check the signature on a request
769
- * should guess the signature method appropriately
770
- */
771
- private function check_signature( $request, $consumer, $token )
772
- {
773
- // this should probably be in a different method
774
- $timestamp = $request instanceof OAuthRequest
775
- ? $request->get_parameter( 'oauth_timestamp' )
776
- : null;
777
- $nonce = $request instanceof OAuthRequest
778
- ? $request->get_parameter( 'oauth_nonce' )
779
- : null;
780
-
781
- $this->check_timestamp( $timestamp );
782
- $this->check_nonce( $consumer, $token, $nonce, $timestamp );
783
-
784
- $signature_method = $this->get_signature_method( $request );
785
-
786
- $signature = $request->get_parameter( 'oauth_signature' );
787
- $valid_sig = $signature_method->check_signature(
788
- $request,
789
- $consumer,
790
- $token,
791
- $signature
792
- );
793
-
794
- if ( !$valid_sig ) {
795
- throw new OAuthException( "Invalid signature" );
796
- }
797
- }
798
-
799
- /**
800
- * check that the timestamp is new enough
801
- */
802
- private function check_timestamp( $timestamp )
803
- {
804
- if ( !$timestamp )
805
- throw new OAuthException(
806
- 'Missing timestamp parameter. The parameter is required'
807
- );
808
-
809
- // verify that timestamp is recentish
810
- $now = time();
811
- if ( abs( $now - $timestamp ) > $this->timestamp_threshold ) {
812
- throw new OAuthException(
813
- "Expired timestamp, yours $timestamp, ours $now"
814
- );
815
- }
816
- }
817
-
818
- /**
819
- * check that the nonce is not repeated
820
- */
821
- private function check_nonce( $consumer, $token, $nonce, $timestamp )
822
- {
823
- if ( !$nonce )
824
- throw new OAuthException(
825
- 'Missing nonce parameter. The parameter is required'
826
- );
827
-
828
- // verify that the nonce is uniqueish
829
- $found = $this->data_store->lookup_nonce(
830
- $consumer,
831
- $token,
832
- $nonce,
833
- $timestamp
834
- );
835
- if ( $found ) {
836
- throw new OAuthException( "Nonce already used: $nonce" );
837
- }
838
- }
839
-
840
- }
841
-
842
- class OAuthDataStore
843
- {
844
- function lookup_consumer( $consumer_key )
845
- {
846
- // implement me
847
- }
848
-
849
- function lookup_token( $consumer, $token_type, $token )
850
- {
851
- // implement me
852
- }
853
-
854
- function lookup_nonce( $consumer, $token, $nonce, $timestamp )
855
- {
856
- // implement me
857
- }
858
-
859
- function new_request_token( $consumer, $callback = null )
860
- {
861
- // return a new token attached to this consumer
862
- }
863
-
864
- function new_access_token( $token, $consumer, $verifier = null )
865
- {
866
- // return a new access token attached to this consumer
867
- // for the user associated with this token if the request token
868
- // is authorized
869
- // should also invalidate the request token
870
- }
871
-
872
- }
873
-
874
- class OAuthUtil
875
- {
876
- public static function urlencode_rfc3986( $input )
877
- {
878
- if ( is_array( $input ) ) {
879
- return array_map( array( 'OAuthUtil', 'urlencode_rfc3986' ), $input );
880
- } else if ( is_scalar( $input ) ) {
881
- $tmp1 = str_replace( '%7E', '~', rawurlencode( $input ) );
882
- $tmp2 = str_replace( ".", "%2E", $tmp1 );
883
- $tmp3 = str_replace( "*", "%2A", $tmp2 );
884
- $tmp4 = str_replace( '+', ' ', $tmp3 );
885
- $tmp = str_replace( "-", "%2D", $tmp4 );
886
-
887
- return $tmp;
888
- /*$tmp1=str_replace('%7E', '~', rawurlencode($input));
889
- $tmp2= str_replace(".","%2E",$tmp1);
890
-
891
-
892
- return $tmp;*/
893
- } else {
894
- return '';
895
- }
896
- }
897
-
898
- public static function parseQueryString( $str )
899
- {
900
- $op = array();
901
- $pairs = explode( "&", $str );
902
- foreach ( $pairs as $pair ) {
903
- list( $k, $v ) = array_map( "urldecode", explode( "=", $pair ) );
904
- $op[ $k ] = $v;
905
- }
906
-
907
- return $op;
908
- }
909
-
910
- //parses string to associative array -modified for PayPal Signature
911
-
912
-
913
- // This decode function isn't taking into consideration the above
914
- // modifications to the encoding process. However, this method doesn't
915
- // seem to be used anywhere so leaving it as is.
916
- public static function urldecode_rfc3986( $string )
917
- {
918
- return urldecode( $string );
919
- }
920
-
921
- // Utility function for turning the Authorization: header into
922
- // parameters, has to do some unescaping
923
- // Can filter out any non-oauth parameters if needed (default behaviour)
924
- // May 28th, 2010 - method updated to tjerk.meesters for a speed improvement.
925
- // see http://code.google.com/p/oauth/issues/detail?id=163
926
- public static function split_header( $header, $only_allow_oauth_parameters = true )
927
- {
928
- $params = array();
929
- if ( preg_match_all( '/(' . ( $only_allow_oauth_parameters ? 'oauth_' : '' ) . '[a-z_-]*)=(:?"([^"]*)"|([^,]*))/', $header, $matches ) ) {
930
- foreach ( $matches[ 1 ] as $i => $h ) {
931
- $params[ $h ] = OAuthUtil::urldecode_rfc3986( empty( $matches[ 3 ][ $i ] ) ? $matches[ 4 ][ $i ] : $matches[ 3 ][ $i ] );
932
- }
933
- if ( isset( $params[ 'realm' ] ) ) {
934
- unset( $params[ 'realm' ] );
935
- }
936
- }
937
-
938
- return $params;
939
- }
940
-
941
- // helper to try to sort out headers for people who aren't running apache
942
- public static function get_headers()
943
- {
944
- if ( function_exists( 'apache_request_headers' ) ) {
945
- // we need this to get the actual Authorization: header
946
- // because apache tends to tell us it doesn't exist
947
- $headers = apache_request_headers();
948
-
949
- // sanitize the output of apache_request_headers because
950
- // we always want the keys to be Cased-Like-This and arh()
951
- // returns the headers in the same case as they are in the
952
- // request
953
- $out = array();
954
- foreach ( $headers AS $key => $value ) {
955
- $key = str_replace(
956
- " ",
957
- "-",
958
- ucwords( strtolower( str_replace( "-", " ", $key ) ) )
959
- );
960
- $out[ $key ] = $value;
961
- }
962
- } else {
963
- // otherwise we don't have apache and are just going to have to hope
964
- // that $_SERVER actually contains what we need
965
- $out = array();
966
- if ( isset( $_SERVER[ 'CONTENT_TYPE' ] ) )
967
- $out[ 'Content-Type' ] = $_SERVER[ 'CONTENT_TYPE' ];
968
- if ( isset( $_ENV[ 'CONTENT_TYPE' ] ) )
969
- $out[ 'Content-Type' ] = $_ENV[ 'CONTENT_TYPE' ];
970
-
971
- foreach ( $_SERVER as $key => $value ) {
972
- if ( substr( $key, 0, 5 ) == "HTTP_" ) {
973
- // this is chaos, basically it is just there to capitalize the first
974
- // letter of every word that is not an initial HTTP and strip HTTP
975
- // code from przemek
976
- $key = str_replace(
977
- " ",
978
- "-",
979
- ucwords( strtolower( str_replace( "_", " ", substr( $key, 5 ) ) ) )
980
- );
981
- $out[ $key ] = $value;
982
- }
983
- }
984
- }
985
-
986
- return $out;
987
- }
988
-
989
- // This function takes a input like a=b&a=c&d=e and returns the parsed
990
- // parameters like this
991
- // array('a' => array('b','c'), 'd' => 'e')
992
- public static function parse_parameters( $input )
993
- {
994
- if ( !isset( $input ) || !$input ) return array();
995
-
996
- $pairs = explode( '&', $input );
997
-
998
- $parsed_parameters = array();
999
- foreach ( $pairs as $pair ) {
1000
- $split = explode( '=', $pair, 2 );
1001
- $parameter = OAuthUtil::urldecode_rfc3986( $split[ 0 ] );
1002
- $value = isset( $split[ 1 ] ) ? OAuthUtil::urldecode_rfc3986( $split[ 1 ] ) : '';
1003
-
1004
- if ( isset( $parsed_parameters[ $parameter ] ) ) {
1005
- // We have already recieved parameter(s) with this name, so add to the list
1006
- // of parameters with this name
1007
-
1008
- if ( is_scalar( $parsed_parameters[ $parameter ] ) ) {
1009
- // This is the first duplicate, so transform scalar (string) into an array
1010
- // so we can add the duplicates
1011
- $parsed_parameters[ $parameter ] = array( $parsed_parameters[ $parameter ] );
1012
- }
1013
-
1014
- $parsed_parameters[ $parameter ][ ] = $value;
1015
- } else {
1016
- $parsed_parameters[ $parameter ] = $value;
1017
- }
1018
- }
1019
-
1020
- return $parsed_parameters;
1021
- }
1022
-
1023
- public static function build_http_query( $params )
1024
- {
1025
- if ( !$params ) return '';
1026
-
1027
- // Urlencode both keys and values
1028
- $keys = OAuthUtil::urlencode_rfc3986( array_keys( $params ) );
1029
- $values = OAuthUtil::urlencode_rfc3986( array_values( $params ) );
1030
- $params = array_combine( $keys, $values );
1031
-
1032
- // Parameters are sorted by name, using lexicographical byte value ordering.
1033
- // Ref: Spec: 9.1.1 (1)
1034
- uksort( $params, 'strcmp' );
1035
-
1036
- $pairs = array();
1037
- foreach ( $params as $parameter => $value ) {
1038
- if ( is_array( $value ) ) {
1039
- // If two or more parameters share the same name, they are sorted by their value
1040
- // Ref: Spec: 9.1.1 (1)
1041
- // June 12th, 2010 - changed to sort because of issue 164 by hidetaka
1042
- sort( $value, SORT_STRING );
1043
- foreach ( $value as $duplicate_value ) {
1044
- $pairs[ ] = $parameter . '=' . $duplicate_value;
1045
- }
1046
- } else {
1047
- $pairs[ ] = $parameter . '=' . $value;
1048
- }
1049
- }
1050
-
1051
- // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
1052
- // Each name-value pair is separated by an '&' character (ASCII code 38)
1053
- return implode( '&', $pairs );
1054
- }
1055
- }
1056
-
1057
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/cacert.pem DELETED
@@ -1,171 +0,0 @@
1
- Verisign Class 3 Public Primary Certification Authority
2
- =======================================================
3
- -----BEGIN CERTIFICATE-----
4
- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
5
- FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
6
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
7
- XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
8
- IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
9
- A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
10
- f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
11
- hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
12
- TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
13
- WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
14
- Tqj/ZA1k
15
- -----END CERTIFICATE-----
16
-
17
- Verisign Class 3 Public Primary Certification Authority - G2
18
- ============================================================
19
- -----BEGIN CERTIFICATE-----
20
- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
21
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
22
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
23
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
24
- dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
25
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
26
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
27
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
28
- dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
29
- FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
30
- lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
31
- MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
32
- 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
33
- Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
34
- -----END CERTIFICATE-----
35
-
36
-
37
- Verisign Class 3 Public Primary Certification Authority - G3
38
- ============================================================
39
- -----BEGIN CERTIFICATE-----
40
- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
41
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
42
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
43
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
44
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
45
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
46
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
47
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
48
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
49
- ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
50
- EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
51
- cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
52
- EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
53
- 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
54
- ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
55
- j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
56
- /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
57
- xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
58
- t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
59
- -----END CERTIFICATE-----
60
-
61
- Verisign Class 4 Public Primary Certification Authority - G3
62
- ============================================================
63
- -----BEGIN CERTIFICATE-----
64
- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
65
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
66
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
67
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
68
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
69
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
70
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
71
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
72
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
73
- ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
74
- tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
75
- 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
76
- Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
77
- Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
78
- j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
79
- mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
80
- fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
81
- RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
82
- UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
83
- -----END CERTIFICATE-----
84
- VeriSign Class 3 Public Primary Certification Authority - G5
85
- ============================================================
86
- -----BEGIN CERTIFICATE-----
87
- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
88
- BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
89
- ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
90
- IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
91
- ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
92
- yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
93
- biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
94
- dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
95
- YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
96
- ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
97
- j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
98
- Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
99
- Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
100
- fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
101
- BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
102
- Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
103
- aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
104
- SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
105
- X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
106
- KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
107
- Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
108
- ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
109
- -----END CERTIFICATE-----
110
- VeriSign Universal Root Certification Authority
111
- ===============================================
112
- -----BEGIN CERTIFICATE-----
113
- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
114
- BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
115
- ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
116
- IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
117
- IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
118
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
119
- cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
120
- IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
121
- aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
122
- 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
123
- MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
124
- 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
125
- AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
126
- tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
127
- CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
128
- a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
129
- DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
130
- Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
131
- Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
132
- P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
133
- wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
134
- mJO37M2CYfE45k+XmCpajQ==
135
- -----END CERTIFICATE-----
136
-
137
- VeriSign Class 3 Public Primary Certification Authority - G4
138
- ============================================================
139
- -----BEGIN CERTIFICATE-----
140
- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
141
- VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
142
- b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
143
- ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
144
- YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
145
- MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
146
- cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
147
- b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
148
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
149
- Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
150
- rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
151
- /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
152
- HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
153
- Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
154
- A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
155
- AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
156
- -----END CERTIFICATE-----
157
- Verisign Class 3 Public Primary Certification Authority
158
- =======================================================
159
- -----BEGIN CERTIFICATE-----
160
- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
161
- FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
162
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
163
- XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
164
- IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
165
- A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
166
- f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
167
- hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
168
- CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
169
- bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
170
- D/xwzoiQ
171
- -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPConfigurationException.php DELETED
@@ -1,9 +0,0 @@
1
- <?php
2
- class PPConfigurationException extends Exception
3
- {
4
-
5
- public function __construct( $message = null, $code = 0 )
6
- {
7
- parent::__construct( $message, $code );
8
- }
9
- }
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPConnectionException.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- class PPConnectionException extends Exception
3
- {
4
- /**
5
- * The url that was being connected to when the exception occured
6
- * @var string
7
- */
8
- private $url;
9
-
10
- public function __construct( $url, $message, $code = 0 )
11
- {
12
- parent::__construct( $message, $code );
13
- $this->url = $url;
14
- }
15
-
16
- public function getUrl()
17
- {
18
- return $this->url;
19
- }
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPInvalidCredentialException.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
-
3
-
4
- class PPInvalidCredentialException extends Exception
5
- {
6
-
7
- public function __construct( $message = null, $code = 0 )
8
- {
9
- parent::__construct( $message, $code );
10
- }
11
-
12
- public function errorMessage()
13
- {
14
- $errorMsg = 'Error on line ' . $this->getLine() . ' in ' . $this->getFile()
15
- . ': <b>' . $this->getMessage() . '</b>';
16
-
17
- return $errorMsg;
18
- }
19
-
20
- }
21
-
22
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPMissingCredentialException.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
-
3
-
4
- class PPMissingCredentialException extends Exception
5
- {
6
-
7
- public function __construct( $message = null, $code = 0 )
8
- {
9
- parent::__construct( $message, $code );
10
- }
11
-
12
- public function errorMessage()
13
- {
14
- $errorMsg = 'Error on line ' . $this->getLine() . ' in ' . $this->getFile()
15
- . ': <b>' . $this->getMessage() . '</b>';
16
-
17
- return $errorMsg;
18
- }
19
-
20
- }
21
-
22
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/exceptions/PPTransformerException.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- class PPTransformerException extends Exception
3
- {
4
-
5
- public function __construct( $message = null, $code = 0 )
6
- {
7
- parent::__construct( $message, $code );
8
- }
9
-
10
- public function errorMessage()
11
- {
12
- $errorMsg = 'Error on line ' . $this->getLine() . ' in ' . $this->getFile()
13
- . ': <b>' . $this->getMessage() . '</b>';
14
-
15
- return $errorMsg;
16
- }
17
-
18
- }
19
-
20
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/gateways/PayPal_Masspay/api/lib/services/PayPalAPIInterfaceService/PayPalAPIInterfaceService.php DELETED
@@ -1,23178 +0,0 @@
1
- <?php
2
- /**
3
- * Stub objects for PayPalAPIInterfaceService
4
- * Auto generated code
5
- *
6
- */
7
- require_once( 'PPUtils.php' );
8
- /**
9
- * On requests, you must set the currencyID attribute to one of
10
- * the three-character currency codes for any of the supported
11
- * PayPal currencies. Limitations: Must not exceed $10,000 USD
12
- * in any currency. No currency symbol. Decimal separator must
13
- * be a period (.), and the thousands separator must be a comma
14
- * (,).
15
- */
16
- class BasicAmountType
17
- {
18
-
19
- /**
20
- *
21
- * @access public
22
- * @var CurrencyCodeType
23
- */
24
- public $currencyID;
25
-
26
- /**
27
- *
28
- * @access public
29
- * @var string
30
- */
31
- public $value;
32
-
33
- /**
34
- * Constructor with arguments
35
- */
36
- public function __construct( $currencyID = null, $value = null )
37
- {
38
- $this->currencyID = $currencyID;
39
- $this->value = $value;
40
- }
41
-
42
-
43
- public function toXMLString()
44
- {
45
- $str = '';
46
- $str .= $this->getAttributeAsXml();
47
- $str .= '>';
48
- if ( $this->value != null ) {
49
- $str .= PPUtils::escapeInvalidXmlCharsRegex( $this->value );
50
- }
51
-
52
- return $str;
53
- }
54
-
55
-
56
- private function getAttributeAsXml()
57
- {
58
- $str = '';
59
- if ( $this->currencyID != null ) {
60
- $str .= ' currencyID = "' . PPUtils::escapeInvalidXmlCharsRegex( $this->currencyID ) . '"';
61
- }
62
-
63
- return $str;
64
- }
65
-
66
- public function init( $arr = null )
67
- {
68
- if ( $arr != null ) {
69
- foreach ( $arr as $arry ) {
70
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'currencyid' ) {
71
- $this->currencyID = $arry[ "text" ];
72
- }
73
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'value' ) {
74
- $this->value = $arry[ "text" ];
75
- }
76
- }
77
- }
78
- }
79
- }
80
-
81
-
82
- /**
83
- *
84
- */
85
- class MeasureType
86
- {
87
-
88
- /**
89
- *
90
- * @access public
91
- * @var string
92
- */
93
- public $unit;
94
-
95
- /**
96
- *
97
- * @access public
98
- * @var double
99
- */
100
- public $value;
101
-
102
- /**
103
- * Constructor with arguments
104
- */
105
- public function __construct( $unit = null, $value = null )
106
- {
107
- $this->unit = $unit;
108
- $this->value = $value;
109
- }
110
-
111
-
112
- public function toXMLString()
113
- {
114
- $str = '';
115
- $str .= $this->getAttributeAsXml();
116
- $str .= '>';
117
- if ( $this->value != null ) {
118
- $str .= PPUtils::escapeInvalidXmlCharsRegex( $this->value );
119
- }
120
-
121
- return $str;
122
- }
123
-
124
-
125
- private function getAttributeAsXml()
126
- {
127
- $str = '';
128
- if ( $this->unit != null ) {
129
- $str .= ' unit = "' . PPUtils::escapeInvalidXmlCharsRegex( $this->unit ) . '"';
130
- }
131
-
132
- return $str;
133
- }
134
-
135
- public function init( $arr = null )
136
- {
137
- if ( $arr != null ) {
138
- foreach ( $arr as $arry ) {
139
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'unit' ) {
140
- $this->unit = $arry[ "text" ];
141
- }
142
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'value' ) {
143
- $this->value = $arry[ "text" ];
144
- }
145
- }
146
- }
147
- }
148
- }
149
-
150
-
151
- /**
152
- * Value of the application-specific error parameter.
153
- */
154
- class ErrorParameterType
155
- {
156
-
157
- /**
158
- * Value of the application-specific error parameter.
159
- * @access public
160
- * @var string
161
- */
162
- public $Value;
163
-
164
-
165
- public function init( $arr = null )
166
- {
167
- if ( $arr != null ) {
168
- foreach ( $arr as $arry ) {
169
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'value' ) {
170
- $this->Value = $arry[ "text" ];
171
- }
172
- }
173
- }
174
- }
175
- }
176
-
177
-
178
- /**
179
- * Error code can be used by a receiving application to
180
- * debugging a response message. These codes will need to be
181
- * uniquely defined for each application.
182
- */
183
- class ErrorType
184
- {
185
-
186
- /**
187
- *
188
- * @access public
189
- * @var string
190
- */
191
- public $ShortMessage;
192
-
193
- /**
194
- *
195
- * @access public
196
- * @var string
197
- */
198
- public $LongMessage;
199
-
200
- /**
201
- * Error code can be used by a receiving application to
202
- * debugging a response message. These codes will need to be
203
- * uniquely defined for each application.
204
- * @access public
205
- * @var string
206
- */
207
- public $ErrorCode;
208
-
209
- /**
210
- * SeverityCode indicates whether the error is an application
211
- * level error or if it is informational error, i.e., warning.
212
- *
213
- * @access public
214
- * @var SeverityCodeType
215
- */
216
- public $SeverityCode;
217
-
218
- /**
219
- * This optional element may carry additional
220
- * application-specific error variables that indicate specific
221
- * information about the error condition particularly in the
222
- * cases where there are multiple instances of the ErrorType
223
- * which require additional context.
224
- * @array
225
- * @access public
226
- * @var ErrorParameterType
227
- */
228
- public $ErrorParameters;
229
-
230
-
231
- public function init( $arr = null )
232
- {
233
- if ( $arr != null ) {
234
- foreach ( $arr as $arry ) {
235
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'shortmessage' ) {
236
- $this->ShortMessage = $arry[ "text" ];
237
- }
238
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'longmessage' ) {
239
- $this->LongMessage = $arry[ "text" ];
240
- }
241
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'errorcode' ) {
242
- $this->ErrorCode = $arry[ "text" ];
243
- }
244
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'severitycode' ) {
245
- $this->SeverityCode = $arry[ "text" ];
246
- }
247
- if ( is_array( $arry[ "children" ] ) && ( ( $arry[ "children" ] ) != null ) ) {
248
- $i = 0;
249
- while ( true ) {
250
- if ( $arry[ "name" ] == "errorparameters[$i]" ) {
251
- $this->ErrorParameters[ $i ] = new ErrorParameterType();
252
- $this->ErrorParameters[ $i ]->init( $arry[ "children" ] );
253
- } else {
254
- break;
255
- }
256
- $i++;
257
- }
258
- }
259
- if ( is_array( $arry[ "children" ] ) && ( ( $arry[ "children" ] ) != null ) && ( $arry[ "name" ] == "errorparameters" ) ) {
260
- $this->ErrorParameters = new ErrorParameterType();
261
- $this->ErrorParameters->init( $arry[ "children" ] );
262
- }
263
- }
264
- }
265
- }
266
- }
267
-
268
-
269
- /**
270
- * Base type definition of request payload that can carry any
271
- * type of payload content with optional versioning information
272
- * and detail level requirements.
273
- */
274
- class AbstractRequestType
275
- {
276
-
277
- /**
278
- * This specifies the required detail level that is needed by a
279
- * client application pertaining to a particular data component
280
- * (e.g., Item, Transaction, etc.). The detail level is
281
- * specified in the DetailLevelCodeType which has all the
282
- * enumerated values of the detail level for each component.
283
- * @array
284
- * @access public
285
- * @var DetailLevelCodeType
286
- */
287
- public $DetailLevel;
288
-
289
- /**
290
- * This should be the standard RFC 3066 language identification
291
- * tag, e.g., en_US.
292
- * @access public
293
- * @var string
294
- */
295
- public $ErrorLanguage;
296
-
297
- /**
298
- * This refers to the version of the request payload schema.
299
- * @access public
300
- * @var string
301
- */
302
- public $Version;
303
-
304
-
305
- public function toXMLString()
306
- {
307
- $str = '';
308
- if ( $this->DetailLevel != null ) {
309
- for ( $i = 0; $i < count( $this->DetailLevel ); $i++ ) {
310
- $str .= '<ebl:DetailLevel>' . PPUtils::escapeInvalidXmlCharsRegex( $this->DetailLevel[ $i ] ) . '</ebl:DetailLevel>';
311
- }
312
- }
313
- if ( $this->ErrorLanguage != null ) {
314
- $str .= '<ebl:ErrorLanguage>' . PPUtils::escapeInvalidXmlCharsRegex( $this->ErrorLanguage ) . '</ebl:ErrorLanguage>';
315
- }
316
- if ( $this->Version != null ) {
317
- $str .= '<ebl:Version>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Version ) . '</ebl:Version>';
318
- }
319
-
320
- return $str;
321
- }
322
-
323
-
324
- }
325
-
326
-
327
- /**
328
- * Base type definition of a response payload that can carry
329
- * any type of payload content with following optional
330
- * elements: - timestamp of response message, - application
331
- * level acknowledgement, and - application-level errors and
332
- * warnings.
333
- */
334
- class AbstractResponseType
335
- {
336
-
337
- /**
338
- * This value represents the date and time (GMT) when the
339
- * response was generated by a service provider (as a result of
340
- * processing of a request).
341
- * @access public
342
- * @var dateTime
343
- */
344
- public $Timestamp;
345
-
346
- /**
347
- * Application level acknowledgement code.
348
- * @access public
349
- * @var AckCodeType
350
- */
351
- public $Ack;
352
-
353
- /**
354
- * CorrelationID may be used optionally with an application
355
- * level acknowledgement.
356
- * @access public
357
- * @var string
358
- */
359
- public $CorrelationID;
360
-
361
- /**
362
- *
363
- * @array
364
- * @access public
365
- * @var ErrorType
366
- */
367
- public $Errors;
368
-
369
- /**
370
- * This refers to the version of the response payload schema.
371
- * @access public
372
- * @var string
373
- */
374
- public $Version;
375
-
376
- /**
377
- * This refers to the specific software build that was used in
378
- * the deployment for processing the request and generating the
379
- * response.
380
- * @access public
381
- * @var string
382
- */
383
- public $Build;
384
-
385
-
386
- public function init( $arr = null )
387
- {
388
- if ( $arr != null ) {
389
- foreach ( $arr as $arry ) {
390
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'timestamp' ) {
391
- $this->Timestamp = $arry[ "text" ];
392
- }
393
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'ack' ) {
394
- $this->Ack = $arry[ "text" ];
395
- }
396
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'correlationid' ) {
397
- $this->CorrelationID = $arry[ "text" ];
398
- }
399
- if ( is_array( $arry[ "children" ] ) && ( ( $arry[ "children" ] ) != null ) ) {
400
- $i = 0;
401
- while ( true ) {
402
- if ( $arry[ "name" ] == "errors[$i]" ) {
403
- $this->Errors[ $i ] = new ErrorType();
404
- $this->Errors[ $i ]->init( $arry[ "children" ] );
405
- } else {
406
- break;
407
- }
408
- $i++;
409
- }
410
- }
411
- if ( is_array( $arry[ "children" ] ) && ( ( $arry[ "children" ] ) != null ) && ( $arry[ "name" ] == "errors" ) ) {
412
- $this->Errors = new ErrorType();
413
- $this->Errors->init( $arry[ "children" ] );
414
- }
415
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'version' ) {
416
- $this->Version = $arry[ "text" ];
417
- }
418
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'build' ) {
419
- $this->Build = $arry[ "text" ];
420
- }
421
- }
422
- }
423
- }
424
- }
425
-
426
-
427
- /**
428
- * Country code associated with this phone number.
429
- */
430
- class PhoneNumberType
431
- {
432
-
433
- /**
434
- * Country code associated with this phone number.
435
- * @access public
436
- * @var string
437
- */
438
- public $CountryCode;
439
-
440
- /**
441
- * Phone number associated with this phone.
442
- * @access public
443
- * @var string
444
- */
445
- public $PhoneNumber;
446
-
447
- /**
448
- * Extension associated with this phone number.
449
- * @access public
450
- * @var string
451
- */
452
- public $Extension;
453
-
454
-
455
- public function toXMLString()
456
- {
457
- $str = '';
458
- if ( $this->CountryCode != null ) {
459
- $str .= '<ebl:CountryCode>' . PPUtils::escapeInvalidXmlCharsRegex( $this->CountryCode ) . '</ebl:CountryCode>';
460
- }
461
- if ( $this->PhoneNumber != null ) {
462
- $str .= '<ebl:PhoneNumber>' . PPUtils::escapeInvalidXmlCharsRegex( $this->PhoneNumber ) . '</ebl:PhoneNumber>';
463
- }
464
- if ( $this->Extension != null ) {
465
- $str .= '<ebl:Extension>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Extension ) . '</ebl:Extension>';
466
- }
467
-
468
- return $str;
469
- }
470
-
471
-
472
- }
473
-
474
-
475
- /**
476
- * Person's name associated with this address. Character length
477
- * and limitations: 32 single-byte alphanumeric characters
478
- */
479
- class AddressType
480
- {
481
-
482
- /**
483
- * Person's name associated with this address. Character length
484
- * and limitations: 32 single-byte alphanumeric characters
485
- * @access public
486
- * @var string
487
- */
488
- public $Name;
489
-
490
- /**
491
- * First street address. Character length and limitations: 300
492
- * single-byte alphanumeric characters
493
- * @access public
494
- * @var string
495
- */
496
- public $Street1;
497
-
498
- /**
499
- * Second street address. Character length and limitations: 300
500
- * single-byte alphanumeric characters
501
- * @access public
502
- * @var string
503
- */
504
- public $Street2;
505
-
506
- /**
507
- * Name of city. Character length and limitations: 120
508
- * single-byte alphanumeric characters
509
- * @access public
510
- * @var string
511
- */
512
- public $CityName;
513
-
514
- /**
515
- * State or province. Character length and limitations: 120
516
- * single-byte alphanumeric characters For Canada and the USA,
517
- * StateOrProvince must be the standard 2-character
518
- * abbreviation of a state or province. Canadian Provinces
519
- * Alberta AB British_Columbia BC Manitoba MB New_Brunswick NB
520
- * Newfoundland NF Northwest_Territories NT Nova_Scotia NS
521
- * Nunavut NU Ontario ON Prince_Edward_Island PE Quebec QC
522
- * Saskatchewan SK Yukon YK United States Alabama AL Alaska AK
523
- * American_Samoa AS Arizona AZ Arkansas AR California CA
524
- * Colorado CO Connecticut CT Delaware DE District_Of_Columbia
525
- * DC Federated_States_Of_Micronesia FM Florida FL Georgia GA
526
- * Guam GU Hawaii HI Idaho ID Illinois IL Indiana IN Iowa IA
527
- * Kansas KS Kentucky KY Louisiana LA Maine ME Marshall_Islands
528
- * MH Maryland MD Massachusetts MA Michigan MI Minnesota MN
529
- * Mississippi MS Missouri MO Montana MT Nebraska NE Nevada NV
530
- * New_Hampshire NH New_Jersey NJ New_Mexico NM New_York NY
531
- * North_Carolina NC North_Dakota ND Northern_Mariana_Islands
532
- * MP Ohio OH Oklahoma OK Oregon OR Palau PW Pennsylvania PA
533
- * Puerto_Rico PR Rhode_Island RI South_Carolina SC
534
- * South_Dakota SD Tennessee TN Texas TX Utah UT Vermont VT
535
- * Virgin_Islands VI Virginia VA Washington WA West_Virginia WV
536
- * Wisconsin WI Wyoming WY Armed_Forces_Americas AA
537
- * Armed_Forces AE Armed_Forces_Pacific AP
538
- * @access public
539
- * @var string
540
- */
541
- public $StateOrProvince;
542
-
543
- /**
544
- * ISO 3166 standard country code Character limit: Two
545
- * single-byte characters.
546
- * @access public
547
- * @var CountryCodeType
548
- */
549
- public $Country;
550
-
551
- /**
552
- * IMPORTANT: Do not set this element for SetExpressCheckout,
553
- * DoExpressCheckoutPayment, DoDirectPayment,
554
- * CreateRecurringPaymentsProfile or
555
- * UpdateRecurringPaymentsProfile. This element should only be
556
- * used in response elements and typically should not be used
557
- * in creating request messages which specify the name of a
558
- * country using the Country element (which refers to a
559
- * 2-letter country code).
560
- * @access public
561
- * @var string
562
- */
563
- public $CountryName;
564
-
565
- /**
566
- * Telephone number associated with this address
567
- * @access public
568
- * @var string
569
- */
570
- public $Phone;
571
-
572
- /**
573
- *
574
- * @access public
575
- * @var string
576
- */
577
- public $PostalCode;
578
-
579
- /**
580
- * IMPORTANT: Do not set this element for SetExpressCheckout,
581
- * DoExpressCheckoutPayment, DoDirectPayment,
582
- * CreateRecurringPaymentsProfile, or
583
- * UpdateRecurringPaymentsProfile.
584
- * @access public
585
- * @var string
586
- */
587
- public $AddressID;
588
-
589
- /**
590
- * IMPORTANT: Do not set this element for SetExpressCheckout,
591
- * DoExpressCheckoutPayment, DoDirectPayment,
592
- * CreateRecurringPaymentsProfile or
593
- * UpdateRecurringPaymentsProfile.
594
- * @access public
595
- * @var AddressOwnerCodeType
596
- */
597
- public $AddressOwner;
598
-
599
- /**
600
- * IMPORTANT: Do not set this element for SetExpressCheckout,
601
- * DoExpressCheckoutPayment, DoDirectPayment,
602
- * CreateRecurringPaymentsProfile or
603
- * UpdateRecurringPaymentsProfile.
604
- * @access public
605
- * @var string
606
- */
607
- public $ExternalAddressID;
608
-
609
- /**
610
- * IMPORTANT: Do not set this element for SetExpressCheckout,
611
- * DoExpressCheckoutPayment, DoDirectPayment,
612
- * CreateRecurringPaymentsProfile or
613
- * UpdateRecurringPaymentsProfile. Only applicable to
614
- * SellerPaymentAddress today. Seller's international name that
615
- * is associated with the payment address.
616
- * @access public
617
- * @var string
618
- */
619
- public $InternationalName;
620
-
621
- /**
622
- * IMPORTANT: Do not set this element for SetExpressCheckout,
623
- * DoExpressCheckoutPayment, DoDirectPayment,
624
- * CreateRecurringPaymentsProfile or
625
- * UpdateRecurringPaymentsProfile. Only applicable to
626
- * SellerPaymentAddress today. International state and city for
627
- * the seller's payment address.
628
- * @access public
629
- * @var string
630
- */
631
- public $InternationalStateAndCity;
632
-
633
- /**
634
- * IMPORTANT: Do not set this element for SetExpressCheckout,
635
- * DoExpressCheckoutPayment, DoDirectPayment,
636
- * CreateRecurringPaymentsProfile or
637
- * UpdateRecurringPaymentsProfile. Only applicable to
638
- * SellerPaymentAddress today. Seller's international street
639
- * address that is associated with the payment address.
640
- * @access public
641
- * @var string
642
- */
643
- public $InternationalStreet;
644
-
645
- /**
646
- * Status of the address on file with PayPal. IMPORTANT: Do not
647
- * set this element for SetExpressCheckout,
648
- * DoExpressCheckoutPayment, DoDirectPayment,
649
- * CreateRecurringPaymentsProfile or
650
- * UpdateRecurringPaymentsProfile.
651
- * @access public
652
- * @var AddressStatusCodeType
653
- */
654
- public $AddressStatus;
655
-
656
-
657
- public function toXMLString()
658
- {
659
- $str = '';
660
- if ( $this->Name != null ) {
661
- $str .= '<ebl:Name>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Name ) . '</ebl:Name>';
662
- }
663
- if ( $this->Street1 != null ) {
664
- $str .= '<ebl:Street1>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Street1 ) . '</ebl:Street1>';
665
- }
666
- if ( $this->Street2 != null ) {
667
- $str .= '<ebl:Street2>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Street2 ) . '</ebl:Street2>';
668
- }
669
- if ( $this->CityName != null ) {
670
- $str .= '<ebl:CityName>' . PPUtils::escapeInvalidXmlCharsRegex( $this->CityName ) . '</ebl:CityName>';
671
- }
672
- if ( $this->StateOrProvince != null ) {
673
- $str .= '<ebl:StateOrProvince>' . PPUtils::escapeInvalidXmlCharsRegex( $this->StateOrProvince ) . '</ebl:StateOrProvince>';
674
- }
675
- if ( $this->Country != null ) {
676
- $str .= '<ebl:Country>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Country ) . '</ebl:Country>';
677
- }
678
- if ( $this->CountryName != null ) {
679
- $str .= '<ebl:CountryName>' . PPUtils::escapeInvalidXmlCharsRegex( $this->CountryName ) . '</ebl:CountryName>';
680
- }
681
- if ( $this->Phone != null ) {
682
- $str .= '<ebl:Phone>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Phone ) . '</ebl:Phone>';
683
- }
684
- if ( $this->PostalCode != null ) {
685
- $str .= '<ebl:PostalCode>' . PPUtils::escapeInvalidXmlCharsRegex( $this->PostalCode ) . '</ebl:PostalCode>';
686
- }
687
- if ( $this->AddressID != null ) {
688
- $str .= '<ebl:AddressID>' . PPUtils::escapeInvalidXmlCharsRegex( $this->AddressID ) . '</ebl:AddressID>';
689
- }
690
- if ( $this->AddressOwner != null ) {
691
- $str .= '<ebl:AddressOwner>' . PPUtils::escapeInvalidXmlCharsRegex( $this->AddressOwner ) . '</ebl:AddressOwner>';
692
- }
693
- if ( $this->ExternalAddressID != null ) {
694
- $str .= '<ebl:ExternalAddressID>' . PPUtils::escapeInvalidXmlCharsRegex( $this->ExternalAddressID ) . '</ebl:ExternalAddressID>';
695
- }
696
- if ( $this->InternationalName != null ) {
697
- $str .= '<ebl:InternationalName>' . PPUtils::escapeInvalidXmlCharsRegex( $this->InternationalName ) . '</ebl:InternationalName>';
698
- }
699
- if ( $this->InternationalStateAndCity != null ) {
700
- $str .= '<ebl:InternationalStateAndCity>' . PPUtils::escapeInvalidXmlCharsRegex( $this->InternationalStateAndCity ) . '</ebl:InternationalStateAndCity>';
701
- }
702
- if ( $this->InternationalStreet != null ) {
703
- $str .= '<ebl:InternationalStreet>' . PPUtils::escapeInvalidXmlCharsRegex( $this->InternationalStreet ) . '</ebl:InternationalStreet>';
704
- }
705
- if ( $this->AddressStatus != null ) {
706
- $str .= '<ebl:AddressStatus>' . PPUtils::escapeInvalidXmlCharsRegex( $this->AddressStatus ) . '</ebl:AddressStatus>';
707
- }
708
-
709
- return $str;
710
- }
711
-
712
-
713
- public function init( $arr = null )
714
- {
715
- if ( $arr != null ) {
716
- foreach ( $arr as $arry ) {
717
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'name' ) {
718
- $this->Name = $arry[ "text" ];
719
- }
720
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'street1' ) {
721
- $this->Street1 = $arry[ "text" ];
722
- }
723
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'street2' ) {
724
- $this->Street2 = $arry[ "text" ];
725
- }
726
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'cityname' ) {
727
- $this->CityName = $arry[ "text" ];
728
- }
729
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'stateorprovince' ) {
730
- $this->StateOrProvince = $arry[ "text" ];
731
- }
732
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'country' ) {
733
- $this->Country = $arry[ "text" ];
734
- }
735
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'countryname' ) {
736
- $this->CountryName = $arry[ "text" ];
737
- }
738
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'phone' ) {
739
- $this->Phone = $arry[ "text" ];
740
- }
741
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'postalcode' ) {
742
- $this->PostalCode = $arry[ "text" ];
743
- }
744
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'addressid' ) {
745
- $this->AddressID = $arry[ "text" ];
746
- }
747
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'addressowner' ) {
748
- $this->AddressOwner = $arry[ "text" ];
749
- }
750
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'externaladdressid' ) {
751
- $this->ExternalAddressID = $arry[ "text" ];
752
- }
753
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'internationalname' ) {
754
- $this->InternationalName = $arry[ "text" ];
755
- }
756
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'internationalstateandcity' ) {
757
- $this->InternationalStateAndCity = $arry[ "text" ];
758
- }
759
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'internationalstreet' ) {
760
- $this->InternationalStreet = $arry[ "text" ];
761
- }
762
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'addressstatus' ) {
763
- $this->AddressStatus = $arry[ "text" ];
764
- }
765
- }
766
- }
767
- }
768
- }
769
-
770
-
771
- /**
772
- *
773
- */
774
- class PersonNameType
775
- {
776
-
777
- /**
778
- *
779
- * @access public
780
- * @var string
781
- */
782
- public $Salutation;
783
-
784
- /**
785
- *
786
- * @access public
787
- * @var string
788
- */
789
- public $FirstName;
790
-
791
- /**
792
- *
793
- * @access public
794
- * @var string
795
- */
796
- public $MiddleName;
797
-
798
- /**
799
- *
800
- * @access public
801
- * @var string
802
- */
803
- public $LastName;
804
-
805
- /**
806
- *
807
- * @access public
808
- * @var string
809
- */
810
- public $Suffix;
811
-
812
-
813
- public function toXMLString()
814
- {
815
- $str = '';
816
- if ( $this->Salutation != null ) {
817
- $str .= '<ebl:Salutation>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Salutation ) . '</ebl:Salutation>';
818
- }
819
- if ( $this->FirstName != null ) {
820
- $str .= '<ebl:FirstName>' . PPUtils::escapeInvalidXmlCharsRegex( $this->FirstName ) . '</ebl:FirstName>';
821
- }
822
- if ( $this->MiddleName != null ) {
823
- $str .= '<ebl:MiddleName>' . PPUtils::escapeInvalidXmlCharsRegex( $this->MiddleName ) . '</ebl:MiddleName>';
824
- }
825
- if ( $this->LastName != null ) {
826
- $str .= '<ebl:LastName>' . PPUtils::escapeInvalidXmlCharsRegex( $this->LastName ) . '</ebl:LastName>';
827
- }
828
- if ( $this->Suffix != null ) {
829
- $str .= '<ebl:Suffix>' . PPUtils::escapeInvalidXmlCharsRegex( $this->Suffix ) . '</ebl:Suffix>';
830
- }
831
-
832
- return $str;
833
- }
834
-
835
-
836
- public function init( $arr = null )
837
- {
838
- if ( $arr != null ) {
839
- foreach ( $arr as $arry ) {
840
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'salutation' ) {
841
- $this->Salutation = $arry[ "text" ];
842
- }
843
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'firstname' ) {
844
- $this->FirstName = $arry[ "text" ];
845
- }
846
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'middlename' ) {
847
- $this->MiddleName = $arry[ "text" ];
848
- }
849
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'lastname' ) {
850
- $this->LastName = $arry[ "text" ];
851
- }
852
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'suffix' ) {
853
- $this->Suffix = $arry[ "text" ];
854
- }
855
- }
856
- }
857
- }
858
- }
859
-
860
-
861
- /**
862
- *
863
- */
864
- class IncentiveAppliedToType
865
- {
866
-
867
- /**
868
- *
869
- * @access public
870
- * @var string
871
- */
872
- public $BucketId;
873
-
874
- /**
875
- *
876
- * @access public
877
- * @var string
878
- */
879
- public $ItemId;
880
-
881
- /**
882
- *
883
- * @access public
884
- * @var BasicAmountType
885
- */
886
- public $IncentiveAmount;
887
-
888
- /**
889
- *
890
- * @access public
891
- * @var string
892
- */
893
- public $SubType;
894
-
895
-
896
- public function init( $arr = null )
897
- {
898
- if ( $arr != null ) {
899
- foreach ( $arr as $arry ) {
900
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'bucketid' ) {
901
- $this->BucketId = $arry[ "text" ];
902
- }
903
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'itemid' ) {
904
- $this->ItemId = $arry[ "text" ];
905
- }
906
-
907
-
908
- if ( is_array( $arry[ "attributes" ] ) && ( $arry[ "attributes" ] ) != null ) {
909
- if ( $arry[ "name" ] == 'incentiveamount' ) {
910
- $tmp = array();
911
- $atr = array();
912
- foreach ( $arry[ "attributes" ] as $key => $val ) {
913
- $atr[ 0 ][ "name" ] = $key;
914
- $atr[ 0 ][ "text" ] = $val;
915
- }
916
- $atr[ 1 ][ "name" ] = "value";
917
- $atr[ 1 ][ "text" ] = $arry[ "text" ];
918
- $this->IncentiveAmount = new BasicAmountType();
919
- $this->IncentiveAmount->init( $atr );
920
- }
921
-
922
- }
923
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'subtype' ) {
924
- $this->SubType = $arry[ "text" ];
925
- }
926
- }
927
- }
928
- }
929
- }
930
-
931
-
932
- /**
933
- *
934
- */
935
- class IncentiveDetailType
936
- {
937
-
938
- /**
939
- *
940
- * @access public
941
- * @var string
942
- */
943
- public $RedemptionCode;
944
-
945
- /**
946
- *
947
- * @access public
948
- * @var string
949
- */
950
- public $DisplayCode;
951
-
952
- /**
953
- *
954
- * @access public
955
- * @var string
956
- */
957
- public $ProgramId;
958
-
959
- /**
960
- *
961
- * @access public
962
- * @var IncentiveTypeCodeType
963
- */
964
- public $IncentiveType;
965
-
966
- /**
967
- *
968
- * @access public
969
- * @var string
970
- */
971
- public $IncentiveDescription;
972
-
973
- /**
974
- *
975
- * @array
976
- * @access public
977
- * @var IncentiveAppliedToType
978
- */
979
- public $AppliedTo;
980
-
981
- /**
982
- *
983
- * @access public
984
- * @var string
985
- */
986
- public $Status;
987
-
988
- /**
989
- *
990
- * @access public
991
- * @var string
992
- */
993
- public $ErrorCode;
994
-
995
-
996
- public function init( $arr = null )
997
- {
998
- if ( $arr != null ) {
999
- foreach ( $arr as $arry ) {
1000
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'redemptioncode' ) {
1001
- $this->RedemptionCode = $arry[ "text" ];
1002
- }
1003
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'displaycode' ) {
1004
- $this->DisplayCode = $arry[ "text" ];
1005
- }
1006
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'programid' ) {
1007
- $this->ProgramId = $arry[ "text" ];
1008
- }
1009
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'incentivetype' ) {
1010
- $this->IncentiveType = $arry[ "text" ];
1011
- }
1012
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'incentivedescription' ) {
1013
- $this->IncentiveDescription = $arry[ "text" ];
1014
- }
1015
- if ( is_array( $arry[ "children" ] ) && ( ( $arry[ "children" ] ) != null ) ) {
1016
- $i = 0;
1017
- while ( true ) {
1018
- if ( $arry[ "name" ] == "appliedto[$i]" ) {
1019
- $this->AppliedTo[ $i ] = new IncentiveAppliedToType();
1020
- $this->AppliedTo[ $i ]->init( $arry[ "children" ] );
1021
- } else {
1022
- break;
1023
- }
1024
- $i++;
1025
- }
1026
- }
1027
- if ( is_array( $arry[ "children" ] ) && ( ( $arry[ "children" ] ) != null ) && ( $arry[ "name" ] == "appliedto" ) ) {
1028
- $this->AppliedTo = new IncentiveAppliedToType();
1029
- $this->AppliedTo->init( $arry[ "children" ] );
1030
- }
1031
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'status' ) {
1032
- $this->Status = $arry[ "text" ];
1033
- }
1034
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'errorcode' ) {
1035
- $this->ErrorCode = $arry[ "text" ];
1036
- }
1037
- }
1038
- }
1039
- }
1040
- }
1041
-
1042
-
1043
- /**
1044
- *
1045
- */
1046
- class IncentiveItemType
1047
- {
1048
-
1049
- /**
1050
- *
1051
- * @access public
1052
- * @var string
1053
- */
1054
- public $ItemId;
1055
-
1056
- /**
1057
- *
1058
- * @access public
1059
- * @var dateTime
1060
- */
1061
- public $PurchaseTime;
1062
-
1063
- /**
1064
- *
1065
- * @access public
1066
- * @var string
1067
- */
1068
- public $ItemCategoryList;
1069
-
1070
- /**
1071
- *
1072
- * @access public
1073
- * @var BasicAmountType
1074
- */
1075
- public $ItemPrice;
1076
-
1077
- /**
1078
- *
1079
- * @access public
1080
- * @var integer
1081
- */
1082
- public $ItemQuantity;
1083
-
1084
-
1085
- public function toXMLString()
1086
- {
1087
- $str = '';
1088
- if ( $this->ItemId != null ) {
1089
- $str .= '<ebl:ItemId>' . PPUtils::escapeInvalidXmlCharsRegex( $this->ItemId ) . '</ebl:ItemId>';
1090
- }
1091
- if ( $this->PurchaseTime != null ) {
1092
- $str .= '<ebl:PurchaseTime>' . PPUtils::escapeInvalidXmlCharsRegex( $this->PurchaseTime ) . '</ebl:PurchaseTime>';
1093
- }
1094
- if ( $this->ItemCategoryList != null ) {
1095
- $str .= '<ebl:ItemCategoryList>' . PPUtils::escapeInvalidXmlCharsRegex( $this->ItemCategoryList ) . '</ebl:ItemCategoryList>';
1096
- }
1097
- if ( $this->ItemPrice != null ) {
1098
- $str .= '<ebl:ItemPrice';
1099
- $str .= $this->ItemPrice->toXMLString();
1100
- $str .= '</ebl:ItemPrice>';
1101
- }
1102
- if ( $this->ItemQuantity != null ) {
1103
- $str .= '<ebl:ItemQuantity>' . PPUtils::escapeInvalidXmlCharsRegex( $this->ItemQuantity ) . '</ebl:ItemQuantity>';
1104
- }
1105
-
1106
- return $str;
1107
- }
1108
-
1109
-
1110
- }
1111
-
1112
-
1113
- /**
1114
- *
1115
- */
1116
- class IncentiveBucketType
1117
- {
1118
-
1119
- /**
1120
- *
1121
- * @array
1122
- * @access public
1123
- * @var IncentiveItemType
1124
- */
1125
- public $Items;
1126
-
1127
- /**
1128
- *
1129
- * @access public
1130
- * @var string
1131
- */
1132
- public $BucketId;
1133
-
1134
- /**
1135
- *
1136
- * @access public
1137
- * @var string
1138
- */
1139
- public $SellerId;
1140
-
1141
- /**
1142
- *
1143
- * @access public
1144
- * @var string
1145
- */
1146
- public $ExternalSellerId;
1147
-
1148
- /**
1149
- *
1150
- * @access public
1151
- * @var BasicAmountType
1152
- */
1153
- public $BucketSubtotalAmt;
1154
-
1155
- /**
1156
- *
1157
- * @access public
1158
- * @var BasicAmountType
1159
- */
1160
- public $BucketShippingAmt;
1161
-
1162
- /**
1163
- *
1164
- * @access public
1165
- * @var BasicAmountType
1166
- */
1167
- public $BucketInsuranceAmt;
1168
-
1169
- /**
1170
- *
1171
- * @access public
1172
- * @var BasicAmountType
1173
- */
1174
- public $BucketSalesTaxAmt;
1175
-
1176
- /**
1177
- *
1178
- * @access public
1179
- * @var BasicAmountType
1180
- */
1181
- public $BucketTotalAmt;
1182
-
1183
-
1184
- public function toXMLString()
1185
- {
1186
- $str = '';
1187
- if ( $this->Items != null ) {
1188
- for ( $i = 0; $i < count( $this->Items ); $i++ ) {
1189
- $str .= '<ebl:Items>';
1190
- $str .= $this->Items[ $i ]->toXMLString();
1191
- $str .= '</ebl:Items>';
1192
- }
1193
- }
1194
- if ( $this->BucketId != null ) {
1195
- $str .= '<ebl:BucketId>' . PPUtils::escapeInvalidXmlCharsRegex( $this->BucketId ) . '</ebl:BucketId>';
1196
- }
1197
- if ( $this->SellerId != null ) {
1198
- $str .= '<ebl:SellerId>' . PPUtils::escapeInvalidXmlCharsRegex( $this->SellerId ) . '</ebl:SellerId>';
1199
- }
1200
- if ( $this->ExternalSellerId != null ) {
1201
- $str .= '<ebl:ExternalSellerId>' . PPUtils::escapeInvalidXmlCharsRegex( $this->ExternalSellerId ) . '</ebl:ExternalSellerId>';
1202
- }
1203
- if ( $this->BucketSubtotalAmt != null ) {
1204
- $str .= '<ebl:BucketSubtotalAmt';
1205
- $str .= $this->BucketSubtotalAmt->toXMLString();
1206
- $str .= '</ebl:BucketSubtotalAmt>';
1207
- }
1208
- if ( $this->BucketShippingAmt != null ) {
1209
- $str .= '<ebl:BucketShippingAmt';
1210
- $str .= $this->BucketShippingAmt->toXMLString();
1211
- $str .= '</ebl:BucketShippingAmt>';
1212
- }
1213
- if ( $this->BucketInsuranceAmt != null ) {
1214
- $str .= '<ebl:BucketInsuranceAmt';
1215
- $str .= $this->BucketInsuranceAmt->toXMLString();
1216
- $str .= '</ebl:BucketInsuranceAmt>';
1217
- }
1218
- if ( $this->BucketSalesTaxAmt != null ) {
1219
- $str .= '<ebl:BucketSalesTaxAmt';
1220
- $str .= $this->BucketSalesTaxAmt->toXMLString();
1221
- $str .= '</ebl:BucketSalesTaxAmt>';
1222
- }
1223
- if ( $this->BucketTotalAmt != null ) {
1224
- $str .= '<ebl:BucketTotalAmt';
1225
- $str .= $this->BucketTotalAmt->toXMLString();
1226
- $str .= '</ebl:BucketTotalAmt>';
1227
- }
1228
-
1229
- return $str;
1230
- }
1231
-
1232
-
1233
- }
1234
-
1235
-
1236
- /**
1237
- *
1238
- */
1239
- class IncentiveRequestDetailsType
1240
- {
1241
-
1242
- /**
1243
- *
1244
- * @access public
1245
- * @var string
1246
- */
1247
- public $RequestId;
1248
-
1249
- /**
1250
- *
1251
- * @access public
1252
- * @var IncentiveRequestCodeType
1253
- */
1254
- public $RequestType;
1255
-
1256
- /**
1257
- *
1258
- * @access public
1259
- * @var IncentiveRequestDetailLevelCodeType
1260
- */
1261
- public $RequestDetailLevel;
1262
-
1263
-
1264
- public function toXMLString()
1265
- {
1266
- $str = '';
1267
- if ( $this->RequestId != null ) {
1268
- $str .= '<ebl:RequestId>' . PPUtils::escapeInvalidXmlCharsRegex( $this->RequestId ) . '</ebl:RequestId>';
1269
- }
1270
- if ( $this->RequestType != null ) {
1271
- $str .= '<ebl:RequestType>' . PPUtils::escapeInvalidXmlCharsRegex( $this->RequestType ) . '</ebl:RequestType>';
1272
- }
1273
- if ( $this->RequestDetailLevel != null ) {
1274
- $str .= '<ebl:RequestDetailLevel>' . PPUtils::escapeInvalidXmlCharsRegex( $this->RequestDetailLevel ) . '</ebl:RequestDetailLevel>';
1275
- }
1276
-
1277
- return $str;
1278
- }
1279
-
1280
-
1281
- }
1282
-
1283
-
1284
- /**
1285
- *
1286
- */
1287
- class GetIncentiveEvaluationRequestDetailsType
1288
- {
1289
-
1290
- /**
1291
- *
1292
- * @access public
1293
- * @var string
1294
- */
1295
- public $ExternalBuyerId;
1296
-
1297
- /**
1298
- *
1299
- * @array
1300
- * @access public
1301
- * @var string
1302
- */
1303
- public $IncentiveCodes;
1304
-
1305
- /**
1306
- *
1307
- * @array
1308
- * @access public
1309
- * @var IncentiveApplyIndicationType
1310
- */
1311
- public $ApplyIndication;
1312
-
1313
- /**
1314
- *
1315
- * @array
1316
- * @access public
1317
- * @var IncentiveBucketType
1318
- */
1319
- public $Buckets;
1320
-
1321
- /**
1322
- *
1323
- * @access public
1324
- * @var BasicAmountType
1325
- */
1326
- public $CartTotalAmt;
1327
-
1328
- /**
1329
- *
1330
- * @access public
1331
- * @var IncentiveRequestDetailsType
1332
- */
1333
- public $RequestDetails;
1334
-
1335
-
1336
- public function toXMLString()
1337
- {
1338
- $str = '';
1339
- if ( $this->ExternalBuyerId != null ) {
1340
- $str .= '<ebl:ExternalBuyerId>' . PPUtils::escapeInvalidXmlCharsRegex( $this->ExternalBuyerId ) . '</ebl:ExternalBuyerId>';
1341
- }
1342
- if ( $this->IncentiveCodes != null ) {
1343
- for ( $i = 0; $i < count( $this->IncentiveCodes ); $i++ ) {
1344
- $str .= '<ebl:IncentiveCodes>' . PPUtils::escapeInvalidXmlCharsRegex( $this->IncentiveCodes[ $i ] ) . '</ebl:IncentiveCodes>';
1345
- }
1346
- }
1347
- if ( $this->ApplyIndication != null ) {
1348
- for ( $i = 0; $i < count( $this->ApplyIndication ); $i++ ) {
1349
- $str .= '<ebl:ApplyIndication>';
1350
- $str .= $this->ApplyIndication[ $i ]->toXMLString();
1351
- $str .= '</ebl:ApplyIndication>';
1352
- }
1353
- }
1354
- if ( $this->Buckets != null ) {
1355
- for ( $i = 0; $i < count( $this->Buckets ); $i++ ) {
1356
- $str .= '<ebl:Buckets>';
1357
- $str .= $this->Buckets[ $i ]->toXMLString();
1358
- $str .= '</ebl:Buckets>';
1359
- }
1360
- }
1361
- if ( $this->CartTotalAmt != null ) {
1362
- $str .= '<ebl:CartTotalAmt';
1363
- $str .= $this->CartTotalAmt->toXMLString();
1364
- $str .= '</ebl:CartTotalAmt>';
1365
- }
1366
- if ( $this->RequestDetails != null ) {
1367
- $str .= '<ebl:RequestDetails>';
1368
- $str .= $this->RequestDetails->toXMLString();
1369
- $str .= '</ebl:RequestDetails>';
1370
- }
1371
-
1372
- return $str;
1373
- }
1374
-
1375
-
1376
- }
1377
-
1378
-
1379
- /**
1380
- *
1381
- */
1382
- class GetIncentiveEvaluationResponseDetailsType
1383
- {
1384
-
1385
- /**
1386
- *
1387
- * @array
1388
- * @access public
1389
- * @var IncentiveDetailType
1390
- */
1391
- public $IncentiveDetails;
1392
-
1393
- /**
1394
- *
1395
- * @access public
1396
- * @var string
1397
- */
1398
- public $RequestId;
1399
-
1400
-
1401
- public function init( $arr = null )
1402
- {
1403
- if ( $arr != null ) {
1404
- foreach ( $arr as $arry ) {
1405
- if ( is_array( $arry[ "children" ] ) && ( ( $arry[ "children" ] ) != null ) ) {
1406
- $i = 0;
1407
- while ( true ) {
1408
- if ( $arry[ "name" ] == "incentivedetails[$i]" ) {
1409
- $this->IncentiveDetails[ $i ] = new IncentiveDetailType();
1410
- $this->IncentiveDetails[ $i ]->init( $arry[ "children" ] );
1411
- } else {
1412
- break;
1413
- }
1414
- $i++;
1415
- }
1416
- }
1417
- if ( is_array( $arry[ "children" ] ) && ( ( $arry[ "children" ] ) != null ) && ( $arry[ "name" ] == "incentivedetails" ) ) {
1418
- $this->IncentiveDetails = new IncentiveDetailType();
1419
- $this->IncentiveDetails->init( $arry[ "children" ] );
1420
- }
1421
- if ( $arry != null && isset( $arry[ 'text' ] ) && $arry[ 'name' ] == 'requestid' ) {
1422
- $this->RequestId = $arry[ "text" ];
1423
- }
1424
- }
1425
- }
1426
- }
1427
- }
1428
-
1429
-
1430
- /**
1431
- * The total cost of the order to the customer. If shipping
1432
- * cost and tax charges are known, include them in OrderTotal;
1433
- * if not, OrderTotal should be the current sub-total of the
1434
- * order. You must set the currencyID attribute to one of the
1435
- * three-character currency codes for any of the supported
1436
- * PayPal currencies. Limitations: Must not exceed $10,000 USD
1437
- * in any currency. No currency symbol. Decimal separator must
1438
- * be a period (.), and the thousands separator must be a comma
1439
- * (,).
1440
- */
1441
- class SetExpressCheckoutRequestDetailsType
1442
- {
1443
-
1444
- /**
1445
- * The total cost of the order to the customer. If shipping
1446
- * cost and tax charges are known, include them in OrderTotal;
1447
- * if not, OrderTotal should be the current sub-total of the
1448
- * order. You must set the currencyID attribute to one of the
1449
- * three-character currency codes for any of the supported
1450
- * PayPal currencies. Limitations: Must not exceed $10,000 USD
1451
- * in any currency. No currency symbol. Decimal separator must
1452
- * be a period (.), and the thousands separator must be a comma
1453
- * (,).
1454
- * @access public
1455
- * @var BasicAmountType
1456
- */
1457
- public $OrderTotal;
1458
-
1459
- /**
1460
- * URL to which the customer's browser is returned after
1461
- * choosing to pay with PayPal. PayPal recommends that the
1462
- * value of ReturnURL be the final review page on which the
1463
- * customer confirms the order and payment. Required Character
1464
- * length and limitations: no limit.
1465
- * @access public
1466
- * @var string
1467
- */
1468
- public $ReturnURL;
1469
-
1470
- /**
1471
- * URL to which the cu